精华内容
下载资源
问答
  • Nginx 调优

    万次阅读 2021-07-28 08:27:30
    Nginx 调优

    • 隐藏 Nginx 版本号
    • 修改 nginx 运行用户-设置 nginx 的 cpu 亲和力
    • 设置 Nginx 每个进程最多可以打开的文件数和事件处理模型
    • ServerName 和 location 匹配及高效传输模式
    • Fastcgi 调优-gzip 压缩网页调优-expires 缓存调优
    • 日志切割优化-目录文件访问控制-来源访问控制
    • 禁止使用 IP 访问网站和 301 优化-防盗链-错误页面的提示-开启认证功能  

    • 隐藏 Nginx 版本号,需要一共修改 3 个源代码文件 nginx.h   ngx_http_header_filter_module.c   ngx_http_special_response.c
    •  tar xf nginx-1.21.1.tar.gz -C /opt/
       cd /opt/nginx-1.21.1/
    • vim src/core/nginx.h
    • 改:
      define NGINX_VERSION "1.21.1"
      define NGINX_VER "nginx/" NGINX_VERSION
      为:
      #define NGINX_VERSION "8.8.8.8" #此行修改的是你想要的版本号。
      #define NGINX_VER "GF/" NGINX_VERSION #此行修改的是你想修改的软件名称。

    •  修改 HTTP 头信息中的 connection 字段,防止回显具体版本号
    • vim src/http/ngx_http_header_filter_module.c
    • 改:static char ngx_http_server_string[] = "Server: nginx" CRLF;
    • 为:static u_char ngx_http_server_string[] = "Server: GF" CRLF;

    • 修改 ngx_http_special_response.c 文件定义了 Nginx 报 404 错误时,不回显版本号。 
    • vim src/http/ngx_http_special_response.c
    • 改 :static u_char ngx_http_error_tail[] =
      "<hr><center>nginx</center>" CRLF
      "</body>" CRLF
      "</html>
    • 为:static u_char ngx_http_error_tail[] =
      "<hr><center>GF</center>" CRLF
      "</body>" CRLF
      "</html>

    • 编译和安装 nginx,安装 nginx 依赖包
    • yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel
    • 创建一个 nginx 用户用于后期启动 nginx 进程使用,比直接使用 root 用户启动 nginx 更安全
      useradd -s /sbin/nologin -M nginx 

    • ./configure --prefix=/usr/local/nginx1.21.1 --user=nginx --group=nginx \

      --with-http_ssl_module --with-http_dav_module --with-http_stub_status_module \

      --with-http_addition_module --with-http_sub_module --with-http_flv_module \

      --with-http_mp4_module --with-http_realip_module --with-http_gzip_static_module \

      --with-pcre --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log \

      --http-log-path=/var/log/nginx/access.log --with-debug --with-http_image_filter_module

    • --with-http_dav_module #启用支持(增加 PUT,DELETE,MKCOL:创建集合,COPY 和MOVE 方法)。 默认关闭,需要编译开启
      --with-http_stub_status_module #启用支持(获取 Nginx 上次启动以来的工作状态)。
      --with-http_addition_module #启用支持(作为一个输出过滤器,支持不完全缓冲,分部分相应请求)。
      --with-http_sub_module #启用支持(允许一些其他文本替换 Nginx 相应中的一些文本)。
      --with-http_flv_module #启用支持(提供支持 flv 视频文件支持)。
      --with-http_mp4_module #启用支持(提供支持 mp4 视频文件支持,提供伪流媒体服务端支持)。
      --with-pcre #支持 正则表达式
    • 用#./configure --help 查看帮助。
    • make -j 4 && make install
    • 启动 nginx 服务
      /usr/local/nginx/sbin/nginx

    • nginx systemctl 启动脚本

    • # vim /lib/systemd/system/nginx.service
      [Unit]
      Description=nginx
      After=network.target
      [Service]
      Type=forking
      ExecStart=/usr/local/nginx1.21.1/sbin/nginx
      ExecReload=/usr/local/nginx1.21.1/sbin/nginx -s reload
      ExecStop=/usr/local/nginx1.21.1/sbin/nginx -s quit
      PrivateTmp=true
      [Install]
      WantedBy=multi-user.target
    • # systemctl daemon-reload
      # systemctl enable nginx.service --now
      # systemctl is-enabled nginx

      enabled

    •  测试 :查看在 http 协议中是否隐藏了版本和软件名

    • 测试 :当访问时,出现 404 及其它错误时也会返回已经隐藏的版本信息

    • 测试 :当访问时,出现 403 错误也会返回已经隐藏的版本信息

    • 修改 Nginx 运行用户
    • vim /etc/nginx/nginx.conf
    • 改为:user  nginx;
       
    • 不重启 nginx 服务加载配置文件
    • /usr/local/nginx1.21.1/sbin/nginx -s reload   

    • 这个是以 nginx 身份运行的 worker process 是 nginx 的工作进程,work 进程才为用户提供服务
    • 设置 Nginx 运行进程个数,一般设置为 CPU 核心数或者核心数的2倍,或者设置为 auto 自动识别

    • vim /etc/nginx/nginx.conf
      worker_processes  auto;

    • 查看 nginx 管理进程和 4 个 work 进程的父子关系

    • pstree -p |grep nginx

    • pstree 属于 psmisc 包
    • yum -y install psmisc
    •  设置 Nginx 运行 CPU 的亲和力
      CPU 的亲和力,就是把 nginx 每个进程绑定到固定的 cpu 上,从而减少 cpu 上下文切换导致的额外的开销。
      比如服务器是 4 核 4 线程的 cpu,配置如下:
      vim /etc/nginx/nginx.conf
      worker_processes auto;     #在此行下添加
      worker_cpu_affinity 0001 0010 0100 1000; 
    •  如果服务器是 8 核 8 线程的 cpu,应该配置为如下:
    • worker_processes 8;
    • worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
    • 查看

      # /usr/local/nginx1.21.1/sbin/nginx -s reload
      # pstree -p |grep nginx
                 |-nginx(86539)-+-nginx(103390)
                 |              |-nginx(103391)
                 |              |-nginx(103393)
                 |              `-nginx(103395)
      # taskset -cp 103390 

    • list: 0      #表示 nginx PID 103390,只能在第一个 cpu 运行,以此类推

    • 设置 Nginx 每个进程最多可以打开的文件数和事件处理模型

    • Nginx 最多可以打开文件数
    • worker_rlimit_nofile 655350; 
      这个指令是指当一个 Nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与 nginx 进程数相除,即:(ulimit -n)/ worker_processes ,但是 nginx 分配请求并不是那么均匀,所以最好与 ulimit -n 的值保持一致。
    • 修改 ulimit -n 的值
    • ulimit -n 655350

    •  Nginx 事件处理模型
      # vim /usr/local/nginx/conf/nginx.conf
      events {
      use epoll; #添加这一行,使用 epoll 模式
      worker_connections 655350;

    • Nginx 事件处理模型对比

    select,poll,epoll 都是 nginx 下的 IO 多路复用的机制。I/O 多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
    Epoll 在 Linux2.6 内核中正式引入,和 select 和 poll 相似,其实都是 I/O 多路复用技术。

    • epoll 优势:

    Epoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大,具体数目可以 cat /proc/sys/fs/file-max 察看。
    # cat /proc/sys/fs/file-max
    808855
    效率提升,Epoll 最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll 的效率就会远远高于 select 和 poll。
    Epoll 在这点上使用了“共享内存”,更省内存,效率更高。

    • 单个进程允许客户端最大并发连接数 
      # 1  html  vim /etc/nginx/nginx.conf
      改:worker_connections 1024; 
      为:worker_connections 655350; 
    •  worker_connections:这个属性是指单个工作进程可以允许同时建立外部连接的数量。无论这个连接是外部主动建立的,还是内部建立的。一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受限于,操作系统 ulimit -n 设定的值和 nginx 的 worker_connections 的值。一般情况下系统 ulimit -n、worker_rlimit_nofile 、worker_connections 三者的值设定一致。 
    • nginx 服务器实际最大并发值就是:worker_processes*worker_connections 的乘积。
    • # top -u nginx               #Nginx 每个进程使用的内存大小。
    •    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                  
      104020 nginx     20   0  348828 275636   3148 S   0.0  3.4   0:00.37 nginx                                                                                                                    
      104021 nginx     20   0  348828 275632   3144 S   0.0  3.4   0:00.35 nginx                                                                                                                    
      104024 nginx     20   0  348828 275636   3148 S   0.0  3.4   0:00.36 nginx                                                                                                                    
      104025 nginx     20   0  348828 275632   3144 S   0.0  3.4   0:00.36 nginx 
    • 注:通过查看 RES 列,可以看到刚启动的 nginx 进程占用内存大概 275M 左右。

    • ServerName 和 location 匹配及高效传输模式 

    • ServerName 匹配
    • ServerName 匹配方式
      (1)、精确匹配:www.aa.com
      (2)、左侧通配符匹配:*.aa.com
      (3)、右侧通配符匹配:www.*
      (4)、正则表达式:~ ^.*\.aa\.com$
      (5)、default_server
      (5)、服务 IP 地址
    • 修改 server_name 值为实际的域名
      # vim /etc/nginx/nginx.conf
      改:server_name localhost;
      为:server_name  gf-beyond.com; 
      注:nginx 配置文件中,每个参数都是以分号;结束
    • -t #检测 nginx 配置文件是否正确

    • location 匹配如下:
      = 绝对匹配。
      ^~ URL 前半部分匹配,不检查正则。~ 正则匹配,区分大小写。
      ~* 正则匹配,不区分大小写。
      \ 转义。
      * 配置任意个任意字符。
      $ 以什么结尾。
      例:匹配出以.php 结尾的文件且配置时不区分大小写。 
    • location ~ \.php$ {..}  #~ \.php$ 表示 url 中以.php 结尾的文件且区分大小写,都按{...}中的方法进行处理 。 这个就可以完成我们的需求。
    • 例:匹配出以.txt 结尾的文件且配置时不区分大小写
       location ~* \.txt$ {
      root file;
      }
    • 开启高效传输模式

    • 在 http 模块内配置
    • http {
      Include mime.types;                                #媒体类型。
      default_type application/octet-stream;    #默认媒体类型 足够。
      sendfile on;           #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成 off。
      tcp_nopush on;必须在 sendfile 开启模式才有效,防止网络阻塞,积极的减少网络报文段的数量。
    • 连接超时时间
      主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的,TCP 的三次握手四次挥手等,我们一般断掉的是那些建立连接但是不做事儿,也就是我建立了链接开始,但是后续的握手过程没有进行,那么我们的链接处于等待状态的,全部断掉!
      同时我们也希望 php 建议短链接,消耗资源少。
    • keepalive_timeout 65;       #在此行下加入如下
      tcp_nodelay on;
      client_header_timeout 15;
      client_body_timeout 15;
      send_timeout 15;
    • keepalived_timeout 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。
      tcp_nodelay;也是防止网络阻塞,不过要包涵在 keepalived 参数才有效。client_header_timeout 客户端请求头读取超时时间,如果超过设个时间没有发送任何数据,nginx将返回 request time out 的错误。
      client_body_timeout 客户端求主体超时时间,超过这个时间没有发送任何数据,和上面一样的错误提示。
      send_timeout 响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx 关闭连接。
    • 文件上传大小限制  , PHP 可以修改上传文件大小限制,nginx 也可以修改。
    • client_max_body_size 10m;
    • Fastcgi 调优-gzip 压缩网页调优-expires 缓存调优
    • 使用 gzip 压缩功能,可能为我们节约带宽,加快传输速度,有更好的体验,节约成本,所以说这是一个重点。
      Nginx 启用压缩功能需要 ngx_http_gzip_module 模块,apache 使用的是 mod_deflate
      一般需要压缩的内容有:文本,js,html,css,对于图片,视频,flash 什么的不压缩,同时也要注意,使用 gzip 的功能需要消耗 CPU 
    •     gzip on;
          gzip_min_length 1k;
          gzip_buffers 4 16k;
          gzip_http_version 1.1;
          gzip_comp_level 9;
          gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml font/ttf font/otf
          gzip_vary on;
          gzip_proxied expired no-cache no-store private auth;
          gzip_disable "MSIE [1-6]\.";
    • gzip on; #开启压缩功能。
      gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从 header 头的Content-Length(内容长度)中获取,默认值是 0,不管页面多大都进行压缩,建议设置成大于 1K,如果小与 1K 可能会越压越大。
      gzip_buffers 4 32k; #压缩缓冲区大小,表示申请 4 个单位为 32K 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果。
      gzip_http_version 1.1; #压缩版本(默认 1.1,前端为 squid2.5 时使用 1.0)用于设置识别 HTTP协议版本,默认是 1.1,目前大部分浏览器已经支持 GZIP 解压,使用默认即可。
      gzip_comp_level 9; #压缩比例,用来指定 GZIP 压缩比,1 压缩比最小,处理速度最快,9 压缩比最大,传输速度快,但是处理慢,也比较消耗 CPU 资源。
      gzip_types text/css text/xml application/javascript; #用来指定压缩的类型,‘text/html’类型总是会被压缩。
      gzip_vary on; #vary header 支持,该选项可以让前端的缓存服务器缓存经过 GZIP 压缩的页面,
      例如用 Squid 缓存经过 nginx 压缩的数据。
    • Fastcgi 相关概念
      FastCGI 是一种协议,规定了 FastCGI 应用和支持 FastCGI 的 Web 服务器之间的接口。Fastcgi 是静态服务和动态服务的一个接口 FastCGI 是二进制连续传递的。
      Fastcgi 相关的个概念如下:
      Cache:写入缓存区
      Buffer:读取缓存区
      Fastcgi 是静态服务和动态服务的一个接口
    •     fastcgi_send_timeout 300;
          fastcgi_read_timeout 300;
          fastcgi_buffers 4 64k;
          fastcgi_busy_buffers_size 128k;
          fastcgi_temp_path /var/run/nginx-tmp-cache;
          fastcgi_temp_file_write_size 128k;
          fastcgi_cache_path /var/run/nginx-cache levels=1:2
          keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
    • }
    • 在 server 标签添加如下:
    • server {
    • .......
    •         location ~ .*\.(php|php5)?$ {
               root           /usr/local/nginx1.21.1/html;
               fastcgi_pass 127.0.0.1:9000;
               fastcgi_index index.php;
               fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
               include        fastcgi_params;
               include        fastcgi.conf;
               fastcgi_cache ngx_fcgi_cache;
               fastcgi_cache_valid 200 302 1h;
               fastcgi_cache_valid 301 1d;
               fastcgi_cache_valid any 1m;
               fastcgi_cache_min_uses 1;
               fastcgi_cache_use_stale error timeout invalid_header http_500;
               fastcgi_cache_key http://$host$request_uri;
              }
      .......
      }
    • fastcgi cache 资料 官方文档:

    http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cache

    配置详解:
    HTTP 字段:
    fastcgi_connect_timeout 300; #指定链接到后端 FastCGI 的超时时间。
    fastcgi_send_timeout 300; # Nginx 允许 FastCGI 服务器返回数据的超时时间,即在规定时间内后端服务器必须传完所有的数据,否则 Nginx 将断开这个连接。
    fastcgi_read_timeout 300; # Nginx 从 FastCGI 服务器读取响应信息的超时时间,表示连接建立成功后,Nginx 等待后端服务器的响应时间。
    fastcgi_buffers 4 64k; #指定缓冲区的数量和大小,如果一个 PHP 脚本返回的页面大小为 256K,则分配为 4 个 64K 的缓冲区来缓存,大于缓冲区大小的应答结果将被写入 temp_file 临时文件中。推荐该值为你的站点 php 脚本返回的页面大小的平均进行设置,尽量不需要使缓存文件写入磁
    盘,也不要设置太大导致内存资源浪费。
    fastcgi_temp_path /var/run/nginx-tmp-cache; #指定临时目录
    fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=ngx_fcgi_cache:512m 
    inactive=1d max_size=40g; #定义缓存的路径、大小、缓存时间。
    上条命令详解:(参数过长拆分详解)
    fastcgi_cache_path 创建缓存路径,如果指定其他路径需注意上层目录是否创建。
    levels:指定了该缓存空间有两层 hash 目录,设置缓存目录层数,levels=1:2,表示创建两层目录缓存,最多创建三层。第一层目录名取 fastcgi_cache_key md5 的最后一个字符,第二层目录名取倒数2-3 字符,如:fastcgi_cache_key md5 为 b7f54b2df7773722d382f4809d65029c,则:
    注:levels 虽然可以设置 3 层但是数值请勿大于 2.如果设置 1:2:3 则报错。1:2:2 则正常。
    levels=2:2 为/var/run/nginx-cache/9c/02/b7f54b2df7773722d382f4809d65029c
    levels=1:2 为/var/run/nginx-cache/c/29/b7f54b2df7773722d382f4809d65029c
    keys_zone 为这个缓存区起名为 zone_name
    512m 指缓存空间最一开始为 512MB;
    inactive=1d 代表如果缓存文件一天内没有被访问,则删除;
    max_size=40g 代表缓存最大为 40G,建议根据自己的磁盘剩余空间来写大小,不能超过剩余缓存的 80%;

    Server 字段中配置详解:
    include fastcgi.conf; #引用 fastcgi 默认配置文件
    fastcgi_cache ngx_fcgi_cache; #指定缓存名称,由 http 字段中 fastcgi_cache_path
    创建。
    fastcgi_cache_valid 200 302 1h; #设置 200、302 状态的 URL 缓存 1 小时
    fastcgi_cache_valid 301 1d; #设置 301 状态的 URL 缓存 1 天。
    fastcgi_cache_valid any 1m; #将其他应答缓存为 1 分钟。
    fastcgi_cache_min_uses 1; #设置请求 1 次就会被缓存。
    fastcgi_cache_use_stale error timeout invalid_header http_500; #设置 500 状态码
    不进行缓存。500 状态码意思是:内部服务器错误
    fastcgi_cache_key http://$host$request_uri; #该指令用来设置 Web 缓存的 Key 值,Nginx
    根据 Key 值 MD5 缓存。一般根据 host(域名),request_uri(请求的路径)等变量组合成
    fastcgi_cache_key。MD5 值将作为缓存文件名。

    • expires 缓存调优
      缓存,主要针对于图片,css,js 等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,完全可以设置图片在浏览器本地缓存 365d,css,js,html 可以缓存个 10 来天,这样用户第一次打开加载慢一点,第二次,就非常快了!缓存的时候,我们需要将需要缓存的拓展名列出来!
    • Expires 缓存配置在 server 字段里面:
    •         location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
                      expires 365d;
              }
              
              location ~ .*\.(js|css)?$ {
                      expires 30d;
              }

              location ~ ^/(images|javascript|js|css|flash|media|static)/ {
                      expires 360d;
              }

              location ~(robots.txt) {
                      expires 7d;
                      break;
              }

    • }

    • expire 功能缺点:
      被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
      解决办法:
      第一个 缩短缓存时间,例如:1 天,不彻底,除非更新频率大于 1 天。
      第二个 对缓存的对象改名。
      a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已。
      b.网站升级对于 js,css 元素,一般可以改名,把 css,js,推送到 CDN。
      网站不希望被缓存的内容:
      1)广告图片
      2)网站流量统计工具
      3)更新频繁的文件(google 的 logo)
    • 查看缓存目录

    • 将缓存文件挂载至内存
    • # vim /etc/fstab #添加一行
      tmpfs /var/run/nginx-cache tmpfs defaults,size=512M 0 0
      mount -a
      df -Th

    • 注:fastcgi_cache 缓存是先写在 fastcgi_temp_path 再移到 fastcgi_cache_path,所以如果不选择将缓存目录挂载至内存,建议 tmp_path 和 cache_path 在同一分区中,同分区文件复制不会占用过高的 IO 资源。
    •  浏览器 F12 查看缓存情况 

    • ​​​日志切割优化-目录文件访问控制-来源访问控制

    • 日志优化的目的,是为了一天日志一压缩,按天存放,超过 10 天的删除。


    • # vim /usr/local/nginx1.21.1/logs/cut_nginx_log.sh         #每天日志分割脚本。

    • #!/bin/bash
      date=$(date +%F -d -1day)
      cd /var/log/nginx/
      if [ ! -d cut ] ; then mkdir cut
      fi
      mv access.log cut/access_$(date +%F -d -1day).log
      mv error.log cut/error_$(date +%F -d -1day).log
      /usr/local/nginx1.21.1/sbin/nginx -s reload
      tar -JcPf cut/$date.tar.xz cut/*
      mv cut/$date.tar.xz /var/log/nginx/
      rm -f cut/access* && rm -f cut/error*
      if [[ -z `egrep -v "00 00 * * * /bin/bash /usr/local/nginx1.21.1/logs/cut_nginx_log.sh &> /dev/null" /var/spool/cron/root` ]]; then
      echo "00 00 * * * /bin/bash /usr/local/nginx1.21.1/logs/cut_nginx_log.sh &> /dev/null" >> /var/spool/cron/root
      fi
      find /var/log/nginx/cut/ -type f -mtime +10 | xargs rm -rf

    • chmod +x cut_nginx_log.sh

    • ./cut_nginx_log.sh

    • 健康检查的日志,不用输入到 log 中,因为这些日志没有意义,我们分析的话只需要分析访问日志,看看一些页面链接,如 200,301,404 的状态码,在 SEO 中很重要,而且我们统计 PV 是页面计算,这些都没有意义,反而消耗了磁盘 IO,降低了服务器性能,可以屏蔽这些如图片,js,css 这些不宜变化的内容。
      # vim /etc/nginx/nginx.conf
    • server {
    • ......
             location ~ .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
                      access_log off;
              }
    • ........
    •  }
    • 测试读取日志文件 

    • 日志目录权限优化:只允许root用户有更改权限
    • chown -R root. /var/log/nginx/
    • 日志格式优化

    • 注意不能写在 server 字段 否则会报一个类似:nginx: [emerg] “log_format” directive is not allowed here in的错误
    • log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for ' '"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';
      其中,各个字段的含义如下:
       1. $remote_addr 与$http_x_forwarded_for 用以记录客户端的 ip 地址;
       2. $remote_user :用来记录客户端用户名称;
       3. $time_local : 用来记录访问时间与时区;
       4. request : 用来记录请求的 url 与 http 协议;
       5. status : 用来记录请求状态,功是 200;
       6. body_bytes_s ent :记录发送给客户端文件主体内容大小;
       7. http_referer :用来记录从哪个页面链接访问过来的;
       8. http_user_agent :记录客户端浏览器的相关信息;

    • 目录文件访问控制
      主要用在禁止目录下指定文件被访问,当然也可以禁止所有文件被访问!一般什么情况下用?比如是有存储共享,这些文件本来都只是一些下载资源文件,那么这些资源文件就不允许被执行,如 sh,py,pl,php等等。
      例如:禁止访问 images 下面的 php 程序文件 
    • 在 server 字段添加
    • server {
    • ......
    •         location ~ ^/images/(jpg|png)/.*\.(php|php5|.sh|.py|.py)$ {
                       deny all;
              }
    • }
    • echo "<?php phpinfo(); ?>" > /usr/local/nginx1.21.1/html/images/test.php
    • chown root. /usr/local/nginx1.21.1/html/images/test.php
    • chmod 600 /usr/local/nginx1.21.1/html/images/test.php

    •  其他文件访问正常

    •  images 下的其他目录下的 PHP 文件

    •  配置 nginx 禁止访问*.txt 文件
    • server {
    • .................
    •         location ~* \.(txt|doc)$ {
                      if ( -f $request_filename) {
                      root /usr/local/nginx1.21.1/html;
                      break;
                      }
                      deny all;
              }
    • ....................
    • }

    •  其他目录

    •  也可以重定向到某一个 URL
    • server {
    • ..........
      location ~* \.(txt|doc)$ {

                    if ( -f $request_filename) {
                    root /usr/local/nginx1.21.1/html;
                    rewrite ^/(.*)$ http://www.gf-beyond.com last;
                    break;
                    }
                    #deny all;
            }
    ......
    }


     

    •  对目录进行限制的方法
    • server {
      ........

              location ~ ^/(upload)/ {
                      deny all;
              }

              location ~ ^/(test)/ {
                      deny all;
              }

      ........
      }

    • 来源访问控制
      需要 ngx_http_access_module 模块支持
    • server {
      .......
              location / {
                  root   /usr/local/nginx1.21.1/html;
                  index  index.html index.htm;
                      allow 192.168.1.0/24;
                      deny all;
              }
      .........
      }
    •  这里为了测试改成 1.0 网段,本地使用 2.0 网段

    •  禁止使用 IP 访问网站和 301 优化-防盗链-错误页面的提示开启认证功能

    • 有时候,访问网站的时候,使用 IP 也可以,把这一层给屏蔽掉,让其直接反馈给 403,也可以做跳转。
    • 禁止 IP 直接访问,跳转到首页
    • server {
      ...............

              listen       80;
              server_name  www.gf-beyond.com gf-beyond.com;

              if ( $host = '192.168.2.40' ) {
                       rewrite ^/(.*)$ http://www.gf-beyond.com/$1 permanent;
              }

      ......................

      }

    • 查看日志 304 跳转

    •  域名跳转的做法:
    •     server {
              listen       80;
              server_name  gf-beyond.com;

              rewrite ^ http://www.baidu.com$request_uri?;
      ........
      }

    •  访问 http://www.gf-beyond.com 会直接跳转到  baidu.com
    • 403 反馈的做法
      server {
       listen 80 default_server;
       server_name _;
       return 403;
      ........
      }

    • 访问 gf-beyond.com 会跳转到  http://www.gf-beyond.com

    •  防盗链

    • 防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的解决办法由几种:
      1:水印,品牌宣传,你的带宽,服务器足够
      2:防火墙,直接控制,前提是你知道 IP 来源
      3:防盗链策略
      下面的方法是直接给予 404 的错误提示:
    • server {
      .......
              location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
                      valid_referers none blocked *.gf-beyond.com gf-beyond.com;
                      if ($invalid_referer) {
                      return 404;
                      }
              }
      ........
      }

    •  在图片上右键 --- 在新标签页打开图片

    • 同时,我们也可以设置一个独有的,图片比较小的,来做 rewrite 跳转
      server {
      .........
      location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
       valid_referers none blocked *.beyond.com beyond.com;
       if ($invalid_referer) {
       rewrite ^/ http://www.gf-beyond.com/images/nolink.png;
       }
      }
      ....
      }

    • 错误页面的提示

    • 对于自定义的错误页面,我们只需要将 errorpage 写入到配置文件。
    • server {
      ........
      error_page 404 /404.html;
      ...............
      }

    •  开启认证功能
    • server {
      .............
      location ~ /test/ {
       auth_basic "gf";
       auth_basic_user_file /usr/local/nginx1.21.1/passwd;
       }
      ........................
    • htpasswd -cb /usr/local/nginx1.21.1/passwd gf 123456
      chmod 400 /usr/local/nginx1.21.1/passwd 
      chown nginx. /usr/local/nginx1.21.1/passwd
      nginx -s reload

     

    • 防止 DDOS 攻击
      通过使用 limit_conn_zone 进行控制单个 IP 或者域名的访问次数。
    • vim /etc/nginx/nginx.conf
    • http {
      .......
      limit_conn_zone $binary_remote_addr zone=addr:10m;
      ........

      server {
      ...................
      location / {
                  root   /usr/local/nginx1.21.1/html;
                  index  index.html index.htm;
                      allow 192.168.2.0/24;
                      deny all;
                      limit_conn addr 1;
              }
      ...................
      }
    • 测试
    • 在另外一台机器上 
    • ab -n 2 -c 2 -t 1 http://192.168.2.40/test/11.html
    • 测试  -n 发出 2个 在 -t 1秒内并发 -c 2个请求

    • 查看 192.168.2.40 的访问日志

    • 加大测试次数
    • ab -n 200 -c 200 -t 1 http://192.168.2.40/1.html

    •  查看日志

    •  server {
      .......
             location / {
                  root   /usr/local/nginx1.21.1/html;
                  index  index.html index.htm;
                      allow 192.168.2.0/24;
                      deny all;
                      limit_conn addr 1;
                      set $no_cache 0;
                              if ($request_method = POST) {
                                      set $no_cache 1;
                              }
                              if ($query_string != "") {
                                      set $no_cache 1;
                              }
                              if ($request_uri ~* "(/zb_system/)") {
                                      set $no_cache 1;
                              }
                              fastcgi_cache_bypass $no_cache;
                              fastcgi_no_cache $no_cache;

              }
      .........

      }
    • 再次测试


    • 完整 配置文件内容

    • grep -Ev "^$|^#|^[[:space:]].*#.*$" /etc/nginx/nginx.conf
      user  nginx;
      worker_processes  auto;
      worker_cpu_affinity 0001 0010 0100 1000;
      worker_rlimit_nofile 655350;
      events {
          use epoll;
          worker_connections  655350;
      }
      http {
          include       mime.types;
          default_type  application/octet-stream;
          sendfile       on;
          tcp_nopush     on;
          keepalive_timeout  65;
          tcp_nodelay on;
          client_header_timeout 15;
          client_body_timeout 15;
          send_timeout 15;
          client_max_body_size 10m;
          gzip on;
          gzip_min_length 1k;
          gzip_buffers 4 16k;
          gzip_http_version 1.1;
          gzip_comp_level 9;
          gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml font/ttf font/otf application/x-httpd-php image/jpeg image/gif image/png; 
          gzip_vary on;
          gzip_proxied expired no-cache no-store private auth;
          gzip_disable "MSIE [1-6]\.";
          fastcgi_send_timeout 300;
          fastcgi_read_timeout 300;
          fastcgi_buffers 4 64k;
          fastcgi_busy_buffers_size 128k;
          fastcgi_temp_path /var/run/nginx-tmp-cache;
          fastcgi_temp_file_write_size 128k;
          fastcgi_cache_path /var/run/nginx-cache levels=1:2 
          keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
          log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for ' '"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';
          limit_conn_zone $binary_remote_addr zone=addr:10m;
          server {
              listen       80;
              server_name  www.gf-beyond.com gf-beyond.com;
              charset utf-8;
           if ( $host = 'gf-beyond.com' ) {
               rewrite ^/(.*)$ http://www.gf-beyond.com/$1 permanent;
           }
           if ( $host = '192.168.2.40' ) {
               rewrite ^/(.*)$ http://www.gf-beyond.com/$1 permanent;
           }
          location ~* .*\.(js|css|jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar|mp4|rm|rmvb|mkv|gz)$ {
              expires 360d;
              valid_referers none blocked *.gf-beyond.com gf-beyond.com;
                          if ($invalid_referer) {
                              rewrite ^/ http://www.gf-beyond.com/images/nolink.png;
                          }
           }
          location ~* ^/(images|fonts|javascript|css|js|flash|media|static|assets)/ {
              expires 360d;
           }
          location ~(robots.txt) {
              expires 7d;
               break;
           }
          location ~ .*\.(js|jpg|jpeg|JPG|JPEG|css|bmp|gif|GIF)$ {
              access_log off;
          }
              location / {
                  root   /usr/local/nginx1.21.1/html;
                  index  index.html index.htm;
              allow 192.168.2.0/24;
              deny all;
              limit_conn addr 1;
              set $no_cache 0;
                   if ($request_method = POST) {
                       set $no_cache 1;
                   }
                  if ($query_string != "") {
                      set $no_cache 1;
                  }
                  if ($request_uri ~* "(/)") {
                      set $no_cache 1;
                  }
                  fastcgi_cache_bypass $no_cache;
                  fastcgi_no_cache $no_cache;
              }
           location ~* ^/images/(jpg|png)/.*\.(php|php5|.sh|.py|.pl)$ {
               deny all;
               }    
          location ~* \.(txt|doc)$ {
              if ( -f $request_filename) {
              root /usr/local/nginx1.21.1/html;
              rewrite ^/(.*)$ http://www.gf-beyond.com last;
               break;
               }
              }
              error_page  404              /404.html;
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }
          location ~ .*\.(php|php5)?$ {
           root        /usr/local/nginx1.21.1/html;
            fastcgi_pass 127.0.0.1:9000;
           fastcgi_index index.php;
               fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
               include        fastcgi_params;
           include     fastcgi.conf;
           fastcgi_cache ngx_fcgi_cache;
           fastcgi_cache_valid 200 302 1h;
           fastcgi_cache_valid 301 1d;
           fastcgi_cache_valid any 1m;
           fastcgi_cache_min_uses 1;
           fastcgi_cache_use_stale error timeout invalid_header http_500;
           fastcgi_cache_key http://$host$request_uri;
              }
          location ~ /test/ {
              auth_basic "gf";
              auth_basic_user_file /usr/local/nginx1.21.1/passwd;
              }
          }
      }
    • 切割日志脚本
    • cut_nginx_log.sh 
      #!/bin/bash
      #
      if [[ `id -u` != "0" ]]; then
          echo "Must by root !";
          exit 1;
      fi

      date=$(date +%F -d -1day)
      logdir=/var/log/nginx

      if [[ ! -d $logdir ]]; then
          echo "Log Dir is not found !"
          exit 2;
      elif [[ ! -d $logdir/cut ]] ; then 
          mkdir $logdir/cut &> /dev/null
      fi

      cd $logdir
      mv access.log cut/access_$date.log
      mv error.log cut/error_$date.log

      /usr/local/nginx1.21.1/sbin/nginx -s reload

      if [[ -n $logdir/cut/$date.tar.xz ]]; then
      tar -JcPf $logdir/$date.tar.xz cut/*
      fi

      rm -f cut/*.log

      if [[ -z `egrep -v "00 00 * * * /bin/bash /usr/local/nginx1.21.1/logs/cut_nginx_log.sh &> /dev/null" /var/spool/cron/root` ]]; then
      echo "00 00 * * * /bin/bash /usr/local/nginx1.21.1/logs/cut_nginx_log.sh &> /dev/null" >> /var/spool/cron/root
      fi

      find $logdir -type f -mtime +7 | xargs rm -rf {}

    展开全文
  • nginx

    万次阅读 多人点赞 2019-02-28 16:39:12
    nginx1. nginx简介2. nginx的特性与优点2.1 nginx的特性2.2 nginx的优点3. nginx反向代理3.1 反向代理的作用3.2 正向代理和反向代理的区别4. nginx的安装与配置4.1 nginx的安装4.2 nginx安装后的配置 1. nginx简介 ...

    1. nginx简介

    nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

    nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

    2. nginx的特性与优点

    2.1 nginx的特性

    • Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
    • 高度的模块化和自由软件许可证是的第三方模块层出不穷(这是个开源的时代啊~)
    • Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操作系统上
    • 这些优秀的设计带来的极大的稳定性

    2.2 nginx的优点

    • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
    • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
    • 配置文件非常简单:风格跟程序一样通俗易懂
    • 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
    • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
    • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
    • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
    • 稳定性高:用于反向代理,宕机的概率微乎其微
    • 模块化设计:模块可以动态编译
    • 外围支持好:文档全,二次开发和模块较多
    • 支持热部署:可以不停机重载配置文件
    • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

    3. nginx反向代理

    多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。

    客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

    反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

    3.1 反向代理的作用

    • 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
    • 负载均衡,通过反向代理服务器来优化网站的负载

    3.2 正向代理和反向代理的区别

    • 在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;
    • 在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

    4. nginx的安装与配置

    4.1 nginx的安装

    //创建系统用户nginx

    [root@xaii ~]# groupadd -r nginx
    [root@xaii ~]# useradd -r -M -s /sbin/nologin -g nginx nginx
    

    //安装依赖环境

    [root@xaii ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
    暗转过程省略......
    [root@xaii ~]# yum -y groups mark install 'Development Tools'
    安装过程省略......
    

    //创建日志存放目录

    [root@xaii ~]# mkdir -p /var/log/nginx
    [root@xaii ~]# chown -R nginx.nginx /var/log/nginx/
    

    //下载nginx,下载过程省略,存放至/usr/src目录下

    [root@xaii src]# wget http://nginx.org/download/nginx-1.12.0.tar.gz
    [root@xaii ~]# ls /usr/src/ |grep nginx
    nginx-1.12.0.tar.gz
    

    //编译安装nginx

    [root@xaii src]# tar xf nginx-1.12.0.tar.gz 
    [root@xaii src]# cd nginx-1.12.0
    
    [root@xaii nginx-1.12.0]# ./configure \
     --prefix=/usr/local/nginx \
     --user=nginx \
     --group=nginx \
     --with-debug \
     --with-http_ssl_module \
     --with-http_realip_module \
     --with-http_image_filter_module \
     --with-http_gunzip_module \
     --with-http_gzip_static_module \
     --with-http_stub_status_module \
     --http-log-path=/var/log/nginx/access.log \
     --error-log-path=/var/log/nginx/error.log
    //安装过程省略....
    
    [root@xaii nginx-1.12.0]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
    //-j是指定多少内核
    //过程省略......
    

    4.2 nginx安装后的配置

    //添加环境变量

    [root@xaii ~]# vim /etc/profile.d/nginx.sh
    [root@xaii ~]# cat /etc/profile.d/nginx.sh 
    export PATH=/usr/local/nginx/sbin:$PATH
    [root@xaii ~]# . /etc/profile.d/nginx.sh
    

    //服务控制方式,使用nginx命令

    -t  //检查配置文件语法
    [root@xaii ~]# nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    
    
    -v  //输出nginx的版本
    root@xaii ~]# nginx -v
    nginx version: nginx/1.12.0
    
    -c  //指定配置文件的路径
    需要拷贝两个文件:nginx.conf和mime.type至新的路径
    [root@xaii conf]# cp -a nginx.conf /opt/nginx/
    [root@xaii conf]# cp -a mime.types /opt/nginx
    [root@xaii ~]# ps -ef |egrep -v 'grep'|grep nginx
    root       4040      1  0 00:03 ?        00:00:00 nginx: master process nginx -c /optnginx/nginx.conf
    nginx      4041   4040  0 00:03 ?        00:00:00 nginx: worker process
    可以看到,现在用的配置文件为/opt/nginx/nginx.conf
    
    -s  //发送服务控制信号,可选值有{stop|quit|reopen|reload}
    

    //nginx和apache不能同时开启

    //因为apache和nginx的端口都是80,当apache服务开启时,无法开始nginx服务
    
    [root@xaii ~]# ss -antlp|grep 80
    LISTEN     0      128         :::80                      :::*                   users:(("httpd",pid=4081,fd=4),("httpd",pid=4080,fd=4),("httpd",pid=4079,fd=4),("httpd",pid=4078,fd=4),("httpd",pid=4077,fd=4),("httpd",pid=4076,fd=4))
        
    [root@xaii ~]# nginx
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    ^C
    

    //关闭apache服务,再开启nginx服务

    [root@xaii ~]# apachectl stop
    [root@xaii ~]# nginx
    [root@xaii ~]# ss -antlp|grep 80
    LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=4069,fd=6),("nginx",pid=4068,fd=6))
    

    4.3利用脚本控制nginx服务的开启,重载,和关闭

    #! /bin/bash
    
    nginx=/usr/local/nginx/sbin/nginx
    conf_path=/opt/nginx/nginx.conf
    
    case $1 in
    start)
            $nginx -c $conf_path
    if [ $? -eq 0 ];then
            echo 'nginx start sucessful'
    else
            echo 'nginx start faild'
    fi
            ;;
    
    
    restart)
            $nginx -s stop
            $nginx -c $conf_path
    if [ $? -eq 0 ];then
            echo 'nginx restart sucessful'
    else
            echo 'nginx restart faild'
    fi
            ;;
    
    
    stop)
            $nginx -s stop 2>/dev/null
    if [ $? -eq 0 ];then
            echo 'nginx is off'
    else
            echo 'nginx error'
    fi
            ;;
    esac
    

    5. nginx的配置文件详解

    主配置文件:/usr/local/nginx/conf/nginx.conf

    • 默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
    • 可以在启动nginx时通过-c选项来指定要读取的配置文件

    5.1 nginx.conf配置详解

    nginx.conf的内容分为以下几段:

    • main配置段:全局配置段。其中main配置段中可能包含event配置段
    • event {}:定义event模型工作特性
    • http {}:定义http协议相关的配置

    支持使用变量:

    • 内置变量:模块会提供内建变量定义
    • 自定义变量:set var_name value

    5.2 用于调试、定位问题的配置

    • 参数daemon {on|off}; //是否以守护进程方式运行nginx,调试时应设置为off
    • master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
    • error_log 位置 级别; //配置错误日志

    5.3 正常运行必备的配置参数

    • user USERNAME [GROUPNAME]; //指定运行worker进程的用户和组

    • pid /path/to/pid_file; //指定nginx守护进程的pid文件

    • worker_rlimit_nofile number; //设置所有worker进程最大可以打开的文件数,默认为1024(文件系统最大打开的文件数为65535)

        //此设置为nginx的配置,还需配置系统的文件
        [root@nginx ~]# head -3 /usr/local/nginx/conf/nginx.conf
        user  nginx;(初始为nobody)
        worker_processes  4;(cpu核心数)
        worker_rlimit_nofile 30000;(默认为1024,最大为65535,我们设置为30000)
        [root@nginx ~]# nginx -s reload
      
      
        //修改系统的硬限制和软限制,都设置为最大的65535
        [root@nginx ~]# vim /etc/security/limits.conf 
        [root@nginx ~]# tail -4 /etc/security/limits.conf 
        * soft nofile 65535
        * hard nofile 65535
      
        # End of file
      
    • worker_rlimit_core size; //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可

    5.4 优化性能的配置参数

    • worker_processes n; //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
    • worker_cpu_affinity cpumask …; //将进程绑定到某cpu中,避免频繁刷新缓存
      • //cpumask:使用8位二进制表示cpu核心,如:
        0000 0001 //第一颗cpu核心
        0000 0010 //第二颗cpu核心
        0000 0100 //第三颗cpu核心
        0000 1000 //第四颗cpu核心
        0001 0000 //第五颗cpu核心
        0010 0000 //第六颗cpu核心
        0100 0000 //第七颗cpu核心
        1000 0000 //第八颗cpu核心
    • timer_resolution interval; //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数
    • worker_priority number; //指明worker进程的nice值

    //具体配置:

    [root@nginx ~]# head /usr/local/nginx/conf/nginx.conf |grep worker_
    worker_processes  4;(cpu核心数为4个)
    worker_rlimit_nofile 30000;
    worker_cpu_affinity 00000001 00000010 00000100 00001000;(所以这里也只能写4个)
    [root@nginx ~]# nginx -s reload
    

    5.5 事件相关的配置:event{}段中的配置参数

    • accept_mutex {off|on}; //master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求

        [root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf	
        	  events {
            worker_connections  1024;
            accept_mutex on;(添加此内容)
        }
      
    • lock_file file; //accept_mutex用到的互斥锁锁文件路径

        pid        logs/nginx.pid;
        lock_file  logs/nginx.lock;(添加此内容,写在event外部,顶格写)
      
    • use [epoll | rtsig | select | poll]; //指明使用的事件模型,建议让nginx自行选择

    • worker_connections #; //每个进程能够接受的最大连接数

        events {
        worker_connections  1024;
        accept_mutex on;
      

      }

    注意:

    worker_connections(连接数) * worker_processes(cpu核心数) <=30000
    

    5.6 网络连接相关的配置参数

    • keepalive_timeout number; //长连接的超时时长,默认为65s

        keepalive_timeout  65;
      
    • keepalive_requests number; //在一个长连接上所能够允许请求的最大资源数

        keepalive_requests 100;(配置文件中没有设置,默认为100,看自己的业务设置)
      
    • keepalive_disable [msie6|safari|none]; //为指定类型的UserAgeng禁用长连接

    • tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on

        tcp_nodelay on;(默认为on)
      
    • client_header_timeout number; //读取http请求报文首部的超时时长

    • client_body_timeout number; //读取http请求报文body部分的超时时长

    • send_timeout number; //发送响应报文的超时时长

    5.7 fastcgi的相关配置参数

    LNMP:php要启用fpm模型
    配置示例如下:

    location ~ \.php$ {
      root html;
      fastcgi_pass 127.0.0.1:9000;      //定义反向代理
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
      include fastcgi_params;
    }
    

    6. 搭建lnmp架构

    6.1 环境:

    nginx端:192.168.157.69
    php、mysql、zabbix端:192.168.157.59

    6.2 php安装

    详情请看:php安装

    6.3 mysql安装

    详情请看:mysql安装

    6.4 php端配置

    //修改配置文件并重启php服务

    [root@xaii ~]# tail -2 /usr/local/php7/etc/php-fpm.conf
    
    listen = 192.168.157.59:9000	(//添加此内容)
    listen.allowed_clients = 192.168.157.69	(//添加此内容)
    
    [root@xaii ~]# service php-fpm restart 
    Gracefully shutting down php-fpm . done
    Starting php-fpm  done
    
    [root@xaii ~]# ss -antl |grep 9000
    LISTEN     0      128    192.168.157.59:9000                     *:*        
    

    6.5 nginx端配置

    //修改配置文件并新加载nginx服务

    location / {
    root   html;
    index  index.php(//添加此内容) index.html index.htm;
        }
    
    
    
     location ~ \.php$ {
     root           /var/www/zabbix;(php端的zabbix目录)
     fastcgi_pass   192.168.157.59:9000; (指向php端ip地址)
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
     include        fastcgi_params;
        }
    
    [root@nginx html]# nginx -s reload
    

    6.6 两端都开启nfs服务,将php端的zabbix目录共享至nginx端

    //php端nfs配置:

    [root@xaii ~]# yum -y install nfs-utils
    [root@xaii ~]# systemctl start nfs
    [root@xaii ~]# echo '/var/www/zabbix *(ro)' > /etc/exports
    [root@xaii ~]# chmod 777 /var/www/zabbix/
    [root@xaii ~]# systemctl restart nfs-server
    

    //nginx端nfs配置,将php端zabbix目录挂载到本地的/usr/local/nginx/html/

    [root@nginx ~]# yum -y install nfs-utils
    [root@nginx ~]# systemctl start nfs
    [root@nginx ~]# mount -t nfs 192.168.157.59:/var/www/zabbix /usr/local/nginx/html(临时挂载)
    [root@nginx ~]# df -Th
    文件系统                                       类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/rhel-root                          xfs        17G  1.5G   16G    9% /
    devtmpfs                                       devtmpfs  901M     0  901M    0% /dev
    tmpfs                                          tmpfs     912M     0  912M    0% /dev/shm
    tmpfs                                          tmpfs     912M  8.6M  904M    1% /run
    tmpfs                                          tmpfs     912M     0  912M    0% /sys/fs/cgroup
    /dev/loop0                                     iso9660   3.8G  3.8G     0  100% /mnt
    /dev/sda1                                      xfs      1014M  143M  872M   15% /boot
    tmpfs                                          tmpfs     183M     0  183M    0% /run/user/0
    192.168.157.59:/usr/local/apache/htdocs/zabbix nfs4       17G  5.9G   12G   35% /usr/local/nginx/html
    [root@nginx ~]# nginx -s reload
    

    6.7 验证

    //输入192.168.157.69

    在这里插入图片描述

    //永久挂载

    [root@nginx ~]# vim /etc/fstab 
    192.168.157.59:/var/www/zabbix /usr/local/nginx/html nfs defaults,_netdev 0 0
    [root@nginx ~]# mount -a 
    [root@nginx ~]# df -Th
    文件系统                       类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/rhel-root          xfs        17G  1.5G   16G    9% /
    devtmpfs                       devtmpfs  901M     0  901M    0% /dev
    tmpfs                          tmpfs     912M     0  912M    0% /dev/shm
    tmpfs                          tmpfs     912M  8.6M  904M    1% /run
    tmpfs                          tmpfs     912M     0  912M    0% /sys/fs/cgroup
    /dev/loop0                     iso9660   3.8G  3.8G     0  100% /mnt
    /dev/sda1                      xfs      1014M  143M  872M   15% /boot
    tmpfs                          tmpfs     183M     0  183M    0% /run/user/0
    192.168.157.59:/var/www/zabbix nfs4       17G  5.8G   12G   34% /usr/local/nginx/html
    

    7. nginx作为web服务器使用的配置:http{}段的配置参数

    http{…}:配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块,结构如下:

    http {//协议级别
      include mime.types;
      default_type application/octet-stream;
      keepalive_timeout 65;
      gzipon;
      upstream {//负载均衡配置
        ...
      }
      server {//服务器级别,每个server类似于httpd中的一个<VirtualHost>
        listen80;
        server_name localhost;
        location / {//请求级别,类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系
          root html;
          index index.html index.htm;
        }
      }
    }
    

    //http{}段配置指令:
    server {}:定义一个虚拟主机,示例如下:

    server {
      listen 80;
      server_name www.lizhao.com;(自己定义)
      root "/vhosts/web"; (html下网页的路径)
    }
    

    listen:指定监听的地址和端口:

    listen address[:port];
    listen port;
    
    • root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径

    • alias path; 用于location配置段,定义路径别名

    • index file; 默认主页面

    • error_page code […] [=code] URI | @name 根据http响应状态码来指明特用的错误页面,例如 error_page 404 /404_customed.html

    • [=code]:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码,例如 error_page 404 =200 /404_customed.html

    location区段,通过指定模式来与客户端请求的URI相匹配:

    //功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
    

    例如:
    URL:https://www.baidu.com/?tn=sitehao123_15
    URI:www.baidu.com
    ?以前的是协议(https)+URI,?以后的是参数。

    //语法:location [ 修饰符 ] pattern {......}
    
    展开全文
  • nginx系列之一:nginx入门

    万次阅读 多人点赞 2019-05-11 17:06:35
    一、nginx 功能介绍 Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2+mod_proxy_balancer的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块...

    前言

    nginx系列之一:nginx入门
    nginx系列之二:配置文件解读
    nginx系列之三:日志配置
    nginx系列之四:web服务器
    nginx系列之五: 负载均衡
    nginx系列之六:cache服务
    nginx系列之七:限流配置
    nginx系列之八:使用upsync模块实现负载均衡

    转自:在此感谢原博主的整理分享

    一、nginx 功能介绍

    Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2+mod_proxy_balancer的轻量级代替者,不仅因为响应静态页面的速度非常快,而且它的模块数量是Apache的2/3。对proxy和rewrite模块的支持很彻底,还支持mod_fcgi、ssl、vhosts ,适合用做mongrel clusters前端HTTP响应。
    nginx和Apache一样用模块化设计,nginx模块包括内置模块和第三方模块,其中内置模块中包含主模块和事件模块。

    nginx处理请求逻辑图
    在这里插入图片描述

    二、nginx可以提供的服务

    1. web 服务.
    2. 负载均衡 (反向代理)
    3. web cache(web 缓存)

    三、nginx 的优点

    1. 高并发。静态小文件
    2. 占用资源少。2万并发、10个线程,内存消耗几百M。
    3. 功能种类比较多。web,cache,proxy。每一个功能都不是特别强。
    4. 支持epoll模型,使得nginx可以支持高并发。
    5. nginx 配合动态服务和Apache有区别。(FASTCGI 接口)
    6. 利用nginx可以对IP限速,可以限制连接数。
    7. 配置简单,更灵活。

    四、nginx应用场合

    1. 静态服务器(图片,视频服务),另个lighttpd。并发几万,html,js,css,flv,jpg,gif等。
    2. 动态服务,nginx—fastcgi 方式运行PHP,jsp。(PHP并发约500-1500,MySQL 并发约300-1500)。
    3. 反向代理,负载均衡。日pv2000W以下,都可直接用nginx做代理。
    4. 缓存服务。类似 SQUID,VARNISH。

    五、主流web服务产品对比说明

    5.1 Apache-特性

    1. 2.2版本本身稳定强大,据官方说:其2.4版本性能更强。
    2. prefork模式取消了进程创建开销,性能很高。
    3. 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在与Apache本身。
    4. 高并发时消耗系统资源相对多一些。
    5. 基于传统的select模型。
    6. 扩展库,DSO方法。

    5.2 nginx-特性

    1. 基于异步IO模型(epoll,kqueue),性能强,能够支持上万并发。
    2. 对小文件支持很好,性能很高(限静态小文件1M)。
    3. 代码优美,扩展库必须编译进主程序。
    4. 消耗代码资源比较低。
    5. lighttpd(百度贴吧,豆瓣)
    6. 基于异步IO模式,性能和nginx相近。
    7. 扩展库是SO模式,比nginx要灵活。
      8.通过差距(mod_secdownload)可实现文件URL地址加密。

    5.3 web服务产品性能对比测试

    5.3.1 静态数据性能对比

    1. 处理静态文件Apache性能比nginx和lighttpd要差。
    2. nginx在处理小文件优势明显。
    3. 处理静态小文件(小于1M),nginx和lighttpd比Apache更有优势,lighttpd最强。

    5.3.2 动态数据性能对比

    1. 处理动态内容三者相差不大,主要取决于PHP和数据库压力。
    2. 当处理动态数据时,三者差距不大,从测试结果看,Apache更有优势。这是因为处理动态数据能力取决于PHP和后端数据的提供服务能力。即瓶颈不在web服务器上。
    3. 一般PHP引擎的并发值300-1000,JAVA引擎并发300-1000,数据库并发300-1000.

    5.3.3 为什么nginx总体性能比Apache高。

    1. nginx用最新epoll、kqueue网络IO模型,而Apache使用床头的select模式。
    2. 目前Linux下能承受高并发访问的squid、Memcached 都采用的是epoll网络IO模型。

    5.3.4 如何选择WEB服务器:

    静态业务:高并发、采用nginx,lighttpd,根据自己掌握程度或公司要求。
    动态业务:采用nginx和Apache均可。
    既有静态业务又有动态业务:nginx或Apache,不要多选要单选。
    动态业务可由前端代理(haproxy),根据页面元素的类型,向后转发给相应的服务器处理。
    思想:工作都不要追求一步到位,满足需求的前提下,先用再逐步完善。
    提示:nginx做web(Apache,lighttpd)、反向代理(haproxy、lvs、nat)及缓存服务器(squid)也是不错的。
    最终建议:对外业务nginx,对内业务Apache(yum httpd mysql-server php)。

    六、nginx实战过程

    6.1 安装依赖包

    • nginx安装依赖GCC、openssl-devel、pcre-devel、zlib-devel软件库。
    • Pcre全称(Perl Compatible Regular Expressions),中文perl兼容正则表达式,pcre官方站点
    yum install  pcre pcre-devel -y 
    yum install openssl openssl-devel -y 
    

    6.2 开始编译

    使用./configure --help查看各模块使用情况,用 --without-http_ssi_module 方式关闭不需的模块。可用 --with-http_perl_modules 方式安装需要的模块。

    6.2.1 编译命令

    tar -zxf nginx-1.10.1.tar.gz 
    cd nginx-1.10.1/
    ./configure --prefix=/data/nginx-1.10.1 --user=nginx --group=nginx  --with-http_ssl_module  --with-http_stub_status_module
    
    useradd nginx -M -s /sbin/nologin 
    make && make install 
    ln -s /data/nginx-1.10.1 /data/nginx
    

    6.2.2 测试nginx配置文件是否正常

    /data/nginx/sbin/nginx -t 
    nginx: the configuration file /data/nginx-1.10.1/conf/nginx.conf syntax is ok
    nginx: configuration file /data/nginx-1.10.1/conf/nginx.conf test is successful
    

    6.2.3 启动nginx服务器

    /data/nginx/sbin/nginx  -t  	# 检查配置文件
    /data/nginx/sbin/nginx      	# 确定nginx服务
    netstat -lntup |grep nginx      # 检查进程是否正常
    curl http://localhost           # 确认结果
    

    6.2.4 nginx其他命令

    nginx -s signal
    signal:
    stop — fast shutdown
    quit — graceful shutdown
    reload — reloading the configuration file
    reopen — reopening the log files
    用来打开日志文件,这样nginx会把新日志信息写入这个新的文件中
    

    /data/nginx/sbin/nginx -V 查看已经编译的参数。

    使用kill命令操作nginx。格式:kill -信号 PID

    信号名称

    • TERM,INT 快速关闭
    • QUIT 优雅的关闭,保持吸纳有的客户端连接
    • HUP 重启应用新的配置文件
    • USR1 重新打开日志文件
    • USR2 升级程序
    • WINCH 优雅的关闭工作进程

    例子

    kill -QUIT  `cat /data/nginx/nginx.pid`
    kill -HUP `cat /data/nginx/nginx.pid`
    

    七、nginx配置文件

    配置基础配置文件

    worker_processes  1;
    events {
        worker_connections  1024;
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  localhost;
            location / {
                root   html;
                index  index.html index.htm;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }
    

    测试配置文件是否正常

    shell> /data/nginx/sbin/nginx -t 
    nginx: the configuration file /data/nginx-1.10.3/conf/nginx.conf syntax is ok
    nginx: configuration file /data/nginx-1.10.3/conf/nginx.conf test is successful
    shell> curl -I http://localhost
    HTTP/1.1 200 OK
    

    八、nginx监控

    开启 nginx 监控服务

    8.1 开启状态页

    # 设定查看 Nginx 状态地址   
    location /status {  
      stub_status on;   				# 表示开启stubStatus的工作状态统计功能。
      access_log off;   				# access_log off; 关闭access_log 日志记录功能。
      #auth_basic "status";   		# auth_basic 是nginx的一种认证机制。
      #auth_basic_user_file conf/htpasswd;	# 用来指定密码文件的位置。
    }
    

    8.2 配置登录密码

    yum install -y httpd-tools
    /usr/local/apache/bin/htpasswd -c /data/nginx/conf/htpasswd biglittleant 
    New password:
    

    完成后会在 /data/nginx/conf/ 目录下生成 htpasswd 文件。

    8.3 访问URL

    curl http://127.0.0.1/status
    
    Active connections:  1
    server accepts handled requests
     16 16 18
    Reading: 0 Writing: 1 Waiting: 0
    

    active connections – 活跃的连接数量
    server accepts handled requests — 总共处理了16个连接 , 成功创建16次握手, 总共处理了18个请求
    Reading — 读取客户端的连接数:
    Writing 响应数据到客户端的数量;
    Waiting 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 即 Nginx 已处理完正在等候下一次请求指令的驻留连接.

    8.3 编写zabbix监控脚本

    nginx_status_fun(){
        NGINX_PORT=$1
        NGINX_COMMAND=$2
        nginx_active(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
            }
        nginx_reading(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
           }
        nginx_writing(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
           }
        nginx_waiting(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
           }
        nginx_accepts(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
           }
        nginx_handled(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
           }
        nginx_requests(){
            /usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
           }
        case $NGINX_COMMAND in
            active)
                nginx_active;
                ;;
            reading)
                nginx_reading;
                ;;
            writing)
                nginx_writing;
                ;;
            waiting)
                nginx_waiting;
                ;;
            accepts)
                nginx_accepts;
                ;;
            handled)
                nginx_handled;
                ;;
            requests)
                nginx_requests;
            esac 
    }
    

    九、nginx优化

    9.1 nginx内核优化

    net.ipv4.tcp_fin_timeout = 2
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_keepalive_time = 600
    net.ipv4.ip_local_port_range = 4000    65000
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.tcp_max_tw_buckets = 36000
    net.ipv4.route.gc_timeout = 100
    net.ipv4.tcp_syn_retries = 1
    net.ipv4.tcp_synack_retries = 1
    net.core.somaxconn = 16384
    net.core.netdev_max_backlog = 16384
    net.ipv4.tcp_max_orphans = 16384
    #以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理。
    net.ipv4.ip_conntrack_max = 25000000
    net.ipv4.netfilter.ip_conntrack_max=25000000
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120
    

    十、扩展一:nginx全局变量

    • $args:这个变量等于请求行中的参数,同$query_string。
    • $is_args: 如果已经设置$args,则该变量的值为"?",否则为""。
    • $content_length: 请求头中的Content-length字段。
    • $content_type: 请求头中的Content-Type字段。
    • $document_uri: 与$uri相同。
    • $document_root: 当前请求在root指令中指定的值。
    • $host: 请求主机头字段,否则为服务器名称。
    • $http_user_agent: 客户端agent信息。
    • $http_cookie: 客户端cookie信息。
    • $limit_rate: 这个变量可以限制连接速率。
    • $request_method: 客户端请求的动作,通常为GET或POST。
    • $remote_addr: 客户端的IP地址。
    • $remote_port: 客户端的端口。
    • $remote_user: 已经经过Auth Basic Module验证的用户名。
    • $request_body_file`: 客户端请求主体的临时文件名。
    • $request_uri: 请求的URI,带参数
    • $request_filename: 当前请求的文件路径,由root或alias指令与URI请求生成。
    • $scheme: 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
    • $server_protocol: 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
    • $server_addr: 服务器地址,在完成一次系统调用后可以确定这个值。
    • $server_name: 服务器名称。
    • $server_port: 请求到达服务器的端口号。
    • $request_uri: 包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz,它无法修改。
    • $uri: 不带请求参数的当前URI,$uri不包含主机名,如/foo/bar.html可能和最初的值有不同,比如经过重定向之类的。它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html。

    例子:

    访问链接是:http://localhost:88/test1/test.php 
    网站路径是:/var/www/html
    
    $host:localhost
    $server_port:88
    $request_uri:http://localhost:88/test1/test.php
    $document_uri:/test1/test.php
    $document_root:/var/www/html
    $request_filename:/var/www/html/test1/test.php
    
    

    nginx plus – ngx_http_status_module

    商业版的 nginx plus 通过他的 ngx_http_status_module 提供了比 nginx 更多的监控指标,可以参看 http://demo.nginx.com/status.html

    nginx access log 分析

    nginx 的 access log 中可以记录很多有价值的信息,通过分析 access log,可以收集到很多指标。
    python 编写的 linux 工具 ngxtop 就实现了对 access log 的分析功能。

    NDK – ngx_devel_kit

    NDK 是一个拓展nginx服务器核心功能的模块,第三方模块开发可以基于它来快速实现。NDK提供函数和宏处理一些基本任务,减轻第三方模块开发的代码量。

    nginx lua – lua-nginx-module

    nginx的lua模块,通过这个模块,可以对nginx做定制开发

    十、扩展二:web服务器事件处理模型

    select

    select 最早于1983年出现在4.2BSD中,通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使进程可获得这些文件描述符从而进行后续的读写操作。
    select 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。
    select 的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,Linux上一般为1024,不过可通过修改宏定义甚至重新编译内核的方式提升这一限制。
    另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用 select() 会对所有socket进行一次线性扫描,所以这也浪费了一定开销。

    poll

    poll 在1986年诞生于System V Release 3,它和 select 在本质上没多大差别,但是 poll 没有最大文件描述符数量的限制。
    poll 和select 同样存在的缺点是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间间,而不论文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。
    另外,select() 和 poll() 将就绪的文件描述符告诉进程后,如果进程没对其进行IO操作,那下次调用 select() 和 poll() 时将再次报告这些文件描述符,所以它们一般不会丢失就绪的消息,这种方式称为水平触发(Level Triggered)。

    epoll

    直到Linux2.6才出现了由内核直接支持的实现方法,就是epoll,它几乎具备之前说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。
    epoll 可同时支持水平触发和边缘触发(Edge Triggered,只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果没有采取行动,那它将不会再次告知,这种方式称为边缘触发),理论上边缘触发的性能要更高些,但代码实现相当复杂。
    epoll同样只告知那些就绪的文件描述符,而且当调用epoll_wait()获得就绪文件描述符时,返回的不是实际的描述符,而是个代表就绪描述符数量的值,只需要去epoll指定的一个数组中依次取得相应数量的文件描述符即可,这里也用了内存映射(mmap)技术,这样便彻底省掉了这些文件描述符在系统调用时复制的开销。
    另个本质的改进在于 epoll 采用基于事件的就绪通知方式。在 select/poll 中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过 epoll_ctl() 来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似 callback 的回调机制,迅速激活这个文件描述符,当进程调用 epoll_wait() 时便得到通知。

    nginx -s reload 过程

    nginx主进程读取配置文件,如果发现配置文件变更,会创建一个新的主进程,然后同时旧的进程,及旧的子进程关闭,旧进程会拒绝新的连接,服务到自己的连接结束,然后关闭。

    Apache select模型和 nginx epoll 模型对比讲解

    Nginx高并发得益于其采用了 epoll 模型,与传统的服务器架构不同,epoll 是linux内核2.6后才出现的。下面通过比较Apache和Nginx工作原理来比较。

    传统Apache都是多进程或者多线程来工作,假设是多进程工作(prefork),apache会先生成几个进程,类似进程池的工作原理,只不过这里的进程池会随着请求数目的增加而增加。对于每一个连接,apache都是在一个进程内处理完毕。具体是 recv(),及根据 URI 去进行磁盘I/O来寻找文件,还有 send()都是阻塞的。其实说白了都是 apche 对套接字的I/O,读或写,但读或写都是阻塞的,阻塞意味着进程得挂起进入sleep状态,那一旦连接数很多,Apache必然要生成更多的进程来响应请求,一旦进程多了,CPU对进程的切换就频繁了,很耗资源和时间,所以导致apache性能下降,处理不过来这么多进程了。其实如果对于进程每个请求都没阻塞,那效率肯定会提高很多。

    Nginx采用 epoll 模型,异步非阻塞。对于Nginx,把一个完整的连接请求处理都划分成了事件,一个个的事件。如accept(), recv(),磁盘I/O,send()等,每部分都有相应的模块去处理,一个完整的请求可能是由几百个模块去处理。真正核心的就是事件收集和分发模块,这就是管理所有模块的核心。只有核心模块的调度才能让对应的模块占用CPU资源,从而处理请求。拿一个HTTP请求来说,首先在事件收集分发模块注册感兴趣的监听事件,注册好后不阻塞直接返回,接下来就不需再管了,等待有连接来了内核会通知你(epoll的轮询会告诉进程),cpu就可处理其他事情去。一旦有请求来,那对整个请求分配相应的上下文(其实已预先分配好),这时再注册新的感兴趣的事件(read函数),同样客户端数据来了内核会自动通知进程可以去读数据了,读数据后就是解析,解析完后去磁盘找资源(I/O),一旦I/O完成会通知进程,进程开始给客户端发回数据send(),这时也不是阻塞的,调用后就等内核发回通知发送的结果就行。整个下来把一个请求分成了很多个阶段,每个阶段都到很多模块去注册,然后处理,都是异步非阻塞。异步指的就是做一个事情,不需等返回结果,做好后会自动通知你。

    select/epoll的特点

    select 特点:select 选择句柄时,是遍历所有句柄,即句柄有事件响应时,select需遍历所有句柄才能获取到哪些句柄有事件通知,因此效率非常低。但是如果连接很少时,select 和 epoll 的LT触发模式相比, 性能上差别不大。
    这里多说一句,select支持的句柄数是有限制的, 同时只支持1024个,这个是句柄集合限制的,如超过这个限制,很可能导致溢出,且非常不容易发现问题, 当然可通过修改linux的socket内核调整这个参数。
    epoll特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需遍历整个句柄链表,因此效率非常高,内核将句柄用红黑树保存的。
    对于epoll而言还有ET和LT的区别,LT表水平触发,ET表边缘触发,两者在性能以及代码实现上差别也是非常大的。

    不管是Nginx还是Squid这种反向代理,其网络模式都是事件驱动。事件驱动其实是很老的技术,早期的select、poll都是如此。后来基于内核通知的更高级事件机制出现,如libevent里的epoll,使事件驱动性能得以提高。事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切换,实现所谓的异步IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作,自身并不涉及到复杂计算。反向代理用事件驱动来做,显然更好,一个工作进程就可run了,没有进程、线程管理的开销,CPU、内存消耗都小。

    所以Nginx、Squid都是这样做的。当然,Nginx也可是多进程 + 事件驱动的模式,几个进程跑libevent,不需要Apache那样动辄数百的进程数。Nginx处理静态文件效果也很好,那是因为静态文件本身也是磁盘IO操作,处理过程一样。至于说多少万的并发连接,这个毫无意义。随手写个网络程序都能处理几万的并发,但如果大部分客户端阻塞在那里,就没什么价值。

    再看看Apache或者Resin这类应用服务器,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图形图像、数据库读写等。它们很可能是CPU密集型的服务,事件驱动并不合适。例如一个计算耗时2秒,那么这2秒就是完全阻塞的,什么event都没用。想想MySQL如果改成事件驱动会怎么样,一个大型的join或sort就会阻塞住所有客户端。这个时候多进程或线程就体现出优势,每个进程各干各的事,互不阻塞和干扰。当然,现代CPU越来越快,单个计算阻塞的时间可能很小,但只要有阻塞,事件编程就毫无优势。所以进程、线程这类技术,并不会消失,而是与事件机制相辅相成,长期存在。

    总言之,事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有各的优势,并不存在谁取代谁的倾向。

    相关参考

    nginx-日志高级技巧](https://segmentfault.com/a/1190000000703319)
    nginx-官方文档
    nginx优化
    查看网站排名
    nginx-status-demo

    展开全文
  • Nginx

    千次阅读 2020-08-18 10:42:47
    Nginx Nginx(engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其...

    Nginx

    Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

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

    Nginx支持的负载均衡调度算法方式如下:

    1. weight轮询(默认,常用):接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
    2. ip_hash(常用):每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
    3. fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。
    4. url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

    Nginx 单个进程允许的最大连接数

    (1) 控制 Nginx 单个进程允许的最大连接数的参数为 worker_connections ,这个参数要根据服务器性能和内存使用量来调整

    (2) 进程的最大连接数受 Linux 系统进程的最大打开文件数限制,只有执行了 "ulimit -HSn 65535" 之后,worker_connections 才能生效

    (3) 连接数包括代理服务器的连接、客户端的连接等,Nginx 总并发连接数 = worker_processes * worker_connections

    nginx.conf 配置文件

    nginx进程数,建议设置为等于CPU总核心数.
    worker_processes 8;

    全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
    error_log /var/log/nginx/error.log info;

    进程文件
    pid /var/run/nginx.pid;

    一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
    worker_rlimit_nofile 65535;

    工作模式与连接数上限
    events
    {
      #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
      use epoll;
      #单个进程最大连接数(最大连接数=连接数*进程数)
      worker_connections 65535;
    }

    设定http服务器
    http
    {

    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模块设置
    gzip on; #开启gzip压缩输出
    gzip_min_length 1k; #最小压缩文件大小
    gzip_buffers 4 16k; #压缩缓冲区
    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; #压缩等级
    gzip_types text/plain application/x-javascript text/css application/xml;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_vary on;
    #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

    upstream blog.ha97.com {
    #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
    server 192.168.80.121:80 weight=3;
    server 192.168.80.122:80 weight=2;
    server 192.168.80.123:80 weight=3;

    }

    虚拟主机的配置
    server
    {

    listen 80;    #监听端口

        server_name aa.cn www.aa.cn ; #server_name end  #域名可以有多个,用空格隔开

    index index.html index.htm index.php;  # 设置访问主页

        set $subdomain '';  # 绑定目录为二级域名 bbb.aa.com  根目录 /bbb  文件夹
        if ( $host ~* "(?:(\w+\.){0,})(\b(?!www\b)\w+)\.\b(?!(com|org|gov|net|cn)\b)\w+\.[a-zA-Z]+" ) { set $subdomain "/$2"; }

    root /home/wwwroot/aa.cn/web$subdomain;# 访问域名跟目录  

    include rewrite/dedecms.conf; #rewrite end   #载入其他配置文件


    location ~ .*.(php|php5)?$
    {
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      include fastcgi.conf;
    }
    #图片缓存时间设置
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
    {
      expires 10d;
    }
    #JS和CSS缓存时间设置
    location ~ .*.(js|css)?$
    {
      expires 1h;
    }

    }

    从图中可以看出主要包含以下几大部分内容:

    1. 全局块

    该部分配置主要影响Nginx全局,通常包括下面几个部分:

    • 配置运行Nginx服务器用户(组)
    • worker process数
    • Nginx进程PID存放路径
    • 错误日志的存放路径
    • 配置文件的引入

    2. events块

    • 该部分配置主要影响Nginx服务器与用户的网络连接,主要包括:
    • 设置网络连接的序列化
    • 是否允许同时接收多个网络连接
    • 事件驱动模型的选择
    • ***连接数的配置

    3. http块

    • 定义MIMI-Type
    • 自定义服务日志
    • 允许sendfile方式传输文件
    • 连接超时时间
    • 单连接请求数上限

    4. server块

    • 配置网络监听
    • 基于名称的虚拟主机配置
    • 基于IP的虚拟主机配置

    5. location块

    • location配置
    • 请求根目录配置
    • 更改location的URI
    • 网站默认首页配置

    一份配置清单例析

    笔者给出了一份简要的清单配置举例:

    配置代码如下:

    接下来就来详细剖析以下配置文件中各个指令的含义

    配置运行Nginx服务器用户(组)

    指令格式:user user [group];

    user:指定可以运行Nginx服务器的用户

    group:可选项,可以运行Nginx服务器的用户组

    如果user指令不配置或者配置为 user nobody nobody ,则默认所有用户都可以启动Nginx进程

    worker process数配置

    Nginx服务器实现并发处理服务的关键,指令格式:worker_processes number | auto;

    number:Nginx进程最多可以产生的worker process数

    auto:Nginx进程将自动检测

    按照上文中的配置清单的实验,我们给worker_processes配置的数目是:3,启动Nginx服务器后,我们可以后台看一下主机上的Nginx进程情况:

    很明显,理解 worker_processes 这个指令的含义就很容易了

    Nginx进程PID存放路径

    Nginx进程是作为系统守护进程在运行,需要在某文件中保存当前运行程序的主进程号,Nginx支持该保存文件路径的自定义

    指令格式:pid file;

    file:指定存放路径和文件名称

    如果不指定默认置于路径 logs/nginx.pid

    错误日志的存放路径

    指定格式:error_log file | stderr;

    file:日志输出到某个文件file

    stderr:日志输出到标准错误输出

    配置文件的引入

    指令格式:include file;

    该指令主要用于将其他的Nginx配置或者第三方模块的配置引用到当前的主配置文件中

    设置网络连接的序列化

    指令格式:accept_mutex on | off;

    该指令默认为on状态,表示会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢。

    说到该指令,首先得阐述一下什么是所谓的 “惊群问题”,可以参考 WIKI百科的解释。就Nginx的场景来解释的话大致的意思就是:当一个新网络连接来到时,多个worker进程会被同时唤醒,但仅仅只有一个进程可以真正获得连接并处理之。如果每次唤醒的进程数目过多的话,其实是会影响一部分性能的。

    所以在这里,如果accept_mutex on,那么多个worker将是以串行方式来处理,其中有一个worker会被唤醒;反之若accept_mutex off,那么所有的worker都会被唤醒,不过只有一个worker能获取新连接,其它的worker会重新进入休眠状态

    这个值的开关与否其实是要和具体场景挂钩的。

    是否允许同时接收多个网络连接

    指令格式:multi_accept on | off;

    该指令默认为off状态,意指每个worker process 一次只能接收一个新到达的网络连接。若想让每个Nginx的worker process都有能力同时接收多个网络连接,则需要开启此配置

    事件驱动模型的选择

    指令格式:use model;

    model模型可选择项包括:select、poll、kqueue、epoll、rtsig等......

    ***连接数的配置

    指令格式:worker_connections number;

    number默认值为512,表示允许每一个worker process可以同时开启的***连接数

    定义MIME-Type

    指令格式:

    MIME-Type指的是网络资源的媒体类型,也即前端请求的资源类型

    include指令将mime.types文件包含进来

    cat mime.types 来查看mime.types文件内容,我们发现其就是一个types结构,里面包含了各种浏览器能够识别的MIME类型以及对应类型的文件后缀名字,如下所示:

    自定义服务日志

    指令格式:

    path:自定义服务日志的路径 + 名称

    format:可选项,自定义服务日志的字符串格式。其也可以使用 log_format 定义的格式

    允许sendfile方式传输文件

    指令格式:

    前者用于开启或关闭使用sendfile()传输文件,默认off

    后者指令若size>0,则Nginx进程的每个worker process每次调用sendfile()传输的数据了***不能超出此值;若size=0则表示不限制。默认值为0

    连接超时时间配置

    指令格式:keepalive_timeout timeout [header_timeout];

    timeout 表示server端对连接的保持时间,默认75秒

    header_timeout 为可选项,表示在应答报文头部的 Keep-Alive 域设置超时时间:“Keep-Alive : timeout = header_timeout”

    单连接请求数上限

    指令格式:keepalive_requests number;

    该指令用于限制用户通过某一个连接向Nginx服务器发起请求的次数

    配置网络监听

    指令格式:

    ***种:配置监听的IP地址:listen IP[:PORT];

    第二种:配置监听的端口:listen PORT;

    实际举例:

    基于名称和IP的虚拟主机配置

    指令格式:server_name name1 name2 ...

    name可以有多个并列名称,而且此处的name支持正则表达式书写

    实际举例:

    此时表示该虚拟主机可以接收类似域名 www1.myserver.com 等的请求而拒绝 www.myserver.com 的域名请求,所以说用正则表达式可以实现更精准的控制

    至于基于IP的虚拟主机配置比较简单,不再太赘述:

    指令格式:server_name IP地址

    location配置

    指令格式为:location [ = | ~ | ~* | ^~ ] uri {...}

    这里的uri分为标准uri和正则uri,两者的唯一区别是uri中是否包含正则表达式

    uri前面的方括号中的内容是可选项,解释如下:

    • “=”:用于标准uri前,要求请求字符串与uri严格匹配,一旦匹配成功则停止
    • “~”:用于正则uri前,并且区分大小写
    • “~*”:用于正则uri前,但不区分大小写
    • “^~”:用于标准uri前,要求Nginx找到标识uri和请求字符串匹配度***的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配

    请求根目录配置

    指令格式:root path;

    path:Nginx接收到请求以后查找资源的根目录路径

    当然,还可以通过alias指令来更改location接收到的URI请求路径,指令为:

    设置网站的默认首页

    指令格式:index file ......

    file可以包含多个用空格隔开的文件名,首先找到哪个页面,就使用哪个页面响应请求

    展开全文
  • 类似Debian的系统中设置 (最新版本)。 要求 software-properties-common (将被安装) dirmngr (将安装) 变数 nginx_use_ppa :[默认: true ]:是否添加PPA(用于安装) nginx_version :[默认: stable ]...
  • Nginx 原理和架构

    万次阅读 多人点赞 2019-11-09 17:13:09
    Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动...
  • nginx安装及部署

    万次阅读 多人点赞 2019-04-11 15:52:47
    下载 官方网站:https://nginx.org/en/download.html Windows下安装 ...下载后解压(切记不能含有中文...1) 直接双击该目录下的"nginx.exe",即可启动nginx服务器; 2) 命令行进入该文件夹,执行start ngin...
  • 解决:Nginx如何实现类似if else的检测 前言: 项目中所用Gateway 在处理OAuth Notification时设置了certificate verification, 燃鹅架构师觉得这是internal url handling, 并不需要设置。 "x509: certificate ...
  • Nginx介绍

    2016-10-01 11:35:31
    Nginx与Apache类似,也是一个高性能的HTTP和反向代理服务器软件,还是一个IMAP/POP3/SMTP代理服务器。 Nginx与Apache相比有以下优势:在性能上,它占用很少的系统资源,能支持更多的并发连接,达到更
  • NginxNginx概述

    千次阅读 2019-12-27 17:41:49
    00. 目录 文章目录00. 目录01. 什么是Nginx02. Nginx特点0.3 参考 01. 什么是Nginx Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,Nginx,它的...Nginx 是由俄罗斯人 Igor Sysoev 为俄罗斯访问量第二的 Ramb...
  • Nginx系列一:Nginx介绍
  • nginx入门

    千次阅读 2015-04-15 15:33:27
     Nginx 基础知识 1. 简介 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru...
  • Nginx——Nginx简介

    千次阅读 2020-01-31 12:15:25
    文章目录1:Nginx介绍2:反向代理介绍3:负载均衡介绍4:动静分离介绍 1:Nginx介绍 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能 力强 (有报告表明能支持高达 50,000 个...
  • yum 安装nginxnginx的 目录

    万次阅读 2017-10-06 11:00:44
    输入命令:whereis nginx即可看到类似于如下的内容:nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx以下是Nginx的默认路径: (1) Nginx配置路径:/etc/nginx/ (2) PID目录:/var/run/...
  • Nginx】初识Nginx

    千次阅读 2020-07-19 01:08:00
    今天我们就来详细谈一谈Nginx!既然说到Nginx我们就不得不先来说一下web服务器和应用服务器。 二、服务器 1、 web服务器 web服务器也叫网页服务器或web服务器。WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能...
  • Nginx详解

    千次阅读 2019-09-10 19:47:05
    文章目录Nginx介绍负载均衡服务器反向代理服务器Nginx用途一、静态代理二、负载均衡三、限流四、缓存五、黑白名单 Nginx介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务...
  • Nginx 基础

    千次阅读 2019-01-17 20:04:27
    Nginx 概述 Nginx (“engine x”) 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪...
  • nginx介绍

    万次阅读 2018-05-31 20:06:00
    其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好 Nginx相较于Apache\lighttpd具有占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而...
  • 1.Nginx介绍 1.1 什么是Nginx? 1.2Nginx能做什么 1.3 为什么要选择用Nginx 2.Nginx的安装与配置 2.1 Nginx 安装 2.2 Nginx配置 2.3 Nginx常用操作 3.Nginx工作原理 3.1 工作原理: 3.1.1 Nginx...
  • Nginx#Nginx-Typora笔记

    万次阅读 2020-10-09 11:28:05
    nginx基础笔记
  • Nginx - 配置

    万次阅读 2016-05-25 07:30:52
    Nginx标签 : nginxNginx nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev. For a long time, it has been ...
  • 1.启动nginx的方式: cd /usr/local/nginx ls ./nginx -c nginx.conf 2.查看nginx的进程方式: [root@localhost nginx]# ps –ef | grep nginx [root@localhost nginx]# ps -ef | grep nginx root 21094 
  • Nginx代理与负载均衡配置与优化 Nginx代理 Nginx从0.7.48版本开始,支持了类似Squid的缓存功能。Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源...
  • nginx安装使用教程详解,实战

    万次阅读 2020-12-09 14:52:48
    新建本地挂载用目录,conf.d和logs目录,位置自己记住就好,如/app/nginx/conf.d和/app/nginx/logs 在conf.d下新建默认配置文件default.conf,并写入监听配置server { listen 80; server_name _; charset utf-8; ...
  • Nginx 详解(包含各个 Nginx 模块)

    千次阅读 2019-09-21 19:32:36
    Nginx 详解Nginx 相关概念1、Nginx 概念2、Nginx 功能3、Nginx 程序架构3.1 master/worker3.2 特性3.3 Nginx 模块3.4 Nginx 功用Nginx 安装及配置1、Nginx 安装2、Nginx 编译安装3、Nginx 程序环境3.1 配置文件的...
  •  1.启动nginx的方式: cd /usr/local/nginx ..../nginx -c nginx.conf ...2.查看nginx的进程方式: ...[root@localhost nginx]# ps –ef | grep nginx [root@localhost nginx

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,107
精华内容 45,242
关键字:

nginx类似产品