在企业信息化应用环境中,安全性不仅取决于硬件防护设备,系统加固、访问控制等基本措施,而且如何减少故障中断时间、提高存储及备份的完善性也是确保企业信息安全的重要措施。本章将进一步学习服务器缓存加速、高可用/负载均衡群集、服务器集中监控等高级安全应用。后续课程将
采用最小化安装的CentOS 7.3系统,安装系统时勾选“开发工具”选项,以此为基础搭建实验环境。随着计算机与Internet技术的蓬勃发展,形形色色的Web站点成为直接面向用户的中坚力量。在各种网站服务器软件中,除了Apache HTTP Server外,还有一款轻量级的HTTP服务器软件-- Nginx,由俄罗斯的lgor Sysoev开发,其稳定、高效的特性逐渐被越来越多的用户认可。
Nginx 最新的稳定版本为1.12.0,其安装文件可以从官方网站http://www.nginx.org/下载。下
面以稳定版1.12.0为例,介绍Nginx的安装及运行控制。
Nginx的配置及运行需要 pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成,具体安装命令如下所示。
[root@localhost ~]# yum -y install pcre-devel zlib-devel
Nginx 服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性,降低安全风险。例如,创建一个名为nginx的用户,不建立宿主文件夹,也禁止登录到Shell 环境。
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
配置Nginx的编译选项时,将安装目录设为/usr/local/nginx,运行用户及组均设为nginx;启用http_stub_status_module模块以支持状态统计,便于查看服务器的连接信息。具体选项根据实际要来定,配置前可参考“./configure -- help”给出的说明。
[root@localhost nginx-1.12.0]# tar zxf nginx-1.12.0.tar.gz
[root@localhost nginx-1.12.0]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@localhost nginx-1.12.0]# make
[root@localhost nginx-1.12.0]# make install
为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行"nginx”命令就可以调用Nginx的主程序。
与Apache的主程序httpd类似,Nginx的主程序也提供了“-t”选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件nginx.conf默认位于安装目录下的conf/子目录中。若要检查位于其他位置的配置文件,可使用“-c”选项来指定路径。
直接运行nginx命令即可启动Nginx服务器,这种方式将使用默认的配置文件,若要改用其置文件,需添加‘-c配置文件路径”选项来指定配置文件路径。需要注意的是,若服务器中已httpd等其他Web服务软件,应采取修改端口、停用或卸载等措施避免端口冲突。
[root@localhost ~]# nginx
通过检查Nginx程序的监听状态,或者在浏览器中访问此Web服务(默认页面将显示“Welcometo nginx!"),可以确认Nginx服务是否正常运行。下面示例中提到的elinks是Linux系统中常用的文本浏览器。
[root@localhost ~]# yum install -y elinks
主程序Nginx支持标准的进程信号,通过kill或killall命令发送HUP信号表示重载配置,QUIT信号表示退出进程,KILL信号表示杀死进程。例如,若使用killall命令,重载配置、停止服务的操作分别如下所示(通过“-s”选项指定信号种类)。最小化安装的centos系统默认没有安装killall命令,需要先通过 yum安装
[root@localhost ~]# killall -a HUP nginx
[root@localhost ~]# killall -s QUIT nginx
当Nginx进程运行时,PID号默认存放在logs/目录下的nginx.pid文件中,因此若改用kill 命令,也可以根据nginx.pid文件中的PID号来进行控制。
为了使Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx服务脚本,并使用chkconfig和systemctl工具来进行管理,也更加符合CentOS系统的管理习惯。
[root@localhost ~]# vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
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 "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
[root@localhost ~]# chmod +x /etc/init.d/nginx
[root@localhost ~]# chkconfig --add nginx
[root@localhost ~]# systemctl status nginx
这样,就可以通过systemctl命令控制Nginx脚本来启动、停止、重启、重载Nginx服务器了,方法是在执行时添加相应的 start、stop、restart、reload参数。
在Nginx服务器的主配置文件/usr/local/nginx/conf/nginx,conf中,包括全局配置、IO事件配置和HTTP配置这三大块内容,配置语句的格式为“关键字 值;”(末尾以分号表示结束),以“#”开始的部分表示注释。
全局配置部分由各种配置语句组成,不使用特定的界定标记。它包括Nginx服务的运行用户,工作进程数、错误日志、PID存放位置等基本设置。
上述配置中,worker_processes表示工作进程的数量。若服务器有多块CPU或者使用多核处理器,可以参考CPU核心总数来指定工作进程数,如设为8:如果网站访问量需求并不大,一般设为1就够用了。一般情况下,若主配置文件中没有设置或已有注释的配置项,表示自行使用默认设置,因此上述配置文中的其他三项配置均已有注释,自动采用Nginx服务自己默认的设置。例如,Nginx的运行用户在编译时指定为nginx,若编译时未指定则默认为nobody。
使用“events{ }” 界定标记用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置。对于2.6及以上版本的内核,建议使用epoll模型以提高性能;每个进程的连接数应根据实际需要来定,一般在10000以下(默认为1024)。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
若工作进程数为8,每个进程处理4096个连接,则允许Nginx正常提供服务的连接数已超过3万个(4096×8=32768),当然具体还要看服务器硬件、网络带宽等物理条件的性能表现。
使用“http{ }”界定标记用于设定HTTP服务器,包括访问日志、HTTP端口、网页目录,默认字符集、连接保持,以及后面要讲到的虚拟Web主机、PHP解析等网站全局设置,其中大部分配置语句都包含在子界定标记“server{ }”内。“server{}”代表一个具体的网站设置。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
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;
server {
listen 80;
server_name www.bdqn.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
上述配置中,listen语句限定端口的同时允许限定IP地址,采用“IP地址:端口”形式;root语句用来设置特定访问位置(如“location/”表示根目录)的网页文档路径,默认为Nginx 安装目录下的html/子目录,根据需要可改为/var/www/html等其他路径,但更改后需保证nginx用户对其具有读取权限。
Nginx内置了HTTP_STUB_STATUS状态统计模块,用来反馈当前的Web访问情况,配置编译参数时可添加--with-http_stub_status_module来启用此模块。要使用Nginx的状态统计功能,除了用内建模块以外,还需要修改nginx.conf配置文件,指定访问位置并打开stub_status配置。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
listen 80;
server_name www.bdqn.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.php;
}
location = /status {
stub_status on;
access_log off;
}
}
}
新的配置生效以后,在浏览器中访问Nginx服务器的/status网站位置,可以看到当前的状态统计信息。其中,“Active connections”表示当前的活动连接数(2);而“server acceptshandled requests"表示已经处理的连接信息,三个数字依次表示已处理的连接数(4)、成功的 TCP握手次数(4)、已处理的请求数(5)。
基于域名的虚拟Web主机通过域名区分不同的Web站点。使用Nginx搭建虚拟主机服务器时,每个虚拟Web站点拥有独立的“server{}”配置段,各自监听的IP地址,端口号可以单独指定,当然网站名称也是不同的。例如,若要在一台 Linux 服务器上部署两个站点www.bdqn.com和
www.accp.com,可以参考以下过程。
(1)配置DNS服务,使两个域名解析为同一IP地址(过程略)。
(2)准备网站目录及测试文件。为两个虚拟Web主机分别建立根目录,并准备测试首页,以方便在测试时区分。
[root@localhost ~]# mkdir -p /var/www/bdqn
[root@localhost ~]# echo "www.bdqn.com
" > /var/www/bdqn/index.html
[root@localhost ~]# mkdir -p /var/www/accp
[root@localhost ~]# echo "www.accp.com
" > /var/www/accp/index.html
(3)调整nginx.conf配置文件。配置两个“server{ }”区域,分别对应两个Web站点,指定各自的网站名称、监听地址、网站根目录、访问日志等信息,然后重载配置。
server {
listen 80;
server_name www.bdqn.com;
charset utf-8;
access_log logs/host.access.log main;
location / {
root /var/www/bdqn;
index index.html index.php;
}
}
server {
listen 80;
server_name www.accp.com;
charset utf-8;
access_log logs/host.access.log main;
location / {
root /var/www/accp;
index index.html index.php;
}
}
(4)访问虚拟Web主机。找一台与Web主机同网段的客户机(系统为Windows 10)测试Web站点是否配置成功。在客户机的浏览器中分别访问两个站点:www.bdqn.com和www.accp.com,若能看到各自的测试首页内容,就表示虚拟Web主机配置成功。