文章目录
1.配置监听端口 listen
listen [IP地址]:端口 [可选参数];
# 示例
listen 80; # 监听所有 IPv4 地址的 80 端口
listen [::]:80; # 监听所有 IPv6 地址的 80 端口
listen 192.168.1.100:80; # 监听特定 IP 的 80 端口
listen [2001:db8::1]:80; # 监听特定 IPv6 地址
关键可选参数 | 作用 | 示例 |
---|---|---|
default_server | 设为默认虚拟主机(处理未匹配域名的请求) | listen 80 default_server; |
ssl | 启用 SSL/TLS 加密(必须用于 HTTPS) | listen 443 ssl; |
http2 | 启用 HTTP/2(需与 ssl 一起使用) | listen 443 ssl http2; |
reuseport | 启用 SO_REUSEPORT(提升高并发性能) | listen 80 reuseport; |
backlog=N | 设置等待连接队列长度(默认 511) | listen 80 backlog=1024; |
2.配置域名 server_name
- 精确域名匹配(最常用)
server_name example.com www.example.com; # 匹配这两个精确域名
- 通配符匹配(
*
只能在开头或结尾)
server_name *.example.com; # 匹配 blog.example.com, shop.example.com 等
server_name example.*; # 匹配 example.com, example.net 等
- 正则表达式匹配(以
~
开头)
# 正则表达式中的 `.` 需要转义为 `\.`
server_name ~^(blog|shop)\.example\.com$; # 匹配 blog.example.com 或 shop.example.com
server_name ~^subdomain-\d+\.example\.com$; # 匹配 subdomain-123.example.com
- 特殊值:默认主机
server_name _; # 匹配所有未定义域名(通常用于默认站点)
- 空域名匹配(处理无 Host 头的请求)
server_name ""; # 匹配缺失 Host 头的请求
- 多域名组合
server_name
example.com
www.example.com
*.app.example.com
~^api-\d+\.example\.com$;
3.配置url location
location [修饰符] 匹配模式 {
# 配置指令
}
修饰符类型
修饰符 | 作用 | 示例 |
---|---|---|
= | 精确匹配(完全相等才匹配) | location = /login { ... } |
^~ | 前缀匹配(匹配后不再检查正则) | location ^~ /static/ { ... } |
~ | 正则匹配(区分大小写) | location ~ \.php$ { ... } |
~* | 正则匹配(不区分大小写) | location~* \.(jpg|jpeg)$ |
无修饰符 | 普通前缀匹配(按最长前缀优先,但会被正则覆盖) | location /api/ { ... } |
常见用法示例
- 精确匹配(登录页)
location = /login {
proxy_pass http://auth_server;
}
- 仅匹配
/login
,不匹配/login/
或/login.html
- 静态资源前缀匹配
location ^~ /static/ {
root /data/www;
expires 30d; # 缓存30天
}
- 匹配
/static/css/style.css
、/static/js/app.js
等 ^~
确保优先于后续正则规则
- 正则匹配(区分大小写)
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
}
- 处理所有以
.php
结尾的请求(如/index.php
)
- 正则匹配(不区分大小写)
location ~* \.(jpg|jpeg|png|gif)$ {
root /data/images;
access_log off; # 不记录图片请求日志
}
- 匹配
.JPG
、.PnG
等大小写混合的图片请求
- 通用路由(兜底规则)
location / {
proxy_pass http://backend;
try_files $uri $uri/ /index.html; # 单页应用支持
}
- 嵌套 Location
location
支持嵌套(通常用于更细粒度的控制):
location /user {
# 父级规则
proxy_set_header X-User-Path $uri;
location /user/profile {
# 子规则:匹配 /user/profile
proxy_pass http://profile_service;
}
}
4.配置静态资源 root
root 用于定义请求文件的根目录路径,是配置静态资源服务的关键指令
location /路径/ {
root /绝对路径/目录;
}
示例1:基础静态站点
server {
listen 80;
server_name example1.com;
root /var/www/example2;
}
# 请求url http://example1.com/about.html →
# 服务器文件 /var/www/example2/about.html
示例2:子目录映射
server{
listen 80;
server_name example1.com;
location /static/{
root /data/web/assets;
}
}
# 请求url http://example.com/static/logo.png
# 服务器文件 /data/web/assets/static/logo.png
示例3:使用 alias 替代 root(路径不拼接)
server{
listen 80;
server_name example1.com;
location /static/{
alias /data/web/assets;
}
}
# 请求url http://example.com/static/logo.png
# 服务器文件 /data/web/assets/logo.png
5.配置默认页面 index
index 指令用于指定当客户端请求指向目录(而非具体文件)时,Nginx 尝试返回的默认文件列表
index file1 file2 ...;
- file: 按优先级排列的文件名列表(用空格分隔)
- Nginx 会按顺序检查列表中的文件,返回第一个找到的文件。
示例1:域名/ip访问
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html index.htm index.php;
# 访问 http://example.com 时返回 返回 index.html
# 如果 index.html 不存在则向后查找
# 优先级:index.html > index.htm > index.php
}
示例2:针对特定目录的配置
server {
listen 80;
server_name example.com;
root /var/www/html;
location /blog {
# 仅在该目录下生效
index default.html;
# 请求 url http://example.com/blog
# 返回页面 /var/www/html/default.html
}
}
6.配置 https ssl
免费的ssl 可以通过 let’s encrypt 获取
server {
listen 443 ssl http2; # 启用 HTTP/2 可选
server_name your-domain.com;
# 访问 https://your-domain.com
# 证书路径
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
# 安全协议与加密套件(可以无脑复制)
ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧版 TLS
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS (强制 HTTPS)(可选)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
7.配置后端服务器
指令 | 默认值 | 作用 | 示例 |
---|---|---|---|
proxy_pass | - | 核心指令:定义后端服务器地址 (支持 HTTP/HTTPS/unix socket) | proxy_pass http://backend:8080; |
proxy_set_header | - | 设置转发请求头 (覆盖或添加新请求头) | proxy_set_header X-Real-IP $remote_addr; |
proxy_redirect | default | 重写后端的重定向地址 (修正 Location 头) | proxy_redirect http://backend https://$host; |
proxy_buffering | on | 启用响应缓冲区 (减少后端服务器压力) | proxy_buffering off; (实时流场景) |
超时控制参数 | 默认值 | 作用 | 推荐值 |
---|---|---|---|
proxy_connect_timeout | 60s | 连接后端超时 | proxy_connect_timeout 5s; |
proxy_send_timeout | 60s | 发送请求超时 | proxy_send_timeout 30s; |
proxy_read_timeout | 60s | 读取响应超时 | proxy_read_timeout 120s; (长连接场景) |
proxy_timeout | 10m | 代理连接最大保持时间 | proxy_timeout 5m; |
缓冲区优化参数 | 默认值 | 作用 | 计算公式 |
---|---|---|---|
proxy_buffer_size | 4k/8k | 响应头缓冲区大小 | proxy_buffer_size 16k; |
proxy_buffers | 8(4k/8k) | 响应体缓冲区数量与大小 | proxy_buffers 16 32k; |
proxy_busy_buffers_size | 8k/16k | 忙碌时缓冲区大小 | 通常为 proxy_buffers × 2 |
proxy_temp_file_write_size | 8k/16k | 临时文件写入块大小 | proxy_temp_file_write_size 64k; |
容错与重试参数 | 默认值 | 作用 | 示例 |
---|---|---|---|
proxy_next_upstream | error timeout | 故障转移条件 (何时切换后端服务器) | proxy_next_upstream error timeout http_502; |
proxy_next_upstream_tries | 0 (无限制) | 最大重试次数 | proxy_next_upstream_tries 3; |
proxy_next_upstream_timeout | 0 (无限制) | 重试总时间限制 | proxy_next_upstream_timeout 10s; |
HTTPS 相关参数 | 作用 | 安全实践 |
---|---|---|
proxy_ssl_verify | 是否验证后端证书 | proxy_ssl_verify on; (生产环境必开) |
proxy_ssl_trusted_certificate | 信任的 CA 证书路径 | 指向自定义 CA 包 |
proxy_ssl_server_name | 是否启用 SNI | proxy_ssl_server_name on; (多域名必开) |
proxy_ssl_protocols | 允许的 SSL/TLS 协议 | proxy_ssl_protocols TLSv1.2 TLSv1.3; |
其他控制参数 | 场景 | 示例 |
---|---|---|
proxy_cookie_domain | 修改 Set-Cookie 的 domain | proxy_cookie_domain backend.com $host; |
proxy_cookie_path | 修改 Set-Cookie 的 path | proxy_cookie_path /legacy/ /new/; |
proxy_force_ranges | 支持断点续传 | proxy_force_ranges on; |
proxy_http_version | 指定 HTTP 协议版本 | proxy_http_version 1.1; (WebSocket 必设) |
示例1:http代理 |
server {
listen 80;
server_name your-domain.com; # 替换为你的域名或IP
location / {
proxy_pass http://localhost:3000; # 后端服务地址
# 关键请求头设置(直接copy)
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;
}
}
示例2:https 代理ssl卸载(Nginx 使用https 后端使用http)
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://你的ip或域名; # http 是关键
proxy_set_header X-Forwarded-Proto https; # 告知后端是HTTPS请求
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:https 代理 ssl不卸载
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass https://你的ip或域名; # http 是关键
proxy_ssl_verify off;
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;
}
}
示例4:websocket代理
location /ws/ {
proxy_pass http://你的ip或域名;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}