soarli

Nginx做代理服务器方法总结
近期学习的Nginx知识笔记,内容原创,转载请注明来源!前天下午发现了一个好玩的远程网络管理工具:蒲公英VPN,它...
扫描右侧二维码阅读全文
24
2020/01

Nginx做代理服务器方法总结

近期学习的Nginx知识笔记,内容原创,转载请注明来源!

前天下午发现了一个好玩的远程网络管理工具:蒲公英VPN,它能实现远距离搭载局域网的功能,无需明确的公网IP就做到了内网穿透(可惜免费版只有1M带宽和3用户qwq)

于是就试着用NGINX在内网一电脑下做其虚拟机的反向代理,从而实现虚拟机的多网站可以被内网下的其他设备访问。

就上述场景而言,有两种方案可以解决,捎带总结下Nginx做三种代理服务器的方法(文中的liao.com均指向服务器IP)。

正向代理其实是客户端的代理,反向代理则是服务器的代理。
正向代理中,服务器并不知道真正的客户端到底是谁;而在反向代理中,客户端也不知道真正的服务器是谁。二者的作用不同。正向代理主要是用来解决访问限制问题;而反向代理则是提供负载均衡、安全防护等作用。
换句话说,打个比方,a,b,c三个人,正向代理是a通过b向C借钱,a知道c的存在 。反向代理是a向b借钱,b又向c借,a不知道c的存在。

反向代理

win cmd方案:

在服务器A执行如下CMD命令,建立端口转发规则127.0.0.1:12306 ==> 192.168.106.131:4000

netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=12306 connectaddress=192.168.106.131 connectport=4000

执行完毕,可通过远程访问127.0.0.1:12306实现对192.168.106.131:4000的单机访问。

与此同时

查看本机添加的所有规则

netsh interface portproxy show all

删除指定规则

netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=12306

此方法虽然比较快捷,但是局限性也很强。127.0.0.1只能代表本机。想用私有地址访问需要额外添加。

Nginx方案:

下载win版nginx:nginx-1.17.7.zip

某夜和温胡二佬三人坐在电脑前,总结出了一个针对win的nginx重启脚本(不是重载):

taskkill /F /IM nginx.exe
start /b nginx.exe

等价于:

nginx -s stop
start nginx

::记一种更优雅的退出方式:
::nginx -s quit (完成已经接受的连接请求并退出)

顺便写下重载命令(不关服务器重新加载配置):

nginx -s reload

但是重载之前最好先检验下配置文件是否有误(以防宕机):

nginx -t

如果提示:
nginx: the configuration file C:\nginx\nginx-1.17.7/conf/nginx.conf syntax is ok
nginx: configuration file C:\nginx\nginx-1.17.7/conf/nginx.conf test is successful
则配置无误;

反之:
nginx: [emerg] unexpected "}" in C:\nginx\nginx-1.17.7/conf/nginx.conf:72
nginx: configuration file C:\nginx\nginx-1.17.7/conf/nginx.conf test failed
则说明第72行主配置文件编写错误。

单个需求(将192.168.137.2的3389端口代理到本机的33389端口):

stream {
    upstream mstsc {
        server 192.168.137.2:3389;
    }

    server {
        listen 33389;
        proxy_pass mstsc;
    }
}

多个需求(反向代理,监听12307,12308两个端口,分别代理192.168.106.131:4000,192.168.106.131:80(ip地址后跟上端口号)):

stream {

        server {

                listen 12307;

                proxy_pass 192.168.106.131:4000;

                proxy_buffer_size 512k;

                proxy_connect_timeout 30s;

                proxy_timeout 30s;

                #allow 127.0.0.0/24;

                #deny all;

        }

        server {

                listen 12308;

                proxy_pass 192.168.106.131:80;

                proxy_buffer_size 512k;

                proxy_connect_timeout 30s;

                proxy_timeout 30s;

                #allow 127.0.0.0/24;

                #deny all;

        }

}

代理本机

变端口号,不变域名的解决方案

监听80和81端口,分别代理C:/www/和C:/wwww/目录

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   C:/www/;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   C:/wwww/;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

不变端口号,“变域名”或“加代理”的解决方案

该方案分为“变域名,不变端口号”和“加代理,不变端口号”两种情况:

1.变域名,不变端口号

当客户访问liao.com时,代理C:/www/;访问dn120.com时,代理C:/wwww/(前提是liao.com和dn120.com都指向服务器IP)

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  liao.com;

        location / {
            root   C:/www/;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       80;
        server_name  dn120.com;

        location / {
            root   C:/wwww/;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

2.加代理,不变端口号

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

#同一端口通过location同时实现多位代理(包括本机代理和正向代理)
    server {
        listen       82;
        server_name  localhost;
        # 这个location表示将localhost:82请求 转发到index.html文件上
        location / {
            root   html;
            index  index.html index.htm;
        }
        #这个location表示将localhost:82/dz/开头的请求 转发到https://www.ipaddress.com/(可以设置为:http://localhost:12307/以转发到dz论坛服务器上)
        location /dz {
            proxy_pass https://www.ipaddress.com/;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
   # 在做请求转发时,主要注意proxy_pass后/符号的添加,不加/表示访问 http://xxxx/dz+ ; 加/表示访问http://xxxx/+

}

正向代理

两种方案

前者使用服务器IP代理用户请求进行访问,后者直接进行域名重定向

http {

server {
listen       12500;
server_name  liao.com;
        location /
         {
        proxy_pass https://www.ipaddress.com/;
        #proxy_pass http://202.108.22.5;
          }
        }


server {
listen     12501;
server_name  liao.com;
rewrite  "^/(.*)$"  https://www.ipaddress.com/$1 break;
          }
          
}

与反向区分使用

正向代理中,如果客户机不能直接与目标服务器通信,则应当使用反向代理方案

一个失败的例子,bl.com仅服务器端可访问,用这种http代理方案会导致很多资源由客户机直接向bl.com索取,结果对于部分网页(typecho和dz)排版一团糟,不知道是不是php-fpm的问题。

http {

server {
listen       12502;
server_name  liao.com;
        location /
         {
        proxy_pass http://bl.com;
          }
        }
          
}

另外,若要阻断恶意域名解析,除了直接重定向,还可以使用以下方案(把127.0.0.1换成任意网站,不加http://

http {

server{
    listen         12503;
    server_name    liao.com;
    return  301 $scheme://127.0.0.1;
}

}

踩坑总结:

1.stream板块与http并列关系,不可嵌套,前者必须包含ip+port后者的代理server必须http://+ip/域名(+端口号)

2.尤其要注意,cmd端口映射方案实现的反向代理中的IP只是纯粹的“IP”(127.0.0.1仅限于本机访问)。

配置文件全文:

#变端口号,不变域名的解决方案(以下:liao.com指向服务器IP)

worker_processes  1;

events {
    worker_connections  1024;
}

#反向代理,代理12307,12308两个端口,分别指向192.168.106.131:4000,192.168.106.131:80(ip地址后跟上端口号)
stream {

        server {

                listen 12307;

                proxy_pass 192.168.106.131:4000;

                proxy_buffer_size 512k;

                proxy_connect_timeout 30s;

                proxy_timeout 30s;

                #allow 127.0.0.0/24;

                #deny all;

        }

        server {

                listen 12308;

                proxy_pass 192.168.106.131:80;

                proxy_buffer_size 512k;

                proxy_connect_timeout 30s;

                proxy_timeout 30s;

                #allow 127.0.0.0/24;

                #deny all;

        }

}

#代理本机,代理80和81端口,分别指向C:/www/和C:/wwww/目录
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   C:/www/;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   C:/wwww/;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }


#正向代理,前者使用服务器IP代理用户请求进行访问,后者直接进行域名重定向
server {
listen       12500;
server_name  liao.com;
        location /
         {
        proxy_pass https://www.ipaddress.com/;
        #proxy_pass http://202.108.22.5;
          }
        }


server {
listen     12501;
server_name  liao.com;
rewrite  "^/(.*)$"  https://www.ipaddress.com/$1 break;
          }


#正向代理中,如果客户机不能直接与目标服务器通信,则应当使用反向代理方案
#一个失败的例子,bl.com仅服务器端可访问,用这种http代理方案会导致很多资源由客户机直接向bl.com索取,结果是网页排版一团糟
server {
listen       12502;
server_name  liao.com;
        location /
         {
        proxy_pass http://bl.com;
          }
        }



#另外,若要阻断恶意域名解析,除了直接重定向,还可以使用以下方案(把ipadress.com换成任意网站)
server{
    listen         12503;
    server_name    liao.com;
    return  301 $scheme://www.ipaddress.com;
}


}

反向代理OJ的方案

server {
 listen 8083; # WEB 服务的端口,此次拿 8083 端口演示
 server_name localhost; # 填写自己的域名,测试可以使用 localhost
 location / {
 proxy_pass http://172.23.79.51/; # 反代的站点,此处使用 HFish 官网 做演示
 sub_filter http://172.23.79.51/ http://localhost:8083/; # 因为是反代域名 需要替换
 sub_filter_once off;
 proxy_set_header Host hfish.io; # 反代站点 Host
 proxy_set_header Referer https://hfish.io; # 反代站点地址
 proxy_cache_key "$scheme://$host$request_uri";
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header Accept-Encoding "";
 }
}

参考资料:

https://segmentfault.com/a/1190000019540114?utm_source=tag-newest

https://blog.csdn.net/u014199860/article/details/80415519

https://www.kxxzz.com/xx/307.html

http://linux.design/1336.html

https://blog.csdn.net/lpp_dd/article/details/83901224

https://blog.csdn.net/wangshui898/article/details/82019100

https://blog.csdn.net/zengmingen/article/details/80302231

https://blog.csdn.net/chenjiale0102/article/details/79455510

https://blog.csdn.net/zs343961443/article/details/87111660

https://m.imooc.com/wenda/detail/324286

https://blog.csdn.net/dj_325/article/details/52397161

https://blog.csdn.net/yeguxin/article/details/94020476

笔记内容原创,转载请注明来源!

最后修改:2022 年 01 月 09 日 03 : 57 AM

发表评论