Nginx网站服务

目录

简介

1、Nginx服务基础 

1.1、安装及运行控制 

(1)编译安装Nginx

(2)Nginx的运行控制 

(3)添加Nginx系统服务 

1.2、配置文件nginx.conf 

(1) 全局配置

(2)I/O事件配置 

(3)HTTP配置 

1.3、访问状态统计 

2、基于授权的访问控制 

2.1、基于授权的访问控制简介 

2.2、基于授权的访问控制步骤 

3、基于客户端的访问控制 

3.1、基于客户端的访问控制简介 

3.2、基于客户端的访问控制步骤 

4、nginx虚拟主机 

4.1、基于域名的虚拟主机 

4.2、基于IP的虚拟主机 

4.3、基于端口的虚拟主机 


简介

  在企业信息化应用环境中,安全性不仅取决于硬件防护设备、系统加固、访问控制等基本措施,而且如何减少故障中断时间、提高存储及备份的完善性也是确保企业信息安全的重要措施。本章将进一步学习服务器缓存加速、高可用/负载均衡群集、服务器集中监控等高级安全应用。实验环境将采用最小化安装的CentOS 7.3系统,安装系统时勾选“开发工具”选项。

  随着计算机与Internet技术的蓬勃发展,形形色色的Web站点成为直接面向用户的中坚力量。在各种网站服务器软件中,除了Apache HTTP Server外,还有一款轻量级的HTTP服务器软件--Nginx。由俄罗斯的lgor Sysoev开发,其稳定、高效的特性逐渐被越来越多的用户认可。


1、Nginx服务基础 

Nginx(发音为 [engine x] )专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对 HTTP 并发连接的高处理能力(单台物理服务器可支持 30000 ~ 50000 个并发请求)。正因为如此,大量提供社交网络、新闻资讯、电子商务及虚拟主机等服务的企业纷纷选择 Nginx 来提供 Web 服务。

 本篇本章将依次介绍Nginx的安装及运行控制,配置文件(nginx.conf)。以及使用Nginx构建基于域名的虚拟主机。

1.1、安装及运行控制 

Nginx安装文件可以从官方网站 http://www.nginx.org/ 下载。下面以稳定版 Nginx1.12.0 为例,介绍Nginx的安装和运行控制。

(1)编译安装Nginx

  • 安装支持软件 

Nginx的配置及运行需要pcre 、 zlib等软件包的支持,因此应预先安装这些软件的开发包(devel ),以便提供相应的库和头文件,确保Nginx的安装顺利完成。

[root@centos7-1 ~]# yum -y install pcre-devel zlib-devel gcc++ gcc
  • 创建运行用户、组 

Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。例如,创建一个名为 nginx 的用户,不建立宿主文件夹,也禁止登录到 Shell 环境。 

[root@centos7-1 ~]# useradd -M -s /sbin/nologin nginx
  • 编译安装 Nginx 

配置 Nginx 的编译选项时,将安装目录设为 /usr/local/nginx ,运行用户和组均设为 nginx ;启用 http_stub_status_module 模块以支持状态统计,便于查看服务器的连接信息。具体选项根据实际需要来定,配置前可参考“./configure --help” 给出的说明。

[root@centos7-1 ~]# tar zxf nginx-1.12.0.tar.gz -C /usr/src/
[root@centos7-1 ~]# cd /usr/src/nginx-1.12.0/
[root@centos7-1 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@centos7-1 nginx-1.12.0]# make && make install

为了使 Nginx 服务器的运行更加方便,可以为主程序 nginx 创建链接文件,以便管理员直接执行“nginx” 命令就可以调用 Nginx 的主程序。 

[root@centos7-1 nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@centos7-1 nginx-1.12.0]# ls -l /usr/local/sbin/nginx 
lrwxrwxrwx 1 root root 27 1月   5 11:00 /usr/local/sbin/nginx -> /usr/local/nginx/sbin/nginx

(2)Nginx的运行控制 

  • 检查配置文件 

与 Apache 的主程序 httpd 类似, Nginx 的主程序也提供了 “-t” 选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件 nginx.conf 默认位于安装目录下的 conf/ 子目录中。若要检查位于其他位置的配置文件,可使用“-c” 选项来指定路径。

[root@centos7-1 ~]# 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@centos7-1 ~]# 
  • 启动、停止Nginx 

直接运行 Nginx 即可启动 Nginx 服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加“-c 配置文件路径 ” 选项来指定路径。需要注意的是,若服务器中已装第有 httpd 等其他 Web 服务软件,应采取措施(修改端口、停用或卸载)避免冲突。

[root@centos7-1 ~]# nginx

通过检查 Nginx 程序的监听状态,或者在浏览器中访问此 Web 服务(默认页面将显示 “Welcome to nginx!”),可以确认 Nginx 服务是否正常运行。 下面示例中提到的 elinks 是 Linux 系统中常用的文本浏览器。

[root@centos7-1 ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      11910/nginx: master 
[root@centos7-1 ~]# yum -y install elinks
[root@centos7-1 ~]# elinks http://localhost
//使用elinks浏览器访问web服务时,显示“Welcome to nginx!”页面,表明Nginx服务已经正常运行

Nginx网站服务_第1张图片


主程序 Nginx 支持标准的进程信号,通过 kill 或 killall 命令发送 HUP 信号表示重载配置, QUIT 信号表示退出进程, KILL 信号表示杀死进程。例如,若使用 killall 命令,重载配置、停止服务的操作分别如下所示(通过“-s” 选项指定信号种类)。

[root@centos7-1 ~]# killall -s HUP nginx  //选项 -s HUP 等同于 -1
[root@centos7-1 ~]# killall -s QUIT nginx  //选项 -s QUIT 等同于 -3

 当 Nginx 进程运行时, PID 号默认存放在 logs/ 目录下的 nginx.pid 文件中,因此若改用kill 命令,也可以根据 nginx.pid 文件中的 PID 号来进行控制。 

(3)添加Nginx系统服务 

 为了使 Nginx 服务的启动、停止、重载等操作更加方便,可以编写 Nginx 服务脚本,并使用 chkconfig 和 systemctl 工具来进行管理,也更加符合 CentOS7.6 系统的管理习惯。 

[root@centos7-1 ~]# vim /etc/init.d/nginx
#!/bin/bash
#!/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@centos7-1 ~]# chmod +x /etc/init.d/nginx 
[root@centos7-1 ~]# chkconfig --add nginx  //添加为系统服务
[root@centos7-1 ~]# systemctl status nginx  //查看Nginx服务状态
● nginx.service - SYSV: Nginx Service Control Script
   Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)
[root@centos7-1 ~]#

 这样一来,就可以 systemctl 命令来启动、停止、重启、重载 Nginx 服务器了,方法是在执行时添加相应的 start 、 stop 、 restart 、 reload 参数。 


1.2、配置文件nginx.conf 

  在 Nginx 服务器的主配置文件 /usr/local/nginx/conf/nginx.conf 中,包括全局配置、 I/O事件配置和 HTTP 配置这三大块内容,配置语句的格式为 “ 关键字 值 ;” (末尾以分号表示结束),以“#” 开始的部分表示注释。

(1) 全局配置

由各种配置语句组成,不使用特定的界定标记。全局配置部分包括 Nginx 服务的运行用户、工作进程数、错误日志、PID 存放位置等基本设置。 

[root@centos7-1 ~]# vim /usr/local/nginx/conf/nginx.conf
#user  nobody;  //运行用户
worker_processes  1;  //工作进程数量
 
#error_log  logs/error.log;  //错误日志文件位置
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;  //PID文件的位置

上述配置中,worker_processes 表示工作进程的数量。如果服务器有多块 CPU 或者使用多核处理器,可以参考 CPU 核心总数来指定工作进程数。如果网站访问量需求并不大,一般设为 1 就够用了。其他三项配置均已有注释,表示采用默认设置,例如, Nginx 的运行用户实际是编译时指定的 nginx ,若编译时未指定则默认为 nobody 。

(2)I/O事件配置 

使用“events { }” 界定标记,用来指定 Nginx 进程的 I/O 响应模型、每个进程的连接数等设置。对于 2.6 及以上版本的内核,建议使用 epoll 模型以提高性能;每个进程的连接数应根据实际需要来定,一般在 10000 以下(默认为 1024 )。

events {
    use epoll;  //使用epoll模型
    worker_connections  4096;  //每个进程处理4096个连接
}

若工作进程数为 8 ,每个进程处理 4096 个连接,则允许 Nginx 正常提供服务的连接数已超过 3 万个( 4096×8=32768 ),当然具体还要看服务器硬件、网络带宽等物理条件的性能表现。 

(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;
    server {                                //Web服务的监听配置
        listen       80;                    //监听地址及端口
        server_name  www.bdqn.com;          //网站名称(bdqn)
        charset utf-8;                      //网页的默认字符集
        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 等其他路径。


1.3、访问状态统计 

Nginx 内置了 HTTP_STUB_STATUS 状态统计模块,用来反馈当前的 Web 访问情况。配置编译参数时可添加--with-http_stub_status_module 来启用此模块支持,可以使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块。

 要使用 Nginx 的状态统计功能,除了启用内建模块以外,还需要修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置代码。 

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;
        location / {
            root   html;
            index  index.html index.php;
        }
        location /status {      //访问位置为/status
            stub_status    on;  //打开状态统计功能
            access_log    off;  //关闭此位置的日志记录
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@centos7-1 ~]# systemctl restart nginx

新的配置生效以后,在浏览器中访问 Nginx 服务器的 /status 网站位置,可以看到当前的状态统计信息,如图 5.1 所示。其中,“Active connections”表示当前的活动连接数( 2 );而“server accepts handled requests” 表示已经处理的连接信息,三个数字依次表示已处理的连接数(2 )、成功的 TCP 握手次数( 2 )、已处理的请求数( 3 )。

Nginx网站服务_第2张图片

 nginx状态统计页面


2、基于授权的访问控制 

2.1、基于授权的访问控制简介 

 Nginx 与 Apahce 一样,可以实现基于用户授权的访问控制,当客户端想要访问相应网站或者目录时,要求用户输入用户名和密码才能正常访问,配置步骤与 Apache 基本一致。概括为以下几个步骤。 

  • 生成用户密码认证文件。
  • 修改主配置文件相对应目录,添加认证配置项。
  • 重启服务,访问测试。

2.2、基于授权的访问控制步骤 

  • 使用 htpasswd 生成用户认证文件,如果没有该命令,可使用 yum 安装 httpd-tools 软件包,用法与 Apache 认证时方式相同,如: htpasswd -c /usr/local/nginx/passwd.db test。 在/usr/local/nginx/ 目录下生成了 passwd.db 文件,用户名是 test, 密码输入 2 次。在 passwd.db 中生成用户和密码的密文。
[root@centos7-1 ~]# yum -y install httpd-tools
[root@centos7-1 ~]# htpasswd -c /usr/local/nginx/passwd.db zhangsan
New password: 
Re-type new password: 
Adding password for user zhangsan
[root@centos7-1 ~]# cat /usr/local/nginx/passwd.db 
zhangsan:$apr1$OcJAD8bW$F.pUO2qcJcQzans5CMMLi0
[root@centos7-1 ~]#
  • 修改密码文件权限为 400 ,将所有者改为 nginx ,设置 Nginx 的运行用户能够读取。 
[root@centos7-1 ~]# chmod 400 /usr/local/nginx/passwd.db 
[root@centos7-1 ~]# chown nginx /usr/local/nginx/passwd.db 
[root@centos7-1 ~]# ll -d /usr/local/nginx/passwd.db 
-r-------- 1 nginx root 47 1月   5 12:07 /usr/local/nginx/passwd.db
  • 修改主配置文件 nginx.conf, 添加相应认证配置项。 
[root@centos7-1 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
 ......//省略部分内容
    server {
        listen       80;
        server_name  www.bdqn.com;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.php;
            auth_basic "secret";
            auth_basic_user_file /usr/local/nginx/passwd.db;
        }
......//省略部分内容
        }
    }
}
  • 检测语法、重启服务。 
[root@centos7-1 ~]# 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@centos7-1 ~]# systemctl restart nginx
  • 用浏览器访问网址,检验控制效果,如下图所示。需要输入用户名和密码进行访问,验证通过才能访问到页面。 

Nginx网站服务_第3张图片


3、基于客户端的访问控制 

3.1、基于客户端的访问控制简介 

基于客户端的访问控制是通过客户端 IP 地址,决定是否允许对页面访问。 Nginx 基于客户端的访问控制要比 Apache 简单,规则如下: 

  • deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
  • allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
  • 规则从上往下执行,如匹配则停止,不再往下匹配。

3.2、基于客户端的访问控制步骤 

  • 修改主配置文件 nginx.conf,添加相应配置项。 
[root@centos7-1 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......//省略部分内容
    server {
        listen       80;
        server_name  www.bdqn.com;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.php;
            #auth_basic "secret";
            #auth_basic_user_file /usr/local/nginx/passwd.db;
            deny 192.168.23.10;  //客户端的IP
            allow all;
        }
......//省略部分内容 
        }
    }
}
[root@centos7-1 ~]# 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@centos7-1 ~]# systemctl restart nginx

Deny 192.168.23.10  表示这个 IP 地址访问会被拒绝,其他 IP 客户端正常访问。 

  • 重启服务器访问网址,页面已经访问不到,如下图所示。 

Nginx网站服务_第4张图片


4、nginx虚拟主机 

利用虚拟主机,不用为每个要运行的网站提供一台单独的 Nginx 服务器或单独运行一组 Nginx 进程,虚拟主机提供了在同一台服务器,同一组 Nginx 进程上运行多个网站的功能。跟 Apache 一样, Nginx 也可以配置多种类型的虚拟主机,分别是基于 IP 的虚拟主机、基于域名的虚拟主机、基于端口的虚拟主机。

使用 Nginx 搭建虚拟主机服务器时,每个虚拟 Web 站点拥有独立的 “server{}” 配置段,各自监听的 IP 地址、端口号可以单独指定,当然网站名称也是不同的。 

4.1、基于域名的虚拟主机 

  • 准备一台DNS服务器 ,加入www.bdqn.com 和 www.accp.com 这两个域名,它们都指向同一个服务器 IP 地址, 用于实现不同的域名访问不同的虚拟主机。 

Nginx网站服务_第5张图片  

  • 备各个网站的目录和测试首页。 
[root@centos7-1 ~]# mkdir -p /var/www/html/bdqncom  //创建www.bdqn.com的根目录
[root@centos7-1 ~]# mkdir -p /var/www/html/accpcom  //创建www.accp.com的根目录
[root@centos7-1 ~]# echo "www.bdqn.com" >> /var/www/html/bdqncom/index.html
[root@centos7-1 ~]# echo "www.accp.com" >> /var/www/html/accpcom/index.html
  • 修改配置文件 , 把配置文件中的 server{} 代码段全部去掉,加入2个新的server{}

    段,对应2个域名。

[root@centos7-1 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......//省略部分内容
    server {
        listen       80;
        server_name  www.bdqn.com;
        charset utf-8;
        location / {
            root   /var/www/html/bdqncom;
            index  index.html index.php;
        }
    }

    server {
        listen       80;
        server_name  www.accp.com;
        charset utf-8;
        location / {
            root   /var/www/html/accpcom;
            index  index.html index.php;
        }
    }
}
[root@centos7-1 ~]# 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@centos7-1 ~]# systemctl restart nginx
  • 分别访问 2 个域名,如下图所示,查看是否访问到不同的页面,测试配置是否成功。 

Nginx网站服务_第6张图片

Nginx网站服务_第7张图片


4.2、基于IP的虚拟主机 

  • 一台主机如果有多个IP地址,可以设置每一个 IP 对应一个站点。主机安装多个网卡可以有多个 IP ,这里采用虚拟 IP 的方式使主机有多个 IP 。 
[root@centos7-1 ~]# ip addr show dev ens32 | grep inet
    inet 192.168.23.201/24 brd 192.168.23.255 scope global noprefixroute ens32
    inet6 fe80::1be4:8031:6d43:76ff/64 scope link noprefixroute 
  • 目前主机有一个网卡,IP 地址是 192.168.23.201 。再配置一个虚拟 IP 为 192.168.23.211 。 
[root@centos7-1 ~]# ifconfig ens32:0 192.168.23.211
[root@centos7-1 ~]# ip addr show dev ens32 | grep inet
    inet 192.168.23.201/24 brd 192.168.23.255 scope global noprefixroute ens32
    inet 192.168.23.211/24 brd 192.168.23.255 scope global secondary ens32:0
    inet6 fe80::1be4:8031:6d43:76ff/64 scope link noprefixroute 
  • 以 /var/www/html/testcom 和 /var/www/html/btcom 为两个站点的根目录,修改 Nginx 的配置文件,使基于 IP 的虚拟主机生效。这里省略了和基于域名虚拟主机的相同配置代码。 
[root@centos7-1 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......//省略部分内容
    server {
        listen       192.168.23.201:80;
        server_name  www.bdqn.com;
        charset utf-8;
        location / {
            root   /var/www/html/bdqncom;
            index  index.html index.php;
        }
    }

    server {
        listen       192.168.23.211:80;
        server_name  www.accp.com;
        charset utf-8;
        location / {
            root   /var/www/html/accpcom;
            index  index.html index.php;
        }
    }
}
[root@centos7-1 ~]# 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@centos7-1 ~]# systemctl restart nginx
  •  分别访问 2 个 IP 地址,如下图所示,查看是否访问到不同的页面,测试配置是否成功。

 Nginx网站服务_第8张图片

Nginx网站服务_第9张图片


4.3、基于端口的虚拟主机 

  • 选择系统中不使用的端口,多个端口映射到同一 IP 地址。 
[root@centos7-1 ~]# vim /usr/local/nginx/conf/nginx.conf
http {
......//省略部分内容
    server {
        listen       192.168.23.201:8088;
        server_name  www.bdqn.com;
        charset utf-8;
        location / {
            root   /var/www/html/bdqncom;
            index  index.html index.php;
        }
    }

    server {
        listen       192.168.23.211:8089;
        server_name  www.accp.com;
        charset utf-8;
        location / {
            root   /var/www/html/accpcom;
            index  index.html index.php;
        }
    }
}
[root@centos7-1 ~]# 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@centos7-1 ~]# systemctl restart nginx
  • 检测端口是否运行正常。 
[root@centos7-1 ~]# netstat -anpt | grep nginx
tcp        0      0 192.168.23.201:8088     0.0.0.0:*               LISTEN      70502/nginx: master 
tcp        0      0 192.168.23.201:8089     0.0.0.0:*               LISTEN      70502/nginx: master 
  • 别访问 2 个端口地址,如下图所示,查看是否访问到不同的页面,测试配置是否成功。 

Nginx网站服务_第10张图片

Nginx网站服务_第11张图片

你可能感兴趣的:(5G云计算_企业网站架构部署,nginx,运维,linux)