nginx使用
参考文档:Nginx 教程、CentOS7 源码安装Nginx
一、nginx使用
nginx的源码编译安装参考可参考CentOS7 源码安装Nginx
1.1nginx配置文件目录
Nginx 配置文件在 conf 目录下,其默认目录结构如下:
# 以".default"为扩展名的文件是 Nginx 配置文件的配置样例文件.├── fastcgi.conf # 为了规范配置指令 SCRIPT_FILENAME 的用法,引入 FastCGI 变量传递配置├── fastcgi.conf.default├── fastcgi_params # Nginx 在配置 FastCGI 代理服务时会根据 fastcgi_params 文件的配置向 FastCGI 服务器传递变量,该配置文件现已由 fastcgi.conf 代替├── fastcgi_params.default├── koi-utf├── koi-win├── mime.types # MIME 类型映射表,Nginx 会根据服务端文件后缀名在映射关系中获取所属文件类型,将文件类型添加到 HTTP 消息头字段"Content-Type"中├── mime.types.default├── nginx.conf # 默认的配置入口文件├── nginx.conf.default├── scgi_params # Nginx 在配置 SCGI 代理服务时会根据 scgi_params 文件的配置向 SCGI 服务器传递变量├── scgi_params.default├── uwsgi_params # Nginx 在配置 uWSGI 代理服务时会根据 uwsgi_params 文件的配置向 uWSGI 服务器传递变量├── uwsgi_params.default└── win-utf
# koi-utf、koi-win、win-utf:这 3 个文件是 KOI8-R 编码转换的映射文件,因为 Nginx 的作者是俄罗斯人,在 Unicode 流行之前,KOI8-R 是使用最为广泛的俄语编码。1.2 nginx.conf中的域
配置文件 nginx.conf 中上层没有其他指令域的区域被称为配置全局域,简称全局域。
Nginx 的常见配置指令域如下表所示。
| 域名称 | 域类型 | 域说明 |
|---|---|---|
| main | 全局域 | Nginx 的根级别指令区域。该区域的配置指令是全局有效的,该指令名为隐性显示,nginx.conf 的整个文件内容都写在该指令域中 |
| events | 指令域 | Nginx 事件驱动相关的配置指令域 |
| http | 指令域 | Nginx HTTP 核心配置指令域,包含客户端完整 HTTP 请求过程中每个过程的处理方法的配置指令 |
| upstream | 指令域 | 用于定义被代理服务器组的指令区域,也称”上游服务器” |
| server | 指令域 | Nginx 用来定义服务 IP、绑定端口及服务相关的指令区域 |
| location | 指令域 | 对用户 URI 进行访问路由处理的指令区域 |
| stream | 指令域 | Nginx 对 TCP 协议实现代理的配置指令域 |
| types | 指令域 | 定义被请求文件扩展名与 MIME 类型映射表的指令区域 |
| if | 指令域 | 按照选择条件判断为真时使用的配置指令域 |
1.2.1 默认nginx.conf配置
1.2.1.1 全局默认配置域参数
1.指定 Nginx运行时的用户和用户组
#user nobody;格式:user 用户名 用户组;,省略用户组时默认和用户名相同
若编译时指定了--user=nginx --group=nginx,生产环境需要取消注释并改为user nginx;,否则 Nginx 会用默认 nobody 运行。
2.nginx工作进程数
worker_processes 1;-
设置 Nginx 的工作进程数,是 Nginx 性能调优的核心参数之一。
-
默认值
1:单进程处理所有请求,适合测试 / 低配服务器; -
生产环境建议设置为服务器 CPU 核心数(比如 4 核设为 4),或
auto(Nginx 自动识别 CPU 核心),充分利用服务器多核资源。
3. Nginx 的错误日志
error_log logs/error.log;error_log logs/error.log notice;error_log logs/error.log info;-
配置 Nginx 的错误日志,包含日志路径和日志级别,Nginx 默认会开启错误日志(路径一般为
logs/error.log,级别默认error)。 -
日志级别(从低到高):
debug(调试)<info(信息)<notice(通知)<warn(警告)<error(错误)<crit(严重)<alert(告警)<emerg(紧急); -
级别越低,日志越详细,生产环境一般用
error/warn,避免日志文件过大。
4. Nginx的主进程号文件的路径
#pid logs/nginx.pid;-
指定 Nginx主进程号文件的路径,
pid文件记录 Nginx 主进程的 ID,用于后续管理(比如重启、停止 Nginx 时通过 pid 文件定位进程)。 -
取消注释后,Nginx 启动时会自动在
logs目录生成nginx.pid文件。
1.2.1.2 events 事件域
events{} 块专门配置 Nginx 的网络连接相关参数,作用于 Nginx 的工作进程,影响连接的处理效率,仅能有一个 events 块。
events { worker_connections 1024;}worker_connections 1024;:设置单个 Nginx 工作进程的最大并发连接数,默认 1024。
-
该数值受服务器系统的文件描述符限制(Linux 默认单进程最大文件描述符为 1024),生产环境需先调大系统限制,再修改此参数;
-
Nginx理论最大并发连接数 ≈
worker_processes(工作进程数) ×worker_connections(单进程最大连接数)。
1.2.1.3 http 域
http{} 是 Nginx 配置的核心,所有和 HTTP/HTTPS 协议相关的配置都在这个块中,支持多个 Server 虚拟主机块,且内部配置会被所有子块(Server/Location)继承。
http { include 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 logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; ... # 后续Server块}逐行解释 HTTP 块内的基础指令:
-
include mime.types;引入 Nginx 的MIME 类型映射文件,
mime.types是 Nginx 自带的配置文件(和 nginx.conf 同目录),里面定义了上千种文件后缀和对应的 MIME 类型(比如.html对应text/html、.jpg对应image/jpeg)。- 作用:Nginx 向客户端返回文件时,会根据该文件的后缀匹配 MIME 类型,然后在 HTTP 响应头中设置
Content-Type,让浏览器正确解析文件(比如识别 html 为网页、jpg 为图片)。
- 作用:Nginx 向客户端返回文件时,会根据该文件的后缀匹配 MIME 类型,然后在 HTTP 响应头中设置
-
default_type application/octet-stream;设置默认的 MIME 类型,当请求的文件后缀在
mime.types中没有匹配项时,Nginx 会将该文件的 MIME 类型设为application/octet-stream(二进制流)。- 作用:浏览器遇到该类型会触发下载行为,比如未知后缀的
.abc文件,浏览器会直接下载而不是尝试解析。
- 作用:浏览器遇到该类型会触发下载行为,比如未知后缀的
-
#log_format main '...';【注释示例】自定义访问日志的格式,并为该格式命名为
main(可自定义名称,比如nginx_log),里面的$xxx是 Nginx 的内置变量,用于获取请求的相关信息,核心变量含义:变量 含义 $remote_addr 客户端的 IP 地址 $remote_user 客户端的认证用户名(无则为空) $time_local 服务器的本地时间 $request 客户端的请求行(方法 + URL + 协议) $status HTTP 响应状态码(200/404/502 等) $body_bytes_sent 向客户端发送的响应体大小(不含响应头) $http_referer 来源页的 URL(防盗链常用) $http_user_agent 客户端的用户代理(浏览器 / 爬虫标识) $http_x_forwarded_for 客户端真实 IP(反向代理场景用) - 作用:自定义日志格式,让访问日志包含你需要的信息,后续
access_log可引用该格式。
- 作用:自定义日志格式,让访问日志包含你需要的信息,后续
-
#access_log logs/access.log main;【注释示例】开启 Nginx 的访问日志,指定日志文件路径为
logs/access.log,并使用上面定义的main格式记录日志。- 访问日志会记录所有客户端的 HTTP 请求,是排查问题、统计访问量的核心依据;
- 可在 Server/Location 块中单独配置,实现不同虚拟主机 / 不同路径的独立访问日志。
-
sendfile on;开启 Linux 的sendfile 零拷贝技术,默认开启,是 Nginx 高性能的核心特性之一。
- 传统文件传输:Nginx 进程→读取磁盘文件→内核缓冲区→Nginx 缓冲区→网络缓冲区→客户端,多步拷贝;
- 零拷贝:内核直接将磁盘文件的内容发送到网络缓冲区,跳过 Nginx 用户态缓冲区,减少内存拷贝和 CPU 消耗,大幅提升静态文件(html/js/img)的传输性能。
-
#tcp_nopush on;【注释示例】开启TCP_NOPUSH选项,需和
sendfile on;配合使用。- 作用:让 Nginx 在发送响应时,先将数据缓冲区填满再一次性发送,减少 TCP 网络包的数量,提升大文件的传输效率(适合静态文件服务)。
-
#keepalive_timeout 0;【注释示例】设置 HTTP长连接的超时时间为 0,即关闭长连接。
- HTTP 长连接:客户端和服务器建立一次 TCP 连接后,可多次发送 HTTP 请求,无需重复建立连接,减少 TCP 握手的开销;
- 设为 0 时,每次请求都建立新的 TCP 连接,性能较低,一般不开启。
-
keepalive_timeout 65;开启 HTTP 长连接,设置超时时间为65 秒,是生产环境的常用值。
- 含义:客户端和服务器建立 TCP 连接后,若 65 秒内没有新的 HTTP 请求,服务器会主动关闭该 TCP 连接;
- 调优建议:根据业务场景调整,比如静态资源服务可设为 30/60 秒,避免长连接占用过多服务器资源。
-
#gzip on;【注释示例】开启 Nginx 的gzip 压缩功能,默认关闭。
- 作用:Nginx 在向客户端返回响应体(html/js/css/json 等文本文件)前,先对其进行 gzip 压缩,减少传输的文件大小,提升网页加载速度(图片 / 视频已压缩,无需 gzip);
- 生产环境建议开启,后续可配置压缩级别、压缩的文件类型等精细参数。
1.2.1.4 server 虚拟主机域
server{} 块属于 HTTP 块的子块,用于配置虚拟主机,Nginx 通过多个 Server 块实现一台服务器运行多个网站(比如同时运行www.aaa.com和www.bbb.com),核心通过listen(端口)+server_name(域名 / IP)区分不同虚拟主机。
默认配置中只有一个 Server 块,监听 80 端口,对应localhost,逐行解释:
server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; ... # 后续Location块}-
listen 80;设置该虚拟主机监听的 TCP 端口,默认 80(HTTP 协议的默认端口),可指定 IP + 端口(比如
192.168.1.100:8080),多个端口用空格分隔(比如listen 80 8080;)。 -
server_name localhost;设置该虚拟主机对应的域名 / 主机名,支持多个值(用空格分隔,比如
server_name localhost www.test.com;),也支持通配符(*.test.com)和正则表达式。- Nginx 接收请求时,会根据请求头中的
Host字段匹配server_name,找到对应的 Server 块处理请求; - 若未匹配到任何 Server 块,会使用第一个匹配 listen 端口的 Server 块处理。
- Nginx 接收请求时,会根据请求头中的
-
#charset koi8-r;【注释示例】设置该虚拟主机的默认字符集,
koi8-r是俄语字符集,生产环境一般改为utf-8(charset utf-8;),让 Nginx 在响应头中设置Content-Type: text/html; charset=utf-8,避免网页中文乱码。 -
#access_log logs/host.access.log main;【注释示例】为该虚拟主机配置独立的访问日志,和 HTTP 块的全局访问日志区分,适合多虚拟主机的场景,方便单独统计 / 排查某个网站的请求。
1.2.1.5 Location 路径匹配域
location{} 块是 Server 块的子块,用于匹配客户端的请求 URL 路径,并为不同路径配置专属的处理规则(比如根目录、错误页面、PHP 解析等),是 Nginx 配置的核心灵活点。
默认配置中有 3 个 Location 块,还有 2 个注释的 PHP 相关示例块,逐一解释:
1. 根路径匹配:location / {}
匹配所有以/开头的请求 URL(即客户端的所有请求,是默认的路径匹配规则),处理网站的根路径请求:
location / { root html; index index.html index.htm;}-
root html;设置该路径对应的网站根目录,
html是相对路径(相对于 Nginx 的安装目录,比如你编译的/usr/local/nginx/html),也可写绝对路径(比如/data/nginx/html)。- 含义:当客户端请求
http://localhost/index.html时,Nginx 会在html目录下查找index.html文件并返回。
- 含义:当客户端请求
-
index index.html index.htm;设置该路径的默认索引文件(首页文件),支持多个值,Nginx 会按顺序查找,找到第一个存在的文件并返回。
- 含义:当客户端请求
http://localhost/(仅域名,无具体 URL)时,Nginx 会在root指定的目录下依次查找index.html、index.htm,找到后返回。 - 生产环境可添加
index.php(PHP 网站)、index.jsp(Java 网站)等。
- 含义:当客户端请求
1.2.1.6 错误页面匹配
这是错误页面的配套配置,处理服务器端的 5xx 错误(服务端内部错误)
#error_page 404 /404.html;
# 第一步:配置5xx错误码跳转到/50x.html页面error_page 500 502 503 504 /50x.html;# 第二步:精确匹配/50x.html请求,指定页面的根目录location = /50x.html { root html;}-
error_page 500 502 503 504 /50x.html;配置HTTP 错误码的跳转页面,当 Nginx 返回 500(内部服务器错误)、502(网关错误)、503(服务不可用)、504(网关超时)时,会向客户端返回
/50x.html页面的内容。- 可扩展:支持 4xx 错误(比如
404 /404.html),也可跳转到绝对 URL(比如error_page 404 https://www.baidu.com;)。
- 可扩展:支持 4xx 错误(比如
-
location = /50x.html {}精确匹配URL 为
/50x.html的请求(=是精确匹配符号,只匹配完全一致的 URL),root html;指定该页面的根目录和网站根目录一致,即html/50x.html(Nginx 默认自带该文件)。
1.2.1.7 注释的示例 Location 块(按需开启)
默认配置中还有 3 个注释的 Location 块,是 Nginx 提供的常用业务示例,分别用于 PHP 代理、PHP-FPM 解析、禁止访问隐藏文件,逐行解释:
1. 将 PHP 请求代理到 Apache 服务器
#location ~ \.php$ {# proxy_pass http://127.0.0.1;#}location ~ \.php$:正则匹配所有以.php结尾的请求(~表示区分大小写的正则匹配);proxy_pass http://127.0.0.1;:开启反向代理,将所有 PHP 请求转发到本地的 Apache 服务器(监听 80 端口),由 Apache 处理 PHP 解析(适合 Nginx+Apache 的组合架构)。
2. 将 PHP 请求交给 FastCGI 服务器(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;#}这是Nginx+PHP-FPM的核心配置(PHP 网站必开),也是最常用的 PHP 解析方式,核心指令:
fastcgi_pass 127.0.0.1:9000;:将 PHP 请求转发到FastCGI 服务器(PHP-FPM) 的 9000 端口,由 PHP-FPM 解析 PHP 脚本;fastcgi_index index.php;:设置 PHP 的默认索引文件,和index指令作用类似;fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;:设置 FastCGI 的核心参数,指定 PHP 脚本的绝对路径(生产环境需修改/scripts为实际的网站根目录,比如$document_root,$document_root是root指令指定的路径);include fastcgi_params;:引入 Nginx 自带的 FastCGI 参数配置文件,里面定义了 CGI 的标准参数(比如请求方法、协议版本)。
3. 禁止访问 Apache 的.htaccess 文件
#location ~ /\.ht {# deny all;#}location ~ /\.ht:正则匹配所有以.ht开头的文件 / 目录(比如 Apache 的配置文件.htaccess);deny all;:拒绝所有客户端的访问(返回 403 Forbidden)。- 原因:Nginx不识别 Apache 的.htaccess 文件,该文件中可能包含网站的敏感配置,禁止访问可提升安全性。
1.2.1.8 其他注释的 Server 块示例
默认配置的最后还有两个注释的 Server 块,是 Nginx 的虚拟主机高级示例,方便你后续扩展:
# another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias;
# location / { # root html; # index index.html index.htm; # } #}=================================================== # HTTPS server # #server { # listen 443 ssl; # server_name localhost;
# ssl_certificate cert.pem; # ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on;-
多端口 / 多域名的虚拟主机:监听 8000 和 8080 端口,对应多个域名 / 别名,适合一台服务器运行多个网站;
-
HTTPS 虚拟主机
:监听 443 端口(HTTPS 默认端口),配置 SSL 证书 / 私钥,开启 HTTPS 加密,是 HTTPS 网站的基础配置,核心指令:
ssl_certificate/ssl_certificate_key:指定 SSL 证书(公钥)和私钥的路径;ssl_session_cache:开启 SSL 会话缓存,减少 SSL 握手开销;ssl_ciphers:指定 SSL 的加密套件,提升 HTTPS 的安全性。
1.3 nginx.conf示例
若使用CentOS7 源码安装Nginx中的编译参数,则可使用如下“nginx.conf`配置
./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--modules-path=/usr/local/nginx/modules \--with-compat \--with-file-aio \--with-threads \--with-http_addition_module \--with-http_auth_request_module \--with-http_dav_module \--with-http_flv_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_mp4_module \--with-http_random_index_module \--with-http_realip_module \--with-http_secure_link_module \--with-http_slice_module \--with-http_ssl_module \--with-http_stub_status_module \--with-http_sub_module \--with-http_v2_module \--with-stream \--with-stream_realip_module \--with-stream_ssl_module \--with-stream_ssl_preread_module \--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' \--with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'使用此配置需要修改
单个工作进程的最大文件描述符限制Terminal window vim /etc/security/limits.conf# 改为65536* soft nofile 65536* hard nofile 65536# 或针对特定用户www-data soft nofile 65536www-data hard nofile 65536
# 全局配置块:对应编译--user=nginx --group=nginx,适配--with-threads/--with-file-aiouser nginx nginx; # 匹配编译的运行用户/组,替代默认nobody,安全必备worker_processes auto; # 自动匹配CPU核心数,充分利用多核,配合线程池更高效error_log logs/error.log warn; # 错误日志,warn级别兼顾排查和日志量pid logs/nginx.pid; # 开启PID文件,用于Nginx进程管理(重启/重载/停止)worker_rlimit_nofile 65535; # 提升文件描述符限制,配合高并发连接数调优
# Events事件块:网络连接配置,适配--with-threads/--with-file-aio编译参数events { use epoll; # Linux专属高并发事件模型,Nginx默认最优选择 worker_connections 10240; # 单进程最大并发连接数,从默认1024调优 multi_accept on; # 一次性接收所有新连接,提升并发处理效率 accept_mutex on; # 开启互斥锁,防止多进程惊群效应,减少CPU消耗}
# HTTP核心块:启用所有编译的HTTP模块,适配Nginx 1.28.2语法http { include mime.types; # 引入MIME类型映射,让浏览器正确解析文件 default_type application/octet-stream; # 未知后缀文件默认以二进制流下载 charset utf-8; # 全局默认UTF-8字符集,解决中文乱码,生产必备
# 自定义访问日志格式:适配--with-http_realip_module,记录客户端真实IP log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$realip_remote_addr"'; access_log logs/access.log main; # 开启访问日志,使用上面的main格式
# 高性能核心配置:适配--with-file-aio/--with-threads编译参数 sendfile on; # 开启零拷贝技术,大幅提升静态文件传输性能(file-aio核心) tcp_nopush on; # 配合sendfile,填满缓冲区再发送,减少TCP包数量 tcp_nodelay on; # 长连接关闭Nagle算法,提升动态请求实时性 keepalive_timeout 60; # 长连接超时时间,比默认65更适中,减少连接占用 keepalive_requests 100; # 单个长连接最大处理请求数,从默认10调优,减少握手开销
# 客户端请求限制:生产必备,防止大文件/大请求压垮服务 client_max_body_size 100M; # 客户端最大上传文件大小,可根据业务修改 client_header_buffer_size 1k; # 客户端请求头缓冲区大小 client_body_buffer_size 16k; # 客户端请求体缓冲区大小
# 压缩配置:适配--with-http_gzip_static/--with-http_gunzip_module编译参数 gzip on; # 开启实时gzip压缩,压缩文本类文件 gzip_static on; # 优先返回预压缩的.gz文件,比实时压缩更省CPU(核心) gzip_min_length 1k; # 小于1k的文件不压缩,无性能收益 gzip_buffers 4 16k; # 压缩缓冲区大小,按需分配内存 gzip_http_version 1.1;# 仅对HTTP1.1+开启压缩,兼容主流客户端 # 需压缩的文件类型,仅压缩文本类,图片/视频已压缩无需处理 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on; # 带Vary头,兼容CDN/缓存服务器,避免缓存混乱
# 真实IP配置:适配--with-http_realip_module编译参数(反向代理/CDN场景必备) set_real_ip_from 127.0.0.1; # 本地代理IP,测试环境留用 set_real_ip_from 192.168.0.0/16; # 内网代理/CDN IP段,按需添加/删除 set_real_ip_from 10.0.0.0/8; # 内网IP段,按需添加/删除 real_ip_header X-Forwarded-For; # 从X-Forwarded-For头解析真实IP real_ip_recursive on; # 递归解析,跳过指定的代理IP段,获取真实客户端IP
# 80端口主虚拟主机:适配Nginx 1.28.2 HTTP/2明文写法(h2c),无SSL纯HTTP server { # Nginx 1.28.2明文HTTP/2写法:http2 cleartext(替代旧的http2),不想用HTTP/2可直接写listen 80; listen 80 ; server_name localhost; # 替换为你的服务器IP/域名,比如192.168.1.100/xxx.com
# 网站根目录和默认索引文件,可根据自己的业务修改路径 root html; index index.html index.htm index.php; # 增加PHP索引,兼容动态站点,无需可删除
# Nginx状态监控:适配--with-http_stub_status_module编译参数(运维必备) location /nginx_status { stub_status on; # 开启监控接口,展示连接数/请求数等核心指标 allow 127.0.0.1; # 仅允许本地访问,安全 allow 192.168.0.0/16; # 允许内网IP段访问,按需添加/删除 deny all; # 拒绝所有外网未授权访问 }
# 根路径请求处理:适配前端单页应用(Vue/React),刷新页面不404 location / { try_files $uri $uri/ /index.html; # 先匹配文件/目录,无则返回index.html }
# 错误页面配置:扩展404/5xx,保留Nginx默认的错误页文件 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /404.html { root html; } location = /50x.html { root html; }
# 安全配置:禁止访问隐藏文件(.htaccess/.env/.git等),防止敏感配置泄露 location ~ /\. { deny all; access_log off; # 不记录该类请求日志 log_not_found off; # 不记录文件未找到日志 }
# PHP解析配置:适配FastCGI(Nginx+PHP-FPM),按需开启(删除#即可) # location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # PHP-FPM默认监听端口 # fastcgi_index index.php; # # 正确的PHP脚本路径,替换默认的/scripts,生产必备 # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # include fastcgi_params; # 引入FastCGI默认参数 # } }
# Stream四层代理配置:适配--with-stream/--with-stream_realip等编译参数 # 无需代理MySQL/Redis/TCP服务则保持注释,需要时删除#并修改配置 # stream { # # 四层代理真实IP配置,按需开启 # # set_real_ip_from 192.168.0.0/16; # # real_ip_header X-Forwarded-For; # # # 示例:代理MySQL 3306端口 # # server { # # listen 3306; # # proxy_pass 192.168.1.100:3306; # 后端MySQL真实IP:端口 # # proxy_connect_timeout 5s; # # proxy_timeout 30s; # # } # # # 示例:代理Redis 6379端口 # # server { # # listen 6379; # # proxy_pass 192.168.1.101:6379; # 后端Redis真实IP:端口 # # } # }}1.3.1 配置参数详细解释
所有配置均一一对应你的编译参数,标注了编译参数关联项,同时解释生产环境调优的原因,方便你根据自身业务修改。
1.3.1.1 全局配置块(关联编译--user/--group)
| 参数 | 含义 & 编译关联 & 调优原因 |
|---|---|
user nginx nginx; | 【关联--user=nginx --group=nginx】指定 Nginx 运行的用户 / 组,替代默认nobody,避免 root 权限运行,生产安全必备 |
worker_processes auto; | 替代默认1,自动匹配服务器 CPU 核心数,充分利用多核资源(编译开启--with-threads,线程池配合多核更高效) |
error_log logs/error.log warn; | 开启错误日志,级别设为warn(比error详细、比info精简),生产环境日志量适中,方便排查问题 |
pid logs/nginx.pid; | 开启 PID 文件,记录 Nginx 主进程 ID,用于nginx -s stop/reload等进程管理操作 |
worker_rlimit_nofile 65535; | 提升单个工作进程的最大文件描述符限制,解决worker_connections调大后因系统限制失效的问题,高并发必备 |
1.3.1.2 Events 事件块(关联编译--with-threads/--with-file-aio)
| 参数 | 含义 & 编译关联 & 调优原因 |
|---|---|
use epoll; | 使用 Linux 专属的epoll事件模型(高并发性能远优于 select/poll),Nginx 默认自动识别,显式配置更稳妥 |
worker_connections 10240; | 【关联--with-threads】单进程最大并发连接数,从默认 1024 调至 10240,配合多核实现万级并发(需系统内核调优) |
multi_accept on; | 工作进程一次性接收所有新建立的连接,避免多次唤醒进程,提升并发处理效率 |
accept_mutex on; | 开启连接互斥锁,防止多进程同时争抢连接的惊群效应,减少 CPU 消耗 |
1.3.1.3 HTTP 核心块(关联所有 HTTP 相关编译模块)
1. 基础协议配置
| 参数 | 含义 & 编译关联 |
|---|---|
charset utf-8; | 全局默认字符集,解决 HTML/JSON 等中文乱码,生产环境必备 |
log_format main '...$realip_remote_addr'; | 自定义访问日志格式,【关联--with-http_realip_module】增加$realip_remote_addr字段,记录客户端真实 IP |
client_max_body_size 100M; | 限制客户端最大上传文件大小,避免大文件请求导致 Nginx 报错,可根据业务修改(比如视频服务调至 1G) |
2. 高性能配置(关联--with-file-aio/--with-threads)
| 参数 | 含义 & 编译关联 & 调优原因 |
|---|---|
sendfile on; | 【关联--with-file-aio】开启 Linux 零拷贝技术,跳过用户态缓冲区,直接内核态传输文件,大幅提升静态文件性能 |
tcp_nopush on; | 配合sendfile on,让 Nginx 填满 TCP 缓冲区后再一次性发送数据,减少 TCP 网络包数量,提升大文件传输效率 |
tcp_nodelay on; | 长连接下关闭 Nagle 算法,实时发送小数据包,提升动态请求(比如 API)的响应速度 |
keepalive_requests 100; | 单个长连接最大处理 100 个请求,从默认 10 调优,减少长连接的建立 / 关闭开销,提升并发 |
3. 压缩配置(关联--with-http_gzip_static/--with-http_gunzip_module)
| 参数 | 含义 & 编译关联 |
|---|---|
gzip on; | 开启实时 gzip 压缩,压缩文本类文件(HTML/CSS/JS),减少传输体积 |
gzip_static on; | 【关联--with-http_gzip_static_module】优先返回预压缩的.gz文件(比如index.html.gz),比实时压缩更省 CPU,编译开启后核心配置 |
gzip_vary on; | 响应头添加Vary: Accept-Encoding,兼容 CDN / 缓存服务器,避免缓存压缩 / 未压缩的混乱 |
4. 真实 IP 配置(关联--with-http_realip_module)
| 参数 | 含义 & 编译关联 |
|---|---|
set_real_ip_from 127.0.0.1/192.168.0.0/16; | 【关联--with-http_realip_module】指定反向代理 IP 段(Nginx 前置 CDN / 负载均衡时),仅从这些 IP 获取真实 IP |
real_ip_header X-Forwarded-For; | 从 HTTP 请求头X-Forwarded-For中解析客户端真实 IP,替代 Nginx 默认的$remote_addr(代理场景下$remote_addr是代理 IP) |
real_ip_recursive on; | 递归解析真实 IP,跳过set_real_ip_from指定的代理 IP 段,直接获取最外层客户端 IP |
1.3.1.4 Server 虚拟主机块(核心,关联http_ssl/http_v2/stub_status)
1. 80 端口配置(HTTP)
| 参数 | 含义 & 编译关联 |
|---|---|
rewrite ^(.*)$ https://$host$1 permanent; | 强制将所有 80 端口 HTTP 请求 301 重定向到 443 端口 HTTPS,【关联--with-http_ssl_module】,生产环境 HTTPS 必备 |
2. 443 端口配置(HTTPS+HTTP2,核心)
| 参数 | 含义 & 编译关联 |
|---|---|
listen 443 ssl http2; | 【关联--with-http_ssl_module/--with-http_v2_module】开启 443 端口,同时启用 SSL 加密和 HTTP2 协议,HTTP2 大幅提升 HTTPS 并发性能 |
ssl_protocols TLSv1.2 TLSv1.3; | 仅开启安全的 TLS1.2/1.3 协议,禁用低版本的 SSL3.0/TLS1.0/1.1,提升 HTTPS 安全性 |
ssl_ciphers 加密套件; | 配置高安全的加密套件,避免弱加密被破解,【关联http_ssl_module】 |
3. 监控配置(关联--with-http_stub_status_module)
| 参数 | 含义 & 编译关联 |
|---|---|
location /nginx_status { stub_status on; } | 【关联--with-http_stub_status_module】开启 Nginx 状态监控,访问https://域名/nginx_status可查看连接数 / 请求数 / 活跃进程等核心指标 |
allow 127.0.0.1; deny all; | 仅允许本地 / 内网访问监控接口,防止外网恶意访问,提升安全性 |
4. 安全配置
| 参数 | 含义 |
|---|---|
location ~ /\. { deny all; } | 禁止访问所有以.开头的隐藏文件(比如.htaccess/.env/.git),避免敏感配置泄露 |
try_files $uri $uri/ /index.html; | 适配 Vue/React 等前端单页应用路由,刷新页面时避免 404,前端项目必备 |
1.3.1.5 Stream 四层代理块(关联--with-stream系列编译参数)
该模块是四层 TCP/UDP 代理,区别于 HTTP 七层代理,【关联--with-stream/--with-stream_realip/--with-stream_ssl_module】,默认注释,按需开启:
stream { ... }:四层代理核心块,开启后可代理 MySQL/Redis/SSH 等 TCP 协议服务,也可代理 UDP 协议(比如 DNS);set_real_ip_from:【关联--with-stream_realip_module】四层代理场景下获取客户端真实 IP;listen 3306; proxy_pass 后端IP:3306;:示例为代理 MySQL 数据库,将 Nginx 的 3306 端口转发到后端 MySQL 服务器。
1.3.1.6 配置使用注意事项
- 证书替换:将
ssl_certificate/ssl_certificate_key替换为自己的 SSL 证书路径(公钥 / 私钥),证书可从阿里云 / 腾讯云 / Let’s Encrypt 免费申请; - 域名修改:将
server_name localhost;替换为自己的实际域名(比如www.test.com test.com); - 根目录修改:将
root html;替换为自己的网站根目录(比如/data/nginx/html); - PHP 解析:如果是 PHP 动态站点,取消 PHP 解析配置的注释,确保 PHP-FPM 正常运行(监听 9000 端口);
- Stream 代理:如果需要代理 MySQL/Redis 等 TCP 服务,取消
stream块的注释,根据实际业务修改代理地址; - 系统内核调优:
worker_connections调至 10240 后,需修改 Linux 内核参数(/etc/security/limits.conf)提升文件描述符限制,否则配置失效。
1.3.2 配置文件模块化
在默认的全局配置文件中加入include conf.d/*.conf;,这条指令的核心作用是引入指定目录下的所有.conf 后缀配置文件,Nginx 启动 / 重载时会自动将这些子配置文件的内容合并到主配置中,和直接写在主配置里的效果完全一致。
conf.d/\*.conf:是相对路径 + 通配符,表示加载 Nginx 主配置目录(和 nginx.conf 同目录) 下的conf.d文件夹中,所有以.conf 结尾的文件;
- 绝对路径写法:比如你的 Nginx 安装在
/usr/local/nginx,可写include /usr/local/nginx/conf/conf.d/*.conf;,效果一致; - 通配符
*:仅匹配conf.d目录下的.conf 文件,子目录的不会匹配(如需递归匹配用**,Nginx 1.19.10 + 支持)。
1.3.2.1 创建conf.d目录 + 目录内有.conf文件
Nginx 会将这些.conf文件的内容合并到主配置的对应位置(include写在哪个层级,子配置就属于哪个层级),子配置和主配置融为一体。
关键:子配置文件的语法要和
include所在层级匹配(比如include写在http{}块内,子配置里直接写server{}块即可,无需再包http{},否则会语法报错)。
1.3.2.2 适用条件
原有配置是单文件配置:所有server块、全局配置都写在nginx.conf里,当需要配置多个虚拟主机、多个业务站点时,主配置会变得无比臃肿,改一个站点的配置要翻几百行,极易出错。
include conf.d/*.conf;就是为了解决这个问题,实现配置拆分 / 模块化管理:把不同站点、不同业务的配置拆分成独立的.conf文件,统一放在conf.d目录下,主配置只保留全局、Events、HTTP 核心配置,让整个配置体系更清晰。
模块化配置的核心优势(生产环境必用)
- 便于管理:每个站点 / 业务一个独立的.conf 文件(比如
blog.conf、admin.conf、api.conf),各司其职,不会混乱; - 便于维护:修改某个站点的配置,只需编辑对应的.conf 文件,不用动主配置
nginx.conf,减少误改核心配置的风险; - 快速启用 / 禁用:只需将.conf 文件重命名为
.bak(比如blog.conf.bak),Nginx 就不会加载,无需注释大量配置,实现站点的快速启停; - 配置复用:不同环境(测试 / 生产)的子配置文件可直接复制,只需修改域名 / IP,无需重构整个配置;
- 团队协作:多个开发 / 运维修改配置时,不会同时编辑主配置文件,避免冲突。
1.3.2.3 使用方法
1. 指令的正确放置位置
include conf.d/*.conf;必须写在http{}块内(推荐放在 http 块的末尾,原有 server 块之后),因为子配置文件的核心内容是server{}块,而server{}是http{}的子级,放错位置会直接语法报错。
2. 必须手动创建conf.d目录
Nginx 不会自动创建该目录,需要手动在nginx.conf 同目录下创建,命令如下(你的 Nginx 安装在/usr/local/nginx):
3. 子配置文件的语法规则
子配置文件中无需写http{}块,直接写server{}块即可(可包含多个 server 块),因为include是把内容合并到主配置的http{}块内,重复写http{}会导致语法错误。
4. 配置优先级
如果子配置和主配置有重复的 HTTP 级配置(比如gzip on;、keepalive_timeout),子配置的内容会覆盖主配置(就近原则),因此建议核心 HTTP 配置只写在主配置,子配置只写站点相关的server{}块。
1.4 启动调试
# 进入安装目录nginx后cd ./sbin/./nginx -t # 检查配置文件是否正确./nginx # 启动nginx./nginx -s quit # 正常关闭nginx./nginx -s stop # 快速关闭nginx./nginx -s reload # 重载nginx./nginx -s reopen # 重新打开日志文件./nginx -V #查看版本信息及编译参数
nginx -p /usr/local/newnginx # 指定Nginx的执行目录,默认为 configure 时的安装目录nginx -c /etc/nginx/nginx.conf # 指定nginx.conf文件的位置,默认为 conf/nginx.conf
# 启动后查看进程ps -ef | grep nginx1.5 nginx 系统优化
1.5.1 添加软连接
由于目前每次需要进入到软件目录的sbin目录下去执行nginx这个可执行文件,或使用绝对路径去执行,非常麻烦。因此可以添加软链接到系统默认的PATH变量路径中,来实现无论在哪个目录下都可以执行nginx命令
# 查看当前系统的PATH环境路径echo $PATH# 结果如下/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 只需将软链接添加到这些路径中即可ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
# 也可以直接编辑PATH变量,将软件的执行命令路径添加到PATH中,但不推荐,一旦安装多了会导致PATH十分臃肿vim /etc/profile# 添加如下内容export PATH="$PATH:/usr/local/nginx/sbin"
# 方法二(推荐):在 /etc/profile.d/ 下创建独立脚本vim /etc/profile.d/nginx.sh# 添加内容export PATH="$PATH:/opt/mytools"# 赋予读权限(无需执行权限): chmod 644 /etc/profile.d/nginx.sh# 新终端会自动加载该脚本1.5.2 添加到systemd服务管理中
创建一个名为 nginx.service 的 systemd 服务单元文件,用于管理 Nginx 服务,存放于/usr/lib/systemd/system目录下,以下内容:(以下内容为nginx 文档中的配置)
[Unit] # 记录service文件的通用信息Description=The Nginx HTTP and reverse proxy server # Nginx服务描述信息After=network.target remote-fs.target nss-lookup.target # Nginx服务启动依赖,在指定服务之后启动
[Service] # 记录service文件的service信息Type=forking # 标准UNIX Daemon使用的启动方式PIDFile=/usr/local/nginx/logs/nginx.pid # Nginx服务的pid文件位置ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid # Nginx服务启动前删除旧的pid文件ExecStartPre=/usr/local/nginx/sbin/nginx -t -q # Nginx服务启动前执行配置文件检测ExecStart=/usr/local/nginx/sbin/nginx -g "pid /usr/local/nginx/logs/nginx.pid;" # 启动Nginx服务ExecReload=/usr/local/nginx/sbin/nginx -t -q # Nginx服务重启前执行配置文件检测ExecReload=/usr/local/nginx/sbin/nginx -s reload -g "pid /usr/local/nginx/logs/nginx.pid;" # 重启Nginx服务ExecStop=/bin/kill -s HUP $MAINPID # 关闭Nginx服务KillSignal=SIGQUIT # 当 systemd 需要强制终止服务(比如超时后),默认发送的信号。TimeoutStopSec=5 # systemd 等待服务正常停止的最长时间(秒)KillMode=process # 可选配置:control-group(杀死整个 cgroup 中的所有进程)/process(只杀死主进程)/mixed(主进程发 KillSignal,子进程发 SIGKILL)PrivateTmp=true # 为该服务创建一个隔离的 /tmp 目录[Install] # 记录service文件的安装信息
WantedBy=multi-user.target # 多用户环境下启用以下为简便的systemd文件
cat > /usr/lib/systemd/system/nginx.service <<'EOF'[Unit]Description=The nginx HTTP and reverse proxy serverAfter=network.target remote-fs.target nss-lookup.target
[Service]Type=forkingExecStart=/usr/sbin/nginxExecReload=/usr/sbin/nginx -s reloadExecStop=/usr/sbin/nginx -s quitPrivateTmp=true
[Install]WantedBy=multi-user.targetEOF# 加载配置systemctl damon-reload1.6 使用案例
1.6.1web服务器
场景说明:
部署纯静态网站(HTML/CSS/JS/ 图片 / 视频),利用gzip_static/sendfile等编译模块优化性能,适配大文件传输。
server { listen 80; server_name static.yourdomain.com; # 替换为你的域名/服务器IP
# 网站根目录(替换为实际静态文件路径) root /data/nginx/static; index index.html index.htm;
# 静态文件优化:适配--with-file-aio/--with-http_gzip_static sendfile on; tcp_nopush on; tcp_nodelay on;
# 预压缩文件优先(.html.gz/.js.gz),省CPU gzip_static on; gzip on; gzip_types text/plain text/css application/javascript image/svg+xml;
# 大文件分块传输(适配--with-http_slice_module) slice 1m;
# 静态文件缓存控制(浏览器缓存,减少重复请求) location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 7d; # 7天缓存 add_header Cache-Control "public, max-age=604800"; access_log off; # 不记录静态文件访问日志 }
# 视频文件优化(适配--with-http_mp4_module/--with-http_flv_module) location ~* \.(mp4|flv)$ { mp4; # 开启MP4断点续传 flv; # 开启FLV断点续传 expires 30d; add_header Cache-Control "public, max-age=2592000"; }
# 禁止访问隐藏文件 location ~ /\. { deny all; }}关键配置解释
gzip_static on:优先返回预压缩的.gz文件(需提前用gzip命令压缩静态文件),比实时压缩省 90% CPU;slice 1m:大文件分块传输,提升下载速度;expires:设置浏览器缓存,减少重复请求。验证方法
访问
http://static.yourdomain.com/xxx.jpg/http://static.yourdomain.com/xxx.mp4,检查文件可正常访问且响应头包含Cache-Control。
1.6.2 反向代理服务器
场景说明:
Nginx 作为前端反向代理,转发请求到后端服务(如 Java SpringBoot、Python Flask、PHP-FPM),适配realip模块传递真实 IP。
1.6.2.1 代理后端 HTTP API(如 SpringBoot)
server { listen 80; server_name api.yourdomain.com;
# 适配--with-http_realip_module:传递客户端真实IP到后端 set_real_ip_from 127.0.0.1; # Nginx自身IP(反向代理场景必配) real_ip_header X-Forwarded-For; real_ip_recursive on;
# 代理后端API(替换为实际后端地址) location / { proxy_pass http://127.0.0.1:8080; # 后端SpringBoot服务地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 5s; # 连接超时 proxy_read_timeout 30s; # 读取超时 }}1.6.2.2 代理 PHP-FPM(Nginx+PHP 经典组合)
server { listen 80; server_name php.yourdomain.com;
root /data/nginx/php; # PHP项目根目录 index index.php index.html;
# 适配--with-http_realip_module set_real_ip_from 127.0.0.1; real_ip_header X-Forwarded-For;
# PHP解析(适配FastCGI) location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # PHP-FPM监听地址 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REMOTE_ADDR $realip_remote_addr; # 传递真实IP include fastcgi_params; }}验证方法
- 代理 API:访问
http://api.yourdomain.com/xxx,后端日志可看到X-Real-IP为客户端真实 IP;- 代理 PHP:在 PHP 项目中写
<?php echo $_SERVER['REMOTE_ADDR']; ?>,访问后显示客户端真实 IP。
1.6.2.3 四层 TCP 代理(Stream 模块,代理 MySQL/Redis)
利用编译的--with-stream模块,实现四层 TCP 代理(区别于 HTTP 七层代理),代理 MySQL/Redis 等 TCP 服务。
配置修改
- 编辑主配置
nginx.conf,取消stream块的注释:
stream { # 适配--with-stream_realip_module:传递真实IP(可选) # set_real_ip_from 192.168.0.0/16; # real_ip_header X-Forwarded-For;
# 引入stream子配置(模块化) include conf.d/stream/*.conf;}- 创建
stream子配置目录:
mkdir -p /usr/local/nginx/conf/conf.d/stream- 代理 MySQL 配置(
conf.d/stream/mysql-proxy.conf):
server { listen 3306; # Nginx监听的端口 proxy_pass 192.168.1.100:3306; # 后端MySQL真实地址 proxy_connect_timeout 5s; # 连接超时 proxy_timeout 300s; # 超时时间(MySQL长连接需调大)}- 代理 Redis 配置(
conf.d/stream/redis-proxy.conf):
server { listen 6379; proxy_pass 192.168.1.101:6379; # 后端Redis真实地址 proxy_connect_timeout 2s; proxy_timeout 60s;}验证方法
# 连接Nginx代理的MySQLmysql -h 你的Nginx服务器IP -P 3306 -u root -p# 连接Nginx代理的Redisredis-cli -h 你的Nginx服务器IP -p 63791.6.3 虚拟主机
场景说明
一台服务器部署多个站点(如site1.com、site2.com),利用conf.d目录拆分配置,互不干扰,便于管理。
1.6.3.1 多网卡(即多ip,多域名)的虚拟主机
server { listen 80; server_name site1.com www.site1.com; # 可为ip # server_name 192.168.1.1; root /data/nginx/site1; index index.html; access_log logs/site1_access.log main; # 独立日志}
server { listen 80; server_name site2.com www.site2.com; # 可为ip # server_name 192.168.1.2; root /data/nginx/site2; index index.html; access_log logs/site2_access.log main; # 独立日志}1.6.3.2 同域名同ip不同端口的虚拟主机
server { listen 80; server_name localhost; # 可为ip # server_name 192.168.1.1; root /data/nginx/site1; index index.html; access_log logs/site1_access.log main; # 独立日志}
server { listen 8080; server_name localhost; # 可为ip # server_name 192.168.1.1; root /data/nginx/site2; index index.html; access_log logs/site2_access.log main; # 独立日志}1.6.4 访问控制(IP 白名单 / 目录限制)
场景说明
限制后台 /admin 目录的访问(仅允许指定 IP 访问),适配安全需求,防止未授权访问。
server { listen 80; server_name admin.yourdomain.com;
root /data/nginx/admin; index index.html;
# 限制/admin目录仅允许指定IP访问(替换为你的白名单IP) location /admin/ { allow 192.168.1.0/24; # 允许网段 allow 127.0.0.1; # 本地IP deny all; # 拒绝其他所有IP auth_basic "请输入管理员账号密码"; # 可选:密码认证 auth_basic_user_file /usr/local/nginx/conf/.htpasswd; # 密码文件 }}
# 密码文件生成# 安装htpasswd(CentOS:yum install httpd-tools -y;Ubuntu:apt install apache2-utils -y)htpasswd -c /usr/local/nginx/conf/.htpasswd admin # 生成admin用户的密码验证方法
- 非白名单 IP 访问
http://admin.yourdomain.com/admin/,返回 403 Forbidden;- 白名单 IP 访问,需输入账号密码(若配置了 auth_basic)。
1.6.5 防盗链
防止他人盗用你的图片 / JS/CSS 等静态资源(比如直接在他的网站引用你的图片链接),适配http_referer模块。
server { listen 80; server_name img.yourdomain.com;
root /data/nginx/images; index index.html;
# 防盗链:仅允许自己的域名引用资源 location ~* \.(jpg|jpeg|png|gif|css|js)$ { valid_referers none blocked yourdomain.com *.yourdomain.com; if ($invalid_referer) { return 403; # 非法引用返回403 # 可选:跳转到自定义图片(如防盗链提示图) # rewrite ^/ https://yourdomain.com/anti-leech.png permanent; } expires 7d; }}关键配置解释
valid_referers:允许的引用域名(none允许直接访问,blocked允许无 referer 的情况);$invalid_referer:若 referer 不在允许列表,返回 403。
1.6.6 前端 SPA 路由适配(Vue/React)
解决 Vue/React 单页应用刷新页面返回 404 的问题(前端路由由 JS 控制,Nginx 需重写所有请求到 index.html)。
server { listen 80; server_name spa.yourdomain.com;
root /data/nginx/spa/dist; # 前端打包后的dist目录 index index.html;
# 适配SPA路由:所有请求重写到index.html location / { try_files $uri $uri/ /index.html; # 先匹配文件,无则返回index.html }
# 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 30d; access_log off; }}验证方法
访问
http://spa.yourdomain.com/about(前端路由),刷新页面后仍能正常显示,不返回 404。
1.6.7 Nginx 日志切割
Nginx 默认将日志写入单个文件,长期运行会导致日志文件过大(几十 G),需定时切割日志(按天 / 按大小),保留历史日志。
# 切割脚本,/usr/local/nginx/logs/cut_nginx_log.sh
#!/bin/bash# Nginx安装目录NGINX_PATH="/usr/local/nginx"# 日志目录LOG_PATH="${NGINX_PATH}/logs"# 日期格式DATE=$(date +%Y%m%d)
# 备份访问日志mv ${LOG_PATH}/access.log ${LOG_PATH}/access_${DATE}.log# 备份错误日志mv ${LOG_PATH}/error.log ${LOG_PATH}/error_${DATE}.log
# 向Nginx发送USR1信号,重新生成日志文件(不中断服务)${NGINX_PATH}/sbin/nginx -s reopen
# 删除7天前的旧日志(可选)find ${LOG_PATH} -name "access_*.log" -mtime +7 -deletefind ${LOG_PATH} -name "error_*.log" -mtime +7 -delete
# ===============================================================# 添加定时任务(每天凌晨 0 点执行)
# 赋予脚本执行权限chmod +x /usr/local/nginx/logs/cut_nginx_log.sh# 编辑crontabcrontab -e# 添加以下内容0 0 * * * /usr/local/nginx/logs/cut_nginx_log.sh > /dev/null 2>&1验证方法
每天凌晨 0 点,日志目录会生成
access_20260212.log、error_20260212.log等按日期命名的日志文件,原日志文件被清空重新生成。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
赣公网安备36072602000131号