微信扫一扫 分享朋友圈

已有 247 人浏览分享

开启左侧

Docker运行Web服务实战之Nginx

[复制链接]
247 0
1. Nginx介绍
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差异对比
image.png
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.        
  16.         worker_connections 51200;         
  17.         #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
  18.         }
  19. http
  20. #整体环境配置--网站配置
  21.         {
  22.                            include       mime.types;
  23.                            default_type  application/octet-stream;
  24.                          #设定mime类型,文件传送类型由mime.type文件定义
  25.              server_names_hash_bucket_size 128;               
  26.                          #保存服务器名字的hash表大小
  27.              client_header_buffer_size 32k;                       
  28.                          #客户端请求头部缓冲区大小
  29.              large_client_header_buffers 4 32k;                       
  30.                          #最大客户端头缓冲大小
  31.              client_max_body_size 50m;                               
  32.                          #客户端最大上传文件大小(M)
  33.              sendfile on;
  34.                          #sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
  35.              tcp_nopush     on;
  36.                          #这个是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。(只在sendfile on时有效)

  37.              keepalive_timeout 60;
  38.                          #连接超时时间
  39.              tcp_nodelay on;
  40.                          #禁用nagle算法,也即不缓存数据。有效解决网络阻塞

  41.                 fastcgi_connect_timeout 300;
  42.                 fastcgi_send_timeout 300;
  43.                 fastcgi_read_timeout 300;
  44.                 fastcgi_buffer_size 64k;
  45.                 fastcgi_buffers 4 64k;
  46.                 fastcgi_busy_buffers_size 128k;
  47.                 fastcgi_temp_file_write_size 256k;
  48.                                 #fastcgi设置
  49.                                gzip on;
  50.                         gzip_min_length  1k;
  51.                                gzip_buffers     4 16k;
  52.                         gzip_http_version 1.1;
  53.                         gzip_comp_level 2;
  54.                         gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;
  55.                         gzip_vary on;
  56.                         gzip_proxied   expired no-cache no-store private auth;
  57.                         gzip_disable   "MSIE [1-6]\.";
  58.                         #limit_conn_zone $binary_remote_addr zone=perip:10m;
  59.                         ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
  60.                 server_tokens off;
  61.                                 #隐藏nginx版本号(curl -I 192.168.4.154可以查看,更加安全)

  62.                        #log format
  63.                         log_format  access  '$remote_addr - $remote_user [$time_local] "$request"'
  64.                      '$status $body_bytes_sent "$http_referer" '
  65.                      '"$http_user_agent" $http_x_forwarded_for';
  66.                      #定义日志格式
  67.         server
  68.                 {
  69.                 listen 80 default_server;
  70.                         #listen [::]:80 default_server ipv6only=on;
  71.                                 #监听80端口,WEB服务的监听设置,可以采用"IP地址:端口"形式
  72.                 server_name www.lnmp.org lnmp.org;
  73.                                 #服务器名,可以写多个域名,用空格分隔
  74.                 index index.html index.htm index.php;
  75.                                 #默认网页文件
  76.                 root  /home/wwwroot/default;
  77.                                 #网页主目录
  78.                                 #error_page   404   /404.html;
  79.                                 include enable-php.conf;
  80.                
  81.                                 location /nginx_status
  82.                                         {
  83.                                             stub_status  on;       
  84.                                             access_log   off;
  85.                                         }
  86.                                 #开启status状态监测
  87.                                 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  88.                                         {
  89.                                             expires      30d;
  90.                                         }
  91.                                 #静态文件处理,保存期30天
  92.                                 location ~ .*\.(js|css)?$
  93.                                         {
  94.                                             expires      12h;
  95.                                         }
  96.                                 #js和css文件处理,保存期12小时
  97.                                 location ~ /\.
  98.                                         {
  99.                                             deny all;
  100.                                         }

  101.                                  access_log  /home/wwwlogs/access.log  access;
  102.                                 #正确访问日志
  103.                         }
  104. include vhost/*.conf;
  105. #vhost/下子配置文件生效
  106. }
复制代码
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. Docker中运行Nginx实验
5.1 使用官方镜像
用户可以使用docker run指令直接运行官方Nginx镜像:
    $dockerrun-d-p80:80--namewebservernginx
    34bcd01998a76f67b1b9e6abe5b7db5e685af325d6fafb1acd0ce84e81e71e5d
然后使用docker ps指令查看当前运行的docker ps指令查看当前运行容器:
    $ docker ps
    CONTAINER  ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
    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内容如下:
    FROM nginx
    COPY ./index.html /usr/share/nginx/html
开始构建镜像my-nginx:
$ docker build -t my-nginx .
构建成功后执行docker run指令:
$ docker run --name nginx-container -d my-nginx
免责声明:
1,海欣资源网所发布的资源由网友上传和分享,不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
2,海欣资源网的资源来源于网友分享,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3,海欣资源网所发布的资源由网友上传和分享,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
4,如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉,联系方式邮箱 haixinst@qq.com
海欣资源-企业信息化分享平台。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

35

主题
热度排行
回复排行
最新贴子

Archiver|手机版|海欣资源 ( 湘ICP备2021008090号-1 )|网站地图

GMT+8, 2024-11-21 14:21 , Gzip On, MemCached On.

免责声明:本站所发布的资源和文章均来自网络,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉。