列举出一些 Nginx 的常用配置,每次修改过nginx配置后,可以使用命令 nginx -s reload,进行配置更新

0. nginx常用内置变量

变量名 功能
$host 请求信息中的Host,如果请求中没有,则等于设置的服务器名
$request_method 客户端的请求类型,如GETPOST
$remote_addr 客户端的IP地址
$remote_port 客户端的端口
$content_length 请求中的Content-length字段
$http_user_agent 客户端agent信息
$http_cookie 客户端cookie信息
$args 请求中的参数
$server_protocol 请求使用的协议,如HTTP/1.0HTTP/1.1
$server_addr 服务器地址
$server_name 服务器名称
$server_port 服务器的端口号

1.worker_processes

一般一个进程足够了,你可以把连接数设得很大。

如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。

或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加

服务器是“多个CPU+gzip+网站总文件大小大于内存”的环境,worker_processes设置为CPU个数的两倍比较好

2.server_name

用来指定IP地址或者域名,多个域名之间用空格分开

1
2
3
4
5
server_name   _; #server_name这么写表示不启用域名,直接ip访问
server_name example.com;
server_name *.example.com; # 后缀匹配
server_name www.example.*; # 前缀匹配
server_name ~\w+.com; # 正则匹配

当我们监听的的端口只有一个server配置的时候,server_name 可以不填

3.gzip

nginx自带压缩功能,但对视频图片效果不好,建议只对css,js等进行压缩

1
gzip on; #默认为off

更详细的配置请查看gzip配置

4.location

语法规则location [=|~|~*|^~] /uri/ { … }

  • = 开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头
  • ~ 开头表示区分大小写的正则匹配 以xx结尾
  • ~* 开头表示不区分大小写的正则匹配 以xx结尾
  • !~!~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则
  • / 通用匹配,任何请求都会匹配到。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    location = / {
    #规则A
    }
    location = /login {
    #规则B
    }
    location ^~ /static/ {
    #规则C
    }
    location ~ \.(gif|jpg|png|js|css)$ {
    #规则D,注意:是根据括号内的大小写进行匹配。括号内全是小写,只匹配小写
    }
    location ~* \.png$ {
    #规则E
    }
    location !~ \.xhtml$ {
    #规则F
    }
    location !~* \.xhtml$ {
    #规则G
    }
    location / {
    #规则H
    }

5.静态http服务器配置

1
2
3
4
5
6
7
8
server {
listen 80;
server_name localhost;
location / {
root /var/www/html;
index index.html;
}
}

6.反向代理配置

反向代理普通请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server{
listen 80;
server_name _;
location /api {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;

proxy_read_timeout 300s;
proxy_send_timeout 300s;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

反向代理websocket

1
2
3
4
5
6
7
8
9
10
11
12
server{
listen 80;
server_name _;
location /api {
proxy_http_version 1.1;
proxy_pass http://127.0.0.1:8080/websoket;
proxy_read_timeout 300s;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

7.重定向配置

1
2
3
4
5
6
7
8
9
server{
listen 80;
server_name _;
index index.html;

if($http_host !~ "^example.png$") {
rewrite ^(.*) http://png.example.com$1 redirect;
}
}

8.防盗链设置

1
2
3
4
5
6
7
8
location ~* \.(gif|jpg|png|bmp)$ {
# 来源是自己的网站或者是百度和谷歌的搜索结果才不回被block
valid_referers none blocked *.***.com server_names ~\.google\. ~\.baidu\.;
if ($invalid_referer) {
return 403; #假如不是自己的网站返回403页面
# rewrite ^/ http://www.example.com/403.jpg;
}
}

9.根据图片文件类型设置过期时间

1
2
3
4
5
location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|swf)$ {
access_log off;
log_not_found off;
expires 30d;
}

10.设置禁止访问某个目录

1
2
3
location ~* \.(txt|doc)$ {
deny all;
}

11.隐藏版本号

可防止别人通过你所用的nginx版本,找其漏洞,进行攻击你,可查看请求的response中的Server字段进行查看效果。

1
2
3
http{
server_tokens off;
}

12.开启ssl加密,开启https

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server{
listen 443 ssl http2 default_server;
listeb [::]:443 ssl http2 default_server;
server_name example.com;
root /var/www/html;
index index.html index.htm;

# 开启ssl
ssl_certificate /etc/httpd/crt/wcs_ssl.crt; # 证书crt文件所在位置
ssl_certificate_key /etc/httpd/crt/wcs_ssl.key; # 证书key文件所在位置
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

}

关于生成自签名证书,可参照这篇文章linux生成私有证书

13.开启文件目录显示

当你想让nginx作为文件下载服务器存在时,需要开启nginx列目录

1
2
3
4
5
6
7
server {
location /download {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}

14.限制请求方法

$request_method能够获取到请求nginx的method

1
2
3
4
5
6
7
server {
location / {
if ($request_method !~ ^(GET|HEAD|OPTIONS|POST|PATCH|DELETE)$ ) {
return 405;
}
}
}

15.设置缓冲区容量上限

在http层级设置,可以防止缓冲区溢出攻击

1
2
3
4
5
6
http{
client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
}