## 反向代理
> 开发时,很多第三方规定只能使用80端口(比如微信开发),而frp代理80端口时会和nginx冲突,这就尴尬了,所以我们要想个办法来解决此问题:**使用Nginx反向代理配置来 隐藏 8080 端口。**
* * * * *
#### 解决frp和nginx80端口冲突问题:
[如果服务器上80端口被占用的话 只能选择别的端口吗? · Issue #124 · fatedier/frp](https://github.com/fatedier/frp/issues/124)
~~~
nginx反向代理是不是要做到IIS和frp前面?即由nginx来监听80端口,根据域名的不同,分到IIS或者frep。这样公网服务器既可以自己做网站服务,又可以提供穿透内网发布Web?
这样原来的IIS主机头就不用了,而是由ngnix来实现?
嗯嗯,非常对
~~~
[访问内网web不通过域名 · Issue #75 · fatedier/frp](https://github.com/fatedier/frp/issues/75)
[怎么使用域名80端口访问? · Issue #883 · fatedier/frp](https://github.com/fatedier/frp/issues/883)
* * * * *
### 解决方案:
1. 增加代理文件:/usr/local/nginx/conf/reverse-proxy/x.xxx.cn.conf;
```
server {
listen 80;
server_name x.xxx.cn;
#标记代理
add_header This-Is-Proxy-Pass "$host => http://nginxServer (frp)";
location / {
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_pass http://nginxServer;
}
}
```
2. 修改文件:/usr/local/nginx/conf/nginx.conf(如果不用upstream 则这步可省略)
```
http {
……
######################## upstream ############################
upstream nginxServer {
server 114.116.67.137:8080;
}
……
}
```
>[tip] 代理文件不能放在这里!只能放在需要代理的 vhost.conf 中。
3. 在需要代理的 vhost.conf 中引入代理配置文件
如果不想使用代理了,直接注释掉 `include /usr/local/nginx/conf/reverse-proxy/x.xxx.cn.conf;` 这行即可关闭代理。
>[tip] **注意这个反向代理实在服务器上配置的,是为了解决frp 80端口冲突不能用导致开发时不方便,使用代理以解决此问题,我们将80代理到8080就可以达到效果了(对外开放80,但其实被代理到了8080,然后穿透到本地开发机),本地不需要这样配置哦。**
>[tip] 配置好代理后如不生效可能需要 `service nginx restart` 一下,重启而不是 `reload`
* * * * *
### 扩展
[Frp 隐藏 8080 端口 – 码农的世界](https://free-e.net/165)
[Linux运维学习笔记之三十:Nginx反向代理 - CSDN博客](https://blog.csdn.net/rumengjian/article/details/80451711)
>[tip] upstream模块应放于nginx.conf配置的http{}标签内。
[搭建nginx反向代理用做内网域名转发 – 运维生存时间](http://www.ttlsa.com/nginx/use-nginx-proxy/)
~~~
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
client_body_buffer_size 256k;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_send_timeout 300s;
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
~~~
[Nginx反向代理以及负载均衡配置 - 程序媛_Mickey - 博客园](https://www.cnblogs.com/Miss-mickey/p/6734831.html)
[使用Nginx实现反向代理 - CSDN博客](https://blog.csdn.net/qw_xingzhe/article/details/79580800)
[还是少不了虚拟机 · php笔记 · 看云](https://www.kancloud.cn/xiak/php-node/558397)
* * * * *
### https时的代理
将80的https代理到8080中去。
/usr/local/nginx/conf/reverse-proxy/x.xxx.cn.conf;
```
server {
listen 80;
listen 443 ssl http2;
ssl_certificate /usr/local/nginx/conf/ssl/x.xxx.cn.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/x.xxx.cn.key;
server_name x.xxx.cn;
#标记代理
add_header This-Is-Proxy-Pass "$host => https://x.xxx.cn:8080 (frp)";
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_ssl_server_name on;
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;
#看来这里要写死域名才行啊
proxy_pass https://x.xxx.cn:8080;
}
}
```
配置正常,可总是报错:`[W] [vhost.go:136] get hostname from http/https request error: Unknow error`,80端口的https请求代理不过来啊。
> 虽然还没有找到真正的问题,但目前这也算是临时解决了这个问题。
> 猜想是因为https是加密的,直接转发到ip:pro是不能识别的,所以报无法找到host,只能完整的写要转发的域名和端口才可以。
[NGINX HTTPS and FRPS · Issue #610 · fatedier/frp](https://github.com/fatedier/frp/issues/610)
[nginx https转发frps · Issue #671 · fatedier/frp](https://github.com/fatedier/frp/issues/671)
[nginx的反向代理模块 参数proxy_pass,proxy_method,proxy_hide_ - adbug的个人空间 - 开源中国](https://my.oschina.net/u/1038053/blog/619993)
[nginx之proxy_pass代理后端https请求完全拆解 - 永福的博客 - 开源中国](https://my.oschina.net/foreverich/blog/1517128?utm_medium=referral)
[请教一个 nginx 反向代理 https 的问题? - V2EX](https://www.v2ex.com/t/253715)
[有人配置成功过 nginx 反代 frp 的 https 嘛? - V2EX](https://www.v2ex.com/t/378393)
[nginx模块之ngx_http_proxy_module - CSDN博客](https://blog.csdn.net/yum_root/article/details/77509156)
[Nginx反向代理http和https - CSDN博客](https://blog.csdn.net/qq_32642039/article/details/78696119)
看来对于https的反向代理可不像http反向代理那么简单啊!
* * * * *
### 补充
注意到默认有这个代理配置文件:/usr/local/nginx/conf/proxy.conf
```
proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
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;
```
* * * * *
last update:2018-8-8 21:40:30