Nginx配置与常用模块
# Nginx配置文件介绍
Nginx中一般会将主配置和虚拟主机、负载均衡等配置分开来编写,然后再在主配置文件中导入拓展配置文件,方便进行统一管理。
# 主配置文件
配置文件路径:
./nginx/conf/nginx.conf
主配置文件常用配置
# 指定Nginx进程的管理用户
user nginx;
# 指定Worker进程数量
# 进程越多并发能力越强,一般设为CPU核数的1~2倍
worker_processes 1;
# 启用CPU亲和
worker_cpu_affinity auto;
# 关闭守护进程模式
daemon off;
# 指定错误日志文件路径
logs/error.log;
# 指定Pid文件路径
pid /var/run/nginx.pid;
# Event事件配置区域
events {
# 定义一个Worker进程可以同时接收多少个访问请求
worker_connections 10240;
}
# HTTP配置区域
http {
# 关闭响应头中的server显示的nginx版本号信息,提高安全性
server_tokens off;
# 导入支持的文件类型配置文件
include mime.types;
# 定义默认识别的文件类型
default_type application/octet-stream;
# 定义访问日志格式:日志格式名 '日志格式'
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 logs/access.log main;
# 优化相关配置
sendfile on;
#tcp_nopush on;
# 开启并指定长连接的超时断开连接时间
keepalive_timeout 65;
# 导入拓展配置文件
include conf.d/*.conf;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 拓展配置文件
拓展配置文件一般会用来定义负载均衡、虚拟主机等配置。
一般会将拓展的配置文件放到一个目录进行统一管理,例如:
./nginx/conf/conf.d/*.conf
虚拟主机常用配置
server { listen 80; server_name localhost; location / { root /data/apps/nginx/html; index index.html index.htm; } }
1
2
3
4
5
6
7
8
9server{}
- 虚拟主机配置区域- 配置一个虚拟主机同等于配置一个网站,例如www、bbs、blog等。
listen 80;
- 虚拟主机监听的端口server_name localhost;
- 虚拟主机名称- 虚拟主机名就是虚拟主机会匹配的域名。
- 虚拟主机名可以配置多个别名,例如:
server_name baidu.com www.baidu.com
。 - 当多个虚拟主机的虚拟主机名冲突时,则按照配置文件导入顺序,使用匹配到的第一个同名虚拟主机。
location [资源匹配路径] {}
- 资源匹配区域客户端访问时,如果访问的是设定的资源匹配路径,就会去设定的资源目录下寻找资源。
匹配路径为
/
代表默认匹配的区域。例如:
server_name www.test.com; # 匹配区域/test location /test { ... } # 匹配区域/ location / { ... } # 用户访问www.test.com/test时,会进到匹配区域/test中,访问其他则会进到匹配区域/中。
1
2
3
4
5
6
7
8
9
10
11
12
root /data/apps/nginx/html;
- 指定资源目录根路径root方式会使用资源目录路径加上匹配路径,去查找指定资源。
例如:
server_name www.test.com; location /test/img { root /data/apps/nginx/html; index index.html index.htm; } # 用户访问www.test.com/test/img/avatar/1.jpg时,会去/data/apps/nginx/html/test/img/目录下查找./avatar/1.jpg资源
1
2
3
4
5
6
7
index index.html index.htm;
- 指定首页文件在用户没有请求具体资源时,默认响应的首页文件。
例如:
server_name www.test.com; location /test { root /data/apps/nginx/html; index index.html index.htm; } # 用户访问www.test.com/test时,会响应/data/apps/nginx/html/index.html的内容给用户。
1
2
3
4
5
6
7
# 虚拟主机匹配顺序
匹配字符串完全匹配的主机名 (完全匹配),例如:
server_name www.baidu.com;
。匹配通配符在前面的主机名,例如:
server_name *.baidu.com;
。匹配通配符在后面的主机名,例如:
server_name www.baidu.*;
。匹配使用正则表达式的主机名。
匹配listen配置项加有"default_server"的主机,例如:
listen 80 default_server;
。可以实现Nginx禁止通过IP或未知域名访问
# 当用户通过IP或未知域名访问时,由于没有匹配到对应的主机名,默认就会按配置文件顺序匹配 # 但我们在虚拟主机上配置"listen 80 default_server;"之后,就可以让该主机更优先于顺序载入进行匹配,可以在该虚拟主机上配置返回错误或者进行跳转来导流。 server { # 让Nginx在其他主机都没有匹配成功时使用该主机 listen 80 default_server; # 匹配空域名或者直接不写该条 server_name _; return 302 https://官网; # return 503; }
1
2
3
4
5
6
7
8
9
10
11
12
13
匹配按顺序配置文件载入的第一个主机。
# root和alias匹配路径的区别
在location / {}中配置的root和alias的区别。
root方式的资源查找路径是:root路径 + location路径。
表示从指定的root目录路径下开始查找,拼接上匹配的资源路径,来查找资源。
# 比如下面的例子,如果用户请求的URI是/img/test.jpg,则会去/data/resource/img/下查找test.jpg location /img/ { root /data/resource/; }
1
2
3
4
alias的资源查找路径是:使用alias路径替换location路径。
表示如果匹配上,则固定使用alias配置的资源。
# 比如下面的例子,如果用户请求的URI是/img/test.jpg,则会去/data/resource/下查找test.jpg location /img/ { alias /data/resource/; }
1
2
3
4
# Nginx命令
# nginx [参数]
-t
- 测试配置文件是否正确-T
- 测试配置文件是否正确,不正确则显示配置文件内容-s [指令]
- 发送控制指令给Master进程reload
- 平滑重启并加载配置- 新建立的连接会使用新配置,不会断开当前已有的连接
quit
- 优雅退出stop
- 快速退出
- 例如:
nginx -s reload
# 虚拟主机访问方式
# 域名访问
- 客户端使用域名访问时,会先将域名解析为IP然后进行转换,访问时请求头会将请求的域名放到Host字段。
- 然后Nginx收到后就可以根据Host字段中的域名,去匹配对应的虚拟主机了。
# IP地址访问
客户端使用IP访问时,则会使用匹配到的第一个虚拟主机,匹配顺序是根据导入顺序的。
如果想要某些配置文件优先导入,可以通过编辑主配置文件,在导入拓展配置文件前,额外导入一个优先匹配的配置文件来调整顺序。
另外虚拟主机配置还可以指定监听的网卡地址,使客户端只能使用监听的地址访问,不过需要所有的站点配置文件的监听地址配置一样才有效,还有就是Nginx中涉及到IP地址的配置都需要重启服务才能生效。
例如:
server { listen 10.0.0.7:80; ... }
# 端口访问
客户端只能使用监听的端口访问某虚拟主机,配置好后平滑重启即可。
另外如果多个虚拟主机端口配置相同,则访问该端口时会按照域名或者导入顺序进行匹配。
例如:
server { listen 8080; ... }
# 网站访问过程
- 将域名进行解析,得到对应的网站服务器IP地址。
- 建立传输层TCP的连接,浏览器访问端口默认是80。
- 根据应用层HTTP协议发出请求报文到网站服务器。
- 服务端根据请求端口和请求报文中的Host信息查找指定虚拟主机,如果没有和域名一致的虚拟主机名,则会按导入顺序找到满足端口要求的第一个虚拟主机交由其处理,并返回响应报文。
- 客户端收到响应报文后,渲染网站页面。
# 常见模块功能
Nginx中的大部分功能实际上是由各种模块来实现的,我们平时编写Nginx配置,实际上就是在定义各种模块。
# IP地址进行访问控制
ngx_http_access_module模块
# 配置格式 Syntax: deny address | CIDR | unix: | all; Default: — # 能使用的区域 Context: http, server, location, limit_except
1
2
3
4
5
6使用例子
# 拒绝10.0.0.0/24网段访问,允许127.16.1.0/24网段访问 # 一般只会配置在server,location这两个区域中,区域不同,作用域就不同 server { ... ... location /test { root /html/www; deny 10.0.0.0/24; allow 127.16.1.0/24; } }
1
2
3
4
5
6
7
8
9
10其他说明
仅配置ALLOW而没有配置DENY时,配置是无效的,仅允许并不会拒绝其他网段。
访问控制是顺序匹配,和Iptables一样先匹配上哪个规则,就使用哪个规则的动作(allow/deny)。所以如果要拒绝除了某个网段外的其他IP,那么可以将ALLOW允许的网段定义DENY ALL上面,例如:
allow 192.168.10.0/24; deny all;
1
2
# 用户认证进行访问控制
ngx_http_auth_basic_module模块
# 认证是否开启,指定"提示信息"进行开启,或者指定off进行关闭 Syntax: auth_basic string | off; # 指定用户密码文件路径 Syntax: auth_basic_user_file file; Default: auth_basic off; Context: http, server, location, limit_except
1
2
3
4
5
6使用例子
server{ location / { ... ... auth_basic "Welcome to My Site"; auth_basic_user_file ./user_auth.txt; } }
1
2
3
4
5
6
7创建密码文件
密码文件配置可以指定相对路径或者绝对路径,不过最好使用相对路径,相对路径是相对于
./nginx/conf/
目录。# 安装htpasswd命令,用于生成密文密码文件 yum install -y httpd-tools # 生成密码文件 htpasswd -bc ./user_auth.txt myuser qwe123456 # 修改文件权限和属主,提高密码文件安全性 chown nginx.nignx ./user_auth.txt && chmod 600 ./user_auth.txt
1
2
3
4
5
6
7
8htpasswd命令
htpasswd -bc [文件路径] [用户名] [密码]
- 参数:
-c
- 创建一个密码文件-b
- 免交互方式生成密码文件-m
- 指定使用md5进行加密(默认)-B
- 指定使用bcrypt进行加密-d
- 删除指定用户
# 资源索引页面
ngx_http_autoindex_module模块
# 是否开启nginx站点目录索引功能 Syntax: autoindex on | off; Default: autoindex off; Context: http, server, location
1
2
3
4使用例子
# 需要让location找不到首页文件, 可以删除index.html文件, 或指定一个不存在的文件 location / { index; autoindex on; }
1
2
3
4
5可识别资源文件类型配置
- 将资源类型加入到
mime.conf
配置文件即可。 - 用于让nginx可以识别资源文件类型,若访问资源的扩展名存在于mime.conf文件中,则访问时直接可以看到该文件的内容。若访问资源的扩展名不存在于mime.conf文件中,则访问时会直接下载该文件资源。
- 将资源类型加入到
# 解决页面中文乱码
ngx_http_charset_module模块
# 指定页面编码类型 Syntax: charset charset | off; Default: charset off; Context: http, server, location, if in location
1
2
3
4使用例子
location / { charset utf-8; ... ... }
1
2
3
4
# 监控网站访问状态
ngx_http_stub_status_module模块,需要在编译时启用该模块:
--with-http_stub_status_module
。# 启用状态访问页面 Syntax: stub_status; Default: — Context: server, location
1
2
3
4使用例子
# 虚拟主机方式 server { listen 80; server_name status.test.com; stub_status; } # 资源页面方式 location = /basic_status { stub_status; }
1
2
3
4
5
6
7
8
9
10
11页面参数信息
- 我们可以使用curl获取页面数据,然后配合awk取出其中的值。
Active connections
- 活跃的连接数信息,当前已连接到网站的客户端数。accepts
- 接收的连接数的总和,重启服务将会重置。handled
- 处理的连接数的总和。- 当接收连接数大于处理连接数时,就代表请求并发量太大,worker处理不过来。
requests
- 所以连接的HTTP请求次数的总和,一个长连接可以对应多个请求。Reading
- 正在读取的请求报文数量。Writing
- 正在发送的响应报文数量。Waiting
- 暂未处理的请求数量。
# 记录错误日志
error_log模块
# 指定错误日志路径以及错误日志记录级别 Syntax: error_log file [level]; Default: error_log logs/error.log error; Context: main, http, mail, stream, server, location
1
2
3
4使用例子
# 主配置文件默认有配置 http { error_log logs/error.log error; ... ... }
1
2
3
4
5错误级别
- 级别越低,显示的信息越多,反之级别越高,显示的信息也就越少,一般使用error级别即可。
debug
- 调试级别,服务运行的状态信息和错误信息详细显示。info
- 信息级别,只显示重要的运行信息和错误信息。notice
- 通知级别,更加重要的信息进行通知说明。warn
- 警告级别,可能出现了一些错误,但不影响服务运行。error
- 错误级别,服务运行出现了错误,需要进行纠正,如果不管则可能会发生更严重的错误。crit
- 严重级别,严重的错误,必须进行错误修改。alert
- 严重警告级别,又严重又有警告,必须进行错误修改。emerg
- 灾难级别,服务已经不能正常运行。
# 记录访问日志
access_log模块
# 定义日志路径和调用日志格式 Syntax: access_log path [format]; Context: http, server, location, if in location, limit_except
1
2
3使用例子
# 默认在主配置文件中配置了记录HTTP的所有访问日志,但一般会关掉,然后在各个server中分别进行配置 # 另外一般还会配置日志切割,可以通过定时任务加脚本、或者logrotate服务进行定时切割 server { listen 80; server_name www.test.com; access_log logs/www_access.log main; ... ... }
1
2
3
4
5
6
7
8日志格式
# 定义日志格式,一般在主配置文件的HTTP块中配置,这样之后导入的拓展配置文件都可以调用 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
1
2
3
4
5$remote_addr
- 访问源IP地址$remote_user
- 访问认证的用户名$time_local
- 访问网站的时间$request
- 请求报文的请求行信息$status
- 网站响应的状态码信息$body_bytes_sent
- 网站响应的数据资源的大小信息(Bytes),可用于统计站点耗费的流量$http_referer
- 用于记录访问或调用网站资源的来源地址,可用于防止盗链- 盗链就是其他人直接将链接盗走,上线到他自己的网站上,这样耗费的流量还是源链接的流量。
$http_user_agent
- 记录用户访问页面使用的用户代理程序,也就是浏览器信息$http_x_forwarded_for
- 用于记录负载均衡服务发送来的用户源IP
# location区域匹配
ngx_http_core_module模块
# location属于core模块,它的作用是匹配客户端访问的URI并进行对应处理 Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Context: server, location
1
2
3
4使用例子
# 精准匹配 location = / {...} # 默认匹配 location / {...} # 按照目录进行匹配 location /documents/ {...} # 使优先匹配 location ^~ /images/ {...} # 不区分大小写进正则匹配 location ~* \.(gif|jpg|jpeg)$ {...}
1
2
3
4
5
6
7
8
9
10匹配方式
= [匹配内容]
- 精确匹配,优先级最高,URI正好是
[匹配内容]
则匹配。
- 精确匹配,优先级最高,URI正好是
^~ /[匹配区域]/
- 优先匹配,优先级第二,同时不识别URI信息中的符号信息。
~ [匹配内容]
- 区分大小写匹配,优先级第三,可用正则表达式。
~* [匹配内容]
- 不区分大小写进行匹配,优先级第三,可用正则表达式。
\
用于转义.
符号,此处表示匹配所有.(gif|jpg|jpeg)结尾的URL。/[匹配区域]/
- 按目录进行匹配,优先级第三,URI是
域名/匹配内容/...
则匹配。
- 按目录进行匹配,优先级第三,URI是
/
- 默认匹配,优先级最低,如果URI和其他location都不匹配,则使用该默认匹配。
- 如果同时配置
/
和= /
,则会以= /
为准。
# 指定错误页面
ngx_http_core_module模块
# error_page属于core模块,它的作用是自定义错误页面 Syntax: error_page code ... [=[response]] uri; Default: — Context: http, server, location, if in location
1
2
3
4使用例子
localtion /onepage { root /html/www; error_page 404 /test.jpg; error_page 500 502 503 504 /50x.html; } # 在/html/www/中存放test.jpg和50x.html文件 # 用户请求/onepage/...出现404时就会展示/test.jpg # 用户请求/onepage/...出现500 502 503 504时就会展示/50x.html
1
2
3
4
5
6
7
8
# 网站跳转重定向
ngx_http_rewrite_module模块
# 重定向规则配置,可重定向浏览器访问的URL或URI到指定网站 Syntax: rewrite regex replacement [flag]; Context: server, location, if
1
2
3- 跳转方式
permanent
- 301 永久跳转- 第一次跳转后,让浏览器保存跳转信息,以后由浏览器本地跳转。
- 如果跳转地址换了,则需要浏览器清除缓存,才能访问新地址。
redirect
- 302 临时跳转- 每一次跳转都会访问服务端,会增加服务器工作量。
- 跳转方式
使用例子
# 重定向test.com的请求到www.test.com虚拟主机 server { listen 80; server_name test.com; rewrite ^/(.*) http://www.test.com/$1 permanent; } # 重定向HTTP请求到HTTPS server { # 监听HTTP的80端口 listen 80; server_name www.test.com; rewrite ^/(.*) https://${server_name}$1 permanent; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14打破无限跳转方法
如果想要在同一虚拟主机中,将多别名跳转成一个别名,就可能出现无限跳转的问题。
比如:将
www.test02.com
重定向到www.test01.com
第一种方法:利用不同的server区进行跳转。
# 方法一: server { listen 80; server_name www.test02.com; rewrite ^/(.*) http://www.test01.com/$1 permanent; } server { listen 80; server_name www.test01.com; root /html/www; index index.html; }
1
2
3
4
5
6
7
8
9
10
11
12
13第二种方法:同一虚拟主机,设置多别名,然后利用IF判断。
# 方法二 server { listen 80; server_name www.test01.com www.test02.com; if ($http_host != "www.test01.com") { rewrite ^/(.*) http://www.test01.com/$1 permanent; } }
1
2
3
4
5
6
7
8
9
return方式实现跳转
return可以返回指定状态码,也可以用来做重定向跳转。
local / { return [状态码] }
1使用例子
# 返回404状态码 local / { return [状态码] } # 返回302状态码并URL跳转到指定链接 # 比如下面的例子:请求www.test02.com/xxx就会302跳转到www.test01.com/xxx local / { return 302 http://www.test01.com$request_uri; } # 返回302状态码并URI跳转到指定资源 # # 比如下面的例子:请求www.test01.com/test就会302跳转到www.test01.com/img/test.jpg local /test { return 302 "/img/test.jpg"; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 配置HTTPS
ngx_http_ssl_module模块,需要在编译时启用该模块:
--with-http_ssl_module
。# 启动ssl功能,或者直接监听时指定:listen 443 ssl; Syntax: ssl on | off; Default: ssl off; Context: http, server # 指定证书文件 Syntax: ssl_certificate file; Default: - Context: http, server # 指定私钥文件 Syntax: ssl_certificate_key file; Default: - Context: http, server
1
2
3
4
5
6
7
8
9
10
11
12
13
14单机配置
# 创建存放SSL证书的路径 mkdir -p /data/apps/nginx/cert/ # 将从CA机构申请的证书放到证书目录下,例如: mv ./www.test.com.crt /data/apps/nginx/cert/ mv ./www.test.com.key /data/apps/nginx/cert/ # 虚拟主机中配置HTTPS server { # 监听HTTPS的443端口并启用SSL listen 443 ssl; server_name www.test.com; root /html/www # 指定公钥文件路径 ssl_certificate cert/www.test.com.crt; # 指定私钥文件路径 ssl_certificate_key cert/www.test.com.key; location / { index index.html; } } # 如果我们需要强制使用HTTPS,则可以配置监听HTTP的80端口,然后将其重定向到HTTPS的443端口去 server { listen 80; server_name www.test.com; rewrite ^/(.*) https://${server_name}$1 permanent; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31负载均衡多机配置
- 一般来说后端服务器不需要开启监听443端口和开启SSL,只需要监听80端口即可。客户端与服务端的SSL认证由负载均衡服务器完成就行,这样一方面可以减少配置复杂度、也可以提高数据传输效率。
- 大体思路:用户以HTTPS访问负载均衡服务器,负载均衡服务器以HTTP代理访问后端WEB服务器,后端WEB服务器以HTTP返回给负载均衡服务器,负载均衡服务器再以HTTPS加密返回给用户。
# 负载均衡服务器上,创建存放SSL证书的路径 mkdir -p /data/apps/nginx/cert/ # 负载均衡服务器上,将从CA机构申请的证书放到证书目录下,例如: mv ./www.test.com.crt /data/apps/nginx/cert/ mv ./www.test.com.key /data/apps/nginx/cert/ # 负载均衡服务器上配置站点文件 upstream web { server 10.0.0.7:80; server 10.0.0.8:80; } server { # 负载均衡服务器以HTTPS处理用户请求 listen 443 ssl; server_name www.test.com; ssl_certificate ssl_key/server.crt; ssl_certificate_key ssl_key/server.key; # 负载均衡服务器以HTTP请求后端WEB服务器 location / { proxy_pass http://web; proxy_set_head Host $http_host; } } # 负载均衡服务器监听HTTP跳转到HTTPS server { listen 80; server_name www.test.com; rewrite ^/(.*) https://${server_name}$1 permanent; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33HTTPS负载均衡PHP页面乱码、无法登录问题
- 后端WEB服务器站点配置文件添加
location ~ \.php$ {...fastcgi_param HTTPS on;...}
即可。
- 后端WEB服务器站点配置文件添加
# 解决上传文件过大报错
Nginx站点配置添加以下参数
client_max_body_size 50m;
即可,控制的是Nginx上传文件最大大小。例如:
server { listen 80; server_name www.test.com; client_max_body_size 50m; ... ... }
1
2
3
4
5
6