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.conf
的location /
段添加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
段配置。
配置步骤
-
在
nginx.conf
中添加状态监控路径(此处路径为/status
,可自定义):location /status { # 访问路径为http://IP/status时触发监控逻辑stub_status on; # 开启状态监控功能(off为关闭) }
-
测试配置文件语法(避免配置错误导致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:验证效果
-
重载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机构的核心证书,用于签署其他服务器的证书(证明服务器证书的合法性),生成步骤如下:
-
进入CA默认工作目录(
/etc/pki/CA/
是系统默认的CA目录,包含证书相关子目录):[root@hrz3 ~]# cd /etc/pki/CA/ // 进入CA工作目录
-
生成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 ......+++ // 生成私钥的过程输出(省略部分内容)
-
生成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申请证书的“申请材料”,包含服务器的标识信息和公钥,生成步骤如下:
-
进入Nginx配置目录(方便管理证书文件):
[root@hrz1 ~]# cd /usr/local/nginx/conf/ // 进入Nginx配置目录
-
生成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 .............+++ // 生成私钥的过程输出(省略部分内容)
-
生成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 []: // 可选(额外公司信息,直接回车跳过)
-
将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
),步骤如下:
-
准备CA签署所需的辅助文件(
index.txt
记录证书索引,serial
记录证书序列号,默认不存在需手动创建):[root@hrz3 ~]# touch /etc/pki/CA/index.txt // 创建证书索引文件(记录所有签署过的证书) [root@hrz3 ~]# echo "01" > /etc/pki/CA/serial // 创建证书序列号文件(第一个证书序列号为01,后续递增)
-
用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 // 操作完成提示
-
将签署后的正式证书(
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访问
-
准备测试网页(可选,用于验证访问效果):
// 向Nginx根目录的index.html文件写入测试内容(原文为indext.html,建议修正为index.html,符合默认索引页规则) [root@hrz1 conf]# echo "Holle world" > /usr/local/nginx/html/index.html