利用Nginx反向代理实现访问认证

1.说明

有时候我们需要对一些服务进行访问限制。避免任何人知晓 ip 和 端口都可以访问。

如针对 netdata 或作为个人私有笔记的 wordpress。

而这些服务本身可能并不自带登陆限制。或限制后会有操作很繁琐等等负面效应。

这种情况下可以考虑使用 Nginx 反向代理进行统一认证。

其主要优势和特征是

  • 认证成功后,操作将不再受任何认证阻挠,非常干净。
  • 认证不成功将一直处于认证窗口,看不到任何服务信息,一刀切。

2.登陆认证配置

首先创建密码文件,建一个目录

mkdir /etc/nginx/mypasswords

创建密码文件,最后的参数为登陆的用户名(示例为pp)

htpasswd -c /etc/nginx/mypasswords/passwd.dav pp

应该会要求输入两次密码。即可创建成功。

接下来进行反向代理配置。

如希望对 http://hostname:8888 进行加密,可在 Nginx 中进行如下配置,且这样配置后需要认证的链接为 http://hostname

server {
     listen 80;
     server_name hostname;
     location /service1/ {
         #要求登陆认证
         auth_basic "Protected";
         #密码文件路径
         auth_basic_user_file /etc/nginx/mypasswords/passwd_service1.psw;
         #反向代理链接 
         proxy_pass http://localhost:8888/;
         }
}

如希望对 http://hostname:8888/service1 进行加密,可在 Nginx 中进行如下配置(注意区别主要在 location /service1 最后不带斜杠,且 proxy_pass http://localhost:8888 最后也不带斜杠),这样配置后需要认证的链接为 http://hostname/service1

server {
     listen 80;
     server_name hostname;
     location /service1 {
         #要求登陆认证
         auth_basic "Protected";
         #密码文件路径
         auth_basic_user_file /etc/nginx/mypasswords/passwd_service1.psw;
         #反向代理链接 
         proxy_pass http://localhost:8888;
         }
}

配置完成后,重启 Nginx 即可生效。

尝试访问需要认证的链接,可以发现需要登陆认证。

3.关闭原服务对外的端口

仅用如上方式配置后,原服务依旧可以通过原端口无认证访问。

所以还需要通过防火墙等手段,将原来的服务端口对外禁止访问,即可达到必须认证的目的。

4.Https加密

通常对于有认证要求的服务,传输过程的保密性也是有需求的。

不过这正好也可以通过 Nginx 反向代理完成,仅需在配置中再加几行 ssl 相关的内容即可。

详见:

Leave a Comment