Nginx网站服务

在各种网站服务器软件中,除了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 个端口地址

相关推荐
看山还是山,看水还是。40 分钟前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
扣得君1 小时前
C++20 Coroutine Echo Server
运维·服务器·c++20
keep__go1 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求1 小时前
Linux中给普通账户一次性提权
linux·运维·服务器
Fanstay9851 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
death bell2 小时前
Docker基础概念
运维·docker·容器
ʚɞ4963 小时前
应用程序部署(IIS的相关使用,sql server的相关使用)
运维·服务器
少陽君3 小时前
服务器显卡和桌面pc显卡有什么不同
运维·服务器
daizikui3 小时前
Linux文件目录命令
linux·运维·服务器
叫我龙翔4 小时前
【项目日记】仿mudou的高并发服务器 --- 整体框架搭建 ,实现时间轮模块
运维·服务器·网络·c++·github