收款定制开发【云原生 | 22】Docker运行Web服务实战之Nginx

作者简介:🏅收款定制开发云计算领域优质创作者🏅收款定制开发新星计划第三季python收款定制开发赛道第一名🏅 🏅
✒️个人主页:
💊个人社区:收款定制开发欢迎您的加入!

收款定制开发为大家推荐一款刷题神奇 

收款定制开发各大互联网大厂面试真题。收款定制开发基础题库到进阶题库等收款定制开发各类面试题应有尽有!

收款定制开发牛客网面经合集,收款定制开发满足大厂面试技术深度,快速构建Java收款定制开发核心知识体系大厂面试官亲授,收款定制开发备战面试与技能提升,主要考点+主流场景+内功提升+真题解析

目录


1. 介绍 

 Nginx (engine x) 收款定制开发是一个高性能的HTTP和web服务器,收款定制开发同时也提供了IMAP/POP3/SMTP服务。Nginx收款定制开发是由伊戈尔·收款定制开发赛索耶夫为俄罗斯访问量第二的Rambler.ru收款定制开发站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3),在BSD-like 协议下发行。其特点是内存利用率高,并发能力强。

2. 为什么Nginx比其他web服务器高 

处理过程:每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的request 进来,他就可以很快再按这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

2.1 进程管理上的区别 

Apache:

        默认采用的是一个主进程 多个工作进程 每个工作进程管理一个线程 每

        个线程管理一个连接

        并发数 = 工作进程数 x 1

Nginx:

        一个主进程 多个工作进程 每个工作进程管理多个线程(最大到65535)

        并发数 = 工作进程数 x 单进程开启的线程数

        淘宝等电商用的web浏览器 Tengine ,相当与Nginx的换皮,通过nginx开源项目针对电商优化的产品

2.2 网络IO模型的选择 

Apache:

        select模型

        select就是一个简单的选择模型(如排队请求网络资源,第一个人阻塞住第二个人依然要排着)

Nginx:

        epoll模型

        epoll更智能的网络管理模型(如排队第一个人阻塞住,会先把第二个人网络的 IO 请求提交出来)

2.3 进程的阻塞方式的区别 

Apache:同步 阻塞型

Nginx:异步 非阻塞型

2.4 模块开发方向不同 

Apache:安全模块众多

Nginx:高性能模块众多

2.5 Apache & Nginx差异对比

Apache

Nginx

配置繁琐

配置相对简单

原生支持动态和静态页面

支持静态页面

模块相对安全

高性能模块出产迅速、社区活跃

BUG 相对较少,消耗资源较多

BUG相对较多,节省资源

对加密支持较好

对反向代理支持较好

同步阻塞型应用

异步非阻塞型应用

3. nginx配置文件详解

  1. user www www;
  2. #程序运行用户和组
  3. worker_processes auto;
  4. #启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目
  5. error_log /home/wwwlogs/nginx_error.log crit;
  6. #全局错误日志
  7. pid /usr/local/nginx/logs/nginx.pid;
  8. #主进程PID保存文件
  9. worker_rlimit_nofile 51200;
  10. #文件描述符数量
  11. events
  12. {
  13. use epoll;
  14. #使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
  15. worker_connections 51200;
  16. #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
  17. }
  18. http
  19. #整体环境配置--网站配置
  20. {
  21. include mime.types;
  22. default_type application/octet-stream;
  23. #设定mime类型,文件传送类型由mime.type文件定义
  24. server_names_hash_bucket_size 128;
  25. #保存服务器名字的hash表大小
  26. client_header_buffer_size 32k;
  27. #客户端请求头部缓冲区大小
  28. large_client_header_buffers 4 32k;
  29. #最大客户端头缓冲大小
  30. client_max_body_size 50m;
  31. #客户端最大上传文件大小(M)
  32. sendfile on;
  33. #sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
  34. tcp_nopush on;
  35. #这个是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。(只在sendfile on时有效)
  36. keepalive_timeout 60;
  37. #连接超时时间
  38. tcp_nodelay on;
  39. #禁用nagle算法,也即不缓存数据。有效解决网络阻塞
  40. fastcgi_connect_timeout 300;
  41. fastcgi_send_timeout 300;
  42. fastcgi_read_timeout 300;
  43. fastcgi_buffer_size 64k;
  44. fastcgi_buffers 4 64k;
  45. fastcgi_busy_buffers_size 128k;
  46. fastcgi_temp_file_write_size 256k;
  47. #fastcgi设置
  48. gzip on;
  49. gzip_min_length 1k;
  50. gzip_buffers 4 16k;
  51. gzip_http_version 1.1;
  52. gzip_comp_level 2;
  53. gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;
  54. gzip_vary on;
  55. gzip_proxied expired no-cache no-store private auth;
  56. gzip_disable "MSIE [1-6]\.";
  57. #limit_conn_zone $binary_remote_addr zone=perip:10m;
  58. ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
  59. server_tokens off;
  60. #隐藏nginx版本号(curl -I 192.168.4.154可以查看,更加安全)
  61. #log format
  62. log_format access '$remote_addr - $remote_user [$time_local] "$request"'
  63. '$status $body_bytes_sent "$http_referer" '
  64. '"$http_user_agent" $http_x_forwarded_for';
  65. #定义日志格式
  66. server
  67. {
  68. listen 80 default_server;
  69. #listen [::]:80 default_server ipv6only=on;
  70. #监听80端口,WEB服务的监听设置,可以采用"IP地址:端口"形式
  71. server_name www.lnmp.org lnmp.org;
  72. #服务器名,可以写多个域名,用空格分隔
  73. index index.html index.htm index.php;
  74. #默认网页文件
  75. root /home/wwwroot/default;
  76. #网页主目录
  77. #error_page 404 /404.html;
  78. include enable-php.conf;
  79. location /nginx_status
  80. {
  81. stub_status on;
  82. access_log off;
  83. }
  84. #开启status状态监测
  85. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  86. {
  87. expires 30d;
  88. }
  89. #静态文件处理,保存期30天
  90. location ~ .*\.(js|css)?$
  91. {
  92. expires 12h;
  93. }
  94. #js和css文件处理,保存期12小时
  95. location ~ /\.
  96. {
  97. deny all;
  98. }
  99. access_log /home/wwwlogs/access.log access;
  100. #正确访问日志
  101. }
  102. include vhost/*.conf;
  103. #vhost/下子配置文件生效
  104. }

4.Nginx工作模式

 nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

4.1 master-worker 

该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。

2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能

3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

4.2 单进程模式: 

 单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。(了解)

5. 中运行Nginx实验

5.1 使用官方镜像 

用户可以使用docker run指令直接运行官方Nginx镜像:

  1. $dockerrun-d-p80:80--namewebservernginx
  2. 34bcd01998a76f67b1b9e6abe5b7db5e685af325d6fafb1acd0ce84e81e71e5d

 然后使用docker ps指令查看当前运行的docker ps指令查看当前运行容器:

  1. $ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 34bcd01998a7 nginx " nginx..." 2min ago Up 0.0.0.0:80->80/tcp, 443/tcp webserver
目前Nginx容器已经在0.0.0.0:80启动,并映射了80端口,此时可以打开
浏览器访问此地址,就可以看到Nginx输出的页面,如图:

5.2 自定义Web页面

 同样的,创建index.html文件,并将index.html文件挂载至容器中,即可看到显示自定义的页面。

$ docker run --name nginx-container -p 80:80 -v index.html:/usr/share/nginx/ html:ro -d nginx

另外,也可以使用Dockerfile来构建新镜像。Dockerfile内容如下:

  1. FROM nginx
  2. COPY ./index.html /usr/share/nginx/html

 开始构建镜像my-nginx:

$ docker build -t my-nginx .

构建成功后执行docker run指令:

$ docker run --name nginx-container -d my-nginx

 

  👑👑👑结束语👑👑👑

为大家推荐一款刷题神奇 

各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!

牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发