- 前言
- 为什么要写这本书
- 读者对象
- 如何阅读本书
- 勘误和支持
- 致谢
- 第一部分 安全运维篇
- 第 1 章 Linux 服务器安全运维
- 第 2 章 Linux 网络安全运维
- 第 3 章 数据安全工具 DRBD、extundelete
- 第二部分 运维故障排查篇
- 第 4 章 Linux 系统运维故障排查思路
- 第 5 章 Linux 故障排查案例实战
- 第三部分 自动化运维篇
- 第 6 章 轻量级运维利器 pssh、pdsh 和 mussh
- 第 7 章 分布式监控系统 Ganglia
- 第 8 章 基于 nagios 的分布式监控报警平台 Centreon
- 第 9 章 通过 Ganglia 与 Centreon 构建智能化监控报警平台
- 第四部分 集群架构篇
- 第 10 章 高性能 Web 服务器 Nginx
- 第 11 章 高性能集群软件 Keepalived
- 第 12 章 千万级高并发负载均衡软件 HAProxy
- 第 13 章 构建高性能的 MySQL 集群系统
- 第 14 章 高性能负载均衡集群软件 HAProxy
10.3 配置与调试 Nginx
10.3.1 Nginx 配置文件结构
Nginx 的配置文件是一个纯文本文件,它一般位于 Nginx 安装目录的 conf 目录下,整个配置文件是以 block 的形式组织的。每个 block 一般以一个大括号“{}”来表示。block 可以分为几个层次,整个配置文件中 Main 命令位于最高层,在 Main 层下面可以有 Events、HTTP 等层级,而在 HTTP 层中又包含 Server 层,即 server block,server block 中又可分为 location 层,并且一个 server block 中可以包含多个 location block。
一个完整的配置文件结构如图 10-2 所示。

图 10-2 Nginx 配置文件结构
在了解配置文件结构之后,就可以开始配置和调试 Nginx 了。
10.3.2 Nginx 配置文件详解
Nginx 安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx 的配置文件路径为/opt/nginx/conf,其中 nginx.conf 为 Nginx 的主配置文件。这里重点介绍下 nginx.conf 这个配置文件。
Nginx 配置文件主要分成四个部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL 匹配特定位置的设置)。main 部分设置的命令将影响其他所有设置;server 部分的命令主要用于指定主机和端口;upstream 命令主要用于负载均衡,设置一系列的后端服务器;location 部分用于匹配网页位置。这四者之间的关系式:server 继承 main,location 继承 server,upstream 既不会继承其他设置也不会被继承。
在这四个部分当中,每个部分都包含若干命令,这些命令主要包含 Nginx 的主模块命令、事件模块命令、HTTP 核心模块命令,同时每个部分还可以使用其他 HTTP 模块命令,例如 Http SSL 模块、HttpGzip Static 模块和 Http Addition 模块等。
下面通过一个 Nginx 配置实例详细介绍 nginx.conf 每个命令的含义。一个配置好的 nginx.conf 文件内容如下:
user nobody nobody;
worker_processes 4;
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events{
use epoll;
worker_connections 65536;
}
这段代码用于对 Nginx 的全局属性进行配置,每个参数含义如下。
- user:主模块命令,指定 Nginx 的 worker 进程运行用户以及用户组,默认由 nobody 账号运行。
- worker_processes:指定 Nginx 要开启的进程数。
- error_log:用来定义全局错误日志文件。日志输出级别有 debug、info、notice、warn、error、crit 可供选择,其中,debug 输出日志最为详细,而 crit 输出日志最少。
- pid:用来指定进程 id 的存储文件位置。
- worker_rlimit_nofile:用于绑定 worker 进程和 CPU,Linux 内核 2.4 以上可用。
- events:设定 Nginx 的工作模式及连接数上限。其中参数“use”用来指定 Nginx 的工作模式,Nginx 支持的工作模式有 select、poll、kqueue、epoll、rtsig 和/dev/poll。其中 select 和 poll 都是标准的工作模式,kqueue 和 epoll 是高效的工作模式,对于 Linux 系统,epoll 工作模式是首选。而参数“worker_connections”用于定义 Nginx 每个进程的最大连接数,默认是 1024。最大客户端连接数由 worker_processes 和 worker_connections 决定,即 max_client=worker_processes*worker_connections。进程的最大连接数受 Linux 系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后 worker_connections 的设置才能生效。
下面这段内容是 Nginx 对 HTTP 服务器相关属性的配置:
http{
include conf/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
access_log logs/www.ixdba.net.access.log main;
client_max_body_size 20m;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
client_header_timeout 10;
client_body_timeout 10;
send_timeout 10;
上述代码中每个配置选项的含义如下。
- include:主模块命令,实现对配置文件所包含文件的设定,可以减少主配置文件的复杂度。类似于 Apache 中的 include 方法。
- default_type:属于 HTTP 核心模块命令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如,在没有配置 PHP 环境时,Nginx 是不予解析的,此时,用浏览器访问 PHP 文件就会出现下载窗口。
- log_format:用于指定 Nginx 日志的输出格式。main 为此日志输出格式的名称,可以在下面的 access_log 命令中引用。
- client_max_body_size:用来设置允许客户端请求的最大的单个文件字节数。
- client_header_buffer_size:用于指定来自客户端请求头的 headerbuffer 大小。对于大多数请求,1KB 的缓冲区大小已经足够,如果自定义了消息头或有更大的 cookie,可以增加缓冲区大小。这里设置为 32KB。
- large_client_header_buffers:用来指定客户端请求中较大的消息头的缓存最大数量和大小,“4”为个数,“128K”为大小,最大缓存量为 4 个 128KB。
- sendfile:用于开启高效文件传输模式。将 tcp_nopush 和 tcp_nodelay 两个命令设置为“on”用于防止网络阻塞。
- keepalive_timeout:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
- client_header_timeout:设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx 将返回“Request time out(408)”错误。
- client_body_timeout:设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx 将返回“Request time out(408)”错误,默认值是 60。
- send_timeout:指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx 将会关闭连接。
下面这段代码是 HttpGzip 模块在 Nginx 配置中的相关属性设置:
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on;
上述代码中每个参数的含义如下。
- gzip:用于设置开启或者关闭 gzip 模块,“gzip on”表示开启 GZIP 压缩,实时压缩输出数据流。
- gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从 header 头的 Content-Length 中获取。默认值是 0,不管页面多大都进行压缩。建议设置成大于 1KB 的字节数,小于 1KB 可能会越压缩越大。
- gzip_buffers:表示申请 4 个单位为 16KB 的内存作为压缩结果流缓存,默认是申请与原始数据大小相同的内存空间来存储 GZIP 压缩结果。
- gzip_http_version:用于设置识别 HTTP 协议版本,默认是 1.1,目前大部分浏览器已经支持 GZIP 解压,使用默认即可。
- gzip_comp_level:用来指定 GZIP 压缩比,1 表示压缩比最小,处理速度最快;9 表示压缩比最大,传输速度快,但处理速度最慢,也比较消耗 CPU 资源。
- gzip_types:用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。
- gzip_vary:让前端的缓存服务器缓存经过 GZIP 压缩的页面,例如用 Squid 缓存经过 Nginx 压缩的数据。
下面这段代码是虚拟主机的配置:
server{
listen 80;
server_name 192.168.12.188 www.ixdba.net;
index index.html index.htm index.jsp;
root /web/wwwroot/www.ixdba.net
charset gb2312;
access_log logs/www.ixdba.net.access.log main;
建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过 include 命令包含进来,这样更便于维护和管理。配置虚拟主机代码中每个参数的含义如下:
- server:定义虚拟主机开始的关键字。
- listen:用于指定虚拟主机的服务端口。
- server_name:用来指定 IP 地址或域名,多个域名之间用空格分开。
- index:用于设定访问的默认首页地址。
- root:用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
- charset:用于设置网页的默认编码格式。
- access_log:用来指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式。
下面这段代码是 URL 地址匹配设置:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /web/wwwroot/www.ixdba.net;
expires 30d;
}
URL 地址匹配是 Nginx 配置中最灵活的部分。通过 location 关键字定义了地址匹配的开始。location 支持正则表达式匹配,也支持条件判断匹配。用户可以通过 location 命令实现 Nginx 对动态、静态网页进行过滤处理。
在上面这段 location 代码中,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf 结尾的静态文件都交给 Nginx 处理,而 expires 用来指定静态文件的过期时间,这里是 30 天。
同理,下面这段代码是将 upload 和 html 下所有文件都交给 Nginx 来处理,当然,upload 和 html 目录包含在/web/wwwroot/www.ixdba.net 目录中。
location ~ ^/(upload|html)/ {
root /web/wwwroot/www.ixdba.net;
expires 30d;
}
在下面这段代码中,通过 location 关键字实现了将所有以.jsp 为后缀的文件都交给本机的 8080 端口处理。
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
下面这段代码配置的是 Nginx 的运行状态,StubStatus 模块能够获取 Nginx 自上次启动以来的工作状态:
location /NginxStatus {
stub_status on;
access_log logs/NginxStatus.log;
auth_basic "NginxStatus";
auth_basic_user_file ../htpasswd;
}
上述代码中每个参数的含义如下。
- stub_status:设置为“on”表示启用 StubStatus 的工作状态统计功能。
- access_log:用来指定 StubStatus 模块的访问日志文件。
- auth_basic:是 Nginx 的一种认证机制。
- auth_basic_user_file:用来指定认证的密码文件。
由于 Nginx 的 auth_basic 认证采用的是与 Apache 兼容的密码文件,因此需要用 Apache 的 htpasswd 命令来生成密码文件,例如,要添加一个 webadmin 用户,可以使用下面的方式生成密码文件:
/usr/local/apache/bin/htpasswd -c /usr/local/nginx/conf/htpasswd password
会得到以下提示信息:
New password:
在输入密码之后,系统会要求再次输入密码。确认密码正确之后成功添加用户。
要查看 Nginx 的运行状态,可以输入 http://ip/NginxStatus,然后输入刚刚创建的用户名和密码,可以看到如下信息:
Active connections: 1 server accepts handled requests 393411 393411 393799 Reading: 0 Writing: 1 Waiting: 0
其中,“Active connections”表示当前活跃的连接数,第三行的三个数字表示 Nginx 当前总共处理了 393411 个连接,成功创建 393411 次握手,总共处理了 393799 个请求。最后一行的“Reading”表示 Nginx 读取到客户端 Header 信息数,“Writing”表示 Nginx 返回给客户端的 Header 信息数,“Waiting”表示 Nginx 已经处理完,正在等候下一次请求命令时的驻留连接数。
最后,设置虚拟主机的错误信息返回页面,代码如下:
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
通过 error_page 命令可以定制各种错误信息的返回页面。在默认情况下,Nginx 会在主目录的 html 目录中查找指定的返回页面。需要特别注意的是,这些错误信息的返回页面的大小一定要超过 512KB,否则会被 IE 浏览器替换为 IE 默认的错误页面。
10.3.3 Nginx 日常维护技巧
1.Nginx 配置正确性检查
Nginx 提供的配置文件调试功能非常有用,可以快速定位配置文件存在的问题。执行如下命令检测配置文件的正确性:
/usr/local/nginx/sbin/nginx –t
或者
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
其中,“-t”参数用于检查配置文件是否正确,但并不执行。“-c”参数用于指定配置文件路径,如果不指定配置文件路径,Nginx 默认会在安装时指定的安装目录下查找 conf/nginx.conf 文件。
如果检测结果显示如下信息,说明配置文件正确。
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful
另外,Nginx 也提供了查看版本及相关编译信息的功能,在命令行执行以下命令可以显示安装 Nginx 的版本信息。
/usr/local/nginx/sbin/nginx -v
执行以下命令显示安装的 Nginx 版本和相关编译信息:
/usr/local/nginx/sbin/nginx -V
不但显示 Nginx 的版本信息,同时显示 Nginx 在编译时指定的相关模块信息。
2.Nginx 的启动、关闭与重启
Nginx 对进程的控制能力非常强大,可以通过信号命令控制进程。常用的信号有:
- QUIT,表示处理完当前请求后关闭进程。
- HUP,表示重新加载配置,即关闭原有的进程并开启新的工作进程。此操作不会中断用户的访问请求,因此,可以通过此信号平滑地重启 Nginx。
- USR1,用于 Nginx 的日志切换,也就是重新打开一个日志文件,例如,每天要生成一个新的日志文件时,可以使用这个信号来控制。
- USR2,用于平滑升级可执行程序。
- WINCH,从容关闭工作进程。
Nginx 的启动非常简单,只需输入:
/usr/local/nginx/sbin/nginx
即可完成 Nginx 的启动。在 Nginx 启动后,可以通过如下命令查看 Nginx 的启动进程:
[root@localhost logs]# ps -ef|grep nginx root 16572 1 0 11:14 ? 00:00:00 nginx: master process /usr/local/ nginx/sbin/nginx nobody 16591 16572 0 11:15 ? 00:00:00 nginx: worker process nobody 16592 16572 0 11:15 ? 00:00:00 nginx: worker process nobody 16593 16572 0 11:15 ? 00:00:00 nginx: worker process nobody 16594 16572 0 11:15 ? 00:00:00 nginx: worker process
如果要关闭 Nginx 进程,可以使用如下命令:
kill -XXX pid
其中,“XXX”就是信号名,“pid”是 Nginx 的进程号,可以通过如下两个命令获取:
ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}'
cat /usr/local/nginx/logs/nginx.pid
要不间断服务平滑地重新启动 Nginx,可以使用如下命令:
kill -HUP 'cat /usr/local/nginx/logs/nginx.pid'
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论