Nginx核心配置详解:访问控制、用户认证与HTTPS部署
一、Nginx访问控制
Nginx访问控制功能主要通过allow
和deny
指令实现,二者均作用于location
段,用于精确管控特定URL路径的访问权限,支持单IP、多IP等多种配置方式,满足不同场景下的访问限制需求。
1.核心指令说明
指令 | 功能描述 | 参数格式 |
---|---|---|
allow | 设定允许访问的主机/IP,优先级低于deny | 单个IP(如192.168.100.20 )、多个IP(空格分隔,如192.168.100.20 192.168.100.30 ) |
deny | 设定禁止访问的主机/IP,优先级高于allow | 格式同allow ,支持deny all (禁止所有主机) |
2.典型配置场景
场景1:拒绝特定主机访问Nginx状态页面
若需禁止IP为192.168.100.40
的主机访问/status
状态页面,配置如下:
location /status {echo "ycy"; # 页面输出内容,可根据需求自定义deny 192.168.100.40; # 禁止指定IP访问
}
- 验证结果:当
192.168.100.40
主机通过curl 192.168.100.10/status
访问时,Nginx会返回403 Forbidden
错误,页面内容如下:
<html>
<head><title>403 Forbidden</title></head><body><center><h1>403 Forbidden</h1></center><hr><center>nginx/1.20.0</center></body>
</html>
场景2:开启stub_status模块查看Nginx状态
stub_status
模块是Nginx内置的状态监控模块,可实时展示连接数、请求处理情况等核心指标,需在location
段中启用:
location /status {echo "ycy"; # 自定义页面标识stub_status on; # 开启状态监控
}
- 状态指标说明:通过
curl 192.168.100.10/status
访问,返回结果及含义如下:Active connections: 1
:当前Nginx正在处理的活动连接数,包括读取请求、发送响应和等待的连接。server accepts handled requests: 63 63 62
:依次表示Nginx启动后总共接收的连接数、成功建立的TCP握手数、处理的HTTP请求数(若“接收数≠握手数”,可能存在TCP连接建立失败问题)。Reading: 0
:Nginx正在读取客户端请求头的连接数。Writing: 1
:Nginx正在向客户端发送响应头的连接数。Waiting: 0
:开启keep-alive
(长连接)时,已处理完请求、等待客户端下一次请求的连接数,计算公式为Waiting = Active connections - (Reading + Writing)
。正常情况下,若业务处理速度快,Waiting
数值会较高;若Reading + Writing
数值高,说明并发访问量大,需关注服务器性能。
场景3:allow与deny组合配置
当allow
和deny
同时存在时,Nginx会按“先匹配先执行”的原则处理,且deny
优先级更高。以下配置仅允许192.168.100.40
访问/status
,禁止其他所有主机:
location /status {stub_status on; # 开启状态监控allow 192.168.100.40; # 允许指定IPdeny all; # 禁止其余所有IP
}
场景4:默认访问策略与常见配置
Nginx访问控制的默认策略为allow all
(允许所有主机访问),基于此可衍生两种常用配置:
- 仅允许指定IP访问,禁止其他IP:适用于内部管理页面、敏感接口等场景,配置如下:
location /admin { # 示例路径,可替换为实际需要限制的路径allow 192.168.100.11; # 允许第一个IPallow 192.168.100.12; # 允许第二个IPdeny all; # 禁止其余所有IP
}
- 仅禁止指定IP访问,允许其他IP:适用于屏蔽恶意IP、限制特定主机的场景,配置如下:
location / { # 对根路径生效,可按需调整路径deny 192.168.100.11; # 禁止第一个IPdeny 192.168.100.12; # 禁止第二个IPallow all; # 允许其余所有IP
}
二、Nginx用户认证
Nginx用户认证基于HTTP Basic Auth机制,通过auth_basic
和auth_basic_user_file
指令实现,需先创建加密的用户密码文件,再配置到Nginx中,确保特定路径仅授权用户可访问。
1.核心指令与密码文件格式
指令 | 功能描述 | 参数要求 |
---|---|---|
auth_basic "欢迎信息" | 启用HTTP Basic Auth,引号内为认证弹窗的提示信息,支持自定义(如“请输入用户名密码”) | 必须配置,提示信息需用英文引号包裹 |
auth_basic_user_file "/path/to/user_auth_file" | 指定用户密码文件的绝对路径,文件中存储“用户名:加密密码”格式的记录 | 路径必须为绝对路径,避免相对路径导致配置失效 |
- 密码文件格式:每行对应一个用户,格式为
username:password
,其中password
必须是加密后的字符串(不支持明文),推荐使用htpasswd
工具生成。
2.完整配置步骤
步骤1:安装htpasswd工具
htpasswd
是Apache HTTP Server工具集的一部分,可快速生成加密的用户密码文件,需通过包管理器安装:
# CentOS/RHEL系统(使用yum)
[root@nginx ~]# yum -y install httpd-tools
# Ubuntu/Debian系统(使用apt)
[root@nginx ~]# apt update && apt -y install apache2-utils
步骤2:创建用户密码文件
进入Nginx配置目录(通常为/usr/local/nginx/conf/
),使用htpasswd
创建文件并添加用户(以用户ycy
为例):
# 进入Nginx配置目录
[root@nginx ~]# cd /usr/local/nginx/conf/
# 生成密码文件(-c:创建新文件;-m:使用MD5加密密码;.user_auth_file:文件名,前缀“.”表示隐藏文件)
[root@nginx conf]# htpasswd -c -m .user_auth_file ycy
New password: # 输入密码(输入时不显示,需谨慎输入)
Re-type new password: # 再次输入密码确认
Adding password for user ycy # 提示添加用户成功
- 查看密码文件:生成的文件内容包含用户名和加密后的密码(MD5格式),示例如下:
[root@nginx conf]# cat .user_auth_file
ycy:$apr1$whXqcpS.$EORacQbsq0P6JblZ0ayM5/ # 格式:用户名:加密密码
步骤3:配置Nginx用户认证
编辑Nginx主配置文件(通常为/usr/local/nginx/conf/nginx.conf
),在目标location
段中添加认证指令:
location /status { # 对/status路径启用认证,可替换为实际路径(如/admin)stub_status on; # 可选,若需同时启用状态监控则保留auth_basic "welcome to hyedu"; # 认证弹窗提示信息auth_basic_user_file "/usr/local/nginx/conf/.user_auth_file"; # 密码文件绝对路径
}
步骤4:验证配置并重载Nginx
- 测试配置文件语法:避免因配置错误导致Nginx无法启动:
[root@nginx conf]# 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 # 提示语法正确
- 重载Nginx配置:使认证配置生效,无需重启服务:
[root@nginx conf]# nginx -s reload
步骤5:验证用户认证效果
通过浏览器或curl
访问配置路径(如192.168.100.10/status
):
- 浏览器访问:会弹出认证弹窗,提示输入用户名和密码,输入正确的
ycy
及对应密码后,可正常查看/status
页面的状态信息;若密码错误,会反复弹窗要求重新输入,或返回401 Unauthorized
错误。 - curl访问:需通过
-u
参数指定用户名和密码,示例如下:
# 正确认证(替换为实际密码)
curl -u ycy:redhat http://192.168.100.10/status
# 输出结果(认证成功后显示状态信息)
Active connections:1
server accepts handled requests
64 64 64
Reading: 0 Writing: 1 Waiting:0
三、Nginx HTTPS配置
HTTPS基于SSL/TLS协议实现数据加密传输,Nginx配置HTTPS需先通过CA(证书颁发机构)生成合法证书,再在Nginx中配置SSL相关参数,确保网站通过https://
协议访问。
1.环境说明
角色 | IP地址 | 核心任务 |
---|---|---|
Nginx服务器 | 192.168.100.10 | 生成证书签署请求(CSR)、部署HTTPS配置、提供加密访问服务 |
CA服务器 | 192.168.100.30 | 生成CA根证书、签署Nginx的CSR请求、颁发服务器证书 |
2.完整配置步骤(基于自建CA)
步骤1:在CA服务器生成根证书(自建CA)
自建CA适用于内部测试、局域网服务等场景;若为公网网站,需向阿里云、Let’s Encrypt等公共CA申请证书。
- 创建CA证书存储目录:规范证书文件存放路径:
[root@ca ~]# mkdir -p /etc/pki/CA/private # 存储CA私钥(权限需严格控制)
[root@ca ~]# cd /etc/pki/CA/
- 生成CA私钥(cakey.pem):使用
openssl
生成2048位RSA私钥,umask 077
确保私钥文件仅root可读写:
[root@ca CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
.+++++
....................+++++
e is 65537 (0x010001) # 生成成功提示
- 提取CA公钥(可选):从私钥中导出公钥,用于验证证书合法性:
[root@ca CA]# openssl rsa -in private/cakey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvaWtkdtUn3T+pXIvD1Rf
LUGP8NdmlVqwamSU7fxqRA5BiWi7gKsNpnSBHlXGJ3PeFBRbNfff/IOpZLnMWDB4
OKDp63pB4OcB3GKWNoJsDYEg5m4HYdhHjJRywTkfmuUNoIok8fBg6gsYYHov9EVK
tmV9FTZBRIPSq7hiVm8dYPDFsuAhvi5CUxGO/VEXRsiJvePSQ1IAaMYUv/mDDMKC
GXX/qvyWPRMA6KdFmr6hO32jbY3fzllzfQpN3tjNrXbQPRa1o6GFQ9nQC8kHzo5L
qtRdeJ0ZMqQyU76f6kJQwcBPS2t/ByTGxq8DRAiVATNK2xO3LuNvfCv+CYRYuVwV
bwIDAQAB
-----END PUBLIC KEY-----
- 生成CA根证书(cacert.pem):基于私钥生成自签名根证书,有效期1024天:
[root@ca CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 1024
- 执行后需填写证书信息(按实际情况填写,Common Name建议为CA服务器标识):
Country Name (2 letter code) [XX]:CN # 国家代码(中国为CN)
State or Province Name (full name) []:HB # 省份(如湖北省缩写HB)
Locality Name (eg, city) [Default City]:WH # 城市(如武汉市缩写WH)
Organization Name (eg, company) [Default Company Ltd]:luoqi # 组织/公司名称
Organizational Unit Name (eg, section) []:linux # 部门名称
Common Name (eg, your name or your server's hostname) []:ycy # 证书主体标识(自定义)
Email Address []:cy@example.com # 邮箱地址(自定义)
步骤2:在Nginx服务器生成证书签署请求(CSR)
- 进入Nginx配置目录:证书文件建议与Nginx配置文件存放在同一目录,便于管理:
[root@nginx ~]# cd /usr/local/nginx/conf/
- 生成Nginx服务器私钥(httpd.key):同样使用2048位RSA加密,
umask 077
确保私钥安全:
[root@nginx conf]# (umask 077; openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
................................................................................+++++
............................................................................................................+++++
e is 65537 (0x010001) # 生成成功提示
- 生成CSR文件(httpd.csr):CSR包含服务器信息和公钥,需发送给CA进行签署:
[root@nginx conf]# openssl req -new -key httpd.key -days 1024 -out httpd.csr
- 填写的信息需与CA根证书保持一致(尤其是Country Name、State、Locality、Organization),避免签署失败:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:luoqi
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:ycy
Email Address []:cy@example.com
- 查看CSR文件:确认文件生成成功,后续需上传至CA服务器:
[root@nginx conf]# ls
httpd.csr httpd.key # 显示CSR和私钥文件,说明生成成功
- 将CSR文件上传至CA服务器:通过
scp
命令传输(需确保CA服务器可正常登录):
[root@nginx conf]# scp httpd.csr root@192.168.100.30:/root/
# 输入CA服务器root密码后,完成文件传输
步骤3:在CA服务器签署证书并返回给Nginx
- 准备CA签署环境:创建证书签署所需的目录和文件:
[root@ca ~]# mkdir /etc/pki/CA/newcerts # 存储签署后的服务器证书
[root@ca ~]# touch /etc/pki/CA/index.txt # 证书索引文件(记录证书状态)
[root@ca ~]# echo "01" > /etc/pki/CA/serial # 证书序列号文件(初始为01,后续递增)
- 签署Nginx的CSR文件:生成服务器证书(httpd.crt),有效期1024天:
[root@ca ~]# openssl ca -in httpd.csr -out httpd.crt -days 1024
- 执行过程中会提示确认证书信息,输入
y
两次(分别确认“签署证书”和“提交到数据库”):
Check that the request matches the signature
Signature ok
Certificate Details:...(证书详细信息,省略)
Certificate is to be certified until ... (1024 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]:y
Write out database with 1 new entries
Data Base Updated # 签署成功提示
- 查看签署后的证书:确认证书生成成功:
[root@ca ~]# ls
anaconda-ks.cfg Documents httpd.crt httpd.csr # 包含httpd.crt(服务器证书)和httpd.csr(原始请求)
- 将证书传输回Nginx服务器:需传输两个文件:签署后的服务器证书(httpd.crt)和CA根证书(cacert.pem):
# 传输服务器证书
[root@ca ~]# scp httpd.crt root@192.168.100.10:/usr/local/nginx/conf/
# 传输CA根证书(客户端需信任此证书,避免浏览器提示“不安全”)
[root@ca ~]# scp /etc/pki/CA/cacert.pem root@192.168.100.10:/usr/local/nginx/conf/
步骤4:在Nginx服务器配置HTTPS
- 编辑Nginx主配置文件:启用443端口(HTTPS默认端口),添加SSL相关配置:
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
- 在
http
块中添加server
段,配置如下:
server {listen 443 ssl; # 监听443端口,启用SSLserver_name localhost; # 服务器域名(公网场景需替换为实际域名,如www.example.com)# SSL证书配置ssl_certificate httpd.crt; # 服务器证书路径(相对路径,基于Nginx配置目录)ssl_certificate_key httpd.key; # 服务器私钥路径# SSL会话缓存配置(提升性能)ssl_session_cache shared:SSL:1m; # 共享会话缓存,大小1MBssl_session_timeout 5m; # 会话超时时间5分钟# SSL加密套件配置(优先选择高强度加密)ssl_ciphers HIGH:!aNULL:!MD5; # 启用高强度加密套件,排除弱加密ssl_prefer_server_ciphers on; # 优先使用服务器端指定的加密套件# 网站根目录与默认页面配置location / {root html; # 网站根目录(默认在/usr/local/nginx/html/)index index.html index.htm; # 默认首页文件}
}
- 测试HTTPS配置语法:确保配置无错误:
[root@nginx conf]# 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 # 配置正确
- 创建测试网页并重载Nginx:
# 进入网站根目录
[root@nginx conf]# cd /usr/local/nginx/html/
# 创建测试首页(内容自定义)
[root@nginx html]# echo "ycy" > index.html
# 重载Nginx,使HTTPS配置生效
[root@nginx html]# nginx -s reload
步骤5:验证HTTPS访问效果
通过浏览器访问https://192.168.100.10
(若为自建CA,浏览器会提示“证书不受信任”,点击“高级”→“继续访问”即可),页面会显示ycy
(即测试首页内容),表示HTTPS配置成功。
- 补充说明:公网场景下,需将CA根证书部署到客户端(如用户浏览器、手机系统),或使用公共CA颁发的证书(如Let’s Encrypt的免费证书),避免浏览器提示“不安全”。