性能怪兽-Nginx常用配置指北

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

安装

Nginx操作命令

https反向代理

负载均衡

轮询

加权轮询

最少连接

加权最少连接

IP Hash

普通 Hash

 动静分离

资源压缩

缓冲区

缓存机制

解决跨域

防盗链设计

配置SLL证书

性能优化

打开长连接配置

开启零拷贝技术

开启无延迟或多包共发机制

调整Worker工作进程

开启CPU亲和机制

开启epoll模型及调整并发连接数

 文件传输配置

工具

参考


安装

nginx-tutorial/nginx-ops.md at master · dunwu/nginx-tutorial (github.com)

Nginx 安装配置 | 菜鸟教程 (runoob.com)

开放80端口并更新防火墙

[root@localhost]# firewall-cmd --zone=public --add-port=80/tcp --permanent  
[root@localhost]# firewall-cmd --reload  
[root@localhost]# firewall-cmd --zone=public --list-ports 

Nginx操作命令

nginx -s stop       快速关闭Nginx可能不保存相关信息并迅速终止web服务。
nginx -s quit       平稳关闭Nginx保存相关信息有安排的结束web服务。
nginx -s reload     因改变了Nginx相关配置需要重新加载配置而重载。
nginx -s reopen     重新打开日志文件。
nginx -c filename   为 Nginx 指定一个配置文件来代替缺省的。
nginx -t            不运行仅仅测试配置文件。nginx 将检查配置文件的语法的正确性并尝试打开配置文件中所引用到的文件。
nginx -v            显示 nginx 的版本。
nginx -V            显示 nginx 的版本编译器版本和配置参数。

https反向代理

  #HTTP服务器
  server {
      #监听443端口。443为知名端口号主要用于HTTPS协议
      listen       443 ssl;

      #定义使用www.xx.com访问
      server_name  www.helloworld.com;

      #ssl证书文件位置(常见证书文件格式为crt/pem)
      ssl_certificate      cert.pem;
      #ssl证书key位置
      ssl_certificate_key  cert.key;

      #ssl配置参数选择性配置
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
      #数字签名此处使用MD5
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;

      location / {
          root   /root;
          index  index.html index.htm;
      }
  }

负载均衡

upstream nginx_boot{  
   # 30s内检查心跳发送两次包未回复就代表该机器宕机请求分发权重比为1:2  
   server 192.168.0.000:8080 weight=100 max_fails=2 fail_timeout=30s;   
   server 192.168.0.000:8090 weight=200 max_fails=2 fail_timeout=30s;  
   # 这里的IP请配置成你WEB服务所在的机器IP  
}  
  
server {  
    location / {  
        root   html;  
        # 配置一下index的地址最后加上index.ftl。
        index  index.html index.htm index.jsp index.ftl;  
        proxy_set_header Host $host;  
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        # 请求交给名为nginx_boot的upstream上  
        proxy_pass http://nginx_boot;  
    }  
}

轮询

upstream bck_testing_01 {
  # 默认所有服务器权重为 1
  server 192.168.250.220:8080
  server 192.168.250.221:8080
  server 192.168.250.222:8080
}

加权轮询

upstream bck_testing_01 {
  server 192.168.250.220:8080   weight=3
  server 192.168.250.221:8080              # default weight=1
  server 192.168.250.222:8080              # default weight=1
}

最少连接

upstream bck_testing_01 {
  least_conn;

  # with default weight for all (weight=1)
  server 192.168.250.220:8080
  server 192.168.250.221:8080
  server 192.168.250.222:8080
}

加权最少连接

upstream bck_testing_01 {
  least_conn;

  server 192.168.250.220:8080   weight=3
  server 192.168.250.221:8080              # default weight=1
  server 192.168.250.222:8080              # default weight=1
}

IP Hash

upstream bck_testing_01 {

  ip_hash;

  # with default weight for all (weight=1)
  server 192.168.250.220:8080
  server 192.168.250.221:8080
  server 192.168.250.222:8080

}

普通 Hash

upstream bck_testing_01 {

  hash $request_uri;

  # with default weight for all (weight=1)
  server 192.168.250.220:8080
  server 192.168.250.221:8080
  server 192.168.250.222:8080

}

 动静分离

location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){  
    root   /soft/nginx/static_resources;  #静态资源目录
    expires 7d;  
}

资源压缩

http{
    # 开启压缩机制
    gzip on;
    # 指定会被压缩的文件类型(也可自己配置其他类型)
    gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
    # 设置压缩级别越高资源消耗越大但压缩效果越好
    gzip_comp_level 5;
    # 在头部中添加Vary: Accept-Encoding建议开启
    gzip_vary on;
    # 处理压缩请求的缓冲区数量和大小
    gzip_buffers 16 8k;
    # 对于不支持压缩功能的客户端请求不开启压缩机制
    gzip_disable "MSIE [1-6]\."; # 低版本的IE浏览器不支持压缩
    # 设置压缩响应所支持的HTTP最低版本
    gzip_http_version 1.1;
    # 设置触发压缩的最小阈值
    gzip_min_length 2k;
    # 关闭对后端服务器的响应结果进行压缩
    gzip_proxied off;
}

在上述的压缩配置中最后一个gzip_proxied选项可以根据系统的实际情况决定总共存在多种选项

  • off关闭Nginx对后台服务器的响应结果进行压缩。

  • expired如果响应头中包含Expires信息则开启压缩。

  • no-cache如果响应头中包含Cache-Control:no-cache信息则开启压缩。

  • no-store如果响应头中包含Cache-Control:no-store信息则开启压缩。

  • private如果响应头中包含Cache-Control:private信息则开启压缩。

  • no_last_modified如果响应头中不包含Last-Modified信息则开启压缩。

  • no_etag如果响应头中不包含ETag信息则开启压缩。

  • auth如果响应头中包含Authorization信息则开启压缩。

  • any无条件对后端的响应结果开启压缩机制。

缓冲区

  • proxy_buffering是否启用缓冲机制默认为on关闭状态。

  • client_body_buffer_size设置缓冲客户端请求数据的内存大小。

  • proxy_buffers为每个请求/连接设置缓冲区的数量和大小默认4 4k/8k

  • proxy_buffer_size设置用于存储响应头的缓冲区大小。

  • proxy_busy_buffers_size在后端数据没有完全接收完成时Nginx可以将busy状态的缓冲返回给客户端该参数用来设置busy状态的buffer具体有多大默认为proxy_buffer_size*2

  • proxy_temp_path当内存缓冲区存满时可以将数据临时存放到磁盘该参数是设置存储缓冲数据的目录。语法proxy_temp_path path; path是临时目录的路径

  • proxy_temp_file_write_size设置每次写数据到临时文件的大小限制。

  • proxy_max_temp_file_size设置临时的缓冲目录中允许存储的最大容量。

  • 非缓冲参数项

    • proxy_connect_timeout设置与后端服务器建立连接时的超时时间。

    • proxy_read_timeout设置从后端服务器读取响应数据的超时时间。

    • proxy_send_timeout设置向后端服务器传输请求数据的超时时间

http{  
    proxy_connect_timeout 10;  
    proxy_read_timeout 120;  
    proxy_send_timeout 10;  
    proxy_buffering on;  
    client_body_buffer_size 512k;  
    proxy_buffers 4 64k;  
    proxy_buffer_size 16k;  
    proxy_busy_buffers_size 128k;  
    proxy_temp_file_write_size 128k;  
    proxy_temp_path /soft/nginx/temp_buffer;  
}

缓存机制

语法

proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

  • path缓存的路径地址。

  • levels缓存存储的层次结构最多允许三层目录。

  • use_temp_path是否使用临时目录。

  • keys_zone指定一个共享内存空间来存储热点Key(1M可存储8000个Key)。

  • inactive设置缓存多长时间未被访问后删除默认是十分钟。

  • max_size允许缓存的最大存储空间超出后会基于LRU算法移除缓存Nginx会创建一个Cache manager的进程移除数据也可以通过purge方式。

  • manager_filesmanager进程每次移除缓存文件数量的上限。

  • manager_sleepmanager进程每次移除缓存文件的时间上限。

  • manager_thresholdmanager进程每次移除缓存后的间隔时间。

  • loader_files重启Nginx载入缓存时每次加载的个数默认100。

  • loader_sleep每次载入时允许的最大时间上限默认200ms。

  • loader_threshold一次载入后停顿的时间间隔默认50ms。

  • purger是否开启purge方式移除数据。

  • purger_files每次移除缓存文件时的数量。

  • purger_sleep每次移除时允许消耗的最大时间。

  • purger_threshold每次移除完成后停顿的间隔时间。

http{  
    # 设置缓存的目录并且内存中缓存区名为hot_cache大小为128m  
    # 三天未被访问过的缓存自动清楚磁盘中缓存的最大容量为2GB。
    proxy_cache_path /soft/nginx/cache levels=1:2 keys_zone=hot_cache:128m inactive=3d max_size=2g;  
      
    server{  
        location / {  
            # 使用名为nginx_cache的缓存空间  
            proxy_cache hot_cache;  
            # 对于200、206、304、301、302状态码的数据缓存1天  
            proxy_cache_valid 200 206 304 301 302 1d;  
            # 对于其他状态的数据缓存30分钟  
            proxy_cache_valid any 30m;  
            # 定义生成缓存键的规则请求的url+参数作为key  
            proxy_cache_key $host$uri$is_args$args;  
            # 资源至少被重复访问三次后再加入缓存  
            proxy_cache_min_uses 3;  
            # 出现重复请求时只让一个去后端读数据其他的从缓存中读取  
            proxy_cache_lock on;  
            # 上面的锁超时时间为3s超过3s未获取数据其他请求直接去后端  
            proxy_cache_lock_timeout 3s;  
            # 对于请求参数或cookie中声明了不缓存的数据不再加入缓存  
            proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;  
            # 在响应头中添加一个缓存是否命中的状态便于调试  
            add_header Cache-status $upstream_cache_status;  
        }  
    }  
}

解决跨域

location / {  
    # 允许跨域的请求可以自定义变量$http_origin*表示所有  
    add_header 'Access-Control-Allow-Origin' *;  
    # 允许携带cookie请求  
    add_header 'Access-Control-Allow-Credentials' 'true';  
    # 允许跨域请求的方法GET,POST,OPTIONS,PUT  
    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';  
    # 允许请求时携带的头部信息*表示所有  
    add_header 'Access-Control-Allow-Headers' *;  
    # 允许发送按段获取资源的请求  
    add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';  
    # 一定要有否则Post请求无法进行跨域
    # 在发送Post跨域请求前会以Options方式发送预检请求服务器接受时才会正式请求  
    if ($request_method = 'OPTIONS') {  
        add_header 'Access-Control-Max-Age' 1728000;  
        add_header 'Content-Type' 'text/plain; charset=utf-8';  
        add_header 'Content-Length' 0;  
        # 对于Options方式的请求返回204表示接受跨域请求  
        return 204;  
    }  
}

防盗链设计

场景a网站不让b网站使用a的静态资源所以设置防盗链

语法

valid_referers none | blocked | server_names | string ...;

  • none表示接受没有Referer字段的HTTP请求访问。

  • blocked表示允许http://https//以外的请求访问。

  • server_names资源的白名单这里可以指定允许访问的域名。

  • string可自定义字符串支配通配符、正则表达式写法。

案例

# 在动静分离的location中开启防盗链机制  
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){  
    # 最后面的值在上线前可配置为允许的域名地址  
    valid_referers blocked 192.168.12.129;  
    if ($invalid_referer) {  
        # 可以配置成返回一张禁止盗取的图片  
        # rewrite   ^/ http://xx.xx.com/NO.jpg;  
        # 也可直接返回403  
        return   403;  
    }  
      
    root   /soft/nginx/static_resources;  
    expires 7d;  
}

配置SLL证书

# ----------HTTPS配置-----------  
server {  
    # 监听HTTPS默认的443端口  
    listen 443;  
    # 配置自己项目的域名  
    server_name www.xxx.com;  
    # 打开SSL加密传输  
    ssl on;  
    # 输入域名后首页文件所在的目录  
    root html;  
    # 配置首页的文件名  
    index index.html index.htm index.jsp index.ftl;  
    # 配置自己下载的数字证书  
    ssl_certificate  certificate/xxx.pem;  
    # 配置自己下载的服务器私钥  
    ssl_certificate_key certificate/xxx.key;  
    # 停止通信时加密会话的有效期在该时间段内不需要重新交换密钥  
    ssl_session_timeout 5m;  
    # TLS握手时服务器采用的密码套件  
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  
    # 服务器支持的TLS版本  
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  
    # 开启由服务器决定采用的密码套件  
    ssl_prefer_server_ciphers on;  
  
    location / {  
        ....  
    }  
}  
  
# ---------HTTP请求转HTTPS-------------  
server {  
    # 监听HTTP默认的80端口  
    listen 80;  
    # 如果80端口出现访问该域名的请求  
    server_name www.xxx.com;  
    # 将请求改写为HTTPS这里写你配置了HTTPS的域名  
    rewrite ^(.*)$ https://www.xxx.com;  
}

性能优化

打开长连接配置

upstream xxx {  
    # 长连接数  
    keepalive 32;  
    # 每个长连接提供的最大请求数  
    keepalived_requests 100;  
    # 每个长连接没有新的请求时保持的最长时间  
    keepalive_timeout 60s;  
}  

开启零拷贝技术

sendfile on; # 开启零拷贝机制  

开启无延迟或多包共发机制

tcp_nodelay on;  
tcp_nopush on;  

交互性很强的应用可以手动开启tcp_nodelay配置让应用程序向内核递交的每个数据包都会立即发送出去。但这样会产生大量的TCP报文头增加很大的网络开销。

实时性要求并不高追求的则是更高的吞吐那么则可以开启tcp_nopush配置项这个配置就类似于“塞子”的意思首先将连接塞住使得数据先不发出去等到拔去塞子后再发出去。设置该选项后内核会尽量把小数据包拼接成一个大的数据包一个MTU再发送出去.

调整Worker工作进程

worker_processes auto;  

 工作进程的数量最高开到8个就OK了8个之后就不会有再大的性能提升。

同时也可以稍微调整一下每个工作进程能够打开的文件句柄数

# 每个Worker能打开的文件描述符最少调整至1W以上负荷较高建议2-3W  
worker_rlimit_nofile 20000;  

开启CPU亲和机制

CPU亲和机制则是指将每个Nginx的工作进程绑定在固定的CPU核心上从而减小CPU切换带来的时间开销和资源损耗开启方式如下

worker_cpu_affinity auto;  

开启epoll模型及调整并发连接数

epoll属于select/poll接口的增强版因此采用该模型能够大程度上提升单个Worker的性能如下

events {  
    # 使用epoll网络模型  
    use epoll;  
    # 调整每个Worker能够处理的连接数上限  
    worker_connections  10240;  
}  

 文件传输配置

 四个参数值都可以根据自己项目的实际情况来配置。

工具

生成配置文件

NGINXConfig | DigitalOcean

参考

Nginx一网打尽动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化... (qq.com)

dunwu/nginx-tutorial: 这是一个 Nginx 极简教程目的在于帮助新手快速入门 Nginx。 (github.com) 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: nginx