Nginx网站服务

        在各种网站服务器软件中,除了 Apache HTTP Server外,还有一款轻量级的 HTTP服务器软件--Nginx,由俄罗斯的 lgor Sysoev 开发,其稳定、高效的特性逐渐被越来越多的用户认可。本章将讲解 Nginx 服务的基本构建、访问控制方式、虚拟主机的搭建,还有应用广泛的 LNMP 架构服务器的部署方式,并对 PHP_FPM 模块如何支持 PHP 语言进行讨论。

一、Nginx服务基础

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

1. Nginx安装及运行控制

(1)编译安装Nginx

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

[root@localhost ~]# yum -y install pcre-devel zlib-devel gcc*

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

[root@localhost ~]# useradd -M -s /sbin/nologin nginx

        配置 Nginx的编译选项时,将安装目录设为/usr/local/nginx,运行用户和组均设为nginx;启用 http stub status module 模块以支持状态统计,便于查看服务器的连接信息。

[root@localhost ~]# tar zxf nginx-1.12.0.tar.gz
[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

         为了使 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]#ll /usr/localsbin/nginx

 (2)Nginx的运行控制

        与 Apache 的主程序 httpd 类似,Nginx 的主程序也提供了“-t"选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件 nginx.conf默认位于安装目录下的 conf/子目录中。若要检查位于其他位置的配置文件,可使用“-c"选项来指定路径。
        直接运行 Nginx 即可启动 Nginx 服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加“-c 配置文件路径"选项来指定路径。
        通过检查 Nginx 程序的监听状态,或者在浏览器中访问此 Web 服务(默认页面将显示“Welcome to nginx!”),可以确认 Nginx 服务是否正常运行。
        主程序 Nginx 支持标准的进程信号,通过 kil 或 killall 命令发送 HUP 信号表示重载配置QUIT 信号表示退出进程,KILL信号表示杀死进程。
        当 Nginx 进程运行时,PID 号默认存放在 logs/日录下的 nginx.pid 文件中,因此若改用kill命令,也可以根据 nginx.pid 文件中的 PID 号来进行控制。 
        为了使 Nginx 服务的启动、停止、重载等操作更加方便,可以编写 Nginx 服务脚本,并使用 chkconfig 和 systemctl 工具来进行管理,也更加符合 CentOS7.3 系统的管理习惯。

[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)
killall -9 nginx
;;
restart)
S0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PDF)
*)
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 服务器了,方法是在执行时添加相应的 start、stop、restart、reload 参数。

2.配置文件nginx.conf

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

(1)全局配置

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

#user nobody;                  //运行用户
worker processes 1;            //工作进程数量
#error_log logs/error.log;     //错误日志文件的位置
#pid    logs/nginx.pid;        //PID 文件的位置

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

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

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

(3) HTTP 配置

        使用“http {}”界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保持,以及后面要讲到的虚拟 Web 主机、PHP 解析等一系列设置,其中大部分配置语句都包含在子界定标记“server{}”内。 

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 配置代码。

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
......
http {
    server{
            listen    80;
            server name  www.benet.com;
            charset utf-8;
       
         location /{
                     root html;
                     index index.html index.php;
        }
        location /status {                 //访问位置为/status
                    stub status on;        //打开状态统计功能
                    access_log off;        //关闭此位置的日志记录
        }
    }
}
[root@localhost ~]# systemctl restart nginx

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

 二、Nginx访问控制

1.基于授权的访问控制

(1)基于授权的访问控制简介

 Nginx与 Apahce 一样,可以实现基于用户授权的访问控制,当客户端想要访问相应网
站或者目录时,要求用户输入用户名和密码才能正常访问,配置步骤与 Apache 基本一致。
概括为以下几个步骤。
        生成用户密码认证文件。
        修改主配置文件相对应目录,添加认证配置项。
        重启服务,访问测试。

(2)基于授权的访问控制步骤

        使用 htpasswd 生成用户认证文件,如果没有该命令,可使用 yum 安装 httpd-tools软件包,用法与 Apache 认证时方式相同,如:htpasswd -c/usrlocal/nginx/passwd.db test.在/usr/localnginx/日录下生成了 passwd.db 文件,用户名是 test,密码输入2次。在passwd.db 中生成用户和密码的密文。

[root@localhost ~]# yum install -y httpd-tools
[root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db test
New password:
Re-type new password:
Adding password for user test
[root@localhost ~]# cat/usr/local/nginx/passwd.db
test:$apr1$x.UaSXIM$RRLa2KJcKwsGBVsikGcrR/

         修改密码文件权限为 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
-r--------1 nginx root 43 5月 16 22:26 /usr/local/nginx/passwd.db

         检测语法、重启服务。

[root@localhost ~]# 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 ~]# systemctl restart nginx

 2.基于客户端的访问控制

(1)基于客户端的访问控制简介

        基于客户端的访问控制是通过客户端IP地址,决定是否允许对页面访问。Nginx 基于客户端的访问控制要比 Apache 简单,规则如下:
        deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
        allow IP/IP 段:允许某个 |P 或 IP 段的客户端访问。
        规则从上往下执行,如匹配则停止,不再往下匹配。

(2)基于客户端的访问控制步骤

[root@localhost ~# vim /usr/localnginx/conf/nginx.conf
server {
        location / {
                deny 192.168.9.207;       //客户端IP        
                allow all;
[root@localhost ~]# systemctl restart nginx

3.Nginx虚拟主机

        利用虚拟主机,不用为每个要运行的网站提供一台单独的 Nginx服务器或单独运行一组 Nginx 进程,虚拟主机提供了在同一台服务器,同一组 Nginx 进程上运行多个网站的功能。跟 Apache 一样,Nginx 也可以配置多种类型的虚拟主机,分别是基于 IP 的虚拟主机、基于域名的虚拟主机、基于端口的虚拟主机。
        使用 Nginx 搭建虚拟主机服务器时,每个虚拟 Web 站点拥有独立的“server{}”配置段各自监听的 IP 地址、端口号可以单独指定,当然网站名称也是不同的。 

(1)基于域名的虚拟主机

[root@localhost ~## mkdir -p /var/www/html/benet
[root@localhost ~## mkdir -p /var/www/html/test
[root@localhost ~]# echo "www.benet.com">>/var/www/html/benet/index.html
[root@localhost ~]# echo "www.test.com">>/var/www/html/test/index.html

        修改配置文件,把配置文件中的 server{}代码段全部去掉,加入2个新的 server{}段,对应2个域名。

server{
    listen    80;
    server name www.benet.com;
    charset utf-8;
    access_log logs/www.bt.access.log;
    location /{
        root    /var/www/html/btcom;
        index    index.html index.htm;
    }
    error page 500 502 503 504 150x.html;
    location =50x.htm{
            root    html;
}
server {
        listen     80;
        server namewww.test.com;
        charset utf-8;
        access_log logs/www.test.access.l0g;
        location /{
                root  /var/www/html/testcom;        
                index    index.html index.htm;
        }
        error _page 500502 503 504 150x.html;
        location = 50x.html{
                  root html;
    }
}
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginxconf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginxconf/nginx.conf test is successful
[root@localhost ~]# systemctl restart nginx

         分别访问2个域名,查看是否访问到不同的页面,测试配置是否成功。

(2)基于IP的虚拟主机

        一台主机如果有多个|P 地址,可以设置每一个 IP 对应一个站点。主机安装多个网卡可以有多个IP,这里采用虚拟IP的方式使主机有多个 IP。目前主机有一个网卡,|P 地址是 192.168.9.158。再配置一个虚拟 IP为 192.168.9.110。

        以/var/www/html/testcom 和/var/www/html/btcom 为两个站点的根目录,修改 Nginx的配置文件,使基于IP 的虚拟主机生效。这里省略了和基于域名虚拟主机的相同配置代码。 

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.confserver {
listen192.168.9.158:80;
server name192.168.9.158:80;

server{
listen     192.168.9.110:80;
server name    192.168.9.110:80;
}

[root@localhost ~]# systemctl restart nginx

 (3)基于端口的虚拟主机

        选择系统中不使用的端口,多个端口映射到同一 IP地址。

[root@localhost ~]# vim /usr/localnginx/conf/nginx.conf
server {
        listen    192.168.9.158:6666:
        server name 192.168.9.158:6666:
}

server {
        listen 192.168.9.158:8888;
        server name 192.168.9.158:8888;
}

         检测端口是否运行正常。

[root@localhost ~]# systemctl restart nginx
[root@localhost ~]#netstat -anpt | grep nginx
tcp 0    0 192.168.9.158:66660.0.0.0:* LISTEN    3838/nginx: master
tcp 0    0 192.168.9.158:88880.0.0.0:* LISTEN    3838/nginx: master

        分别访问2个端口地址,查看是否访问到不同的页面,测试配置是否成功。

4.LNMP架构部署及应用

        众所周知,LAMP 平台是目前应用最为广泛的网站服务器架构,其中“A"对应着 Web 服务软件 Apache。随着 Nginx 在企业中的使用越来越多,LNMP(或 LEMP)架构也越老越受到企业的青睐。 

(1)安装MySQL服务

        为了与Nginx、php环境保持一致,仍选择采用源码安装方式安装MySQL组件。以5.6.36版本为例,安装过程如下所述。

[root@localhost ~]# yum -y install ncurses-devel gcc-c++ perl-Module-Install
[root@localhost ~]# tar -zxvf cmake-2.8.6.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/cmake-2.8.6/
[root@localhost cmake-2.8.6]# ./configure
[root@localhost cmake-2.8.6]# gmake && gmake install
[root@localhost cmake-2.8.6]# cd
[root@locahost ~]# tar -zxvf mysql-5.6.36.tar.gz 
[root@localhost ~# cd /usr/local/mysql-5.6.36/
[root@locahost mysql-5.6.36]# cmake -DCMAKE INSTALL PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
[root@localhost mysql-5.6.36]# make && make install

         复制配置文件到/etc下,并把 MySQL 添加到服务。之后初始化数据库。

[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -M -s /sbin/nologin mysql -g mysql
[root@localhost ~]# chown -R mysql.mysql /usr/local/mysql
[root@localhost ~]#/usr/localmysql/scripts/mysql_install_db   --basedir=/usr/local/mysql    --datadir=/usr/local/mysql/data    --user=mysql

        启动 mysql,并设置密码。

[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysqladmin -u root password '123.com'

(2)安装PHP解析环境

        新版本的 PHP(如 5.5 版本)已经自带 FPM(FastCGl Process Manager,FastCGl进程管理器)模块,用来对 PHP 解析实例进行管理、优化解析效率。单服务器的LNMP 架构通常使用这种方式,因此在配置 PHP 编译选项时应添加""--enable-fpm"以启用此模块。

[root@localhost ~]# yum -y install gd libxml2-devel libjpeg-devel libpng-devel
[root@localhost ~]#tar -zxvf php-5.5.38.tar.gz -C /usr/local/
[root@localhost ~]#cd /usr/localphp-5.5.38/
[root@localhost php-5.5.38]# ./configurel--prefix=/usr/local/php5 --with-gd --with-zlib 
--with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql config  --with-config-file-path=/usr/local/php5  --enable-mbstring  --enable-fpm --with-jpeg-dir=/usr/lib
[root@localhost php-5.5.38]# make && make install

        安装后调整

[root@localhost php-5.5.38]# cp php.ini-development /usr/local/php5/php.ini
[root@localhost php-5.5.38]# ln -s /usr/local/php5/bin/* /usr/local/bin
[root@localhost php-5.5.38]# ln -s /usr/local/php5/sbin/* /usr/local/sbin

 (3)配置Nginx支持PHP环境

        若要让 Nginx 能够解析 PHP 网页,有两种方法可以选择:其一,充当中介,将访问 PHP页面的 Web 请求转交给其他服务器(LAMP)去处理;其二,通过使用 PHP 的 FPM 模块来调用本机的 PHP 环境。
        如果选用 fpm 方式,则需要先启动 php-fpm 进程,以便监听 php 解析请求。参考范例建立 php-fpm.conf配置文件,并修改其中的 PID 文件、运行用户、服务数(进程数量)等相关设置,然后启动 php-fpm 程序即可(默认监听本机的 9000端口)。

[root@localhost ~]# cd /usr/local/php5/etc
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# useradd -M -s /sbin/nologin php
[root@localhost etc]# vim php-fpm.conf

pid = run/php-fpm.pid
user = php
group= php

pm.max children= 50
pm.start servers = 20

pm.min spare servers= 5
pm.max spare servers=35
[root@localhost etc]# /usr/local/sbin/php-fpm
[root@localhost etc# netstat -anpt | grep php-fpm

tcp 0 0 127.0.0.1:9000    0.0.0.0:*     LISTEN   5798/php-fpm: maste

        在 php-fpm.conf 文件中,pid 配置行指出了 PID 信息的存放位置,对应的实际路径为/usr/local/php5/var/run/php-fpm.pid。根据上述信息,可以修改 Nginx 服务脚本,以便启动/停止 Nginx 服务器时将 php-fpm 进程也自动启停。
        无论是将 PHP 页面交给 LAMP 服务去解析,还是调用本机的 php-fpm 进程进行解析,都需要在“"server{}”配置段中添加 location 设置,以便指定当访问.php 页面时采取何种操作。
        对于第一种方法(转给其他 Web 服务器处理),使用的配置语句如下所示。例如,交给 IP 地址为 192.168.1.22 的 LAMP 服务器处理,从而实现由 Nginx 负责处理静态页面,LAMP 负责动态页面的分离效果。
        对于第二种方法(调用本机的 php-fpm 进程),使用的配置语句如下所示。

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
Server{
        listen    80;
        server name    ww.benet.com;

location ~ \.php$ {
                root        /var/www/html;
                fastcgi pass127.0.0.1:9000;
                fastcgi indexindex.php;
                include    fastcgi.conf;
}

        上述方法中,选用任何一种都可以,本章中建议使用第二种。完成修改以后,重新加载Nginx 服务即可生效。
        以调用 php-fpm 解析为例,可以在 PHP 文档根目录下创建一个测试页面,用以测试PHP语句能否正常解析,以及能否连接 MySQL 数据库。访问测试页面,如 http:/hwww.bt.com/test.php,若能看到连接成功的提示信息,则表示 PHP 解析及数据库连接均正常。反之,需根据页面提示信息、日志消息等进行排查,排除相应故障。 

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值