Nginx 官方配置文档
添加更多的线程
# 工作进程 CPU* 2 或者 CPU*3# nginx.confworker_processes 1;
设置最多文件描述符数目
# nginx.confworker_rlimit_nofile 65535;
epoll 并发能力
epoll 是Linux内核为处理大批量文件描述符而作了改进的poll
# nginx.confevents {# 单个工作进程可以允许同时建立外部连接的数量worker_connections 102400;# 启用 "惊群" (就是如果来了一个请求将会启动多个进程争先恐后的抢夺) Nginx 建议开启, Nginx 的进程是根据CPU的数量来的不会很多,影响很小,启动对突然流量的并发有很好的缓解作用accept_mutex on;# 工作进程将一次接受一个新连接multi_accept on;# 使用epolluse epoll;}
设置Nginx SSL
# 以下属性中,以ssl开头的属性表示与证书配置有关。server {listen 443 ssl;# 配置HTTPS的默认访问端口为443。# 如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。# 如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。# 需要将yourdomain.com替换成证书绑定的域名。server_name yourdomain.com;# SSL# 需要将cert-file-name.pem替换成已上传的证书文件的名称。ssl_certificate cert/cert-file-name.pem;# 需要将cert-file-name.key替换成已上传的证书密钥文件的名称。ssl_certificate_key cert/cert-file-name.key;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;# SSL 超时ssl_session_timeout 10s;# 表示使用的加密套件的类型。# 表示使用的TLS协议的类型。ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;# 路径location / {root html; #站点目录。index index.html index.htm;}}
设置Nginx WebSocket
# 通过配置端口指向部署websocker的项目location /wss/ {# 配置地址proxy_pass http://127.0.0.1:82/;proxy_http_version 1.1;# 配置数据proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header X-real-ip $remote_addr;proxy_set_header X-Forwarded-For $remote_addr;}
设置更低的超时配置
# 给客户端分配keep-alive链接超时时间, 一般浏览器默认60s,nginx默认75s, 高并发10skeepalive_timeout 10s;# 设置请求头和请求体(各自)的超时时间, 考虑网络波动可以设置更低client_header_timeout 10s;# body 根据body 大小设置, 如果有上传文件项目给60sclient_body_timeout 60;# 告诉nginx关闭不响应的客户端连接reset_timedout_connection on;# 服务器响应超时时间 20s; 如果返回数据不大可以设置3-5s;send_timeout 20;# ------------------------------------------# 根据服务并发能力适当调高proxy_connect_timeout 10s;proxy_send_timeout 15s;proxy_read_timeout 20s;
限制IP并发以及流量
# nginx提供的的ngx_http_limit_conn_module模块实现该功能。# 为地址状态分配一个大小为size的内存存储区,限制了每秒(分、小时)只接受rate个IP的频率。limit_conn_zone $binary_remote_addr zone=one:10m;# 这将指定一个地址只能同时存在一个连接。“one”与上面的对应,也可以自定义命名, 并发数# limit_conn one 10;# 线程限速300K# limit_rate 300k;# 分配一个大小为size的内存存储区,限制了每秒(分、小时)只接受rate个IP的频率limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
Nginx 流代理
# Nginx 流代理stream {log_format proxy '$remote_addr [$time_local] ''$protocol $status $bytes_sent $bytes_received ''$session_time "$upstream_addr" ''"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';access_log /opt/software/nginx/logs/tcp-access.log proxy ;open_log_file_cache off;# 读取配置include tcp_conf/*.conf;}
# 代理的服务器地址upstream tcp9004 {server 127.0.0.1:8992;}# 入口server {listen 9004;proxy_connect_timeout 8s;proxy_timeout 24h;proxy_pass tcp9004;}
Nginx Gzip 压缩传输
# 开启Gzipgzip on;# 置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于2k的字节数,小于2k可能会越压越大。gzip_min_length 1k;# 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。gzip_buffers 4 16k;# 值为1.0和1.1 代表是否压缩http协议1.0,选择1.0则1.0和1.1都可以压缩gzip_http_version 1.0;# 压缩级别, 1-10,数字越大压缩的越好,也越占用CPU时间gzip_comp_level 2;# 设置哪压缩种文本文件可参考 conf/mime.typesgzip_types text/plain application/javascript application/css text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;# 给CDN和代理服务器使用,针对相同url,可以根据头信息返回压缩和非压缩副本gzip_vary on;# IE 1-6禁用gzip_disable "MSIE [1-6]\.";
Nginx 热加载
nginx -s reload
生产环境Nginx配置
# nginx.confuser root;worker_processes 4;worker_cpu_affinity 00000001 00000010 00000100 00001000;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events {worker_connections 102400;accept_mutex on;multi_accept on;use epoll;}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;send_timeout 600;tcp_nopush on;tcp_nodelay on;keepalive_timeout 6500;types_hash_max_size 204800;client_max_body_size 800M;client_body_buffer_size 128000k;gzip on;gzip_min_length 1k;gzip_vary on;gzip_comp_level 3;gzip_http_version 1.1;gzip_buffers 4 16k;limit_conn_log_level error;limit_conn_status 503;limit_conn_zone $binary_remote_addr zone=addr:1m;limit_conn addr 15;limit_rate 1m;include /etc/nginx/conf.d/*.conf;server {listen 80 default_server;server_name _;default_type 'text/html;Charset=utf-8';add_header permission-control proxy;return 200 'no permission proxy';}}
生产环境Server配置
# Vue 配置server {listen 80;server_name xinsj-admin.yuemia.com;root /html/xinsj-admin;index index.html index.htm;try_files $uri $uri/ /index.html;gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_comp_level 6;gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;gzip_vary off;gzip_disable "MSIE [1-6]\.";}# Api 配置server {listen 80;server_name xxx.xxxx.com;root /html/xinsj;gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_comp_level 6;gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;gzip_vary off;gzip_disable "MSIE [1-6]\.";client_max_body_size 200m;client_header_timeout 30m;client_body_timeout 30m;proxy_connect_timeout 360s;proxy_read_timeout 30m;proxy_send_timeout 30m;location /mobile/ {alias /html/xinsj/mobile/;index index.html index.htm;try_files $uri $uri/ /mobile/index.html;}location /WW_verify_hXpspD3AQMjrL6vY.txt {return 200 'hXpspD3AQMjrL6vY';}location /api/ {proxy_pass http://172.16.249.147:8033/;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Scheme $scheme;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#socketproxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_http_version 1.1;proxy_connect_timeout 4s;proxy_read_timeout 900s;proxy_send_timeout 12s;}}
Nginx 源码
Nginx 源码下载地址
如果Nginx 用Rust 重写一遍会不会更好?
Nginx vs Tengine vs Openresty
Nginx 服务器代理工具 Openresty 基于Nginx的代理,通过Lua脚本扩容的服务器代理. Tengine 基于Nginx 的代理,淘宝开发有很多淘宝自己用的功能. 截止2021年4月底,Openresty 在服务器使用榜上上升越来越快.
目前来说,服务器最好还是Nginx 使用,边缘服务组件稳定最重要
