Nginx 访问控制、用户认证、HTTPS配置实操手册

Nginx 访问控制、用户认证、HTTPS配置实操手册

本文档基于实际环境

三台主机:

nginx 服务器hrz1(192.168.100.10)

hrz2(192.168.100.20)

hrz3(192.168.100.30)

详细记录Nginx三大核心功能的配置流程与验证结果,适用于服务器安全加固与HTTPS部署场景。

一、Nginx访问控制

基于location段配置IP级别的访问权限,结合stub_status模块监控服务状态,核心是allow(允许)和deny(拒绝)指令,匹配规则为"先定义先生效"

1.1 基于IP的访问控制(allow/deny)

场景1:拒绝特定IP访问(如拒绝hrz2)

nginx.conflocation /段添加deny指令,拒绝192.168.100.20(hrz2)访问,配置如下:

bash 复制代码
location / {
    deny 192.168.100.20; # 拒绝hrz2主机(IP为192.168.100.20)的所有访问请求
    root   html; # 网站根目录,指向Nginx默认的html文件夹
    index  index.html index.htm; # 默认索引页,优先加载index.html,不存在则加载index.htm
}
  • 验证结果

    • hrz2访问被拒绝(返回403 Forbidden,无权限访问):

      java 复制代码
      [root@hrz2 ~]# curl http://192.168.100.10 // 从hrz2主机访问hrz1的Nginx服务
      <html><head><title>403 Forbidden</title></head>
      <body><center><h1>403 Forbidden</h1></center></body></html> // 拒绝访问的响应内容
    • hrz3访问正常(未被拒绝,返回网页内容):

      java 复制代码
      [root@hrz3 ~]# curl http://192.168.100.10  //从hrz3主机访问hrz1的Nginx服务
      welcome luoqi // 正常返回网站根目录下的索引页内容
场景2:仅允许特定IP访问(如仅允许hrz2)

需先通过allow指定允许的IP,再用deny all拒绝所有其他IP(顺序不可颠倒,否则allow会失效),配置如下:

bash 复制代码
location / {
    allow 192.168.100.20; # 仅允许hrz2主机(IP为192.168.100.20)访问
    deny all; # 拒绝除上述IP外的所有主机访问
    root   html; # 网站根目录
    index  index.html index.htm; # 默认索引页
}
  • 验证结果

    • hrz2访问正常(允许访问,返回网页内容):

      java 复制代码
      [root@hrz2 ~]# curl http://192.168.100.10 // 从hrz2访问hrz1的Nginx
      welcome luoqi // 正常返回索引页内容
    • hrz3访问被拒绝(不在允许列表,返回403):

      java 复制代码
      [root@hrz3 ~]# curl http://192.168.100.10 // 从hrz3访问hrz1的Nginx
      <html><head><title>403 Forbidden</title></head></html> // 拒绝访问的响应内容

1.2 启用stub_status状态监控

stub_status模块是Nginx内置的状态监控模块,用于查看服务实时运行状态(如连接数、请求数、空闲连接等),需在单独的location段配置。

配置步骤
  1. nginx.conf中添加状态监控路径(此处路径为/status,可自定义):

    bash 复制代码
    location /status { # 访问路径为http://IP/status时触发监控逻辑
        stub_status on; # 开启状态监控功能(off为关闭)
    }
  2. 测试配置文件语法(避免配置错误导致Nginx异常),并重载配置(使新配置生效):

    java 复制代码
    [root@hrz1 ~]# nginx -t // 验证Nginx配置文件语法是否正确
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok // 语法正确提示
    [root@hrz1 ~]# nginx -s reload // 平滑重载配置(不中断现有服务)
状态指标解释

通过curl或浏览器访问/status路径,可查看Nginx状态信息(以hrz2访问为例):

java 复制代码
[root@hrz2 ~]# curl http://192.168.100.10/status // 访问hrz1的Nginx状态页
Active connections: 1 // 当前活动连接数(含处理中+等待中的连接)
server accepts handled requests
 11 11 11 // 依次为:总接受连接数、成功处理握手数、总处理请求数(三者通常相等,若accepts>handled可能有连接异常)
Reading: 0 // Nginx正在读取客户端请求头的连接数(读请求阶段)
Writing: 1 // Nginx正在向客户端返回响应头的连接数(写响应阶段)
Waiting: 0 // 开启keep-alive后,空闲等待下一次请求的连接数(计算公式:Active - (Reading + Writing))
  • 运维建议
    • Waiting数值较大,说明服务处理效率高(请求快速完成,连接空闲等待下次请求),属于正常现象;
    • Reading + Writing数值较大,说明并发访问量高(大量请求正在处理),需关注服务器资源(CPU、内存)是否充足。

二、Nginx用户认证(auth_basic)

通过"用户名+加密密码"控制特定路径的访问权限(如/status状态页、后台管理页面),依赖Nginx的auth_basic模块,密码需用htpasswd工具加密(避免明文存储导致安全风险)。

  • auth_basic "欢迎信息";该指令用于启用 HTTP 基本认证,并设置认证弹窗中显示的提示信息(这里是 "欢迎信息")。当用户访问配置了该指令的资源时,浏览器会弹出一个登录弹窗,显示这段文字,提示用户输入用户名和密码。
  • auth_basic_user_file "/path/to/user_auth_file";该指令指定存储用户名和密码的认证文件路径(/path/to/user_auth_file是文件的实际路径)。Nginx 会通过读取这个文件来验证用户输入的凭据是否有效。

//user_auth_file内容格式

username:password

//这里的密码为加密后的密码串,建议用htpasswd来创建文件

htpasswd -c -m /path/to/.user_auth_file USERNAME

2.1 前置准备:安装htpasswd工具

htpasswd是Apache工具集(httpd-tools)中的密码生成工具,用于生成加密的用户密码文件,需先安装:

java 复制代码
[root@hrz1 ~]# yum -y install httpd-tools // CentOS/RHEL系统通过yum安装(Ubuntu用apt-get install apache2-utils)

2.2 步骤1:创建加密密码文件

在Nginx配置目录(如/usr/local/nginx/conf/,方便管理)创建用户密码文件,文件格式为"用户名:加密密码":

java 复制代码
// -c:新建密码文件(若文件已存在,需去掉-c,否则会覆盖原有文件);-m:用MD5算法加密密码;.user_auth_file:密码文件名(前缀.表示隐藏文件);hrz:用户名
[root@hrz1 conf]# htpasswd -c -m .user_auth_file hrz
New password: // 输入密码(如123456,输入时不显示明文)
Re-type new password: // 重复输入密码(确认一致性)
Adding password for user hrz // 提示:成功为用户hrz添加密码
  • 查看密码文件(密码已通过MD5加密,非明文):

    java 复制代码
    [root@hrz1 conf]# cat .user_auth_file // 查看密码文件内容
    hrz:$apr1$bUa8vnq3$Rla.Z2lglgiyMD5O7qDbo0 // 格式:用户名:MD5加密后的密码串

2.3 步骤2:配置Nginx用户认证

在需要保护的location段(如/status状态页)添加auth_basic相关指令,注意密码文件必须使用绝对路径(避免Nginx找不到文件)

bash 复制代码
location /status {
    stub_status on; # 保留状态监控功能
    auth_basic "welcome to luoqi"; # 认证弹窗的提示信息(浏览器访问时显示)
    auth_basic_user_file "/usr/local/nginx/conf/.user_auth_file"; # 密码文件的绝对路径(必须准确)
}

2.4 步骤3:验证效果

  1. 重载Nginx配置(使认证配置生效):

    java 复制代码
    [root@hrz1 conf]# nginx -s reload // 平滑重载配置


三、Nginx HTTPS配置(自签证书)

HTTPS协议基于SSL/TLS加密,需依赖SSL证书实现身份验证和数据加密。本文采用"自签CA证书"(适合测试环境,无需付费),生产环境建议使用可信CA机构(如Let's Encrypt、阿里云SSL)颁发的证书(浏览器默认信任)。

角色划分

  • CA服务器:hrz3(192.168.100.30)(负责生成根证书、签署Nginx的证书请求);
  • Nginx服务器:hrz1(192.168.100.10)(负责生成证书请求文件、部署HTTPS服务)。

3.1 步骤1:CA服务器(hrz3)生成根证书

根证书是CA机构的核心证书,用于签署其他服务器的证书(证明服务器证书的合法性),生成步骤如下:

  1. 进入CA默认工作目录(/etc/pki/CA/是系统默认的CA目录,包含证书相关子目录):

    java 复制代码
    [root@hrz3 ~]# cd /etc/pki/CA/ // 进入CA工作目录
  2. 生成CA私钥(cakey.pem),私钥是CA的核心密钥,需严格保密(umask 077确保私钥仅root用户可读,其他用户无权限):

    java 复制代码
    // umask 077:设置文件权限掩码,确保生成的私钥权限为-rw-------(仅root可读可写);openssl genrsa:生成RSA私钥;-out private/cakey.pem:私钥保存路径;2048:私钥长度(2048位及以上安全,越长加密强度越高)
    [root@hrz3 CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
    Generating RSA private key, 2048 bit long modulus
    ......+++ // 生成私钥的过程输出(省略部分内容)
  3. 生成CA根证书(cacert.pem),根证书是公开的,用于分发给客户端(证明CA身份),需填写证书标识信息:

    java 复制代码
    // openssl req:生成证书请求或自签证书;-new:生成新的证书请求;-x509:生成自签证书(CA根证书需自签);-key private/cakey.pem:指定私钥(用于签名);-out cacert.pem:根证书保存路径;-days 1024:证书有效期(1024天,约2.8年)
    [root@hrz3 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 1024
    You are about to be asked to enter information that will be incorporated into your certificate request.
    -----
    Country Name (2 letter code) [XX]:CN // 国家代码(如CN=中国,必须为2位字母)
    State or Province Name (full name) []:HB // 省份(如HB=湖北省,可自定义)
    Locality Name (eg, city) [Default City]:WH // 城市(如WH=武汉市,可自定义)
    Organization Name (eg, company) []:luoqi // 组织/公司名称(可自定义)
    Organizational Unit Name (eg, section) []:linux // 部门名称(可自定义)
    Common Name (eg, your server's hostname) []:hrz3 // CA服务器的主机名(需唯一,不可与Nginx服务器重复)
    Email Address []:hrz3@example.com // 邮箱地址(可自定义,用于联系)

3.2 步骤2:Nginx服务器(hrz1)生成证书请求(CSR)

CSR(Certificate Signing Request,证书请求文件)是Nginx服务器向CA申请证书的"申请材料",包含服务器的标识信息和公钥,生成步骤如下:

  1. 进入Nginx配置目录(方便管理证书文件):

    java 复制代码
    [root@hrz1 ~]# cd /usr/local/nginx/conf/ // 进入Nginx配置目录
  2. 生成Nginx服务器的私钥(httpd.key),用于后续加密数据(同样需保密):

    java 复制代码
    // umask 077:确保私钥仅root可读;-out httpd.key:Nginx私钥保存路径;2048:私钥长度
    [root@hrz1 conf]# (umask 077; openssl genrsa -out httpd.key 2048)
    Generating RSA private key, 2048 bit long modulus
    .............+++ // 生成私钥的过程输出(省略部分内容)
  3. 生成CSR文件(httpd.csr),填写的信息需与CA根证书保持一致(除Common Name为Nginx服务器主机名):

    java 复制代码
    // -key httpd.key:指定Nginx的私钥(用于生成CSR);-out httpd.csr:CSR文件保存路径;-days 1024:请求的证书有效期
    [root@hrz1 conf]# openssl req -new -key httpd.key -days 1024 -out httpd.csr
    You are about to be asked to enter information that will be incorporated into your certificate request.
    -----
    Country Name (2 letter code) [XX]:CN // 与CA根证书一致(CN)
    State or Province Name (full name) []:HB // 与CA根证书一致(HB)
    Locality Name (eg, city) [Default City]:WH // 与CA根证书一致(WH)
    Organization Name (eg, company) []:luoqi // 与CA根证书一致(luoqi)
    Organizational Unit Name (eg, section) []:linux // 与CA根证书一致(linux)
    Common Name (eg, your server's hostname) []:hrz1 // Nginx服务器的主机名(与CA的hrz3区分)
    Email Address []:hrz1@example.com // 邮箱地址(可自定义)
    A challenge password []: // 可选(证书申请密码,直接回车跳过)
    An optional company name []: // 可选(额外公司信息,直接回车跳过)
  4. 将CSR文件发送到CA服务器(hrz3),用于CA签署证书:

    java 复制代码
    // scp:通过SSH协议传输文件;httpd.csr:本地CSR文件路径;root@192.168.100.30:/root/:目标服务器(hrz3)的用户、IP和保存路径
    [root@hrz1 conf]# scp httpd.csr root@192.168.100.30:/root/
    root@192.168.100.30's password: // 输入hrz3的root密码(传输验证)
    httpd.csr 100% 1025   882.8KB/s   00:00 // 传输完成提示

3.3 步骤3:CA服务器(hrz3)签署Nginx证书

CA服务器接收CSR文件后,用根证书和CA私钥对其签名,生成Nginx可使用的正式证书(httpd.crt),步骤如下:

  1. 准备CA签署所需的辅助文件(index.txt记录证书索引,serial记录证书序列号,默认不存在需手动创建):

    java 复制代码
    [root@hrz3 ~]# touch /etc/pki/CA/index.txt // 创建证书索引文件(记录所有签署过的证书)
    [root@hrz3 ~]# echo "01" > /etc/pki/CA/serial // 创建证书序列号文件(第一个证书序列号为01,后续递增)
  2. 用CA根证书签署Nginx的CSR文件,生成正式证书:

    java 复制代码
    // openssl ca:CA签署命令;-in httpd.csr:指定待签署的CSR文件(路径为/root/httpd.csr);-out httpd.crt:签署后的证书保存路径;-days 1024:证书有效期
    [root@hrz3 ~]# openssl ca -in httpd.csr -out httpd.crt -days 1024
    Using configuration from /etc/pki/tls/openssl.cnf // 加载OpenSSL默认配置
    Check that the request matches the signature // 验证CSR签名一致性(确保未被篡改)
    Signature ok // 签名验证通过
    Certificate is to be certified until Jul 18 02:45:32 2028 GMT (1024 days) // 证书有效期提示
    Sign the certificate? [y/n]:y // 确认签署证书(输入y)
    1 out of 1 certificate requests certified, commit? [y/n]y // 确认提交签署结果(输入y)
    Write out database with 1 new entries // 更新证书索引文件
    Data Base Updated // 操作完成提示
  3. 将签署后的正式证书(httpd.crt)和CA根证书(cacert.pem)发送回Nginx服务器(hrz1):

    java 复制代码
    // 发送正式证书httpd.crt到hrz1的Nginx配置目录
    [root@hrz3 ~]# scp httpd.crt root@192.168.100.10:/usr/local/nginx/conf/
    // 发送CA根证书cacert.pem到hrz1的Nginx配置目录(部分场景需客户端信任,可选)
    [root@hrz3 ~]# scp /etc/pki/CA/cacert.pem root@192.168.100.10:/usr/local/nginx/conf/

3.4 步骤4:Nginx服务器(hrz1)配置HTTPS

HTTPS默认使用443端口,需在nginx.conf中添加443端口的server段,配置SSL相关参数:

bash 复制代码
server {
    listen       443 ssl; # 监听443端口(HTTPS默认端口),并启用SSL功能
    server_name  localhost; # 服务器名称(可改为域名,如www.example.com)

    # SSL证书核心配置
    ssl_certificate      httpd.crt; # Nginx的正式证书(CA签署后生成的httpd.crt)
    ssl_certificate_key  httpd.key; # Nginx的私钥(之前生成的httpd.key)
    ssl_session_cache    shared:SSL:1m; # SSL会话缓存配置:shared表示共享缓存,SSL为缓存名称,1m为缓存大小(1MB约存4000个会话)
    ssl_session_timeout  5m; # SSL会话超时时间(5分钟内重复访问无需重新握手,提升效率)
    ssl_ciphers          HIGH:!aNULL:!MD5; # 启用高强度加密算法(HIGH),禁用无加密(aNULL)和弱加密(MD5)算法
    ssl_prefer_server_ciphers  on; # 优先使用服务器端支持的加密套件(避免客户端使用弱算法)

    # 网站核心配置(与HTTP的location一致)
    location / {
        root   html; # 网站根目录
        index  index.html index.htm; # 默认索引页
    }
}
  • 测试配置文件语法并重载Nginx(确保配置无错误):

    java 复制代码
    [root@hrz1 conf]# nginx -t // 验证HTTPS配置语法
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok // 语法正确提示
    [root@hrz1 conf]# nginx -s reload // 平滑重载配置(启用HTTPS)

3.5 步骤5:验证HTTPS访问

  1. 准备测试网页(可选,用于验证访问效果):

    java 复制代码
    // 向Nginx根目录的index.html文件写入测试内容(原文为indext.html,建议修正为index.html,符合默认索引页规则)
    [root@hrz1 conf]# echo "Holle world" > /usr/local/nginx/html/index.html
相关推荐
2501_915918413 小时前
Video over HTTPS,视频流(HLSDASH)在 HTTPS 下的调试与抓包实战
网络协议·http·ios·小程序·https·uni-app·iphone
Lin_Aries_04214 小时前
在 Kubernetes 集群中运行并发布应用程序
运维·nginx·docker·云原生·容器·kubernetes·自动化
uhakadotcom5 小时前
入门教程:常用的 Python 第三方库:python-logstash
后端·面试·github
绝无仅有5 小时前
资深面试之MySQL 问题及解答(一)
后端·面试·github
绝无仅有5 小时前
面试MySQL 高级问题及解答(三)
后端·面试·github
rggrgerj7 小时前
前后端部署实战:Vue3+Vite+PNPM + NestJS + Docker + Nginx + 云效
nginx·docker·容器
Jackilina_Stone16 小时前
一个高性能的HTTP和反向代理服务器:Nginx
nginx·http·ai 推理·nv
Lin_Aries_042117 小时前
部署 GitLab 服务器
linux·运维·服务器·docker·gitlab·github
渡我白衣18 小时前
HTTPS协议原理
网络协议·http·https