标签 nginx 下的文章

用nginx的proxy_pass代理一个站点且保持访客原IP登录

感谢Radi提供nginx配置内容。

portal.drserver.net 晚上从国内直接访问慢,甚至打不开。如用户使用国外代理提交订单,又会被订单系统认为用户资料地区和提交订单的IP不符而取消。

过程:

1.找一个转发的机子,如阿里云香港地域的ECS实例,配置好nginx 1.10+

2.创建站点配置文件,本例是 /etc/nginx/sites-enabled/portal.drserver.cn,内容如下:

server {
        listen       443 http2; 
        server_name  portal.drserver.cn;

  ssl_certificate           /etc/nginx/ssl/portal.drserver.cn.pem;
  ssl_certificate_key       /etc/nginx/ssl/portal.drserver.cn.key;

  ssl on;
  ssl_session_cache  builtin:1000  shared:SSL:10m;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
  ssl_prefer_server_ciphers on;

        location / {
                resolver 8.8.8.8 ipv6=off;
                proxy_pass https://portal.drserver.net$1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Proto https;
                proxy_redirect off;
                proxy_set_header Referer $http_referer;
        }
}

3.创建好相应的ssl文件,nginx -t 测试配置内容

4.nginx -s reload # 重载nginx配置

5.访问 https://portal.drserver.cn ,显示的内容也是 https://portal.drserver.net 的内容

使用nginx反向代理时,需要留意auth_basic是否也转给了后端

情况:nginx监听80端口,反向代理后边的tomcat,且nginx配置了auth_basic,凭密码访问。输入正确的用户名和密码,但nginx总是提示错误。

过程:

1.查看nginx错误日志,有提示用户不存在的内容,如 user "liujia7" was not found in "D:\nginx-1.15.6/conf/passwd" ,但我明明输入的是用户名是 liujia

2.暂时移除nginx配置文件里的proxy_pass,再次测试,能正常验证密码

3.搜索网上资料,在nginx文件里恢复proxy_pass同时加上proxy_set_header Authorization ""; 即验证信息不转给后端的tomcat,最后测试,也能正常验证密码

        location / {
            root   html;
            auth_basic "Restricted";
            auth_basic_user_file passwd;
            autoindex on;
            autoindex_exact_size on;
            autoindex_localtime on;
            proxy_pass http://tomcat_server$request_uri;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #index  index.html index.htm;
            
            proxy_set_header   Authorization "";
        }

参考:https://serverfault.com/questions/511846/basic-auth-for-a-tomcat-app-jira-with-nginx-as-reverse-proxy

用 nginx 反向代理 https 站点(SNI)

新注册了 drserver.cn 的域名,首先是想到放国内,因为访问速度快。但一想到ICP备案,打算域名访问到境外的机子,但通过反向代理浏览国内机子的内容。

环境:debian 9,nginx;国内站点访问 drserver.anqun.org

过程:

1.apt install nginx # 境外debian9上安装好nginx
nginx-reserv-ssl-1.png

2.vi /etc/nginx/sites-enabled/drserver.cn # 创建drserver.cn站点配置文件,内容如下。请根据情况调整SSL证书,主机名等参数

server {
        listen 80;
        listen 443 ssl http2;  # your server's public IP address
        server_name  drserver.cn www.drserver.cn;      # your domain name

        ssl on;
        ssl_certificate           /etc/nginx/ssl/drserver.cn.pem;
        ssl_certificate_key       /etc/nginx/ssl/drserver.cn.key;

        location / {
          # proxy_ssl_name $host;
          proxy_ssl_server_name on;
          proxy_pass         https://drserver.anqun.org;
          # proxy_redirect     off;
          # 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;
        }
}

3.systemctl restart nginx # 保存好站点配置文件后重启nginx

4.访问测试,正常
nginx-reserv-ssl-2.png

参考:

在nginx里用 http_referer 阻止指定站点的 Referer 请求访问

有网友提问,想在 nginx 阻止指点站点的 referer 来路访问。

环境:CentOS 7,nginx 1.12

过程:

  1. 如想来自 www.baidu.com 和 www.360.cn 的 referer 返回403错误
  2. 在 server 站点配置内容中,在 location 的命令位置上添加以下内容:

    location / {
             valid_referers www.baidu.com www.360.cn;
             if ($invalid_referer = ''){
                     return 403;
             }
     }
  3. 重启nginx后测试,能收到效果

参考: