2、nginx常用配置----作为web服务端

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

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值