Skip to content

配置

Nginx 的配置文件通常位于 /etc/nginx/nginx.conf,其基本结构如下:

  • 全局块:设置全局范围的配置,如工作进程数、用户权限、日志路径等。

  • HTTP 块:配置 HTTP 服务器的相关设置,如缓存、压缩、负载均衡等。

  • Server 块:定义虚拟主机,处理不同域名的请求。

  • Location 块:用于匹配请求 URL,配置不同 URL 对应的处理方式。

nginx.conf

全局块

user  nginx; // 配置worker进程的用户及用户组;
worker_processes  auto;  // 业务进程可接受连接数,默认数字1表示开启一个业务进程
error_log  /var/log/nginx/error.log notice; // 错误日志存放路径
pid        /var/run/nginx.pid; // pid(进程标识符):存放路径

user指令

./configure --user=nginx --group=nginx

系统创建用户
useradd nginx
注释掉后,worker进程会显示nobody

目的控制权限访问(假如被入侵也只能访问nginx有权限访问的系统目录)

work process指令

master_process      on|off;
worker_processes     num/auto;  建议将该值和服务器CPU的内核数保存一致
worker_rlimit_nofile 65535; // 设置最大可打开文件描述符的数量,默认0(操作系统自适应),设置后适用高并发

daemon指令

daemon     on|off;  是否以守护进程的方式启动,一般不会用

pid指令

pid:用来配置Nginx当前master进程的进程号ID存储的文件路径。
默认为:/usr/local/nginx/logs/nginx.pid

ps -ef | grep nginx

error_log指令

error_log  /var/log/nginx/error.log notice;  

可用于 全局块、http、server、location
./configure --error-log-path=PATH来指定
日志级别的值有:debug|info|notice|warn|error|crit|alert|emerg

include指令

include /etc/nginx/conf.d/*.conf;

include file; 用来引入其他配置文件,使Nginx的配置更加灵活

可配置在任意处;

events块

events {
	accept_mutex on;
	multi_accept on;
    worker_connections  1024; // 每个 worker 进程的最大并发连接数。
    use epoll;
}

accept_mutex指令

accept_mutex on|off; 默认值on,设置Nginx网络连接序列化:

如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。

multi_accept指令

multi_accept on|off; 默认值off,设置是否允许同时接收多个网络连接:

nginx一个worker 进程只能同时接受一个新的连接。否则,一个worker 进程可以同时接受所有的新连接

worker_connections指令

worker_connections number; 默认值512

use指令

use epoll;  此处所选择事件处理模型是Nginx优化部分的一个重要内容,method的可选值有select/poll/epoll/kqueue等,

epoll: 多路复用

http块

http {


	set_real_ip_from 0.0.0.0/0; // 信任所有的 IP 地址,生产环境尽量制定ip范围设置,如:192.168.1.0/24(192.168.1.0 到 192.168.1.255)
    real_ip_header X-Forwarded-For; // 从 X-Forwarded-For 头部字段里获取客户端的真实 IP 地址
    real_ip_recursive on; // 处理客户端真实 IP 地址的指令
	server_names_hash_bucket_size 128; //虚拟主机数量较多、server_name 较长时设置,默认32或64(按操作系统)。配置了大量的虚拟主机时,server_name 的数量会相应增加。如果桶的大小设置过小,可能会导致哈希冲突频繁发生,从而降低查找效率。此时,适当增大

	proxy_hide_header X-Powered-By; // 隐藏 X-Powered-By 头信息,增强网站的安全性
    proxy_hide_header Server; // 隐藏 Server 头信息
    proxy_intercept_errors on; // 拦截后端的错误响应,然后根据 Nginx 自身的配置进行处理,例如返回自定义的错误页面
	server_tokens off; // 隐藏nginx的版本号,例如 Server: Nginx/1.25.3,仅显示 Server: Nginx

    include mime.types; // mime.types文件中定义了各种文件扩展名与 MIME 类型的映射关系,设置 Content-Type 响应头
    default_type  application/octet-stream; //默认的 MIME 类型
    
    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  logs/access.log  main; // 引用上面main定义的日志格式
    
    sendfile on; // 开启 sendfile 功能,零拷贝(Zero-Copy)技术
    tcp_nopush     on; //在开启 sendfile 的同时,通常还会配合 tcp_nopush 和 tcp_nodelay 指令来进一步优化 TCP 传输性能。
    
    keepalive_timeout  65; // TCP 连接保持机制
    
    gzip  on; // 将文本内容(如 HTML、CSS、JavaScript文件等)进行压缩,减少数据的传输量。比如浏览器response的Content-Encoding:
}

定义mime.types

include mime.types;
default_type  application/octet-stream;

default_type可用于http、server、location

定义日志

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'; 
只能用于http块                      
                      
                      
access_log  logs/access.log  main; // 引用上面main定义的日志格式
 
可用于http、server、location块

sendfile指令

sendfile on; 默认值off, 该属性可以大大提高Nginx处理静态资源的性能

keepalive_timeout指令

keepalive_timeout 65s; 默认值75s,设置长连接的超时时间。可用于http、server、location块

keepalive_requests指令

keepalive_requests 100; 默认值100, 设置一个keep-alive连接使用的次数。可用于http、server、location块

gzip扩展

    gzip  on; // 将文本内容(如 HTML、CSS、JavaScript文件等)进行压缩,减少数据的传输量。
    gzip_min_length 1000; // 只有当响应内容的长度大于或等于这个值时,才会压缩,通常是20字节
    gzip_comp_level 4; // 压缩级别,范围是 1(最快,压缩率最低)到 9(最慢,压缩率最高),建议将 gzip_comp_level 设置为 4 到 6 之间。这样可以在压缩率和压缩速度之间取得一个较好的平衡。越高对cpu消耗越大
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css; // 指定哪些 MIME 类型的内容可以进行 Gzip 压缩
    
    gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon; 
    gzip_buffers 4 16k; // 设置 Gzip 压缩缓冲区的指令
    gzip_vary      on; // 设置 Vary 响应头的指令,on会Hearder出现: Vary: Accept-Encoding


    gzip_proxied any // 一般不配置,表示作为反向代理时是否启用压缩。有多个条件设置,如off、any、expried、auth
     
    

可以f12看 www.jd.com、www.baidu.com、www.aliyun.com等等

Response Hearder的 Content-Encoding: gzip
成功启用后:
Transfer-Encoding: chunked
Content-Encoding: gzip
没有则:
Content-Length: 20045

gzip和sendfile冲突问题

新版本Nginx(≥1.6):已优化兼容性。当同时启用sendfile和gzip时:

若响应需要压缩,Nginx自动禁用sendfile,改用缓冲读写(read + write),确保压缩生效。

若响应无需压缩(如已压缩文件、图片等),继续使用sendfile提升性能。

tcp扩展

tcp_nopush on; // 减少TCP包的数量,数据包里发送所有头文件,而不是一个接一个发送;tcp_nopush 通常与 sendfile 指令一起使用
tcp_nodelay off; // 提供响应速度,降低带宽利用率,(如实时聊天、在线游戏、交互式 Web 应用等),tcp_nodelay 通常与 sendfile 指令一起使用

三方模块扩展

limit_speed_zone one $binary_remote_addr  10m; // 创建一个名为one的速度限制区域,该区域根据客户端的IP($binary_remote_addr)来识别访问者,并为他们设置最大的速率限制为10MB/s。

其他扩展

	server_tokens off; // 隐藏nginx版本号
	
	client_header_timeout 600; // 客户端在 600 秒内没有发送完整的请求头,Nginx 会关闭连接。
    client_body_timeout 600; // 客户端在 600 秒内没有发送完整的请求体,Nginx 会关闭连接
    client_max_body_size 1024m; // 请求体的最大大小为 1024MB(1GB),其默认值为 1m
    client_body_buffer_size 1024m; // 客户端请求体的缓冲区大小为 1024MB(1GB),默认值取决于操作系统的页面大小,一般为 8KB 或者 16KB
    
    
    proxy_buffering on; // 开启代理缓冲功能。默认开启
    proxy_buffer_size 512k; // 默认值为4k或8k 
    proxy_buffers   8 256k; // 表示设置8个256k大小的缓冲区,默认 8 4k
    proxy_busy_buffers_size 512k; 
    // 整体调高了缓存池大小,需要nginx所在机器内存够高
    
    
    // 自定义变量判断是否是机器人,根据以下条件
    map $http_user_agent $is_bot {
                default 0;
                ~[a-z]bot 1;
                ~[sS]pider 1;
                ~spi_der 1;
                ~crawler 1;
                ~ysearch 1;
                ~Yahoo\sPipes 1;
                ~BingPreview 1;
                ~YoudaoFeedFetcher 1;
                ~Firefox\/3.0 1;
                ~MSIE\s6.0 1;
                'Yahoo!\sSlurp' 1;
                'Mediapartners-Google' 1;
     }
include /etc/nginx/conf.d/*.conf; // 允许将多个配置文件合并到主配置文件中,使配置更加模块化和易于管理

server

server {
	listen       80; // 监听在 80 端口上的虚拟主机
	server_name  localhost; // 虚拟主机的名称,ip或域名可多个,空格隔开;支持正则*.baidu.com、baidu.*、~^[0-9]+\.baidu\.com$;
	
	#access_log  logs/host.access.log  main; // 单独给虚拟主机配置日志
	
	#charset utf-8; // 统一字符集,会为所有响应添加 Content-Type 响应头,并包含 charset=utf-8 参数。例如:Content-Type: text/html; charset=utf-8
}

lisiten指令

listen 127.0.0.1:8000; // listen localhost:8000 监听指定的IP和端口
listen 127.0.0.1; 监听指定IP的所有端口
listen 8000; 监听指定端口上的连接
listen *:8000; 监听指定端口上的连接

listen 8080 default_server; // 默认主机指的是如果没有匹配到对应的address:port,则会默认执行
的。如果不指定默认使用的是第一个server

server_name指令

server_name localhost; 精确匹配
server_name *.baidu.com; 通配符匹配
baidu.*、~^[0-9]+\.baidu\.com$; 正则表达式匹配

正则表达式的执行顺序

server{
	listen 80;
	server_name ~^www\.\w+\.com$;
	return 200 '1';
}
server{
	listen 80;
	server_name www.liuchenyun.*;
	return 200 '2';
}
server{
	listen 80;
	server_name *.liuchenyun.com;
 	return 200 '3';
 }

 server{
 	listen 80;
 	server_name www.itheima.com;
 	return 200 '4';
 }

 server{
 	listen 80 default_server;
 	server_name _;
 	return 444 '5';
 }
 
结果: 4 > 3 > 2 > 1 > 5

proxy代理配置

    proxy_set_header Host $host; // 确保后端服务器知道客户端请求的域名
    proxy_connect_timeout 3s; // 与后端服务器建立连接的超时时间为 3 秒
    proxy_read_timeout 600s; // 从后端服务器读取响应的超时时间
    proxy_set_header X-Real-IP $remote_addr; // 确保后端服务器知道客户端的真实 IP 地址,而不是代理服务器的 IP 地址
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; // 设置 X-Forwarded-For 头信息,将客户端的 IP 地址添加到 X-Forwarded-For 列表中
    proxy_set_header X-Forwarded-Proto $scheme; // 设置 X-Forwarded-Proto 头信息,将请求的协议(如 http 或 https)传递给后端服务器。
    
    proxy_intercept_errors on; // 启用错误拦截功能,允许 Nginx 拦截后端服务器返回的错误响应,并返回自定义的错误页面

location

    location / { // 匹配路径
		root html; // 文件根目录
		index index.html index.htm; // 默认页名称
	}
	
	error_page 500 502 503 504 /50x.html; 报错编码对应页面
		location = /50x.html {
		root html;
	}
    
    location / {
         proxy_pass http://192.168.31.157:32006; // 请求转发到指定的后端服务器
    }
    
    location ~*/(js|img|css) { // 支持正则表达式,后端服务一般不用,用于前端项目比较适合
         proxy_pass http://192.168.31.157:32006; // 请求转发到指定的后端服务器
    }

UrlRewrite

rewrite  <regex>    <replacement>   [flag];
关键字    正则       替代内容         flag标记


rewrite参数的标签段位置:
server,location,if


flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
    location ~ ^/web/mycontent/account$ {
        rewrite "^/(.*)$" http://cdtest.liuchenyun.com/console/dashboard break;
    }

upstream

负载均衡,不能保持会话

     upstream myServer{
       server  192.168.1.1:8080 weight=2;  // 根据权重配置负载均衡
       server  192.168.1.2:8080 weight=2 down; // down:不参与负载
       server  192.168.1.3:8080 weight=2 backup; // backup:备用机,当 192.168.1.1宕机才会启用
     
       server  192.168.247.129:8080 max_fails=3 weight=2;  // 失败3次,标记为不可用
       server  192.168.247.129:8081 max_fails=3 weight=4;	
     }
     
	location / {
		proxy_pass http://myServer ;
	}
  • ip_hash:根据客户端ip保持转发到同一台服务器以保持会话(但是基站切换会导致ip变化)
  • least_conn:根据连接次数分配(但是服务器性能不一致,造成流量倾斜)
  • url_hash:根据用户访问url定向转发请求
  • fair:根据后端服务相应时间转发请求(但是服务器性能不一致,造成流量倾斜)
  • 以上都没法动态上下线服务器

动静分离

前端项目放nginx的html下

防盗链

valid_referers none | blocked | server_names | strings ....;
  • none,允许缺失 referer 头部的请求访问
  • blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。
  • server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
valid_referers none www.supermapol.com;
if ($invalid_referer) {
	return 403;
}

https

listen  443 ssl;
ssl_certificate   /etc/nginx/cert/7917704__supermapol.com.pem; // 指定 SSL 证书文件的路径
ssl_certificate_key  /etc/nginx/cert/7917704__supermapol.com.key; // 指定 SSL 私钥文件的路径

ssl_session_cache	shared:SSL:1m; // 加密访问缓存设置,可以大大提高访问速度
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m; // 5m 表示 SSL 会话超时时间为 5 分钟。超时时间过后,客户端需要重新建立 SSL 会话。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; // 这个指令指定了 Nginx 支持的加密套件列表。ECDHE-RSA-AES128-GCM-SHA256 是一个强加密套件,其他选项用于排除不安全的加密套件。这些设置可以提高 SSL/TLS 连接的安全性。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; // 设置支持的 SSL/TLS 协议版本
ssl_prefer_server_ciphers on; //  会优先使用服务器端配置的加密套件