0 目录
1 环境及目的
本文演示nginx作为web服务的常用配置,相对于httpd的配置说明。
nginx版本1.8,已编译安装完成。
安装目录及配置文件目录:
[root@node1 ~]% ls /usr/local/nginx
html logs nginx
[root@node1 ~]% ls /etc/nginx/
fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
fastcgi_params koi-win nginx.conf scgi_params.default win-utf
安装使用的选项见 http://blog.csdn.net/wangzhenyu177/article/details/78633278 。
下面主要在nginx配置文件中使用不同配置,验证nginx作为web服务的各功能。
为方便起见,把nginx命令添加至PATH:
[root@node1 ~]% cat /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx:$PATH
2 nginx配置文件特点和结构
2.1 特性
- nginx是高度模块化的,编译时装载不同的模块,会在配置文件中引入不同的内置变量和指令;
- 除了内置变量还可自定义变量,格式”set NAME VALUE”,变量的设置和引用均需要”$”符号;
- nginx由各指令配置,每个指令必须以分号结尾;
- 配置指令使用格式类似httpd的,都是”DIRECTIVE VALUE”;
不同模块的参考信息在官网 http://nginx.org/en/docs/ 模块参考项下。其中说明了各模块的内置变量和指令。大部分内置变量在http核心模块。
在nginx配置目录下有很多文件,基本见名知意。主配置文件为nginx.conf:
[root@node1 ~]% ls /etc/nginx/
fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
fastcgi_params koi-win nginx.conf scgi_params.default win-utf
2.2 主配置文件结构
nginx主配置文件结构大致形如:
【main段】
events{
【events段】
}
http{
【http段】
}
……
本文编译nginx时没有使用”–with-mail”,所以配置文件中没有mail段。
和httpd类似,nginx的配置文件也可使用指令include把指定文件包含进来,这样可把配置定义在不同的文件中,便于编辑和维护。
主配置文件中,main配置段是直接写在配置文件中,events包括其他所有配置段,都需写在对应的大括号中。
main段和events段对全局有效,称为全局配置。
3 常用全局配置
3.1 main段
main配置段主要定义了nginx运行的各属性,默认为:
#user nobody; # 运行worker进程的用户。由于本机上的nginx在编译时指定了用户nginx,这里nobody是注释
worker_processes 1; # 启动的worker进程数
#error_log logs/error.log; # 错误日志的路径和级别
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; # pid文件路径
main配置段指令由核心模块引入。常用指令:
指令 | 意义 |
---|---|
user USER [GROUP] | 指定运行worker进程的用户和组(注意master进程要由root运行,因为要监听套接字)。如不指定组,则就是用户所在的组 |
pid PATH | 指定nginx的pid文件 |
worker_rlimit_nofile | 指定一个worker进程最多打开的文件数 |
worker_processes NUM | 指定启动的worker进程数1,默认值1。在较新版本中,参数可指定为”auto”,令其自动设置 |
worker_cpu_affinity CPU_MASK | 用于定义worker进程和哪颗CPU有”亲和性”,worker进程就会只在指定的CPU上运行了。CPU使用CPU掩码指定2。也可在CPU掩码前加入”auto”令其自动在指定CPU设置亲和性 |
worker_priority NUM | 设置worker进程的nice值以调整其优先级,默认值0。这个指令的参数范围也就是nice值范围(-20至19) |
查看上述配置效果:
验证worker进程绑定CPU效果:
1、本虚拟机有2CPU核心:
[root@node1 ~]% lscpu | grep "CPU(s)"
CPU(s): 2
On-line CPU(s) list: 0,1
NUMA node0 CPU(s): 0,1
2、启动nginx,因为默认worker进程数是1,所以只启动1个worker进程:
[root@node1 ~]% nginx
[root@node1 ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx 1986 1
nginx: worker process 1987 0
3、设置worker_processes为2,效果:
worker_processes 2;
[root@node1 ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 1996 0
nginx: worker process 1997 1
由于只有2核心,所以master和某个worker运行在同1核心上了。
4、使两worker进程绑定在不同核心:
worker_processes 2;
worker_cpu_affinity 01 10;
[root@node1 ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 2017 0
nginx: worker process 2018 1
前者worker运行于CPU0,后者运行于CPU1。
5、更换绑定的核心:
worker_processes 2;
worker_cpu_affinity 10 01;
[root@node1 ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 2062 1
nginx: worker process 2063 0
前者worker运行于CPU1,后者运行于CPU0。
验证调整worker进程优先级效果:
1、默认情况下,nice值为0:
[root@node1 ~]% ps axo command,pid,ni | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 2062 0
nginx: worker process 2063 0
2、调整nice值为-5:
worker_priority -5;
[root@node1 ~]% ps axo command,pid,ni | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 2078 -5
nginx: worker process 2079 -5
3.2 events段
默认配置:
events {
worker_connections 1024; # 定义每个worker进程最大并发连接数
}
events段常用指令:
指令 | 意义 |
---|---|
worker_connections NUM | 指定每个worker进程的最大并发连接数3。 |
accept_mytex on|off | 多个worker进程负载均衡,轮流处理请求,否则是由较快的worker进程处理新请求。默认开启 |
lock_file PATH | 如果多个worker进程负载均衡,需要锁文件。该选项用于指定锁文件路径。编译安装时也可通过./configure的选项指定 |
4 web服务相关配置
http段用于定义nginx作为web服务的配置。
http段结构:
http{
……
server{
【server1配置】
}
server{
【server2配置】
}
……
}
server就相当于httpd中的虚拟主机。不同之处是nginx没有中心主机,即便只有一个站点,也要使用一个server段定义。
在server段外定义的配置,对所有server生效。
server段常用配置指令(如无特别说明在,则指令均来自http核心模块):
4.1 server_name、root、listen
指令 | 意义 |
---|---|
server_name | 指定虚拟主机名。相当于httpd虚拟主机段中的ServerName |
root | 指定页面文件根目录,如果使用相对路径,则相对的是编译安装目录(编译时–prefix指定的路径)。类似于httpd中的DocumentRoot,但不尽相同,root在location段中也常使用。定义root后,各指令所指定的相对路径,就是相对于root了 |
listen IP [:PORT] [OPTIONS] | 指定监听的地址、端口 |
这是一个server最简单配置所必须的3指令。
注意:
httpd中如果是基于IP区分的各虚拟主机,可不定义主机名。对于nginx,监听的地址、端口和server_name一般都要定义。
比如,定义两虚拟主机,监听在192.168.0.106主机的6666和8888端口:
server {
listen 6666; # 不指定IP表示监听在本机所有IP的6666端口
server_name www.6666.com;
root /var/www/6666;
}
server {
listen 8888;
server_name www.8888.com;
root /var/www/8888;
}
对应的不同主页内容:
[root@node1 ~]% cat /var/www/6666/index.html
Index Page from 192.168.0.106:6666
[root@node1 ~]% cat /var/www/8888/index.html
Index Page from 192.168.0.106:8888
访问效果:
4.1.1 listen指令常用选项
listen指令格式为:listen IP [:PORT] [OPTIONS]
,其后可以跟众多选项。常用options为:
选项 | 意义 |
---|---|
default_server | 设置默认虚拟主机,即当没有虚拟主机符合请求时,使用默认虚拟主机响应 |
rcvbuf=SIZE | 接收缓冲区大小 |
sndbuf=SIZE | 发送缓冲区大小 |
ssl | 限制仅能通过ssl连接进行服务,即提供https服务。这时监听的端口应指定为443 |
4.1.2 server_name定义方式
定义server_name,用于使用户可根据主机名访问不同主机4。
定义主机名有以下几种方式:
方式 | 示例 |
---|---|
精确主机名 | www.test.com |
左侧使用通配 | *.test.com |
右侧使用通配 | www.test.* |
正则表达式匹配 | ~www.test.com$~。要使用波浪线括起来 |
如果客户端在浏览器键入的主机名可以被上述方式中的多种匹配到,则优先级是:精确主机名–>左侧使用通配–>右侧使用通配–>正则表达式匹配。
4.2 location
使用格式:location [ = | ~ | ~* | ^~ ] uri { ... }
。表示对匹配到的URI,做指定配置。
使用范围:server段、location段
匹配URI的方式,按优先级依次为:
方式 | 意义 |
---|---|
=PATH | 精确匹配路径 |
^~PATH | 使用正则表达式匹配URI的前半段 |
~PATH | 使用正则表达式匹配URI,区分大小写 |
~*PATH | 使用正则表达式匹配URI,不区分大小写 |
PATH | 直接使用PATH匹配,表示在PATH路径下的资源 |
即优先级是先匹配小范围,再匹配大范围。
官方文档的示例:
location = / { # 仅当URI为"/"时,使用A配置
[ configuration A ]
}
location / { # URI为"/"下包含的路径时,使用B配置
[ configuration B ]
}
location /documents/ { # URI为"/documents/"下包含的路径时,使用C配置
[ configuration C ]
}
location ^~ /images/ { # URI靠前部分为"/images/",使用D配置
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ { # URI结尾是gif、jpg或jpeg时,使用E配置
[ configuration E ]
}
按上述定义,和优先级规则。比如:
“www.test.com/”匹配A配置;
“www.test.com/test”、”www.test.com/example”匹配B配置,因为URI都在”/”下;
“www.test.com/documents/test.html”匹配C配置,虽然它也符合B配置,但能匹配到的越长优先级越高;
“www.test.com/images/test.html”匹配D配置,虽然它也符合B配置,但正则表达式匹配前端字符优先级高;
“www.test.com/documents/test.jpg”匹配E配置,虽然它也符合C配置,但正则表达式匹配高于普通字符串。
4.2.1 alias定义路径别名
指令alias,仅能定义在location段中,用于把location指定的URI定义别名。
比如:
location /test/ {
alias /data/test/;
}
表示把uri中的”/test”替换为”/data/test”。
以具体请求为例,上述的效果是把”http://www.test.com/test/index.html“访问的资源替换为服务端文件系统路径的”/data/test/index.html”,而不是”http://www.test.com/data/test/index.html“。也就是,alias的参数是服务端资源的文件系统路径,不是在原URI上做的替换5。
以106主机为例,配置server:
server{
listen 80;
server_name www.host.com;
root /var/www/;
access_log /var/log/nginx/access_log;
}
分别有文件:
[root@node1 ~]% cat /var/www/host1/host.html
@host1
[root@node1 ~]% cat /var/www/host2/host.html
@host2
访问效果:
修改配置文件,添加路径别名:
server{
listen 80;
server_name www.host.com;
root /var/www/;
access_log /var/log/nginx/access_log;
location /host1/ {
alias /var/www/host2/;
}
}
效果,访问host1,返回的是host2目录下的host.html:
特别地,当alias定义的某路径A的别名为/PATH/A,即把某路径A的别名定义为指定路径下的A,则功能同root。比如:
location /test/ {
alias /var/www/test/;
}
相当于:
location /test/ {
root /var/www;
}
即把指定路径作为location的URI的根路径。如果出现这种情况,最好就使用root了。
4.3 index定义主页
指令index来自模块ngx_\http_index_module。用于定义主页。
使用范围:http段、server段、location段。定义在不同的段有不同的生效范围。默认值是index.html
比如server段配置为:
server{
listen 80;
server_name www.host.com;
root /var/www/;
access_log /var/log/nginx/access_log;
index host1/host.html;
}
[root@node1 ~]% cat /var/www/host1/host.html
@host1
直接访问IP,效果:
4.4 error_page定义错误页面
指令error_page,用于自定义错误页面。
使用格式:error_page code ... [=[response]] uri
。表示根据响应码code(可指定多个),返回给客户端uri指定的页面。
使用范围:http段、server段、location段、location段中的if语句
比如,在106主机定义文件,用于响应码为404的情况:
[root@node1 ~]% cat /var/www/error/404.html
The 404 page from 192.168.0.106
在server段定义:
server{
listen 80;
server_name www.host.com;
root /var/www/;
error_page 404 /error/404.html; # 参数是URI,所以写的不是绝对路径
}
效果:
有的访问不到,可能是浏览器原因,360、qq浏览器都显示的是它们定义的错误页面。
1、上述的404.html也是个页面文件,且正常显示了,那么是否响应码就成200了?
打开浏览器调试界面,可以看到响应码就是4