Nginx配置
Nginx 配置文件说明
# 启动进程,通常设置成和 CPU 的核心数量相等
worker_processes 1;
events {
# epoll 是多路复用 IO(I/O Multiplexing) 中的一种方式
# 但是仅用于 linux2.6 以上内核,可以大大提高 nginx 的性能
use epoll;
# 单个后台 worker process 进程的最大并发链接数
worker_connections 1024;
}
http {
# 引用外部的mime.types文件,设定类型;
# 此文件中定义了对于不同后缀的文件,http使用不同的响应方式(
# 如.js文件直接加载,而.mp4文件则是下载)
include mime.types;
# 若文件类型没在mime.types中指定,则使用默认octet-stream方式
# 传输给客户端
default_type application/octet-stream;
# sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)
# 来输出文件,对于普通应用,必须设为 on,如果用来进行下载等应用磁盘
# IO 重负载 应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,
# 降低系统的 uptime.
sendfile on;
# http长连接空闲保持时间,在此时间内客户端若有新的请求,则保持连接;(默认75s)
keepalive_timeout 65s;
# 一个长连接最大处理请求数量;一个长连接建立之后,Nginx就会为这个连接设置一个计数器,
# 若请求超过最大值,Nginx会强行关闭这个长连接,逼迫客户端重新建立连接。(默认值100)
keepalive_requests 100;
# 设定请求缓冲
client_header_buffer_size 2k;
# 配置虚拟主机 192.168.75.145
server {
# 监听的ip和端口,配置 192.168.75.145:80
listen 80;
# 虚拟主机名称,可以是单个或多个ip、域名;
server_name 192.168.75.145;
# 所有的请求都以 / 开始,所有的请求都可以匹配此 location
location / {
# 使用 root 指令指定虚拟主机目录即网页存放目录
root /usr/share/nginx/wwwroot/html80;
# 指定欢迎页面,按从左到右顺序查找
index index.html index.htm;
}
# 错误页
error_page 404 500 502 /404.html;
location /404.html {
root html;
}
}
# 配置虚拟主机
server {
listen 8080;
server_name 192.168.75.145;
location / {
root /usr/share/nginx/wwwroot/html8080;
index index.html index.htm;
}
}
}Nginx 常用命令
修改配置后不必重启整个进程,reload 会平滑加载新配置(旧连接处理完再退出),不中断服务。
# 检查配置文件语法是否正确(改完配置务必先执行,避免带着错误配置 reload)
nginx -t
# 启动
nginx
# 平滑重载配置(不中断现有连接,推荐)
nginx -s reload
# 快速停止(立即关闭,不等待请求处理完)
nginx -s stop
# 优雅停止(处理完当前请求再关闭)
nginx -s quit
# 指定配置文件启动(默认读取安装目录下 conf/nginx.conf)
nginx -c /usr/local/nginx/conf/nginx.conf
# 查看版本及编译参数(可用于确认是否包含某个模块)
nginx -V提示
养成"改完配置先 nginx -t,通过后再 nginx -s reload"的习惯,可以避免因语法错误导致 reload 失败、服务受影响。
Nginx 虚拟主机(静态服务器)
基于域名
提示
域名可以使用通配符*,表示任意字符;也可以使用正则
user 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 admin.service.com;
location / {
root /usr/share/nginx/wwwroot/myshop;
index index.html index.htm;
# 列出文件夹内容,可在网页上查看
autoindex on;
# 设置本地浏览器缓存3天;会自动对比版本并替换为最新;
expires 3d;
}
}
server {
listen 80;
server_name *.web.com;
location / {
root /usr/share/nginx/wwwroot/myshop/myapp;
index index.html index.htm;
# 列出文件夹内容,可在网页上查看
autoindex on;
# 设置本地浏览器缓存3天;会自动对比版本并替换为最新;
expires 3d;
}
}
}注意
location 和 root 配合使用:
root 若是相对路径,相对路径根目录为 nginx 安装目录
root 若是绝对路径,则对应的文件目录为: root + location
基于端口
user 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 127.0.0.1;
location / {
root /usr/share/nginx/wwwroot/myshop;
index index.html index.htm;
}
}
server {
listen 8080;
server_name 127.0.0.1;
location / {
root /usr/share/nginx/wwwroot/myshop/myapp;
index index.html index.htm;
}
}
}location 匹配规则与优先级
location 用于匹配请求的 URI,它是 nginx 中最容易混淆的点。匹配由修饰符决定,不同修饰符的优先级不同,并非从上到下依次匹配。
| 修饰符 | 示例 | 含义 |
|---|---|---|
= | location = /api | 精确匹配,URI 与之完全相等才命中,性能最高 |
^~ | location ^~ /img/ | 前缀匹配,命中后不再检查正则 |
~ | location ~ \.js$ | 正则匹配,区分大小写 |
~* | location ~* \.js$ | 正则匹配,不区分大小写 |
| 无 | location /api | 普通前缀匹配(最长前缀优先),会被更高优先级规则覆盖 |
匹配优先级(由高到低):
= > ^~ > ~ / ~*(按配置文件中出现的先后顺序) > 无修饰符的普通前缀(最长前缀优先)提示
一个易记的结论:先看有没有精确匹配 =,再看 ^~ 前缀,再按顺序试正则,最后才回退到普通前缀匹配。所以把 location / 写在最上面也不影响其他规则命中——它只是所有普通前缀里最短的那个,兜底用。
server {
listen 80;
server_name 127.0.0.1;
# 1. 精确匹配,只有 /login 完全相等才命中
location = /login {
# ...
}
# 2. 前缀匹配且命中后不再匹配正则,常用于静态资源目录
location ^~ /static/ {
root /usr/share/nginx/html;
}
# 3. 正则匹配(不区分大小写),命中图片走强缓存
location ~* \.(gif|jpg|png|css|js)$ {
expires 7d;
root /usr/share/nginx/html;
}
# 4. 普通前缀,兜底
location / {
root /usr/share/nginx/html;
index index.html;
}
}root 与 alias 的区别
两者都用于指定文件所在目录,但路径拼接方式完全不同,这是新手最容易踩的坑:
root:最终路径 =root 值+location 匹配的完整 URIalias:最终路径 =alias 值+location 之后剩余的 URI(即把 location 部分"替换"掉)
# 请求 /static/js/app.js
location /static/ {
root /usr/share/nginx/html;
# 实际查找:/usr/share/nginx/html/static/js/app.js (URI 被完整拼接)
}
location /static/ {
alias /usr/share/nginx/html/assets/;
# 实际查找:/usr/share/nginx/html/assets/js/app.js (/static/ 被 alias 替换)
}注意
使用 alias 时,若 location 以 / 结尾,则 alias 的值也必须以 / 结尾,否则路径拼接会出错。
Nginx 反向代理
反向代理主要通过 proxy_pass 实现, 注意其位置在 location 内
提示
一旦 location 中配置了 proxy_pass,则 root 和 index 配置项将不再生效!
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 简单匹配:访问 localhost:8080 反向代理到 http://victor.spring-cloud.cn
server {
listen 8080;
# server_name 使用 _ 结尾,会匹配任何未被其他 server 块显式捕获的请求
# _ 结尾适用于兜底;如本机局域网 IP 为192.168.1.100,由于设置了 localhost、127.0.0.1 匹配,
# 访问 192.168.1.100:8080 时,若以 _ 结尾,则能正常访问,否则访问失败。
# server_name localhost 127.0.0.1 _;
server_name localhost 127.0.0.1;
location / {
proxy_pass http://victor.spring-cloud.cn/;
# 以下配置均无效
root /usr/share/nginx/wwwroot/myshop;
index index.html index.htm;
}
}
# 匹配规则 -- location
# 以下示例表示: 访问 127.0.0.1:8081/api/a 反向代理到 http://victor.spring-cloud.cn/api/a
# location /api/ 和 location /api 的区别是匹配精度不同
# /api 能匹配 /api、/apis、/apiss/s 等路径,但 /api/ 只能匹配类似 /api/xxx 的路径
server {
listen 8081;
server_name 127.0.0.1;
location /api/ {
proxy_pass http://victor.spring-cloud.cn;
}
}
# 匹配规则 -- proxy_pass
# 以下示例表示: 访问 127.0.0.1:8081/api/aa 反向代理到 http://victor.spring-cloud.cn/aa
# proxy_pass 是否以 / 结尾,表示是否保留 location 指定的路径;/ 结尾不保留,否则保留
# 通常的做法是将 location 指定的路径和 proxy_pass 的 url 保持一致,更容易理解
# 如 location /api/ 搭配 proxy_pass http://victor.spring-cloud.cn/api/;
server {
listen 8082;
server_name 127.0.0.1;
location /api/ {
proxy_pass http://victor.spring-cloud.cn/; # 注意此处末尾以 / 结尾
}
}
}反向代理常用请求头
反向代理后,后端服务拿到的请求都来自 nginx,因此默认取到的客户端信息是 nginx 的信息(如 IP 变成 nginx 所在机器)。为让后端拿到真实的客户端信息,通常需要通过 proxy_set_header 透传:
location /api/ {
proxy_pass http://127.0.0.1:8080/;
# 透传原始请求的 Host 头,后端据此区分域名(虚拟主机场景必备)
proxy_set_header Host $host;
# 透传客户端真实 IP
proxy_set_header X-Real-IP $remote_addr;
# 追加经过的代理 IP 链,后端可取最左侧为真实客户端 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 透传原始请求协议(http/https),后端据此判断是否走了 https
proxy_set_header X-Forwarded-Proto $scheme;
}提示
若后端框架(如 Spring、Tomcat)需要获取真实 IP,务必配置 X-Real-IP 或 X-Forwarded-For,否则日志和限流拿到的都是 nginx 的 IP。
Nginx 负载均衡
负载均衡需结合反向代理使用,并使用 upstream 配置项
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
server 192.168.75.145:9090 weight=10;
server 192.168.75.145:9091 weight=5;
# 设置到上游服务器保持的最大长连接数量;
# 这里可以简单理解为连接池可以缓存1000个连接;
keepalive 1000;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
# 设置超时断开连接
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 300s;
# 若下游传递Connection close头,防止关闭长连接。
proxy_set_header Connection "";
}
}
}负载均衡策略
轮询:默认配置,在 upstream 中不指定策略即可
权重:添加
weight= 数值 ,数值越大,几率越大down:添加
down关键字,则不参与负载均衡backup:添加
backup关键字,不参与负载均衡,但当其他机器不可用时,使用当前机器健康检查:
max_fails指定失败次数(默认 1),fail_timeout指定失败后的隔离时长(默认 10s)。如server 192.168.75.145:9090 max_fails=3 fail_timeout=30s;表示 30s 内失败 3 次则将该节点标记为不可用,隔离 30s 后再重试
ip_hash
同一个IP的请求只会访问到一个机器上;若访问者IP会变,要注意是否会产生问题
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
ip_hash;
server 192.168.75.145:9090;
server 192.168.75.145:9091;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
}
}
}fair
根据服务器响应时间分配请求,响应时间短的优先分配
注意
fair 并非 nginx 内置策略,而是第三方模块 nginx-upstream-fair 提供的,需要在编译 nginx 时通过 --add-module 引入,直接使用会报 unknown directive "fair"。相比之下,本文其余的 ip_hash、hash(cookie/uri)均为内置指令,开箱即用。
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
server 192.168.75.145:9090;
server 192.168.75.145:9091;
fair;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
}
}
}其他 hash
Cookie
根据请求头携带的 Cookie 值,相同 Cookie 访问同一台机器;此配置需注意浏览器禁用 Cookie 的问题
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
hash $cookie_jsessionid;
server 192.168.75.145:9090;
server 192.168.75.145:9091;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
}
}
}uri
同一 uri 访问相同机器
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
hash $request_uri;
server 192.168.75.145:9090;
server 192.168.75.145:9091;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
proxy_pass http://myapp;
}
}
}UrlRewrite 伪静态配置
若原本的 url 为 http://www.test.com/index.jsp?pageNum=10,且参数为动态
现在想在浏览器输入 http://www.test.com/10.html 达到相同的效果,则可以使用以下配置
主要由 rewrite 配置项实现:
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream myapp {
server 192.168.75.145:9090 weight=10;
server 192.168.75.145:9091 weight=5;
}
server {
listen 80;
server_name www.test.com;
location / {
rewrite ^/([0-9]+)\.html$ /index.jsp?pageNum=$1 break;
proxy_pass http://myapp;
}
location ~*/(js|img|css) {
root html;
}
}
}提示
- 观察 rewrite 配置项中的
$1,它表示动态获取第一个正则的值,即([0-9]+)匹配的值 - 正则中的
.是元字符,会匹配任意字符,若想匹配字面量的"点",需转义为\.;如\.html$才是精确匹配.html结尾 - break 关键字表示 本条规则匹配完成即终止,不再匹配后面的任何规则 :::
其他关键字:
last #本条规则匹配完成后,继续向下匹配新的 location URI 规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址
permanent #返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址
防盗链
若站内的图片、css、js 等资源不想让其他站点直接访问,可通过防盗链设置实现
例如在 html 中通过 url 直接引用外部 js,js 请求头中会携带 Referer 属性,用于标明引用者的身份;nginx 可通过判断 Referer 属性值是否合法,来决定放行与否;
提示
Referer 是 HTTP 协议里一个著名的拼写错误(本应是 Referrer),实际书写时以协议为准。nginx 中对应的内置变量为 $http_referer,非法引用时 $invalid_referer 会被置为非空。
防盗链 valid_referers 配置项说明
valid_referers none | blocked | server_names | strings ....;- none, 设置为 none,没有 refer 属性直接放行;只有间接引用,header 中才会有 refer 属性;浏览器直接打开,则没有 refer 属性;
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况该头域的值不以 “http://” 或 “https://” 开头;此配置不太常用;
- server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
不让其他站点引用资源
只允许 www.test.com 引用或浏览器直接访问访问图片、css、js
user 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 www.test.com;
location ~*/(js|img|css) {
valid_referers none www.test.com;
if ($invalid_referer) {
return 403;
}
root html;
}
}
}提示
return 403 表示禁止访问,直接返回状态码给浏览器;也可以是错误页、图片等
错误页
再单独配置一个错误页处理
error_page 403 /403.html; location /403.html { root html; }图片
return 403 替换成如下
rewrite ^/ /img/error.png
配置 websocket
user 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;
# websocket接口
location /api/log/test_log {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:8080/api/log/test_log;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}Gzip 压缩
对文本类资源(HTML、CSS、JS、JSON 等)开启 Gzip 压缩,可显著减小传输体积、加快前端首屏加载。压缩由服务端完成,浏览器自动解压。
http {
# 开启 gzip
gzip on;
# 小于此大小的文件不压缩(太小的文件压缩收益低,反而浪费 CPU)
gzip_min_length 1k;
# 压缩级别 1~9,级别越高压缩比越大但越耗 CPU,一般 4~6 较均衡
gzip_comp_level 6;
# 需要压缩的 MIME 类型(图片、视频等已是压缩格式,无需再压)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
# 为带 Vary 的响应加上 Vary: Accept-Encoding,便于 CDN/代理正确缓存
gzip_vary on;
# 对代理请求也启用压缩(any 表示不论后端是否要求都压缩)
gzip_proxied any;
}提示
JPG、PNG、MP4 等本身已是压缩格式,再压几乎没有收益,不要加入 gzip_types。若追求更高压缩比,可考虑 brotli(需第三方模块)。
配置 HTTPS(SSL 证书)
前端部署几乎都要求 HTTPS。核心是监听 443 ssl 端口并指定证书;同时通常将 80 端口的请求强制跳转到 443。
http {
# HTTP:将所有 80 端口请求 301 跳转到 HTTPS
server {
listen 80;
server_name test.zjx.com;
# $host 保留原域名,$request_uri 保留原路径和参数
return 301 https://$host$request_uri;
}
# HTTPS
server {
listen 443 ssl;
server_name test.zjx.com;
# 证书(.pem/.crt)与私钥(.key)文件路径
ssl_certificate /etc/nginx/cert/test.zjx.com.pem;
ssl_certificate_key /etc/nginx/cert/test.zjx.com.key;
# 会话缓存,减少握手开销,提升性能
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 仅启用较安全的协议版本(禁用已不安全的 SSLv3、TLSv1.0/1.1)
ssl_protocols TLSv1.2 TLSv1.3;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}注意
ssl_certificate 需要使用完整证书链(包含中间证书),否则部分客户端(尤其是 Android、部分 IoT 设备)会报证书不受信任。
前端 SPA 部署(history 路由)
Vue Router / React Router 的 history 模式下,/user/1、/order/list 这类路径在服务端并没有对应的物理文件。若直接访问或刷新,nginx 会因找不到文件而返回 404。
解决办法是用 try_files 兜底:找不到对应文件时,一律回退到 index.html,交由前端路由接管。
server {
listen 80;
server_name test.zjx.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
# 依次尝试:URI 对应的文件 -> 目录 -> 都找不到则回退 index.html
try_files $uri $uri/ /index.html;
}
# 静态资源可单独设置强缓存(文件名一般带 hash,可放心长缓存)
location ~* \.(js|css|png|jpg|jpeg|gif|svg|woff2?)$ {
root /usr/share/nginx/html;
expires 30d;
add_header Cache-Control "public, max-age=2592000";
}
}提示
若前端部署在子路径(如 /admin/),需同时设置打包时的 base/publicPath 为 /admin/,并将回退目标改为 /admin/index.html,否则资源路径会 404。
日志配置
nginx 提供访问日志(access_log)和错误日志(error_log),是排查线上问题的第一手资料。可通过 log_format 自定义访问日志格式。
http {
# 自定义日志格式,命名为 main
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 /var/log/nginx/access.log main;
# 错误日志:路径 + 级别(debug|info|notice|warn|error|crit,由低到高)
error_log /var/log/nginx/error.log warn;
server {
listen 80;
server_name test.zjx.com;
# 可在 server / location 级别单独指定日志,覆盖 http 级别配置
location /api/ {
access_log /var/log/nginx/api.access.log main;
proxy_pass http://127.0.0.1:8080/;
}
# 对不关心的资源(如探活、静态图标)可关闭日志,减少磁盘写入
location = /favicon.ico {
access_log off;
}
}
}提示
常见变量说明:$remote_addr 客户端 IP、$status 响应状态码、$body_bytes_sent 响应体大小、$request_time 请求处理耗时(排查慢请求常用,可自行加入格式)、$http_x_forwarded_for 经过代理时的真实客户端 IP 链。
日志切割(防止日志撑爆磁盘)
access_log 默认会无限追加到同一个文件,久了会把磁盘写满,导致 nginx 无法访问(删掉日志文件即恢复)。行业标准做法是用 Linux 自带的 logrotate 做日志轮转,而不是在 nginx 里解决。apt/yum 安装的 nginx 一般已自带 /etc/logrotate.d/nginx:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天切割
rotate 30 # 保留 30 份,更早的自动删除
compress # 旧日志 gzip 压缩
missingok
notifempty
postrotate
# 关键:切割后通知 nginx 重新打开日志文件
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}注意
切割的本质是"重命名旧文件 + 让 nginx 重开新文件"。若只手动 rm access.log 而不执行 nginx -s reopen(即上面的 kill -USR1),nginx 仍持有旧文件句柄继续写,磁盘空间不会释放。
nginx 解决跨域问题
以下示例表示前端和后台都部署在同一台服务器中:
user 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 test.zjx.com;
# 前端部署路径
location / {
root D:/cloudServer/nginx/front;
# root /usr/local/app/front
index index.html index.htm;
}
# 后端接口允许跨域访问
location /api/ {
proxy_pass http://localhost:8080/api/;
# 允许的请求方法;注意带凭证(cookie)的请求下,部分浏览器不接受 *,
# 稳妥起见建议显式列出,如 "GET, POST, PUT, DELETE, OPTIONS"
add_header Access-Control-Allow-Methods *;
# 预检命令的缓存,如果不缓存每次会发送两次请求
add_header Access-Control-Max-Age 3600;
# 带cookie请求需要加上这个字段,并设置为true
add_header Access-Control-Allow-Credentials true;
# 表示允许这个域跨域调用(客户端发送请求的域名和端口)
# $http_origin 动态获取请求客户端请求的域;不用*的原因是带cookie的请求不支持*号【报错but only one is allowed说明和服务端的CorsFilter冲突,删掉这条就行】
add_header Access-Control-Allow-Origin $http_origin;
# 表示请求头的字段 动态获取
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
# OPTIONS预检命令,预检命令通过时才发送请求
# 检查请求的类型是不是预检命令
if ( $request_method = OPTIONS ) {
return 200;
}
}
}
}
