Nginx核心配置详解:访问控制、用户认证与HTTPS部署

Nginx核心配置详解:访问控制、用户认证与HTTPS部署

一、Nginx访问控制

Nginx访问控制功能主要通过allowdeny指令实现,二者均作用于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状态页面,配置如下:

nginx 复制代码
location /status {
    echo "ycy";  # 页面输出内容,可根据需求自定义
    deny 192.168.100.40;  # 禁止指定IP访问
}
  • 验证结果 :当192.168.100.40主机通过curl 192.168.100.10/status访问时,Nginx会返回403 Forbidden错误,页面内容如下:
html 复制代码
<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段中启用:

nginx 复制代码
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组合配置

allowdeny同时存在时,Nginx会按"先匹配先执行"的原则处理,且deny优先级更高。以下配置仅允许192.168.100.40访问/status,禁止其他所有主机:

nginx 复制代码
location /status {
    stub_status on;  # 开启状态监控
    allow 192.168.100.40;  # 允许指定IP
    deny all;  # 禁止其余所有IP
}
场景4:默认访问策略与常见配置

Nginx访问控制的默认策略为allow all(允许所有主机访问),基于此可衍生两种常用配置:

  1. 仅允许指定IP访问,禁止其他IP:适用于内部管理页面、敏感接口等场景,配置如下:
nginx 复制代码
location /admin {  # 示例路径,可替换为实际需要限制的路径
    allow 192.168.100.11;  # 允许第一个IP
    allow 192.168.100.12;  # 允许第二个IP
    deny all;  # 禁止其余所有IP
}
  1. 仅禁止指定IP访问,允许其他IP:适用于屏蔽恶意IP、限制特定主机的场景,配置如下:
nginx 复制代码
location / {  # 对根路径生效,可按需调整路径
    deny 192.168.100.11;  # 禁止第一个IP
    deny 192.168.100.12;  # 禁止第二个IP
    allow all;  # 允许其余所有IP
}

二、Nginx用户认证

Nginx用户认证基于HTTP Basic Auth机制,通过auth_basicauth_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工具集的一部分,可快速生成加密的用户密码文件,需通过包管理器安装:

bash 复制代码
# 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为例):

bash 复制代码
# 进入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格式),示例如下:
bash 复制代码
[root@nginx conf]# cat .user_auth_file 
ycy:$apr1$whXqcpS.$EORacQbsq0P6JblZ0ayM5/  # 格式:用户名:加密密码
步骤3:配置Nginx用户认证

编辑Nginx主配置文件(通常为/usr/local/nginx/conf/nginx.conf),在目标location段中添加认证指令:

nginx 复制代码
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
  1. 测试配置文件语法:避免因配置错误导致Nginx无法启动:
bash 复制代码
[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  # 提示语法正确
  1. 重载Nginx配置:使认证配置生效,无需重启服务:
bash 复制代码
[root@nginx conf]# nginx -s reload
步骤5:验证用户认证效果

通过浏览器或curl访问配置路径(如192.168.100.10/status):

  1. 浏览器访问 :会弹出认证弹窗,提示输入用户名和密码,输入正确的ycy及对应密码后,可正常查看/status页面的状态信息;若密码错误,会反复弹窗要求重新输入,或返回401 Unauthorized错误。
  2. curl访问 :需通过-u参数指定用户名和密码,示例如下:
bash 复制代码
# 正确认证(替换为实际密码)
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申请证书。

  1. 创建CA证书存储目录:规范证书文件存放路径:
bash 复制代码
[root@ca ~]# mkdir -p /etc/pki/CA/private  # 存储CA私钥(权限需严格控制)
[root@ca ~]# cd /etc/pki/CA/
  1. 生成CA私钥(cakey.pem) :使用openssl生成2048位RSA私钥,umask 077确保私钥文件仅root可读写:
bash 复制代码
[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)  # 生成成功提示
  1. 提取CA公钥(可选):从私钥中导出公钥,用于验证证书合法性:
bash 复制代码
[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-----
  1. 生成CA根证书(cacert.pem):基于私钥生成自签名根证书,有效期1024天:
bash 复制代码
[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)
  1. 进入Nginx配置目录:证书文件建议与Nginx配置文件存放在同一目录,便于管理:
bash 复制代码
[root@nginx ~]# cd /usr/local/nginx/conf/
  1. 生成Nginx服务器私钥(httpd.key) :同样使用2048位RSA加密,umask 077确保私钥安全:
bash 复制代码
[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)  # 生成成功提示
  1. 生成CSR文件(httpd.csr):CSR包含服务器信息和公钥,需发送给CA进行签署:
bash 复制代码
[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

  1. 查看CSR文件:确认文件生成成功,后续需上传至CA服务器:
bash 复制代码
[root@nginx conf]# ls
httpd.csr  httpd.key  # 显示CSR和私钥文件,说明生成成功
  1. 将CSR文件上传至CA服务器 :通过scp命令传输(需确保CA服务器可正常登录):
bash 复制代码
[root@nginx conf]# scp httpd.csr root@192.168.100.30:/root/
# 输入CA服务器root密码后,完成文件传输
步骤3:在CA服务器签署证书并返回给Nginx
  1. 准备CA签署环境:创建证书签署所需的目录和文件:
bash 复制代码
[root@ca ~]# mkdir /etc/pki/CA/newcerts  # 存储签署后的服务器证书
[root@ca ~]# touch /etc/pki/CA/index.txt  # 证书索引文件(记录证书状态)
[root@ca ~]# echo "01" > /etc/pki/CA/serial  # 证书序列号文件(初始为01,后续递增)
  1. 签署Nginx的CSR文件:生成服务器证书(httpd.crt),有效期1024天:
bash 复制代码
[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 # 签署成功提示

  1. 查看签署后的证书:确认证书生成成功:
bash 复制代码
[root@ca ~]# ls
anaconda-ks.cfg  Documents  httpd.crt  httpd.csr  # 包含httpd.crt(服务器证书)和httpd.csr(原始请求)
  1. 将证书传输回Nginx服务器:需传输两个文件:签署后的服务器证书(httpd.crt)和CA根证书(cacert.pem):
bash 复制代码
# 传输服务器证书
[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
  1. 编辑Nginx主配置文件:启用443端口(HTTPS默认端口),添加SSL相关配置:
bash 复制代码
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
  • http块中添加server段,配置如下:
nginx 复制代码
server {
    listen       443 ssl;  # 监听443端口,启用SSL
    server_name  localhost;  # 服务器域名(公网场景需替换为实际域名,如www.example.com)

    # SSL证书配置
    ssl_certificate      httpd.crt;  # 服务器证书路径(相对路径,基于Nginx配置目录)
    ssl_certificate_key  httpd.key;  # 服务器私钥路径

    # SSL会话缓存配置(提升性能)
    ssl_session_cache    shared:SSL:1m;  # 共享会话缓存,大小1MB
    ssl_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;  # 默认首页文件
    }
}
  1. 测试HTTPS配置语法:确保配置无错误:
bash 复制代码
[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  # 配置正确
  1. 创建测试网页并重载Nginx
bash 复制代码
# 进入网站根目录
[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的免费证书),避免浏览器提示"不安全"。
相关推荐
2501_916007473 小时前
前端开发工具都有哪些?常用前端开发工具清单与场景化推荐
android·ios·小程序·https·uni-app·iphone·webview
apple_ttt4 小时前
融合:迈向 “一台计算机” 的终极架构
网络·架构·cxl·数据中心网络
祁弋4 小时前
UDP的理解
网络·网络协议·udp
独行soc5 小时前
2025年渗透测试面试题总结-98(题目+回答)
网络·安全·web安全·adb·面试·渗透测试·安全狮
十二月将至7 小时前
python读取文件的常用操作
网络·python
凤凰战士芭比Q7 小时前
部署Nginx(Kylinv10sp3、Ubuntu2204、Rocky9.3)
linux·运维·nginx
Miki Makimura8 小时前
基于网络io的多线程TCP服务器
网络·c++·学习
yenggd8 小时前
QoS之流量整形配置方法
网络·数据库·华为
key068 小时前
《数据出境安全评估办法》企业应对策略
网络·人工智能·安全