nginx使用

10326 字
52 分钟
nginx使用

参考文档Nginx 教程、CentOS7 源码安装Nginx

一、nginx使用#

nginx的源码编译安装参考可参考CentOS7 源码安装Nginx

1.1nginx配置文件目录#

Nginx 配置文件在 conf 目录下,其默认目录结构如下:

Terminal window
# 以".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运行时的用户和用户组#
Terminal window
#user nobody;

格式:user 用户名 用户组;,省略用户组时默认和用户名相同

若编译时指定了--user=nginx --group=nginx,生产环境需要取消注释并改为user nginx;,否则 Nginx 会用默认 nobody 运行。

2.nginx工作进程数#
Terminal window
worker_processes 1;
  • 设置 Nginx 的工作进程数,是 Nginx 性能调优的核心参数之一。

  • 默认值1:单进程处理所有请求,适合测试 / 低配服务器;

  • 生产环境建议设置为服务器 CPU 核心数(比如 4 核设为 4),或auto(Nginx 自动识别 CPU 核心),充分利用服务器多核资源。

3. Nginx 的错误日志#
Terminal window
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的主进程号文件的路径#
Terminal window
#pid logs/nginx.pid;
  • 指定 Nginx主进程号文件的路径pid文件记录 Nginx 主进程的 ID,用于后续管理(比如重启、停止 Nginx 时通过 pid 文件定位进程)。

  • 取消注释后,Nginx 启动时会自动在logs目录生成nginx.pid文件。

1.2.1.2 events 事件域#

events{} 块专门配置 Nginx 的网络连接相关参数,作用于 Nginx 的工作进程,影响连接的处理效率,仅能有一个 events 块

Terminal window
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)继承。

Terminal window
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 块内的基础指令:

  1. include mime.types;

    引入 Nginx 的MIME 类型映射文件mime.types是 Nginx 自带的配置文件(和 nginx.conf 同目录),里面定义了上千种文件后缀和对应的 MIME 类型(比如.html对应text/html.jpg对应image/jpeg)。

    • 作用:Nginx 向客户端返回文件时,会根据该文件的后缀匹配 MIME 类型,然后在 HTTP 响应头中设置Content-Type,让浏览器正确解析文件(比如识别 html 为网页、jpg 为图片)。
  2. default_type application/octet-stream;

    设置默认的 MIME 类型,当请求的文件后缀在mime.types中没有匹配项时,Nginx 会将该文件的 MIME 类型设为application/octet-stream(二进制流)。

    • 作用:浏览器遇到该类型会触发下载行为,比如未知后缀的.abc文件,浏览器会直接下载而不是尝试解析。
  3. #log_format main '...'; 【注释示例】

    自定义访问日志的格式,并为该格式命名为main(可自定义名称,比如nginx_log),里面的$xxx是 Nginx 的内置变量,用于获取请求的相关信息,核心变量含义:

    变量含义
    $remote_addr客户端的 IP 地址
    $remote_user客户端的认证用户名(无则为空)
    $time_local服务器的本地时间
    $request客户端的请求行(方法 + URL + 协议)
    $statusHTTP 响应状态码(200/404/502 等)
    $body_bytes_sent向客户端发送的响应体大小(不含响应头)
    $http_referer来源页的 URL(防盗链常用)
    $http_user_agent客户端的用户代理(浏览器 / 爬虫标识)
    $http_x_forwarded_for客户端真实 IP(反向代理场景用)
    • 作用:自定义日志格式,让访问日志包含你需要的信息,后续access_log可引用该格式。
  4. #access_log logs/access.log main; 【注释示例】

    开启 Nginx 的访问日志,指定日志文件路径为logs/access.log,并使用上面定义的main格式记录日志。

    • 访问日志会记录所有客户端的 HTTP 请求,是排查问题、统计访问量的核心依据;
    • 可在 Server/Location 块中单独配置,实现不同虚拟主机 / 不同路径的独立访问日志
  5. sendfile on;

    开启 Linux 的sendfile 零拷贝技术,默认开启,是 Nginx 高性能的核心特性之一。

    • 传统文件传输:Nginx 进程→读取磁盘文件→内核缓冲区→Nginx 缓冲区→网络缓冲区→客户端,多步拷贝;
    • 零拷贝:内核直接将磁盘文件的内容发送到网络缓冲区,跳过 Nginx 用户态缓冲区,减少内存拷贝和 CPU 消耗,大幅提升静态文件(html/js/img)的传输性能。
  6. #tcp_nopush on; 【注释示例】

    开启TCP_NOPUSH选项,需和sendfile on;配合使用。

    • 作用:让 Nginx 在发送响应时,先将数据缓冲区填满再一次性发送,减少 TCP 网络包的数量,提升大文件的传输效率(适合静态文件服务)。
  7. #keepalive_timeout 0; 【注释示例】

    设置 HTTP长连接的超时时间为 0,即关闭长连接

    • HTTP 长连接:客户端和服务器建立一次 TCP 连接后,可多次发送 HTTP 请求,无需重复建立连接,减少 TCP 握手的开销;
    • 设为 0 时,每次请求都建立新的 TCP 连接,性能较低,一般不开启。
  8. keepalive_timeout 65;

    开启 HTTP 长连接,设置超时时间为65 秒,是生产环境的常用值。

    • 含义:客户端和服务器建立 TCP 连接后,若 65 秒内没有新的 HTTP 请求,服务器会主动关闭该 TCP 连接;
    • 调优建议:根据业务场景调整,比如静态资源服务可设为 30/60 秒,避免长连接占用过多服务器资源。
  9. #gzip on; 【注释示例】

    开启 Nginx 的gzip 压缩功能,默认关闭。

    • 作用:Nginx 在向客户端返回响应体(html/js/css/json 等文本文件)前,先对其进行 gzip 压缩,减少传输的文件大小,提升网页加载速度(图片 / 视频已压缩,无需 gzip);
    • 生产环境建议开启,后续可配置压缩级别、压缩的文件类型等精细参数。

1.2.1.4 server 虚拟主机域#

server{} 块属于 HTTP 块的子块,用于配置虚拟主机,Nginx 通过多个 Server 块实现一台服务器运行多个网站(比如同时运行www.aaa.comwww.bbb.com),核心通过listen(端口)+server_name(域名 / IP)区分不同虚拟主机。

默认配置中只有一个 Server 块,监听 80 端口,对应localhost,逐行解释:

Terminal window
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
... # 后续Location块
}
  1. listen 80;

    设置该虚拟主机监听的 TCP 端口,默认 80(HTTP 协议的默认端口),可指定 IP + 端口(比如192.168.1.100:8080),多个端口用空格分隔(比如listen 80 8080;)。

  2. server_name localhost;

    设置该虚拟主机对应的域名 / 主机名,支持多个值(用空格分隔,比如server_name localhost www.test.com;),也支持通配符(*.test.com)和正则表达式。

    • Nginx 接收请求时,会根据请求头中的Host字段匹配server_name,找到对应的 Server 块处理请求;
    • 若未匹配到任何 Server 块,会使用第一个匹配 listen 端口的 Server 块处理。
  3. #charset koi8-r; 【注释示例】

    设置该虚拟主机的默认字符集koi8-r是俄语字符集,生产环境一般改为utf-8charset utf-8;),让 Nginx 在响应头中设置Content-Type: text/html; charset=utf-8,避免网页中文乱码。

  4. #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(即客户端的所有请求,是默认的路径匹配规则),处理网站的根路径请求:

Terminal window
location / {
root html;
index index.html index.htm;
}
  1. root html;

    设置该路径对应的网站根目录html是相对路径(相对于 Nginx 的安装目录,比如你编译的/usr/local/nginx/html),也可写绝对路径(比如/data/nginx/html)。

    • 含义:当客户端请求http://localhost/index.html时,Nginx 会在html目录下查找index.html文件并返回。
  2. index index.html index.htm;

    设置该路径的默认索引文件(首页文件),支持多个值,Nginx 会按顺序查找,找到第一个存在的文件并返回。

    • 含义:当客户端请求http://localhost/(仅域名,无具体 URL)时,Nginx 会在root指定的目录下依次查找index.htmlindex.htm,找到后返回。
    • 生产环境可添加index.php(PHP 网站)、index.jsp(Java 网站)等。

1.2.1.6 错误页面匹配#

这是错误页面的配套配置,处理服务器端的 5xx 错误(服务端内部错误)

Terminal window
#error_page 404 /404.html;
# 第一步:配置5xx错误码跳转到/50x.html页面
error_page 500 502 503 504 /50x.html;
# 第二步:精确匹配/50x.html请求,指定页面的根目录
location = /50x.html {
root html;
}
  1. 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;)。
  2. 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 服务器#
Terminal window
#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)解析#
Terminal window
#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_rootroot指令指定的路径);
  • include fastcgi_params;:引入 Nginx 自带的 FastCGI 参数配置文件,里面定义了 CGI 的标准参数(比如请求方法、协议版本)。
3. 禁止访问 Apache 的.htaccess 文件#
Terminal window
#location ~ /\.ht {
# deny all;
#}
  • location ~ /\.ht:正则匹配所有以.ht开头的文件 / 目录(比如 Apache 的配置文件.htaccess);
  • deny all;拒绝所有客户端的访问(返回 403 Forbidden)。
  • 原因:Nginx不识别 Apache 的.htaccess 文件,该文件中可能包含网站的敏感配置,禁止访问可提升安全性。

1.2.1.8 其他注释的 Server 块示例#

默认配置的最后还有两个注释的 Server 块,是 Nginx 的虚拟主机高级示例,方便你后续扩展:

Terminal window
# 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;
  1. 多端口 / 多域名的虚拟主机:监听 8000 和 8080 端口,对应多个域名 / 别名,适合一台服务器运行多个网站;

  2. 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`配置

Terminal window
./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 65536
www-data hard nofile 65536
Terminal window
# 全局配置块:对应编译--user=nginx --group=nginx,适配--with-threads/--with-file-aio
user 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 配置使用注意事项#

  1. 证书替换:将ssl_certificate/ssl_certificate_key替换为自己的 SSL 证书路径(公钥 / 私钥),证书可从阿里云 / 腾讯云 / Let’s Encrypt 免费申请;
  2. 域名修改:将server_name localhost;替换为自己的实际域名(比如www.test.com test.com);
  3. 根目录修改:将root html;替换为自己的网站根目录(比如/data/nginx/html);
  4. PHP 解析:如果是 PHP 动态站点,取消 PHP 解析配置的注释,确保 PHP-FPM 正常运行(监听 9000 端口);
  5. Stream 代理:如果需要代理 MySQL/Redis 等 TCP 服务,取消stream块的注释,根据实际业务修改代理地址;
  6. 系统内核调优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 核心配置,让整个配置体系更清晰。

模块化配置的核心优势(生产环境必用)#
  1. 便于管理:每个站点 / 业务一个独立的.conf 文件(比如blog.confadmin.confapi.conf),各司其职,不会混乱;
  2. 便于维护:修改某个站点的配置,只需编辑对应的.conf 文件,不用动主配置nginx.conf,减少误改核心配置的风险;
  3. 快速启用 / 禁用:只需将.conf 文件重命名为.bak(比如blog.conf.bak),Nginx 就不会加载,无需注释大量配置,实现站点的快速启停;
  4. 配置复用:不同环境(测试 / 生产)的子配置文件可直接复制,只需修改域名 / IP,无需重构整个配置;
  5. 团队协作:多个开发 / 运维修改配置时,不会同时编辑主配置文件,避免冲突。

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 启动调试#

Terminal window
# 进入安装目录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 nginx

1.5 nginx 系统优化#

1.5.1 添加软连接#

由于目前每次需要进入到软件目录的sbin目录下去执行nginx这个可执行文件,或使用绝对路径去执行,非常麻烦。因此可以添加软链接到系统默认的PATH变量路径中,来实现无论在哪个目录下都可以执行nginx命令

Terminal window
# 查看当前系统的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 文档中的配置)

Terminal window
[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文件

Terminal window
cat > /usr/lib/systemd/system/nginx.service <<'EOF'
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
Terminal window
# 加载配置
systemctl damon-reload

1.6 使用案例#

1.6.1web服务器#

场景说明:

部署纯静态网站(HTML/CSS/JS/ 图片 / 视频),利用gzip_static/sendfile等编译模块优化性能,适配大文件传输。

conf.d/static.conf
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)#

conf.d/proxy-api.conf
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 经典组合)#

conf.d/proxy-php.conf
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 服务。

配置修改#
  1. 编辑主配置nginx.conf,取消stream块的注释:
Terminal window
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;
}
  1. 创建stream子配置目录:
Terminal window
mkdir -p /usr/local/nginx/conf/conf.d/stream
  1. 代理 MySQL 配置(conf.d/stream/mysql-proxy.conf):
Terminal window
server {
listen 3306; # Nginx监听的端口
proxy_pass 192.168.1.100:3306; # 后端MySQL真实地址
proxy_connect_timeout 5s; # 连接超时
proxy_timeout 300s; # 超时时间(MySQL长连接需调大)
}
  1. 代理 Redis 配置(conf.d/stream/redis-proxy.conf):
Terminal window
server {
listen 6379;
proxy_pass 192.168.1.101:6379; # 后端Redis真实地址
proxy_connect_timeout 2s;
proxy_timeout 60s;
}
验证方法#
Terminal window
# 连接Nginx代理的MySQL
mysql -h 你的Nginx服务器IP -P 3306 -u root -p
# 连接Nginx代理的Redis
redis-cli -h 你的Nginx服务器IP -p 6379

1.6.3 虚拟主机#

场景说明

一台服务器部署多个站点(如site1.comsite2.com),利用conf.d目录拆分配置,互不干扰,便于管理。

1.6.3.1 多网卡(即多ip,多域名)的虚拟主机#

Terminal window
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不同端口的虚拟主机#

Terminal window
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 访问),适配安全需求,防止未授权访问。

Terminal window
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模块。

Terminal window
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)。

Terminal window
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 -delete
find ${LOG_PATH} -name "error_*.log" -mtime +7 -delete
# ===============================================================
# 添加定时任务(每天凌晨 0 点执行)
# 赋予脚本执行权限
chmod +x /usr/local/nginx/logs/cut_nginx_log.sh
# 编辑crontab
crontab -e
# 添加以下内容
0 0 * * * /usr/local/nginx/logs/cut_nginx_log.sh > /dev/null 2>&1

验证方法#

每天凌晨 0 点,日志目录会生成access_20260212.logerror_20260212.log等按日期命名的日志文件,原日志文件被清空重新生成。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

nginx使用
https://2233941.xyz/posts/nginx使用/
作者
lumifly
发布于
2026-06-30
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
lumifly
不逐世间万丈星河,自守一隅细碎明光
✨ 今日一言
" 加载中... "
——
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
本年还剩 -- --%
本月还剩 -- --%
本周还剩 -- --%
距离--
--
--
天气预报
站点统计
文章
7
分类
1
标签
3
总字数
38,070
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.1
文章许可
CC BY-NC-SA 4.0

文章目录