近期学习的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
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
笔记内容原创,转载请注明来源!
版权属于:soarli
本文链接:https://blog.soarli.top/archives/16.html
转载时须注明出处及本声明。