以前以为是运维的事所以就草草看了一遍就完事了,真开发的时候不懂多一点和运维沟通那是真有点折磨啊,故重新捡起来学一遍。
一、Nginx 是什么?
Nginx 是一个高性能的 Web 服务器,也可以作为反向代理服务器、负载均衡器、静态资源服务器使用。
可以先把 Nginx 理解成一个"请求入口"。用户访问网站时,请求先到 Nginx,然后 Nginx 决定:
- 直接返回 HTML、CSS、JS、图片等静态文件
- 把请求转发给后端服务,比如 Java、Node.js、Python、Go
- 把 HTTP 请求重定向到 HTTPS
- 根据域名或路径分发到不同服务
常见请求链路:

二、Nginx 的基本配置结构
一个最基础的 Nginx 配置大致长这样:
nginx
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
}
}
1. 全局块
nginx
worker_processes 1;
用于配置 Nginx 的整体运行参数。
worker_processes 表示 worker 进程数量。简单理解,worker 是真正处理请求的进程。
生产环境常见写法是:
nginx
worker_processes auto;
2. events 块
nginx
events {
worker_connections 1024;
}
用于配置连接处理能力。
nginx
worker_connections 1024;
表示每个 worker 最多可以处理多少连接。
3. http 块
nginx
http {
...
}
HTTP 相关配置都写在这里。
nginx
include mime.types;
表示引入 MIME 类型配置,让 Nginx 知道 .html、.css、.js、.png 等文件应该用什么类型返回给浏览器。
nginx
default_type application/octet-stream;
表示如果 Nginx 不认识某种文件类型,就按二进制文件处理。
4. server 块
nginx
server {
listen 80;
server_name localhost;
}
server 可以理解成一个"虚拟主机"或"站点"。
nginx
listen 80;
表示监听 80 端口。HTTP 默认端口就是 80,所以访问:
nginx
http://localhost
其实就是访问:
nginx
http://localhost:80
其中:
nginx
server_name localhost;
表示这个站点处理 localhost 这个域名的请求。
5. location 块
nginx
location / {
root html;
index index.html;
}
location 用来匹配请求路径。
nginx
root html;
表示静态文件目录。
nginx
index index.html;
表示默认首页文件。
当用户访问:
nginx
http://localhost/
Nginx 会尝试返回:
nginx
html/index.html
三、静态站点配置
所谓"静态站点",就是 Nginx 直接从磁盘读取文件并返回给浏览器,不需要后端程序参与。
常见静态资源包括:
nginx
index.html
style.css
main.js
logo.png
favicon.ico
示例配置:
nginx
server {
listen 80;
server_name localhost;
location / {
root /tmp/demo-site;
index index.html;
}
}
如果你的文件是:
nginx
/tmp/demo-site/index.html
那么访问:
nginx
http://localhost/
Nginx 就会返回这个文件。
可以用下面命令创建一个测试页面:
bash
mkdir -p /tmp/demo-site
cat > /tmp/demo-site/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Nginx Demo</title>
</head>
<body>
<h1>我是 Nginx 静态站点</h1>
<p>部署成功!!!</p>
</body>
</html>
EOF
然后配置 Nginx:
nginx
cat > /etc/nginx/sites-enabled/demo << 'NGX'
server {
listen 8081;
server_name localhost;
root /tmp/demo-site;
index index.html;
}
NGX
检查配置:
nginx
nginx -t
重新加载:
nginx
nginx -s reload
访问测试:
bash
curl http://localhost:8081
四、Nginx 命令常用操作
1. 检查配置是否正确
nginx
nginx -t
改完配置后,建议先执行这个命令。如果配置语法有问题,Nginx 会提示错误。
2. 重新加载配置
nginx
nginx -s reload
-s 是 signal 的意思,表示给正在运行的 Nginx 发送一个信号。
意思是告诉 Nginx:重新读取配置文件。
推荐流程:
nginx
nginx -t
nginx -s reload
3. 停止 Nginx
快速停止:
nginx
nginx -s stop
优雅停止:
nginx
nginx -s quit
quit 会等待正在处理的请求结束后再退出。
五、反向代理是什么?
反向代理是 Nginx 最常见的用途之一。
简单说:
用户访问 Nginx,Nginx 再把请求转发给后端服务。
例如后端服务运行在:
127.0.0.1:8080
但用户访问的是:
http://localhost/api/
请求链路是:
浏览器 / curl
|
v
Nginx :80
|
v
后端服务 :8080
Nginx 配置:
nginx
server {
listen 80;
server_name localhost;
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
}
这样用户访问:
http://localhost/api/
会被 Nginx 转发到:
http://127.0.0.1:8080/
六、upstream 是什么?
如果后端服务器比较多,可以用 upstream 定义一个后端服务组。
nginx
upstream backend {
server 127.0.0.1:8080;
}
这里表示定义了一个名为 backend 的后端服务组。
然后在 location 里使用:
nginx
server {
listen 80;
server_name localhost;
location /api/ {
proxy_pass http://backend/;
}
}
完整配置:
nginx
upstream backend {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name localhost;
location /api/ {
proxy_pass http://backend/;
}
}
如果有多个后端:
nginx
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
Nginx 会在这些后端之间分发请求,这就是简单的负载均衡。
七、location 和 proxy_pass 结尾的 /
这是 Nginx 里非常容易混的地方。
1. 保留 /api 前缀
location /api {
proxy_pass http://backend;
}
请求:
/api/user
转发到:
http://backend/api/user
也就是最后请求的路径保留 /api。
2. 去掉 /api 前缀
nginx
location /api/ {
proxy_pass http://backend/;
}
请求:
/api/user
转发到:
http://backend/user
也就是去掉 /api/。
3. 怎么选择?
A、如果后端接口本身就是:
/api/user
那么使用:
nginx
location /api {
proxy_pass http://backend;
}
B、如果后端接口是:
/user
但前端希望统一请求:
/api/user
那么使用:
nginx
location /api/ {
proxy_pass http://backend/;
}
八、常见代理请求头
反向代理时,常见配置如下:
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;
1. Host
nginx
proxy_set_header Host $host;
表示把用户原本访问的域名传给后端。
例如用户访问:
http://example.com/api/user
那么后端收到:
nginx
Host: example.com
2. X-Real-IP
nginx
proxy_set_header X-Real-IP $remote_addr;
表示把真实客户端 IP 传给后端。
因为后端看到的请求来源可能是 Nginx,而不是用户浏览器,所以需要 Nginx 告诉后端:
nginx
X-Real-IP: 用户真实 IP
3. X-Forwarded-For
nginx
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
表示记录完整代理链路中的 IP。如果请求经过多层代理,这个头会保留更完整的路径。
4. X-Forwarded-Proto
nginx
proxy_set_header X-Forwarded-Proto $scheme;
表示告诉后端,用户最初是通过 HTTP 还是 HTTPS 访问的。
如果用户访问:
https://example.com
那么后端可以知道原始协议是:
https
这对登录跳转、生成链接、设置 Cookie 很重要。
九、前后端分离项目怎么配?
前后端分离项目一般是:
- 前端:Vue / React / Vite 打包后的 dist 静态文件
- 后端:Java / Node / Python / Go API 服务
常见部署方式是:
/ -> 返回前端静态页面
/api/ -> 转发给后端接口服务
示例:
nginx
server {
listen 80;
server_name example.com;
location / {
root /var/www/frontend/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8080/;
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;
}
}
这里:
nginx
location / {
root /var/www/frontend/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
负责前端页面。
try_files 很重要,尤其是 Vue Router、React Router 使用 history 模式时。
例如用户直接访问:
https://example.com/user/profile
磁盘上可能没有 /user/profile 这个文件。
所以需要:
try_files $uri $uri/ /index.html;
意思是:
先找真实文件
找不到再找目录
还找不到就返回 index.html
然后交给前端路由处理。
十、HTTPS 配置
HTTP 是明文传输,HTTPS 是加密传输。生产环境通常应该使用 HTTPS。
Nginx HTTPS 配置示例:
nginx
server {
listen 443 ssl;
server_name secure.example.com;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}
}
HTTP 自动跳转 HTTPS:
nginx
server {
listen 80;
server_name secure.example.com;
return 301 https://$host$request_uri;
}
整体逻辑:
用户访问 http://secure.example.com
|
v
Nginx 80
|
v
跳转到 https://secure.example.com
用户访问 https://secure.example.com
|
v
Nginx 443 ssl
|
v
Nginx 解密 HTTPS
|
v
转发给后端服务
简单说:
- 80 端口:负责把 HTTP 跳到 HTTPS
- 443 端口:真正处理 HTTPS 请求
十一、初学者推荐配置模板
1. 静态站点模板
nginx
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
2. 反向代理模板
nginx
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
3. 前后端分离模板
nginx
server {
listen 80;
server_name example.com;
location / {
root /var/www/frontend/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8080/;
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;
}
}