学习 Nginx 首先一定要了解其配置文件的基本结构、常用指令的含义以及其使用方法,原因在于 Nginx 所有功能的实现,都是通过配置文件的设置来完成的,例如,虚拟主机、反向代理、负载均衡等的实现。
一、认识配置文件
Nginx 服务器安装完成后,默认安装时自带的配置文件全部存储在安装目录的 conf 目录下,并且为了备份还原,每个配置文件都提供了一个以 .default 结尾的备份文件。其中,nginx.conf 是 Nginx 默认的主配置文件,所有功能的实现都与此文件的配置相关。
1.1 配置文件结构
打开 nginx.conf 配置文件,从整体结构可以看出,该配置文件主要由以下几部分组成:
main
events {...}
http {
server {
location {...}
}
}
从上面的结构可以看出, Nginx 的默认主配置文件主要由 main、events、http、server 和 location 5 个块组成,并且对于嵌套块(如 http、server、location )中的指令,执行的顺序为从外到内依次执行,内层块中的大部分指令会自动获取外层块指令的值作为默认值,只有某些特殊指令除外 。各个块的作用如下:
块 | 说明 |
---|---|
main | 主要控制 Nginx 子进程所属的用户和用户组、派生子进程数、错误日志位置与级别、pid 位置、子进程优先级、进程对应 CPU、进程能够打开的文件描述符数目等 |
events | 控制Nginx处理链接的方式 |
http | Nginx 处理 http 请求的主要配置块,大多数配置都在这里面进行 |
server | Nginx 中主机的配置块,可用于配置多个虚拟主机 |
location | server 中对应目录级别的控制块,可以有多个 |
默认的配置文件如下(已去掉#开头的注释行):
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
可以看出,Nginx的指令由指令名称和参数组成。例如,第1行worker_processes指令的参数为1,第四行的worker_connections指令的参数为1024等。当一个指令中包含多个子指令作为参数时,需要使用{}进行包裹,且每条指令都以分号结尾。例如上面的第三行到第五行。Nginx默认配置文件中指令的含义见下表:
指令 | 说明 |
worker_processes | 配置Nginx的工作进程数,一般设为CPU总核数或总核数的两倍 |
work_connections | 配置Nginx允许单个进程并发连接的最大请求数 |
include | 用于引入配置文件 |
default_type | 设置默认文件类型 |
sendfile | 默认值为on,表示开启高效文件传输模式 |
keepalive_timeout | 设置长连接超时时间(秒) |
listen | 监听端口,默认监听80端口 |
server_name | 设置主机名称 |
root | 设置主机站点根目录地址 |
index | 指定默认索引文件 |
error_page | 自定义错误页面 |
其中,在该配置文件中引入文件的路径可以是相对路径(相对于当前配置文件nginx.conf所在的目录),也可以是绝对路径(以Linux的根目录"/"开始的文件路径)。
1.2 设置用户和组
Nginx 服务是由一个主进程(master process)和多个工作进程(worker process)组成的。其中,主进程以 root 权限运行,而工作进程在默认情况下以 nobody 用户运行。原因在于 nobody 用户是一个不能登录的账号,有一个专用的 ID,可将每个运行的工作进程隔离出来,这样即使黑客破坏了服务器程序,因其不是 root 用户,也不会影响其他数据。因此,为工作进程设置的执行用户权限越低,则服务器安全系数越高。
通过 ps 命令查看当前启动的 Nginx 服务器中主进程(master process)和工作进程(worker process)的用户权限,具体命令如下:
root@ubuntu:~# ps aux | grep nginx
root 2334 0.0 0.0 31972 764 ? Ss 21:04 0:00 nginx: master process nginx
nobody 2335 0.0 0.1 32412 3040 ? S 21:04 0:00 nginx: worker process
root 2630 0.0 0.0 14228 984 pts/8 S+ 21:33 0:00 grep --color=auto nginx
可以看出 Nginx 默认有一个主进程(master process)和一个工作进程(worker process),以及用户和组的分配情况。
Nginx 提供配置用户和组的功能,针对的就是工作进程(worker process),主要用于对某些操作提供权限。例如,配置日志文件时,主进程创建日志文件后,会以工作进程的用户作为文件所有者,从而使工作进程能够将日志写入指定文件中。
Nginx 提供两种设置用户和组的方式,一种是在安装时通过编译选项进行设置,另一种是修改配置文件。需要注意的是,不论哪种方式在配置之前,都需要提前创建好用户和组。
1.2.1 编译安装配置方式
在./configure编译安装 Nginx 时的选项中,添加如下两个选项:
--user=<user> --group=<group>
user 用于指定用户名称,group 用于指定用户所在组的名称。
1.2.2 修改配置文件方式
打开 Nginx 的配置文件,找到配置用户和组的指令 user(nginx.conf的的第一行):
#user nobody;
以用户 nuser 和组 ngroup 为例,修改后的配置如下:
user nuser ngroup;
上述配置中, nuser 用于指定执行工作进程的用户,ngroup 用于指定 nuser 用户所属的组。按照上述命令修改完成后,保存 nginx.conf 配置文件,之后重启Nginx。然后再通过 ps 命令查看当前启动的 Nginx 服务器中主进程(master process)和工作进程(worker process)的用户权限,可以看到工作进程用户已成功修改为 nuser。
root@ubuntu:~# ps aux | grep nginx
root 2762 0.0 0.0 31972 764 ? Ss 21:51 0:00 nginx: master process nginx
nuser 2763 0.0 0.1 32412 3056 ? S 21:51 0:00 nginx: worker process
root 2765 0.0 0.0 14228 940 pts/8 S+ 21:51 0:00 grep --color=auto nginx
Nginx 的进程设计思想如下图所示。它由一个主进程和多个工作进程组成,主进程接收容户端请求,转交给工作进程处理,从而很好地利用多核心 CPU 的计算能力。当管理员执行 reload 命令重新加载配置时,主进程会等待工作进程完成工作后再结束工作进程,然后基于新的配置重新创建工作进程,避免了工作过程中被打断的情况。由于整个过程中主进程没有停止,因此也不会发生漏掉客户端请求的情况。
1.2.3 自定义错误页面
在网站访问过程中,经常会遇见各种各样的错误,如找不到访问的页面则会提示 404 Not Found 错误,没有访问权限会提示 403 Forbidden 等,对于普通人而言,这样的提示界面并不友好。在 Nginx 的主配置文件中,给出了以下的处理方式:
error_page 500 502 503 504 /50x.html;
在上述配置中,error_page 指令用于自定义错误页面,500、502、503 和 504 指的就是 HTTP 错误代码,/50x.html 用于表示当发生上述指定的任意一个错误时,都使用网站根目录下的 50x.html 文件处理。
除此之外,error_page 指令还可以指定单个错误的处理页面、利用在线资源处理指定的错误、更改网站响应的状态码等多种设置,下面逐一演示自定义错误页面的几种常用使用方式。
1、为每种类型的错误设置单独的处理方式
#指定网站根目录下的页面 40x.html 处理 403 错误
error_page 403 /40x.html;
#指定网站根目录下的图片 404.jpg 处理 404 错误
error_page 404 /404.jpg;
例如将上述配置放到 server 块中,在安装目录的html目录中放入一张图片并命名为404.jpg,重启 Nginx 使配置生效,之后访问一个不存在的路径,效果如下:
2、利用在线资源进行处理错误
处理错误的页面除了可以使用本站的资源外,还可以在发生指定错误时跳转到指定的URL,利用在线资源进行处理:
#处理单个指定错误
error_page 404 https://www.baidu.com;
#处理一系列指定错误
error_page 500 502 503 504 http://example.com/notfound.html;
按照上述设置修改配置文件后,发生 404 错误就会跳转到 https://www.baidu.com 页面。
3、更改晌应状态码
在上述的测试中,发生404错误时页面请求的响应码也是404,可以使用浏览器的F12查看:
若要隐藏服务器返回的真实状态码信息,可以利用=进行自定义设置:
#自定义404页面
error_page 404 =200 /404.jpg;
按照上述设置修改配置文件,再次进行访问测试,结果如下图所示。可以看出,在发生 404 错误时,响应信息中的状态码是自定义的码值 200,成功隐藏了实际响应状态码 。
另外,更改响应状态码时还可以不指定确切的码值,而是由重定向后实际处理的真实结果来决定。例如,去掉上面配置的 200 后,配置如下:
#自定义404页面
error_page 404 = /404.jpg;
重启Nginx之后,再次访问结果如下:
二、访问控制
访问控制是网络安全防范和保护的主要策略,其任务是保证网络资源不被非法访问。Nginx 提供了访问控制的功能,可以根据实际需求,对用户可以访问和禁止的目录进行限制。
2.1 权限控制命令
Nginx 中提供了两个用于配置访问权限控制的指令,分别为 allow 和 deny。allow 用于设置允许访问的权限,deny 用于设置禁止访问的权限。在使用时,权限指令后只需跟上允许或禁止的 IP、IP 段或 all 即可。其中,all 表示所有的。同一块下,若同时存在多个权限指令,则先出现的访问权限设置生效,并且会对后出现的设置进行覆盖,未覆盖的范围依然生效,否则以先出现的设置为准。当多个块(如 http、server、location)中都出现了权限设置指令,则内层块中的权限级别要比外层块中设置的权限级别高。
例如,在Nginx的主配置文件的server块中加入如下配置:
deny all;
表示禁止所有ip访问。重启Nginx服务,在物理机的浏览器中访问Nginx,结果如下:
2.2 访问控制典型应用
在实际应用中,权限控制的需求更加复杂。例如,对于网站下的 img 目录允许所有用户访问,但对于网站下的 admin 目录则仅允许管理员身份的用户访问。此时,仅靠 deny 和 allow 这两个权限指令不能满足需求,还需要使用 location 块来完成相关需求的匹配。
首先简单了解一下 location 的相关语法及规定,具体如下:
location [=|~|~*|^~] URI {...} #语法类型1
location @name {...} #语法类型2
其中,=、~、~*、^~和@都是 location 用于实现访问控制的前缀,且在使用时只能选择一种,当然也可以不设置前缀。关于 location 前缀的含义如下表。URI 表示 URL 地址中从域名到参数之间的部分,{...} 表示指令块,用于满足 location 匹配条件后需要执行的指令。
前缀 | 说明 |
= | 根据其后的指定模式进行精准匹配。例如,在访问时要与 /html/aaa/index.html 完全一致才会执行其后的指令块 |
~ | 使用正则表达式完成 location 的匹配,区分大小写 |
~* | 使用正则表达式完成 location 的匹配,不区分大小写 |
^~ | 不使用正则表达式,完成以指定模式开头的 location 匹配 |
@ | 用于定义一个 location 块,且该块不能被外部客户端所访问,只能被Nginx内部配置指令访问 |
根据上表的规则,可将 location 根据不同前缀的使用方式,分为普通 location 和正则 location。其中,~和~* 属于正则 location,其余的前缀和没有前缀的情况都属于普通 location。
Nginx的配置文件中,可以有多个location块,多个正则 location 之间按照正则 location 在配置文件中的书写顺序进行匹配,且只要匹配成功就不会继续匹配后面定义的正则 location。正则 location 的编写顺序不同,则结果不同,只有前面定义的正则 location 匹配不成功的情况下,才会继续匹配后面的正则 location。
由于 location 可以同时定义多个,当一个配置文件中同时出现多个 location 时,普通 location 之间遵循“最大前缀匹配”原则。通俗地讲就是,匹配度最高的 location 将会执行。
当最大前缀location与正则location同时存在时,如果正则location匹配成功,则不会执行最大前缀locaiton。
利用=精准匹配或^~非正则匹配可以在正则匹配之前优先匹配,从而禁止执行原有的正则匹配。
三、日志文件
Nginx 提供了一个非常灵活的日志记录功能,它可以使每个块的配置拥有各自独立的日志进行记录,并且根据记录内容的不同又分为访问日志和错误日志。
3.1 访问日志
访问日志主要用于记录客户端访问 Nginx 的每一个请求,格式可通过 log_format 指令进行自定义,存储路径、缓存大小等可使用 access_log 指令设置。通过访问日志的配置,可以记录用户 IP、访问时间、请求方式、响应状态、地域来源、跳转来源、使用终端等信息。
3.1.1 查看默认访问配置
打开Nginx的配置文件nginx.conf,找到log_format与access_log指令的默认配置,具体如下:
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;
上述第 1~3 行用于设置访问日志的格式,main 表示访问日志格式名称,用户可以自定义。其后的字符串表示访问日志格式样式。其中相关的内置变量的含义如下表。第4行中access_log指令的第一个参数logs/access.log用于指定相对于Nginx的安装目录的日志文件存放路径,并包含日志文件名称,第2个参数指定由log_format指令指定的日志格式名称。
内置变量 | 含义 |
$remote_addr | 客户端的IP地址 |
$remote_user | 客户端用户名,用于记录浏览者进行身份验证时提供的名称,如果没有登录则为空 |
$time_local | 访问的时间与时区 |
$request | 请求的 URI 和 HTTP 协议,如 GET /HTTP/1.1 |
$status | 记录请求返回的 HTTP 状态码,如 200 (成功) |
$body_bytes_sent | 发送给客户端的文件主体内容的大小 |
$http_referer | 来路 URL 地址 |
$http_user_agent | 客户端浏览器信息 |
$http_x_forwarded_for | 客户端 IP 地址列表(包括中间经过的代理 ) |
Nginx 默认开启了访问日志的功能,且 log_format 指令的配置仅可用在 http 块内,否则会出现警告信息。
3.1.2 自定义日志格式
修改 http 块中的默认设置,自定义访问日志格式 mylog:
log_format mylog '[ip:] $remote_addr [time:] $time_local [user_agent:] "$http_user_agent"';
上述访问日志格式的名称自定义为 mylog,并且修改了默认访问日志的存储格式。
接着,在 Nginx 的默认 server 块中采用 mylog 访问日志格式,使用 access_log 指令将其访问日志文件保存到custom_access.log文件中:
access_log logs/custom_access.log mylog;
需要注意要保证当前 Nginx 进程的用户和组有创建 custom_access.log 文件的权限。否则日志文件将无法被创建。
完成设置后重启 Nginx,在浏览器中访问Nginx,可以看到生成的日志文件:
root@wuychn:/usr/local/nginx/logs# ll
总用量 24
drwxr-xr-x 2 root root 4096 4月 26 18:25 ./
drwxr-xr-x 11 root root 4096 4月 26 16:25 ../
-rw-r--r-- 1 root root 4019 4月 26 17:13 access.log
-rw-r--r-- 1 root root 1456 4月 26 18:25 custom_access.log
-rw-r--r-- 1 root root 4077 4月 26 18:20 error.log
-rw-r--r-- 1 root root 6 4月 26 18:25 nginx.pid
custom_access.log内容如下:
[ip:] 192.168.115.1 [time:] 26/Apr/2019:18:20:42 +0800 [user_agent:] "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
[ip:] 192.168.115.1 [time:] 26/Apr/2019:18:21:12 +0800 [user_agent:] "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
[ip:] 192.168.115.1 [time:] 26/Apr/2019:18:25:21 +0800 [user_agent:] "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
[ip:] 192.168.115.1 [time:] 26/Apr/2019:18:25:33 +0800 [user_agent:] "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
[ip:] 192.168.115.1 [time:] 26/Apr/2019:18:25:33 +0800 [user_agent:] "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
[ip:] 192.168.115.1 [time:] 26/Apr/2019:18:25:34 +0800 [user_agent:] "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
[ip:] 192.168.115.1 [time:] 26/Apr/2019:18:25:34 +0800 [user_agent:] "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
[ip:] 192.168.115.1 [time:] 26/Apr/2019:18:25:35 +0800 [user_agent:] "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
3.1.3 关闭访问日志
关闭访问日志只需要将 access_log 指令的参数设置为 off 即可:
access_log off;
3.2 错误日志
错误日志是由 error_log 指令设置的,主要是用来记录客户端在访问 Nginx 时出错的记录,且该错误显示格式不支持自定义。
3.2.1 默认错误日志配置
打开 Nginx 的配置文件 nginx.conf,找到 error_log 指令的默认配置如下:
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
error_log 指令的第 1 个参数用于指定错误日志的路径,第 2 个参数用于指定错误记录详细程度的等级,默认值为 error ,如1第行配置的就是 error 等级。其他常用的等级还有 debug、info、notice、warn、error 和 crit,日志记录详细程度依次递减,debug 记录的内容最详细,crit 记录的内容最简洁。
由于 Nginx 默认开启了错误日志的功能,下面直接在浏览器中访问一个不存在的文件,打开 logs 目录下的 error.log 文件,效果如下:
2019/04/28 14:31:11 [error] 3232#0: *1 open() "/usr/local/nginx/html/1" failed (2: No such file or directory), client: 192.168.115.1, server: localhost, request: "GET /1 HTTP/1.1", host: "192.168.115.128"
在实际应用中,error_log 指令除了可以像默认配置一样在 main 块中设置,还可以在http、server、location 块中设置,配置方式相同。
3.2.2 关闭错误日志
Nginx 关闭错误日志的实现方式比较特殊,具体设置如下:
error_log /dev/null;
上述配置的含义就是,将错误日志信息全部输出到 Linux 的空设备中,表示丢掉输出信息,也可以将其当做一个“垃圾桶”。
3.3 日志文件切割
为了使日志文件的存储更合理、有序,可以通过切割的方式将 Nginx 中的日志文件按照规定的时间分开存储。其中,切割的方式可分为手动切割和自动切割两种。
3.3.1 手动切割
手动切割方式就是用户自己执行相关的命令,共分为两步,第一步使用 mv 命令将需要备份的日志移到一个新的目录文件中,通常情况下,备份的文件使用日期命名。第二步重新生成一个空的日志文件,以便存储新的记录。具体操作步骤如下:
1、查看当前 Nginx 中的日志文件
root@wuychn:/usr/local/nginx/logs# ll
总用量 28
drwxr-xr-x 2 root root 4096 4月 26 18:32 ./
drwxr-xr-x 11 root root 4096 4月 26 16:25 ../
-rw-r--r-- 1 root root 4019 4月 26 17:13 access.log
-rw-r--r-- 1 root root 181 4月 26 18:33 custom_access.log
-rw-r--r-- 1 root root 4545 4月 28 14:31 error.log
-rw-r--r-- 1 root root 5 4月 28 14:31 nginx.pid
2、备份指定日志文件
root@wuychn:/usr/local/nginx/logs# mv custom_access.log 20190428.log
root@wuychn:/usr/local/nginx/logs#
root@wuychn:/usr/local/nginx/logs# ll
总用量 28
drwxr-xr-x 2 root root 4096 4月 28 14:38 ./
drwxr-xr-x 11 root root 4096 4月 26 16:25 ../
-rw-r--r-- 1 root root 181 4月 26 18:33 20190428.log
-rw-r--r-- 1 root root 4019 4月 26 17:13 access.log
-rw-r--r-- 1 root root 4545 4月 28 14:31 error.log
-rw-r--r-- 1 root root 5 4月 28 14:31 nginx.pid
3、生成新的日志文件
利用 Nginx 的 reopen 功能,完成新日志文件的生成:
root@wuychn:/usr/local/nginx/logs# nginx -s reopen
root@wuychn:/usr/local/nginx/logs#
root@wuychn:/usr/local/nginx/logs# ll
总用量 24
drwxr-xr-x 2 root root 4096 4月 28 14:42 ./
drwxr-xr-x 11 root root 4096 4月 26 16:25 ../
-rw-r--r-- 1 nobody root 0 4月 28 14:42 20190428.log
-rw-r--r-- 1 root root 4019 4月 26 17:13 access.log
-rw-r--r-- 1 nobody root 0 4月 28 14:42 custom_access.log
-rw-r--r-- 1 nobody root 4725 4月 28 14:42 error.log
-rw-r--r-- 1 root root 5 4月 28 14:42 nginx.pid
3.3.2 自动切割
手动切割虽然实现简单,但如果每天都进行手动切割实在有些麻烦。可以编写一个 shell 脚本文件,使用 Linux 系统提供的 crontab 指令让其每天按照设定的时间自动备份前一天的日志。下面为 Nginx 默认 server 块中的日志文件设置自动切割。
1、创建脚本文件autolog.sh
#!/bin/bash
#当前Nginx日志文件存放路径
logs_path="/usr/local/nginx/logs"
#备份日志文件
mv $logs_path/custom_access.log $logs_path/'date+"%Y%m%d%H%M"'.log
#重新打开新的日志文件
/usr/local/nginx/sbin/nginx -s reopen
2、为 autolog.sh 脚本文件设置可执行权限
root@wuychn:/usr/local/nginx/logs# chmod +x autolog.sh
3、实现自动备份
要实现每天定点系统自动备份日志文件,可以使用 Linux 中提供的 crontab 命令,设置某脚本被周期性执行。执行下列命令后,进入任务的编辑页面:
root@wuychn:/usr/local/nginx/logs# crontab -e
上述命令中的 -e 表示编辑当前用户的定时任务。进入编辑页面后的操作与 vi 编辑器的操作相同,在实际应用中,通常按照如下形式添加命令,设置系统自动备份时间:
0 0 * * * /usr/local/nginx/logs/autolog.sh > /dev/null 2 > &1
上述命令用于每天晚上零点备份一次日志文件。> /dev/null 2 > &1 指令用于屏蔽标准输出和标准出错的信息,并将其放到“垃圾桶”中,目的就是防止在 Linux 系统中执行 crontab 操作时,将输出内容和错误信息以邮件的形式发送个用户,造成大量的垃圾文件,因此,在使用 crontab 指令时,推荐添加 > /dev/null 2 > &1 设置。
为了方便测试,这里将 crontab 任务编辑页面的时间修改成如下形式:
* * * * * /usr/local/nginx/logs/autolog.sh > /dev/null 2 > &1
这表示 crontab 程序备份日志的频率是每分钟备份一次。任务编辑完成后,可以通过 crontab -l 显示当前用户的 crontab 文件内容,crontab -r 指令删除设置的任务计划。
root@wuychn:/usr/local/nginx/logs# crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
* * * * * /usr/local/nginx/logs/autolog.sh > /dev/null 2>&1
在完成上述设置的几分钟后,查看日志文件自动切割效果:
root@wuychn:/usr/local/nginx/logs# ll
总用量 44
drwxr-xr-x 2 root root 4096 4月 28 14:51 ./
drwxr-xr-x 11 root root 4096 4月 26 16:25 ../
-rw-r--r-- 1 nobody root 0 4月 28 14:42 20190428.log
-rw-r--r-- 1 nobody root 0 4月 28 14:42 201904281516.log
-rw-r--r-- 1 nobody root 0 4月 28 14:42 201904281517.log
-rw-r--r-- 1 nobody root 0 4月 28 14:42 201904281518.log
-rw-r--r-- 1 root root 4019 4月 26 17:13 access.log
-rwxr-xr-x 1 root root 219 4月 28 14:50 autolog.sh*
-rw-r--r-- 1 nobody root 8918 4月 28 15:12 custom_access.log
-rw-r--r-- 1 nobody root 9763 4月 28 15:15 error.log
-rw-r--r-- 1 root root 5 4月 28 14:42 nginx.pid
四、虚拟主机
4.1 什么是虚拟主机
虚拟主机技术是指在一台物理主机服务器上划分出多个磁盘空间,每个磁盘空间都是一台虚拟主机,每台虚拟主机都可以独立对外提供 Web 服务,且互不干扰。在外界看来,虚拟主机就是一台独立的服务器主机,这就意味着用户能够利用虚拟主机把多个不同域名的网站部署在同一台服务器上,而不必再为建立一个网站单独购买一台服务器,既解决了维护服务器技术的难题,同时又极大地节省了服务器硬件成本和相关的维护费用。
例如,在一台物理主机服务器(10.20.30.40)上划分出多台虚拟主机,同时在每台虚拟主机上部署井运行一个网站,当用户请求时,物理主机服务器根据其配置情况,将用户的请求分配到不同的虚拟主机上进行处理。
4.2 基于端口号配置虚拟主机
基于端口号配置虚拟主机的原理是一个Nginx监听多个端口,根据不同的端口号,来区分不同的网站。当前物理主机的IP是192.168.115.128,让其监听不同的端口,如8001、8002,来实现根据不同端口号配置虚拟主机的功能。
1、打开Nginx的配置文件nginx.conf,查看默认配置文件中提供的关于虚拟主机配置的方案:
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
上述第 1 行注释,用于告知用户 Nginx 中虚拟主机的配置可以基于 IP 地址、域名和端口号进行设置,第 3 ~ 11 行配置是用于在 server 块中完成虚拟主机的设置。其中,第 4 行配置表示使用 listen 命令监听端口,第 5 行配置表示使用 “IP/域名:端口号”的方式监听端口,在实际设置中两者只能选其一。
因此,若要在 Nginx 中配置一个虚拟主机,只需在 http 块中添加一个 server 块即可。换句话说,http 块中的每个 server 块都是一个虚拟主机。
2、修改 nginx.conf 配置文件,在 http 块中添加以下两个 server 配置 :
#监听8001端口的虚拟主机
server{
listen 8001;
server_name 192.168.115.128;
root html/html8001;
index index.html index.htm;
}
#监听8002端口的虚拟主机
server{
listen 8002;
server_name 192.168.115.128;
root html/html8002;
index index.html index.htm;
}
上述配置中,监听8001端口的虚拟主机的网站根目录为"html/html8001",监听8002端口的虚拟主机的网站根目录为"html/html8002"。因此,需要在/usr/local/nginx/html/目录下新建目录html8001和html8002,且分别放入一个index.html文件用于测试,html8001中的index.html内容如下:
Hi, I am 8001
html8002中的index.html内容如下:
Hi, I am 8002
保存nginx.conf,重启Nginx服务。
在浏览器中分别访问 http://192.168.115.128:8001/ 和 http://192.168.115.128:8002/,效果如下图所示:
需要注意的是,若不能访问,需要修改防火墙开放 8001 和 8002 端口。
4.3 基于IP配置Nginx虚拟主机
在 Linux 系统中,可以通过设置 IP 别名的方式,实现一块物理网卡上绑定多个 IP 地址。
1、设置IP别名(设置一个网卡绑定多个ip)
在 Linux 上,IP 别名的设置有两种方式,一种是修改网络配置文件,一种是通过 ifconfig 和 route 命令进行设置,下面以第一种方式进行介绍。
首先切换到网络配置文件所在的目录/etc/network:
root@wuychn:~# cd /etc/network/
编辑网卡文件 interfaces,添加 ens33、ens33:0 和 ens33:1(注意使用ifconfig命令查看到的是eth0还是ens33,需要几个就加几个):
auto ens33
iface ens33 inet static #设置静态ip
address 192.168.115.128 #ip地址
netmask 255.255.255.0 #子网掩码
gateway 192.168.115.2 #网关
auto ens33:0
iface ens33:0 inet static
address 192.168.115.129
netmask 255.255.255.0
gateway 192.168.115.2
auto ens33:1
iface ens33:1 inet static
address 192.168.115.130
netmask 255.255.255.0
gateway 192.168.115.2
之后重启网卡:
root@wuychn:/etc/network# /etc/init.d/networking restart
利用 ifconfig 查看。结果如下表示设置成功:
root@wuychn:~# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.115.128 netmask 255.255.255.0 broadcast 192.168.115.255
inet6 fe80::20c:29ff:fe3b:62cc prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:3b:62:cc txqueuelen 1000 (以太网)
RX packets 83 bytes 9913 (9.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 166 bytes 22737 (22.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.115.129 netmask 255.255.255.0 broadcast 192.168.115.255
ether 00:0c:29:3b:62:cc txqueuelen 1000 (以太网)
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.115.130 netmask 255.255.255.0 broadcast 192.168.115.255
ether 00:0c:29:3b:62:cc txqueuelen 1000 (以太网)
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (本地环回)
RX packets 204 bytes 15237 (15.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 204 bytes 15237 (15.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
除此之外,还可以在物理机 Windows 系统下的命令窗口中,通过 ping 命令测试已设置的 IP 别名。
2、配置基于 IP 的虚拟主机
接下来,基于 IP 为 192.168.115.128 的虚拟机以及其别名为 192.168.115.129 的 IP 配置Nginx 的虚拟主机。
首先修改 nginx.conf 配置文件,在 http 块中添加以下两个 server 配置:
#基于ip为192.168.115.128的虚拟主机
server{
listen 80;
server_name 192.168.115.128;
root html/192.168.115.128;
index index.html index.htm;
}
#基于ip为192.168.115.129的虚拟主机
server{
listen 80;
server_name 192.168.115.129;
root html/192.168.115.129;
index index.html index.htm;
}
注意在html目录下新建相应的子目录,并放入index.html文件。之后重启Nginx,在浏览器中访问 http://192.168.115.129/ 和 http://192.168.115.128/即可。
4.4 基于域名配置虚拟主机
为了便于学习和测试,在 hosts 文件中设置一个虚拟的域名,并将域名解析到指定 IP 地址。编辑 C:\Windows\System32\drivers\etc\hosts 文件,增加:
192.168.115.128 www.wuychn.com
192.168.115.128 wuychn.com
根据域名的使用习惯,域名 www.wuychn.com 和 wuychn.com 在访问时通常指向同一网站,就像访问 www.baidu.com 和访问 baidu.com 是一样的。
按照上述方式配置后,通过 Windows 中的浏览器,访问域名为 www.wuychn.com 或 wuychn.com 的网站时,就会自动解析到 IP 地址为 192.168.115.128 的服务器上。
打开 nginx.conf 配置文件,在 http 块中添加以下配置,实现基于域名的虚拟主机:
#基于域名为www.wuychn.com的虚拟主机
server{
listen 80;
server_name www.wuychn.com;
root html/www.wuychn.com;
index index.html index.htm;
}
上述第 4 行配置中的 server_name 指令,用于定义虚拟主机域名,且其后可以设置多个域名,每个域名之间使用空格分隔即可。
完成上述配置,重启Nginx服务,在浏览器中输入 http://www.wuychn.com/,效果如下:
4.5 设置目录列表
Nginx 默认是不允许列出整个目录的,所以,当用户访问某一站点或目录,且该站点或目录下没有 index 指令设置的默认索引文件(如 index.html 等)时,就会报 403 Forbidden 错误。但是当开启了目录列表功能后,出现上述的情况就可以让该站点或目录下的文件以
列表的形式展示。
在 Nginx 中开启目录列表功能非常简单,只需要配置 autoindex 指令即可:
autoindex on;
上述指令在不同块中的作用范围也不同,在 http 块中,表示用于对所有站点都有效;在server 块中,表示对指定站点有效;在 location 块中,表示对某个目录起作用。下面进行演示。
配置虚拟主机,且该虚拟主机的站点根目录下没有指定的默认索引文件:
#基于ip为192.168.115.130的虚拟主机
server{
listen 80;
server_name 192.168.115.130;
root html/192.168.115.130;
index index.php;
}
重启Nginx,访问 http://192.168.115.130/ 如下:
接下来在上一步的配置中添加autoindex配置,完成目录列表的设置:
#基于ip为192.168.115.130的虚拟主机,目录为空
server{
listen 80;
server_name 192.168.115.130;
root html/192.168.115.130;
index index.php;
autoindex on;
}
重启Nginx,再次访问 http://192.168.115.130/:
可以看出,该站点目录下没有指定的默认索引文件 index.php,从而显示该站点下的目录列表。
4.6 子配置文件的引入
由于一个 Nginx 服务器可运行多个虚拟主机,如果将所有虚拟主机的配置全部放在 nginx.conf 文件中,则会造成 nginx.conf 文件过大、可读性差,对日后的维护带来诸多不便。因此,Nginx 中提供了 include 指令用于组织和管理 Nginx 相关的配置信息。
include 指令的具体语法如下:
include file | mask;
其中,file 用于指定包含的文件名称,mask 用于指定某一路径下的文件,其路径可以是相对路径(相对的是 Nginx 的安装路径下的 conf 目录),也可以是绝对路径。
下面进行演示。
在 /usr/local/nginx/conf 路径下创建 vhost 目录,用于保存 Nginx 服务器的虚拟主机配置文件:
root@wuychn:/usr/local/nginx/conf# mkdir vhost
然后在 vhost 目录下新建一个配置文件,命名为 192.168.115.130.conf(为了便于管理,推荐使用站点域名或IP为配置文件命名),内容如下:
#基于ip为192.168.115.130的虚拟主机
server{
listen 80;
server_name 192.168.115.130;
root html/192.168.115.130;
index index.html;
autoindex on;
}
打开 Nginx 的主配置文件 nginx.conf,删除前面配置的相关的虚拟主机配置,在 http 块中利用 include 指令完成192.168.115.130.conf 文件的引人。具体配置如下:
#方式1,单个文件导入
include vhost/192.168.115.130.conf;
#方式2,使用通配符
#include vhost/*.conf;
之后重启Nginx,访问http://192.168.115.130/结果如下: