在各种网站服务器软件中,除了ApacheHTTPSenver外,还有一款轻量级的HTTP服务器软件------Nginx,由俄罗斯的lgorSysoev开发,其稳定、高效的特性逐渐被越来越多的用户认可。本章将讲解Nginx服务的基本构建、访问控制方式、虚拟主机的搭建,还有应用广泛的LNMP架构服务器的部署方式,并对PHP_FPM模块如何支持PHP语言进行讨论
一.Nginx服务基础
Nginx(发音为[enginex])专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对HTTP并发连接的高处理能力(单台物理服务器可支持30000~50000个并发请求)。正因为如此,大量提供社交网络、新闻资讯、电子商务及虚拟主机等服务的企业纷纷选择Nginx来提供Web服务
Nginx安装文件可以从官方网站http:/mwww.nginx.org/下载。下面以稳定版Nginx1.12.0为例,介绍Nginx的安装和运行控制
1.编译安装Nginx
(1)安装支持软件
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成。
yum -y install zlib-devel gcc* pcre-devel
(2)创建运行用户和组
Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。例如,创建一个名为nginx的用户,不建立宿主文件夹,也禁止登录到Shell环境
[root@localhost~]# useradd -M -s /sbin/nologin nginx
备注:
useradd
:这是用于添加新用户的命令。-M
:这个选项表示不为新用户创建主目录。-s /sbin/nologin
:这个选项指定了用户的 shell,这里是/sbin/nologin
,表示这个用户不能登录系统。nginx
:这是新用户的用户名。
(3)编译安装Nginx
配置Nginx的编译选项时,将安装目录设为/usr/local/nginx,运行用户和组均设为nginx启用http_stub_status_module模块以支持状态统计,便于查看服务器的连接信息。具体选项根据实际需要来定,配置前可参考"./configure--help给出的说明。
[root@localhost~#tar zxf nginx-1.12.0.tar.gz //解压nginx压缩文件
[root@localhost~]#cd nginx-1.12.0 //进入解压后的目录下
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/localnginx --user=nginx --group=nginx --with-http_stub_status_module //
[root@localhost nginx-1.12.0]#make && make install //编译与安装
[root@localhost nginx-1.12.0]# /usr/local/nginx/sbin/nginx -v //检测是否安装成功
[root@localhost nginx-1.12.0]# /usr/local/nginx/sbin/nginx //启动nginx
为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行"nginx命令就可以调用Nginx的主程序。
//将nginx命令软链接到系统管理员命令下
[root@localhost nginx-1.12.0# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
//查看连接结果
[root@localhost nginx-1.12.0]#ls -l /usr/local/sbin/nginx
Irwxrwxrwx 1 root root 275 月 16 16:50 /usr/local/sbin/nginx ->/usr/localnginx/sbin/nginx
2.Nginx的运行控制
(1)检测配置文件
与Apache的主程序httpd类似,Nginx的主程序也提供了"-t"选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件nginx.conf默认位于安装目录下的conf/子日录中。若要检查位于其他位置的配置文件,可使用"-c"选项来指定路径。
[root@localhost nginx-1.12.0]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
(2)启动、停止Nginx
直接运行Nginx即可启动Nginx服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加"-c 配置文件路径"选项来指定路径。需要注意的是,若服务器中已装有httpd等其他Web服务软件,应采取措施(修改端口、停用或卸载)避免冲突
[root@localhost~]# nginx
通过检查Nginx程序的监听状态,或者在浏览器中访问此Web服务(默认页面将显示Welcometonginx!"),可以确认Nginx服务是否正常运行。
使用浏览器访问web服务器会显示以下内容
[root@localhost nginx-1.12.0]# yum -y install elinks
[root@localhost nginx-1.12.0]# elinks http://localhost
主程序Nginx支持标准的进程信号,通过kil或killall命令发送HUP信号表示重载配置,QUIT信号表示退出进程,KILL信号表示杀死进程。例如,若使用killall命令,重载配置、停止服务的操作分别如下所示(通过"-s选项指定信号种类)
[root@localhost ~]# killall -s HUP nginx //选项-s HUP等同于-1
[root@localhost ~]# killall -s QUIT nginx //选项-s QUIT等同于-3
当Nginx进程运行时,PID号默认存放在logs/目录下的nginx.pid文件中,因此若改用kill命令,也可以根据nginx.pid文件中的PID号来进行控制。
(3)添加Nginx系统服务
为了使Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx服务脚本,并使用chkconfig和systemctl工具来进行管理,也更加符合CentOS7.3系统的管理习惯。
[root@localhost ~]# vim /etc/init.d/nginx
#!/bin/bash
//为后面脚本添加到系统启动服务列表"chkconfig --add nginx"
#chkconfig:- 99 20
#descriptiono:Nginx Service Control Script
//nginx命令存放位置
PROG="/usr/local/nginx/sbin/nginx"
//Nginx运行后pid存放的位置
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "不是要输入的值"
exit 1
esac
exit 0
这样一来,就可以使用systemctl命令来启动,停止,重载Nginx服务器了,方法是在执行时添加相应的start,stop,restart,reload参数。
3.配置文件nginx.conf
在Nginx服务器的主配置文件/usr/local/nginx/conf/nginx.conf中,包括全局配置、I/O事件配置和HTTP配置这三大块内容,配置语句的格式为"关键字 值;"(末尾以分号表示结束),以"#"开始的部分表示注释。
(1)全局配置
由各种配置语句组成,不使用特定的界定标记。全局配置部分包括Nginx服务的运行用户、工作进程数、错误日志、PID存放位置等基本设置。
//运行用户
#user nobody;
//工作进程数量
worker_processes 1;
//错误日志文件的位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
//PID文件的位置
#pid logs/nginx.pid;
上述配置中,worker_processes表示工作进程的数量。如果服务器有多块CPU或者使用多核处理器,可以参考CPU核心总数来指定工作进程数。如果网站访问量需求并不大,般设为1就够用了。其他三项配置均已有注释,表示采用默认设置,例如,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody
(2)I/O 事件配置
使用"events{}"界定标记,用来指定Nginx进程的I/O响应模型、每个进程的连接数等设置。
events {
use epoll; ##使用 epoll 模型
worker_connections 4096; ##每进程处理 4096 个连接
}
备注:epoll模式能够提高并发连接,并支持非活跃连接;总连接数由 进程x每个进程的连接数
(3)HTTP 配置
使用"http{}"界定标记,包括访问日志、HTTP端口、网页目录、默认字符集、连接保持,以及后面要讲到的虚拟Web主机、PHP解析等一系列设置,其中大部分配置语句都包含在子界定标记"server{}"内
http {
include mime.types;
default_type application/octet-stream;
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;
//支持文件发送(下载)
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
//连接保持超时
keepalive_timeout 65;
#gzip on;
//Web服务器的监听配置
server {
//监听地址及端口
listen 80;
//网站名称(FQDN)
server_name www.benet.com;
// 网页的默认字符集
charset utf-8;
#access_log logs/host.access.log main;
//根目录配置
location / {
// 网站根目录的位置
root html;
//默认首页(素引页)
index index.html index.htm;
}
// 内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
//错误页面配置
location = /50x.html {
root html;
}
}
}
上述配置中,listen语句允许同时限定IP地址,采用"IP地址:端口"形式。root语句用来设置特定访问位置(如"location/表示根目录)的网页文档路径,默认为Nginx安装目录下的htm子目录,根据需要可改为/var/www/html等其他路径。
4.访问状态统计
Nginx内置了HTTP_STUB_STATUS状态统计模块,用来反馈当前的Web访问情况。配置编译参数时可添加--with-http_stub_status_module来启用此模块支持,可以使用命令/usr/loca/nginx/sbin/nginx-V查看已安装的Nginx是否包含HTTP_STUB_STATUS模块。
要使用Nginx的状态统计功能,除了启用内建模块以外,还需要修改nginx.conf配置文件,指定访问位置并添加stub_status配置代码。
http {
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
index index.html index.htm;
}
//访问位置为/status
location /status {
//打开状态统计功能
stub_status on;
//关闭此位置的日志记录
access_log off;
}
}
}
配置文件修改并重启后,使用地址: 192.168.10.101/status 访问
备注:Active connections表示当前的活动连接数(2);而"senver accepts handled requests表示已经处理的连接信息,三个数字依次表示已处理的连接数(2)、成功的TCP握手次数(2)、已处理的请求数(1)
二.Nginx访问控制
1.基于授权的访问控制
(1)基于授权的访问控制介绍
Nginx与Apahce一样,可以实现基于用户授权的访问控制,当客户端想要访问相应网站或者目录时,要求用户输入用户名和密码才能正常访问,配置步骤与Apache基本一致。既括为以下几个步骤。
- 生成用户密码认证文件
- 修改主配置文件相对应目录,添加认证配置项
- 重启服务,访问测试。
(2)基于授权的访问控制步骤
(a)使用htpasswd生成用户认证文件,如果没有该命令,可使用yum安装httpd-tools件包,用法与Apache认证时方式相同,如:htpasswd -c /usr/local/nginx/passwd.db henanxiaoman。在/usr/local/nginx/目录下生成了passwd.db文件,用户名是henanxiaoman,密码输入两次。在passwd.db中生成用户和密码的密文。
[root@localhost ~]# yum -y install httpd-tools
[root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db
New password:
Re-type new password:
Adding password for user henanxiaoman
(b)修改密码文件权限为400,将所有者改为nginx,设置Nginx的运行用户能够读取。
[root@localhost~]# chmod 400 /usr/local/nginx/passwd.db
[root@localhost~]# chown nginx /usr/local/nginx/passwd.db
[root@localhost~]# ll -d /usr/local/nginx/passwd.db
(c)修改主配置文件nginx.conf,添加相应认证配置项。
location / {
root html;
index index.html index.htm;
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
(d)检测语法,重启服务
[root@localhost nginx]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx]# systemctl restart nginx
(e)用浏览器访问网址,检测控制效果
2.基于用户端的访问控制
(1)介绍
基于客户端的访问控制是通过客户端IP地址,决定是否允许对页面访问。Nginx基于客户端的访问控制要比Apache简单,规则如下:
- deny IP/IP段:拒绝某个IP或IP段的客户端访问
- allow IP/IP段:允许某个IP或IP段的客户端访问
- 规则从上往下执行,如匹配则停止,不再往下匹配
(2)基于客户端的访问控制步骤
(a)修改主配置文件nginx.conf,添加相应配置项。
[root@localhost ~]# vim lusrllocal/nginxlconflnginx.conf
server {
location /{
deny 192.168.10.102 //客户端IP
allow all;
}
}
(3)重启服务器访问网址,在102主机上访问页面已经访问不到
三.Nginx虚拟主机
用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行-组Nginx进程,虚拟主机提供了在同一台服务器,同一组Nginx进程上运行多个网站的功能。跟Apache一样,Nginx也可以配置多种类型的虚拟主机,分别是基于IP的虚拟主机、基于域名的虚拟主机、基于端口的虚拟主机。
使用Nginx搭建虚拟主机服务器时,每个虚拟Web站点拥有独立的"server{}"配置段,各自监听的IP地址、端口号可以单独指定,当然网站名称也是不同的。
1.基于域名的虚拟主机
(1)修改Windows客户机的C:Windows\System32\drivers\etc\hosts文件,加入www.henan.com和www.xiaoman.com这两个域名,它们都指向同一个服务器IP地址, 用于实现不同的域名访问不同的虚拟主机
修改hosts 文件,加入www.henan.com 和 www.xiaoman.com 这两个域名
192.168.10.101 www.henan.com
192.168.10.101 www.xiaoman.com
(2)准备各个网站的目录和测试首页
[root@localhost ~]# mkdir -p /var/www/html/hecom/
[root@localhost ~]# mkdir -p /var/www/html/xiaocom/
[root@localhost ~]# echo "www.henan.com">> /var/www/html/hecom/index.html
[root@localhost ~]# echo "www.xiao.com">>/var/www/html/xiaocom/index.html
(3)修改配置文件,把配置文件中的server代码段全部去掉,加入2个新的senver段,对应2个域名。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.henan.com;
access_log logs/www.henan.com.access.log;
charset utf-8;
location / {
root /var/www/html/hecom;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html {
root html;
}
}
server {
listen 80;
server_name www.xiaoman.com;
access_log logs/www.xiaoman.com.access.log;
charset utf-8;
location / {
root /var/www/html/xiaocom;
index index.html index.htm;
}
}
(4)测试
2.基于IP的虚拟主机
(1)为服务器设置多个IP地址
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:1
[root@localhost network-scripts]# vim ifcfg-ens33:0
IPADDR=192.168.10.150
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
DNS1=223.6.6.6
NAME=ens33:0
DEVICE=ens33:0
[root@localhost network-scripts]# vim ifcfg-ens33:1
IPADDR=192.168.10.160
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
DNS1=223.6.6.6
NAME=ens33:1
DEVICE=ens33:1
[root@localhost network-scripts]# systemctl restart network
(2)修改 Nginx的配置文件,使基于 IP 的虚拟主机生效
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 192.168.10.150:80;
server_name www.henan.com;
.....
}
server {
listen 192.168.10.160:80;
server_name www.xiaoman.com;
.....
}
(3)访问两个IP网站,测试页面是否生效
3:基于端口的虚拟主机
(1)选择系统中不使用的端口,多个端口映射到同一 IP 地址
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 192.168.10.101:8080;
server_name www.henan.com;
.....
}
server {
listen 192.168.10.101:8888;
server_name www.xiaoman.com;
.....
}
[root@localhost ~]# systemctl restart nginx
(2)检测端口是否运行正常
[root@localhost ~]# netstat -anpt | grep nginx
(3)分别访问 2 个端口地址