Nginx网站服务

  • 学会Nginx网站服务的基本构建
  • 了解Nginx访问控制实现的方法
  • 掌握Nginx部署虚拟主机的方法

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

1.1 Nginx服务基础

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

本节将介绍 Nginx 的安装配置方法

1.1.1 Nginx 1.12安装及运行控制

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

1. 编译安装Nginx

(1)安装支持软件

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

复制代码
[root@node2 ~]# yum -y install pcre-devel zlib-devel gcc++ gcc

(2)创建运行用户、组

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

复制代码
[root@node2 ~]# useradd -M -s /sbin/nologin nginx

(3)编译安装Nginx

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

复制代码
[root@node2 ~]# tar zxvf nginx-1.22.1.tar.gz
[root@node2 ~]# cd nginx-1.22.1/
[root@node2 nginx-1.22.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@node2 nginx-1.22.1]# make && make install

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

复制代码
[root@node2 nginx-1.22.1]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/[root@node2 nginx-1.22.1]# ls -l /usr/local/sbin/nginx 
lrwxrwxrwx. 1 root root 27 1月   5 11:08 /usr/local/sbin/nginx -> /usr/local/nginx/sbin/nginx
[root@node2 nginx-1.22.1]#

2. Nginx的运行控制

(1)检查配置文件

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

复制代码
[root@node2 ~]# 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@node2 ~]#

(2)启动、停止Nginx

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

复制代码
[root@node2 ~]# nginx

通过检查 Nginx 程序的监听状态,或者在浏览器中访问此 Web 服务(默认页面将显示 "Welcome to nginx!"),可以确认 Nginx 服务是否正常运行

复制代码
[root@node2 ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      69254/nginx: master 
[root@node2 ~]# yum -y install elinks

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

复制代码
[root@node2 ~]# killall -s HUP nginx    //选项-s HUP 等同于-1
[root@node2 ~]# killall -s QUIT nginx    //选项-s QUIT 等同于-3

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

(3)添加Nginx系统服务

复制代码
[root@node2 ~]# vim /etc/init.d/nginx 
#!/bin/bash
#chkconfig: - 99 20
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@node2 ~]# chmod +x /etc/init.d/nginx 
[root@node2 ~]# chkconfig --add nginx
[root@node2 ~]# systemctl status nginx
● nginx.service - (null)
   Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)
[root@node2 ~]#

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

1.1.2 配置文件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        logs/nginx.pid;        //PID文件的位置

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

  1. 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 ),当然具体还要看服务器硬件、网络带宽等物理条件的性能表现

  1. HTTP配置

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

复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;
    server {                                    //web服务的监听配置
        listen       80;                        //监听地址及端口
        server_name  www.aaa.com;               //网站名称(aaa)
        charset utf-8                           //网页的默认字符集

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {                            //根目录的配置
            root   html;
            index  index.html index.php;        //安装默认首页
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;    //内部错误的反馈页面
        location = /50x.html {                    //错误页面配置
            root   html;
        }
    }
}

述配置中,listen 语句允许同时限定 IP 地址,采用 "IP 地址 : 端口 " 形式。 root 语句用来设置特定访问位置(如"location /" 表示根目录)的网页文档路径,默认为 Nginx 安装目录下的 html/ 子目录,根据需要可改为 /var/www/html 等其他路径

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

复制代码
server {
        listen       80;
        server_name  www.aaa.com;
        charset utf-8

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.php;
        }

        location /status {            //访问位置为/status
            stub_status    on;       //打开状态统计功能
            access_log    off;       //关闭此位置的日志记录
        }

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

1.2 Nginx访问控制

1.2.1 基于授权的访问控制

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

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

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

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

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

复制代码
[root@node2 ~]# yum -y install httpd-tools
[root@node2 ~]# htpasswd -c /usr/local/nginx/passwd.db test
New password: 
Re-type new password: 
Adding password for user test
[root@node2 ~]# cat /usr/local/nginx/passwd.db 
test:$apr1$x5x0mgJ7$3t7bCokcPV.7aDKQhLfjj0
[root@node2 ~]#

(2)修改密码文件权限为400,将所有者改为nginx,设置Nginx的运行用户能读取

复制代码
[root@node2 ~]# chmod 400 /usr/local/nginx/passwd.db 
[root@node2 ~]# chown nginx /usr/local/nginx/passwd.db 
[root@node2 ~]# ll -d /usr/local/nginx/passwd.db 
-r--------. 1 nginx root 43 1月   5 12:19 /usr/local/nginx/passwd.db
[root@node2 ~]#

(3)修改配置文件nginx.conf,添加相对应认证配项

复制代码
[root@node2 ~]# vim /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  www.aaa.com;
        charset utf-8;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.php;
            auth_basic "secret";
            auth_basic_user_file /usr/local/nginx/passwd.db;
        }

        location /status {
            stub_status    on;
            access_log    off;
        }

(4)检查语法,重启服务

复制代码
[root@node2 ~]# 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@node2 ~]# systemctl restart nginx

(5)用浏览器访问地址,检验控制效果,如图所示。需要输入用户名和密码进行访问,验证通过后才能访问到页面

1.2.2 基于客户端的访问控制

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

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

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

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

(1)修改主配置文件nginx.conf添加相应配置项

复制代码
server {
        listen       80;
        server_name  www.aaa.com;
        charset utf-8;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.php;
            auth_basic "secret";
            auth_basic_user_file /usr/local/nginx/passwd.db;
            deny 192.168.161.12;        //客户端IP
            allow all;
        }

        location /status {
            stub_status    on;
            access_log    off;
        }

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

(2)重启服务器访问地址,页面已经访问不到,如图所示

1.3 Nginx虚拟主机

1. 基于IP的虚拟主机

(1)一台主机如果有多个 IP 地址,可以设置每一个 IP 对应一个站点。主机安装多个网卡可以有多个 IP ,这里采用虚拟 IP 的方式使主机有多个 IP

复制代码
[root@node2 ~]# ip addr show dev ens33 | grep inet
    inet 192.168.161.13/24 brd 192.168.161.255 scope global noprefixroute ens33
    inet6 fe80::2ffd:5682:73d6:ecd4/64 scope link noprefixroute 
[root@node2 ~]#

目前只有一个网卡,IP地址是192.168.161.13。再配置一个虚拟IP为192.168.161.100

复制代码
[root@node2 ~]# ifconfig ens33:0 192.168.161.100
[root@node2 ~]# ip addr show dev ens33 | grep inet
    inet 192.168.161.13/24 brd 192.168.161.255 scope global noprefixroute ens33
    inet 192.168.161.100/24 brd 192.168.161.255 scope global secondary ens33:0
    inet6 fe80::2ffd:5682:73d6:ecd4/64 scope link noprefixroute 
[root@node2 ~]#

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

复制代码
[root@node2 ~]# vim /usr/local/nginx/conf/nginx.conf
 
    server {
        listen      192.168.161.13:80;
        server_name      www.aaa.com;
        charset     utf-8;
        access_log  logs/www.aaa.access.log;
        location / {
            root    /var/www/html/bdqncom;
            index   index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen      192.168.161.100:80;
        server_name      www.bbb.com;
        charset     utf-8;
        access_log  logs/www.bbb.access.log;
        location / {
            root    /var/www/html/accpcom;
            index   index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
 
[root@node2 ~]# 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@node2 ~]# 
[root@node2 ~]# systemctl restart nginx

( 3 )分别访问 2 个 IP 地址,如图所示,查看是否访问到不同的页面,测试配置是否成功

相关推荐
崔庆才丨静觅5 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了6 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅6 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅6 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
七夜zippoe6 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥6 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
崔庆才丨静觅6 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅7 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端