Ubuntu 22.04服务器指定端口应用的HTTP认证保护及部署免凭证配置方案咨询
嘿,这个需求用Nginx反向代理来实现是最稳妥、最易维护的方案,既能给指定端口的应用加上HTTP认证,又能轻松搞定部署时的免凭证访问,我给你一步步拆解具体操作:
一、先装Nginx和密码管理工具
首先咱们得把Nginx装上,Ubuntu 22.04的默认软件源里就有,直接跑命令:
sudo apt update && sudo apt install nginx
然后需要用到htpasswd来生成HTTP认证的密码文件,这个工具在apache2-utils包里,一起装上:
sudo apt install apache2-utils
二、创建HTTP认证的用户密码文件
咱们把密码文件放在Nginx的配置目录下,比如/etc/nginx/.htpasswd,创建第一个用户(比如叫admin)的命令是:
sudo htpasswd -c /etc/nginx/.htpasswd admin
执行后会提示你输入并确认密码。如果之后要加更多用户,去掉-c参数就行,不然会覆盖原有文件:
sudo htpasswd /etc/nginx/.htpasswd another_user
三、配置Nginx反向代理(核心步骤)
咱们新建一个Nginx配置文件来管理这两个需要认证的应用,比如/etc/nginx/sites-available/app-auth.conf,把下面的内容填进去,记得替换里面的部署IP或者按需调整:
# 处理4000端口的应用 server { listen 4000; server_name 1.2.3.4; location / { # 反向代理到实际运行的应用(这里假设应用改绑到本地127.0.0.1了,后面会说原因) proxy_pass http://127.0.0.1:4000; # 传递必要的请求头,保证应用能正常获取客户端信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 关键:允许指定IP免认证,其他IP必须走HTTP认证 satisfy any; allow 192.168.1.100; # 替换成你部署机器的公网/内网IP allow 127.0.0.1; # 如果部署是在服务器本地执行,加上这个 deny all; # 认证提示信息和密码文件路径 auth_basic "Restricted Application Access"; auth_basic_user_file /etc/nginx/.htpasswd; } } # 处理5000端口的应用,配置和上面基本一致 server { listen 5000; server_name 1.2.3.4; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; satisfy any; allow 192.168.1.100; allow 127.0.0.1; deny all; auth_basic "Restricted Application Access"; auth_basic_user_file /etc/nginx/.htpasswd; } }
这里解释下satisfy any的作用:只要满足“IP在允许列表里”或者“通过HTTP认证”其中一个条件,就能访问应用,完美解决部署免凭证的需求。
四、调整原有应用的监听地址(重要)
原来你的应用是监听1.2.3.4:4000/5000,现在咱们让它们改绑到127.0.0.1(也就是服务器本地),这样外部请求必须经过Nginx才能访问应用,避免绕过认证直接访问。具体怎么改要看你的应用类型:
- 比如Node.js/Express应用,启动时把监听地址改成
127.0.0.1而不是0.0.0.0或者1.2.3.4 - Python/Flask应用,启动命令里加
--host=127.0.0.1 - 其他应用同理,找到配置里的监听地址设置,改成仅本地访问
五、启用配置并验证
先把新建的配置文件软链接到Nginx的启用目录:
sudo ln -s /etc/nginx/sites-available/app-auth.conf /etc/nginx/sites-enabled/
然后测试配置有没有语法错误:
sudo nginx -t
如果输出test is successful,就重启Nginx生效:
sudo systemctl restart nginx
备选方案:直接在应用中添加认证(不推荐)
如果不想用Nginx,也可以在应用代码里加HTTP认证,但不同语言/framework的实现方式不一样,比如:
- Node.js/Express用
basic-auth中间件 - Python/Flask用
flask-basicauth库
这种方式的缺点是每个应用都要单独配置,而且部署免凭证需要在应用里加IP判断逻辑,不如Nginx统一管理方便,所以还是优先推荐反向代理方案。
备注:内容来源于stack exchange,提问作者user984621

