当前位置: 首页 > news >正文

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)访问,配置如下:

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,无权限访问):

      [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访问正常(未被拒绝,返回网页内容):

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

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

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

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

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

      [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,可自定义):

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

    [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访问为例):

[root@hrz2 ~]# curl http://192.168.100.10/status // 访问hrz1的Nginx状态页
Active connections: 1 // 当前活动连接数(含处理中+等待中的连接)
server accepts handled requests11 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)中的密码生成工具,用于生成加密的用户密码文件,需先安装:

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

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

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

// -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加密,非明文):

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

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

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

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配置(使认证配置生效):

    [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目录,包含证书相关子目录):

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

    // 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身份),需填写证书标识信息:

    // 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配置目录(方便管理证书文件):

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

    // 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服务器主机名):

    // -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签署证书:

    // 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记录证书序列号,默认不存在需手动创建):

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

    // 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):

    // 发送正式证书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相关参数:

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(确保配置无错误):

    [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. 准备测试网页(可选,用于验证访问效果):

    // 向Nginx根目录的index.html文件写入测试内容(原文为indext.html,建议修正为index.html,符合默认索引页规则)
    [root@hrz1 conf]# echo "Holle world" > /usr/local/nginx/html/index.html
    

    在这里插入图片描述

http://www.dtcms.com/a/419778.html

相关文章:

  • github repository 一个文件忘记添加到 .gitignore
  • 【STM32项目开源】基于STM32的智能语音分类垃圾桶
  • wordpress建站详细教程网页打不开视频怎么办
  • 【开题答辩全过程】以 基于Java的物流管理系统为例,包含答辩的问题和答案
  • BCEWithLogitsLoss
  • 在线设计网站大全网站建设方案推销
  • CUDA框架
  • 辽阳专业建设网站公司wordpress rss 爬取
  • TypeScript 简介与项目中配置
  • 南宁seo建站seo网站优化排名
  • 【每日一问】老化测试有什么作用?
  • 广州信科做网站dede 门户网站
  • 【JDBC】系列文章第一章,怎么在idea中连接数据库,并操作插入数据?
  • 企业的网站建设朔州网站建设收费
  • 外贸上哪个网站开发客户网站建设费可分摊几年
  • 8. mutable 的用法
  • 做网站 php j2ee做网站投注员挣钱吗
  • 试玩平台网站开发录入客户信息的软件
  • 网站建设谈单情景对话wordpress外网访问错误
  • 怎么学网站开发海阳网站制作
  • 肥东建设局网站家具设计师常去的网站
  • 查网站开通时间网站设计 职业
  • 重庆网站优化搜索引擎优化包括( )方面的优化
  • 助力工业转型升级 金士顿工博会大放异彩
  • 智慧校园智能一卡通管理系统的完整架构与功能模块设计,结合技术实现与应用场景,分为核心平台、功能子系统及扩展应用三部分
  • @[TOC](【笔试强训】Day02) # 1. ⽜⽜的快递(模拟) [题⽬链接: BC64 ⽜⽜的快递]
  • 广州魔站建站3d演示中国空间站建造历程
  • MySQL数据库——13.2.2 JDBC编程-鑫哥演示使用过程
  • AWS实战:轻松创建弹性IP,实现固定公网IP地址
  • 网站制作谁家好vps可以做wordpress和ssr