需求描述
- 针对于某些线上生产小项目,可能因为某些原因,需要做做一下登录认证
- 比如某个项目本来大家都可以访问的,现在临时要设置成只有某个账号登录以后,才能访问
- 这个时候,若是再去写后端,去新建用户表、做JWT的token认证,有些杀鸡用牛刀了
- 这个时候,我们可以使用Nginx自带的auth_basic进行对应用户名密码登录控制
- 如下效果图

实际操作
1. 一个小项目
比如,笔者的这个4433端口上,跑着的是一个使用FFmpeg做的音频混合工具

现在需要做轻量级的登录控制,输入用户名和密码才能登录成功后访问
这里,笔者的服务器是乌班图,如下:
sh
root@iv-ydy912e3nkay8n6x7ufo:~# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
2. 安装apache2-utils
执行命令
sh
apt install apache2-utils -y
安装成功以后,可以查看对应版本
sh
root@iv-ydy912e3nkay8n6x7ufo:~# dpkg -l apache2-utils
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-==============-==================-============-=====================================================
ii apache2-utils 2.4.52-1ubuntu4.18 amd64 Apache HTTP Server (utility programs for web servers)
3. 注意,现有项目的路径位置
笔者的生产服务器部署了多个项目,其中就有这个audio-mix项目,就是上述的音频混合项目
sh
root@iv-ydy912e3nkay8n6x7ufo:/etc/nginx/conf.d# ls
audio-mix.conf xxx.conf yyy.conf main.conf zzz.conf
查看一下内容
nginx
root@iv-ydy912e3nkay8n6x7ufo:/etc/nginx/conf.d# cat audio-mix.conf
server {
listen 4433 ssl;
server_name ashuai.site;
ssl_certificate /etc/nginx/certs/ashuai.site.pem;
ssl_certificate_key /etc/nginx/certs/ashuai.site.key;
# 可选:SSL 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
client_max_body_size 50M;
location / {
proxy_pass http://127.0.0.1:3333;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
}
4. 创建audio-mix项目对应的admin用户的密码文件
为了方便,我直接创建audio-mix项目对应的admin用户的密码文件,在同级目录下
执行命令sudo htpasswd -c /etc/nginx/conf.d/.htpasswd_audio_mix admin会让输入设置一下对应admin用户的密码,而后在重新输入一下,回车即可
sh
root@iv-ydy912e3nkay8n6x7ufo:/etc/nginx/conf.d# sudo htpasswd -c /etc/nginx/conf.d/.htpasswd_audio_mix admin
New password:
Re-type new password:
Adding password for user admin
然后,执行ls -a查看所有文件,就能看到刚刚创建的那个文件了,然后查看这个文件的内容,我们发现,就是用户名冒号密码,只不过这里的密码被加密成字符串了
sh
root@iv-ydy912e3nkay8n6x7ufo:/etc/nginx/conf.d# ls -a
. .. audio-mix.conf .htpasswd_audio_mix main.conf xxx.conf ...
root@iv-ydy912e3nkay8n6x7ufo:/etc/nginx/conf.d# cat .htpasswd_audio_mix
admin:$apr1$0LaARKj4$mDBVdf8oGU/gcp.YG9wXC.
好的,现在设置好了用户名和密码,而后再将其关联到对应nginx项目模块配置文件里面即可
当然,为了进一步安全,还可以使用chmod 和 chown进行文件目录的进一步控制,这里不赘述
5. 在对应的nginx模块中使用之
这里直接在location中使用即可
nginx
server {
listen 4433 ssl;
server_name ashuai.site;
ssl_certificate /etc/nginx/certs/ashuai.site.pem;
ssl_certificate_key /etc/nginx/certs/ashuai.site.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
client_max_body_size 50M;
location / {
# 核心:添加 admin 用户名密码认证
auth_basic "音频混合工具 - 请输入认证密码";
# 使用刚刚创建好的那个用户名和密码文件作为登录认证
auth_basic_user_file /etc/nginx/conf.d/.htpasswd_audio_mix;
# 原有代理配置(完全保留)
proxy_pass http://127.0.0.1:3333;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
}
如果还想进一步控制,比如防爆破限流,可以使用limit_req、limit_conn等,不赘述
别忘了 nginx -t 和 nginx -s reload 重新加载nginx配置,使其生效
6. 效果图
这样,经过上述一波操作,用户再访问我们的项目的时候,就需要输入正确的,就是原先设置好的用户名和密码后,才能访问了
好记性不如烂笔头,记录一下吧...