powershell
# 指定 Nginx 服务运行时使用的系统用户是 nginx,控制文件权限,避免用 root 运行带来安全风险
user nginx;
# 工作进程数 = 自动匹配服务器 CPU 核心数,让 Nginx 自动最优利用 CPU 性能
worker_processes auto;
# 错误日志存到 /var/log/nginx/error.log,日志级别是 notice,记录 Nginx 启动失败、请求报错等信息
error_log /var/log/nginx/error.log notice;
# 把 Nginx 主进程的 PID 号存到这个文件,方便重启 / 停止 Nginx 时找到进程
pid /run/nginx.pid;
# 事件模块配置,每个工作进程最大支持 1024 个并发连接,控制 Nginx 能同时处理多少用户请求
events {
worker_connections 1024;
}
# HTTP 服务配置块开始,所有网站、代理、日志都写在这里面
http {
# 加载系统预设的文件类型配置,让 Nginx 认识 .html/.css/.js/.jpg 等文件
include /etc/nginx/mime.types;
# 不认识的文件默认按 "二进制流" 处理,避免未知文件无法下载 / 访问
default_type application/octet-stream;
# 定义访问日志格式,名字叫 main 记录内容包括:1访问者 IP2访问时间3请求地址4状态码5浏览器信息6转发 IP 等
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志存到 /var/log/nginx/access.log,使用上面定义的 main 格式
access_log /var/log/nginx/access.log main;
# 开启高效文件传输模式,静态文件(图片、JS、CSS)访问更快
sendfile on;
#tcp_nopush on;
# 长连接保持 65 秒,减少重复建立连接,
keepalive_timeout 65;
# 开启Gzip压缩,把网页、CSS、JS、JSON 压缩后传输,提升速度,网站加载速度大幅提升
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript;
# 一个网站服务配置块开始,前端服务 + 后端代理 合并到同一个server块(同源最优方案)
server {
# 监听 80 端口(HTTP 默认端口)
listen 80;
# 这个网站对应的域名 / IP 访问 http://IP 就会进入这个 server
server_name 域名IP;
# 匹配所有请求 / 开头的路径(即所有页面)前端静态文件
location / {
# 前端静态文件放在 /usr/local/hjjk/dist 目录
root /usr/local/hjjk/dist;
# 默认首页文件是 index.html
index index.html;
# 找不到文件时,统一返回 index.html
try_files $uri $uri/ /index.html; # 解决Vue路由刷新404
}
# 后端API反向代理 /s/xxx → 转发到后端
# 匹配所有以 /s/ 开头的请求
# ~ 表示正则匹配
# (.*) 是捕获后面所有路径
location ~ ^/s/(.*)$ {
# 把 /s/xxx 转发到后端服务
#访问 /s/user
#实际转发到 http://IP:端口/api/public/air/user
proxy_pass http://IP:端口/api/$1;
# 传递真实信息给后端否则后端拿到的 IP 都是 Nginx 的,不是用户的
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 处理跨域 (CORS) - 精准配置前端访问域名跨域配置,但目前被注释了,不生效
#add_header 'Access-Control-Allow-Origin' 'http://IP:端口' always;
#add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
#add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
#add_header 'Access-Control-Allow-Credentials' 'true' always;
# 处理浏览器发送的 OPTIONS 预检请求
# 让跨域请求正常通过 返回 204 表示无内容,成功通过
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;
return 204;
}
}
# 错误页配置 服务器出错(500/502/503/504)时,显示 50x.html 页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
# 错误页面放在 /usr/share/nginx/html 目录
root /usr/share/nginx/html;
}
}
}
一、Nginx 最核心的 3 个概念
1. 主配置结构(写配置按这个顺序)
全局块(user、worker_processes、pid...)
events 块(连接数)
http 块(里面放所有网站)
server 块(一个网站 = 一个 server)
location 块(匹配不同路径)
顺序不能乱,乱了直接启动失败。
2. location 匹配规则
Nginx 匹配路径不是按顺序 ,是按优先级:
= 精准匹配 优先级最高
^~ 前缀匹配 第二
~ 正则区分大小写
~* 正则不区分大小写
/ 通用匹配(最后兜底)
现在配置里用的:
location ~ ^/s/(.*)$
就是正则匹配 ,优先级比普通 / 高。
3. 反向代理 vs 负载均衡
- 反向代理:把请求转给后端(你现在用的)
- 负载均衡:把请求分给多台后端服务器(高可用必备)
二、日常操作必背命令
bash
# 检查配置是否写错(最常用!改完必执行)
nginx -t
# 平滑重启(不中断用户访问)
nginx -s reload
# 启动
nginx
# 停止
nginx -s stop
# 查看版本
nginx -v
重点:
改配置后永远先 nginx -t ,再 reload!
否则写错一行,服务直接挂。
三、配置必须注意的 6 个坑
1. Vue/React 前端刷新 404
配置里已经写了:
try_files $uri $uri/ /index.html;
✅ 正确,这是唯一正确写法,少了就会 404。
2. 静态文件缓存
前端 dist 目录建议加强缓存:
location / {
root /usr/local/hjjk/dist;
index index.html;
try_files $uri $uri/ /index.html;
# 缓存静态资源
expires 7d;
}
不加的话每次都重新下载,网站巨慢。
3. 跨域问题
配置里跨域是注释的:
#add_header ...
如果前后端分离出现跨域,必须打开,否则前端调不通接口。
4. listen 80 端口冲突
如果服务器启动失败,大概率是:
- 80 端口被 Apache/其他服务占用
- 防火墙没放行 80 端口
5. SELinux 导致 403 Forbidden
如果访问出现 403,不是权限,是 SELinux:
bash
setenforce 0
临时关闭,就能访问。
6. root 与 alias 区别
- root:路径会拼接
- alias:路径不会拼接
现在用的是 root,正确。
四、生产环境必备优化
1. 隐藏 Nginx 版本号(安全)
http {
server_tokens off;
}
2. 提高并发连接数
events {
worker_connections 10240; # 提高到 1 万
use epoll;
multi_accept on;
}
3. 禁止恶意域名访问
server {
listen 80 default_server;
return 444;
}
4. 防止文件被下载(如 .env、.sql)
location ~ /\.env {
deny all;
}
五、日志排查
看错误日志
tail -f /var/log/nginx/error.log
常见错误:
- 502 = 后端服务没启动
- 403 = 权限/SELinux
- 404 = 路径不对
- 500 = 后端代码报错
看访问日志
tail -f /var/log/nginx/access.log
六、HTTPS 配置
免费证书用 Let's Encrypt,一行命令搞定:
certbot --nginx
自动帮你配置好:
- 80 端口跳转 443
- SSL 证书
- 安全协议
七、最常用的 4 大功能
- 反向代理
- 负载均衡(多台后端)
- 静态资源托管(前端、图片)
- 接口限流、防盗链、黑白名单
八、一句话总结 Nginx 核心作用
Nginx 就是一个:接收用户请求 → 分发到正确地方(前端/后端)的中间管家。
总结
- 改配置先 nginx -t,再 reload
- location 匹配看优先级,不是顺序
- Vue 必须加 try_files 解决刷新 404
- 403 大概率是 SELinux
- 502 是后端服务挂了
- 生产环境一定要开缓存 + Gzip