1. 规范优化Nginx配置文件
大家都知道,Apache主配置包含虚拟主机子文件的方法,这里也借鉴了Apache的这种包含方法。
Nginx的主配置文件为nginx.conf,主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目录中,虚拟主机的配置文件按照网站的域名或功能取名,如www.conf、bbs.conf、03_blog.conf等。当然,如果虚拟主机的数量不是很多,也可以把多个虚拟主机配置成一个单独的配置文件,仅仅和Nginx的主配置文件nginx.conf分离开即可。
这里使用的参数是include,下面先看看它的语法:
include file | mask;
它可以防止Nginx配置中任何位置。用法示例如下:
include mime.types;
include 01_www.conf; ---包含单个文件
include 02_bbs.conf; ---包含单个文件
include extra/*.conf; ---包含vhosts下所有以conf结尾的文件,这里的路径是相对于主配置文件的路径的
优化Nginx配置实战的具体实施步骤如下:
[root@web01 conf]# mkdir extra
打印www.etiantian.org虚拟主机配置内容。
[root@web01 conf]# sed -n "10,21p" nginx.conf
server {
listen 192.168.9.7:80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
[root@web01 conf]# sed -n "10,21p" nginx.conf > extra/01_www.conf
---把www.etiantian.org虚拟主机配置内容写入extra/01_www.conf
打印bbs.etiantian.org虚拟主机配置内容。
[root@web01 conf]# sed -n "23,30p" nginx.conf
server {
listen 192.168.9.208:80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.html index.htm;
}
}
[root@web01 conf]# sed -n "23,30p" nginx.conf > extra/02_bbs.conf
---把bbs.etiantian.org虚拟主机配置内容写入extra/02_bbs.conf
打印blog.etiantian.org虚拟主机配置内容。
[root@web01 conf]# sed -n "32,39p" nginx.conf
server {
listen 192.168.9.209:80;
server_name blog.etiantian.org;
location / {
root html/blog;
index index.html index.htm;
}
}
[root@web01 conf]# sed -n "32,39p" nginx.conf > extra/03_blog.conf
---把blog.etiantian.org虚拟主机配置内容写入extra/03_blog.conf。
删除主配置文件nginx.conf中所有虚拟主机的配置(包含Server{}标签),这里是10~39行的内容,需要提前查好行号,打印确认无误后删除。
[root@web01 conf]# sed -n "10,39p" nginx.conf
server {
listen 192.168.9.7:80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 192.168.9.208:80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 192.168.9.209:80;
server_name blog.etiantian.org;
location / {
root html/blog;
index index.html index.htm;
}
}
[root@web01 conf]# sed -i '10,39d' nginx.conf ---删除主配置中3个域名虚拟主机的配置
[root@web01 conf]# cat nginx.conf ---删除3个域名虚拟主机后的nginx.conf配置内容
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
}
把多个虚拟主机独立配置文件01_www.conf、02_bbs.conf、03_blog.conf信息包含到nginx.conf里,这样就把主配置和各个虚拟主机配置分离了,具体包含的配置内容为:
include extra/01_www.conf;
include extra/02_bbs.conf;
include extra/03_blog.conf;
也可以用*直接包含所有配置,如下:
include extra/*.conf; ---这样配置后,倒地哪个主机配置在前面哪一个在后面?默认按主机文件名开头的数字顺序加载
快速操作的过程如下。
1)操作前配置文件内容:
[root@web01 conf]# cat -n nginx.conf
1 worker_processes 1;
2 events {
3 worker_connections 1024;
4 }
5 http {
6 include mime.types;
7 default_type application/octet-stream;
8 sendfile on;
9 keepalive_timeout 65;
10 }
2)执行下面的插入命令:
[root@web01 conf]# sed -i '10 i include extra/01_www.conf;\ninclude extra/02_bbs.conf;\ninclude extra/03_blog.conf;' nginx.conf
上述sed插入命令生效的结果是在下面配置中增加三行包含虚拟主机文件的配置:
[root@web01 conf]# cat -n nginx.conf
1 worker_processes 1;
2 events {
3 worker_connections 1024;
4 }
5 http {
6 include mime.types;
7 default_type application/octet-stream;
8 sendfile on;
9 keepalive_timeout 65;
10 include extra/01_www.conf;
11 include extra/02_bbs.conf;
12 include extra/03_blog.conf;
13 }
3)重新加载配置,并测试更改后的结果:
[root@web01 conf]# nginx -t
nginx: the configuration file /application/nginx-1.16.0//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.16.0//conf/nginx.conf test is successful
[root@web01 conf]# nginx -s reload
[root@web01 conf]# tail -1 /etc/hosts
192.168.9.7 www.etiantian.org bbs.etiantian.org blog.etiantian.org
[root@web01 conf]# curl www.etiantian.org
http://www.etiantian.org
[root@web01 conf]# curl bbs.etiantian.org
http://www.etiantian.org
[root@web01 conf]# curl blog.etiantian.org
http://www.etiantian.org
优化Nginx配置文件后的网站访问,一切正常。
通过使用在主配置文件中添加include包含的配置,可以让Nginx的配置更加简单、清晰、规范,修改后包含的文件路径及内容为:
[root@web01 conf]# tree extra/
extra/
├── 01_www.conf
├── 02_bbs.conf
└── 03_blog.conf
0 directories, 3 files
[root@web01 conf]# cat extra/01_www.conf
server {
listen 192.168.9.7:80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
[root@web01 conf]# cat extra/02_bbs.conf
server {
listen 192.168.9.208:80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.html index.htm;
}
}
[root@web01 conf]# cat extra/03_blog.conf
server {
listen 192.168.9.209:80;
server_name blog.etiantian.org;
location / {
root html/blog;
index index.html index.htm;
}
}
如果需要新增虚拟主机站点,可以按照上述的配置步骤在extra下创建新的虚拟主机文件,然后在主配置文件nginx.conf中包含在extra下创建新的虚拟主机文件。
如果虚拟主机数量过多,也可以按业务分类,如几个同业务的虚拟主机配置放到一个文件里,这样不至于因虚拟主机太多而导致文件过于零碎,一切都可以灵活地调整。
如果想以后都经常改动nginx.conf配置,可以用include extra/*.conf;来包含,然后,把每隔主机的配置按文件名用数字排好序,这样在新增虚拟主机时就可以不用修改nginx.conf配置了。
2. Nginx虚拟主机的别名配置
2.1 虚拟主机别名介绍及配置
所谓虚拟主机别名,就是为虚拟主机设置除了主域名以外的一个或多个域名名字,这样能实现用户访问的多个域名对应同一个虚拟主机网站的功能。
以www.etiantian.org域名的虚拟主机为例,为其增加一个别名etiantian.org,使得访问etiantian.org时,在该域名出现的网站内容和www.etiantian.org时得到的是一样的,这是企业场景活生生的基本需求配置。
具体配置内容及对比见下表。
上述配置仅在server_name所在行的行尾增加了etiantian.org内容,重新加载配置并测试访问结果。
1)重新加载配置:
[root@web01 conf]# nginx -t
nginx: the configuration file /application/nginx-1.16.0//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.16.0//conf/nginx.conf test is successful
[root@web01 conf]# nginx -s reload
2)进行配置域名解析:
[root@web01 conf]# tail -1 /etc/hosts ---最后面增加etiantian.org内容
192.168.9.7 www.etiantian.org bbs.etiantian.org blog.etiantian.org etiantian.org
[root@web01 conf]# ping etiantian.org
PING www.etiantian.org (192.168.9.7) 56(84) bytes of data.
64 bytes from www.etiantian.org (192.168.9.7): icmp_seq=1 ttl=64 time=0.012 ms
3)测试访问结果:
[root@web01 conf]# curl etiantian.org
http://www.etiantian.org
[root@web01 conf]# curl www.etiantian.org
http://www.etiantian.org
访问etiantian.org所出现的内容和访问www.etiantian.org是一样的,在工作中可以通过对别名的配置实现多域名访问一个站点,如baidu.com和www.baidu.com就是一样的内容,当然这里的实现方法除了别名,还有rewrite 301跳转的配置思路。
2.2 虚拟主机别名的生产使用场景案例
多数企业网站希望访问www.etiantian.org和etiantian.org所浏览的是同一个页面,若有这类需求,就可以让etiantian.org以别名的方式出现,这时两个域名都要解析到同一个服务器的IP地址上。
在别的生产环境中曾经还利用过别名来监控集群下面的RS的URL是否正常。如:
server_name www.etiantian.org www1.etiantian.org www2.etiantian.org;
可以在监控服务器里配置hosts来监控RS www1.etiantian.org、www2.etiantian.org等地址是否正常,进而判断每一台机器的www.etiantian.org是否正常。如不使用别名则很难通过域名URL的方式检测判断节点下面机器是否正常(因为这些集群节点域名是同一个)。
3. Nginx状态信息功能实战
3.1 Nginx status介绍
Nginx软件的功能模块中有一个ngx_http_stub_status_module模块,这个模块的主要功能是记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态,如连接数等信息。要想使用状态模块,在编译Nginx时必须增加http_stub_status_module支持。
可通过如下方法检查编译安装Nginx时是否设定支持上述模块:
[root@web01 conf]# nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/application/nginx-1.16.0/ --with-http_stub_status_module --with-http_ssl_module
---可以看到有--with-http_stub_status_module
3.2 配置Nginx status
1)生成状态配置,并增加状态配置参数:
[root@web01 conf]# cat >>/application/nginx/conf/extra/04_status.conf< #status
> server{
> listen 80;
> server_name status.etiantian.org;
> location / {
> stub_status on;
> access_log off;
> }
> }
> EOF
[root@web01 conf]# cat extra/04_status.conf
#status
server{
listen 80;
server_name status.etiantian.org;
location / {
stub_status on; ---打开状态信息开关
access_log off;
}
}
[root@web01 conf]# sed -i '13 i include extra/04_status.conf;' nginx.conf
[root@web01 conf]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extra/01_www.conf;
include extra/02_bbs.conf;
include extra/03_blog.conf;
include extra/04_status.conf; ---不要忘了增加包含文件的配置到主配置文件nginx.conf
}
2)检查语法,并重启服务:
[root@web01 conf]# nginx -t
nginx: the configuration file /application/nginx-1.16.0//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.16.0//conf/nginx.conf test is successful
[root@web01 conf]# nginx -s reload
3)配置hosts解析(Windows客户端,路径默认为C:\Windows\System32\drivers\etc\hosts):
192.168.9.7 www.etiantian.org bbs.etiantian.org blog.etiantian.org
192.168.9.7 etiantian.org status.etiantian.org
4)测试访问结果。访问情况如下图所示。
也可以用Location的方式实现状态信息配置,如在任意一个虚拟主机里,为Server标签增加如下配置:
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.9.0/24; ---设置允许和禁止的IP段访问
deny all; ---设置允许和禁止的IP段访问
}
3.3 Nginx status显示结果详解
通常,打开http://status.etiantian.org时会有上图所示的状态信息显示,可以通过压力测试工具获取这些数值,结果说明如下:
Active connections:2872
---表示Nginx正处理的活动连接数 2872个
server accepts handled requests
29431211 29431211 110298687
Reading:80 Writing:35 Waiting:2757
其中:
- Server表示Nginx启动到现在共处理了29431211个连接。
- accepts表示Nginx启动到现在共成功创建29431211次握手。
请求丢失数=(握手数-连接数),可以看出,本次状态显示没有丢失请求。 - 第三个handled requests,表示总共处理了110298687次请求。
- Reading为Nginx读取到客户端的Header信息数。
- Writing为Nginx返回给客户端的Header信息数。
- Waiting为Nginx已经处理完正在等候下一次请求指令的驻留连接。在开启keep-alive的情况下,这个值等于active-(reading+writing)。
提示:为了安全起见,这个状态信息要防止外部用户查看。
4. 为Nginx增加错误日志(error_log)配置
Nginx软件会把自身运行的故障信息及用户访问的日志信息记录到指定的日志文件里。
4.1 Nginx错误日志信息介绍
配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(ngx_core_module)的参数,该参数名字为error_log,可以放在Main区块中全局配置,也可以放置不同的虚拟主机中单独记录虚拟主机的错误信息。
error_log的语法格式及参数语法说明如下:
error_log file level;
关键字 日志文件 错误日志级别
其中,关键字error_log不能改变,日志文件可以指定任意存放日志的目录,错误日志级别常见的有[debug |info |notice |warn |error |crit |alert |emerg],级别越高记录的信息越少,生产场景一般是warn |error |crit这三个级别之一,注意不要配置info等较低级别,会带来巨大磁盘I/O消耗。
error_log的默认值为:
#default: error_log logs/error.log error;
可以防止的标签段为:
#context: main, http, server, location
4.2 Nginx错误日志配置
编辑主配置文件nginx.conf,增加错误日志的配置方法如下:
[root@web01 conf]# cat -n nginx.conf
1 worker_processes 1;
2 error_log logs/error.log ---配置这一行即可,在主配置里增加,在所有虚拟主机生效
3 events {
4 worker_connections 1024;
5 }
6 http {
7 include mime.types;
8 default_type application/octet-stream;
9 sendfile on;
10 keepalive_timeout 65;
11 include extra/01_www.conf;
12 include extra/02_bbs.conf;
13 include extra/03_blog.conf;
14 include extra/04_status.conf;
15 }