赞
踩
https://my.oschina.net/foreverich/blog/1512304
https://blog.csdn.net/palmer_kai/article/details/100930164
nginx中有两个模块都有proxy_pass
指令。
ngx_http_proxy_module
的proxy_pass
:- 语法: proxy_pass URL;
- 场景: location, if in location, limit_except
- 说明: 设置后端代理服务器的协议(protocol)和地址(address),以及location中可以匹配的一个可选的URI。协议可以是"http"或"https"。地址可以是一个域名或ip地址和端口,或者一个 unix-domain socket 路径。
- 详见官方文档: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
- URI的匹配,本文第四部分重点讨论。
ngx_stream_proxy_module
的proxy_pass
:- 语法: proxy_pass address;
- 场景: server
- 说明: 设置后端代理服务器的地址。这个地址(address)可以是一个域名或ip地址和端口,或者一个 unix-domain socket路径。
- 详见官方文档: http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_pass
proxy_pass
的关系和区别在两个模块中,两个proxy_pass
都是用来做后端代理的指令。ngx_stream_proxy_module
模块的proxy_pass
指令只能在server段使用使用, 只需要提供域名或ip地址和端口。可以理解为端口转发,可以是tcp端口,也可以是udp端口。ngx_http_proxy_module
模块的proxy_pass
指令需要在location段,location中的if段,limit_except段中使用,处理需要提供域名或ip地址和端口外,还需要提供协议,如"http"或"https",还有一个可选的uri可以配置。
ngx_stream_proxy_module
模块的proxy_pass
指令- server {
- listen 127.0.0.1:12345;
- proxy_pass 127.0.0.1:8080;
- }
-
- server {
- listen 12345;
- proxy_connect_timeout 1s;
- proxy_timeout 1m;
- proxy_pass example.com:12345;
- }
-
- server {
- listen 53 udp;
- proxy_responses 1;
- proxy_timeout 20s;
- proxy_pass dns.example.com:53;
- }
-
- server {
- listen [::1]:12345;
- proxy_pass unix:/tmp/stream.socket;
- }
ngx_http_proxy_module
模块的proxy_pass
指令- server {
- listen 80;
- server_name www.test.com;
-
- # 正常代理,不修改后端url的
- location /some/path/ {
- proxy_pass http://127.0.0.1;
- }
-
- # 修改后端url地址的代理(本例后端地址中,最后带了一个斜线)
- location /testb {
- proxy_pass http://www.other.com:8801/;
- }
-
- # 使用 if in location
- location /google {
- if ( $geoip_country_code ~ (RU|CN) ) {
- proxy_pass http://www.google.hk;
- }
- }
-
- location /yongfu/ {
- # 没有匹配 limit_except 的,代理到 unix:/tmp/backend.socket:/uri/
- proxy_pass http://unix:/tmp/backend.socket:/uri/;;
-
- # 匹配到请求方法为: PUT or DELETE, 代理到9080
- limit_except PUT DELETE {
- proxy_pass http://127.0.0.1:9080;
- }
- }
-
- }
proxy_pass
后,后端服务器的url
(request_uri
)情况分析- server {
- listen 80;
- server_name www.test.com;
-
- # 情形A
- # 访问 http://www.test.com/testa/aaaa
- # 后端的request_uri为: /testa/aaaa
- location ^~ /testa/ {
- proxy_pass http://127.0.0.1:8801;
- }
-
- # 情形B
- # 访问 http://www.test.com/testb/bbbb
- # 后端的request_uri为: /bbbb
- location ^~ /testb/ {
- proxy_pass http://127.0.0.1:8801/;
- }
-
- # 情形C
- # 下面这段location是正确的
- location ~ /testc {
- proxy_pass http://127.0.0.1:8801;
- }
-
- # 情形D
- # 下面这段location是错误的
- #
- # nginx -t 时,会报如下错误:
- #
- # nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular
- # expression, or inside named location, or inside "if" statement, or inside
- # "limit_except" block in /opt/app/nginx/conf/vhost/test.conf:17
- #
- # 当location为正则表达式时,proxy_pass 不能包含URI部分。本例中包含了"/"
- location ~ /testd {
- proxy_pass http://127.0.0.1:8801/; # 记住,location为正则表达式时,不能这样写!!!
- }
-
- # 情形E
- # 访问 http://www.test.com/ccc/bbbb
- # 后端的request_uri为: /aaa/ccc/bbbb
- location /ccc/ {
- proxy_pass http://127.0.0.1:8801/aaa$request_uri;
- }
-
- # 情形F
- # 访问 http://www.test.com/namea/ddd
- # 后端的request_uri为: /yongfu?namea=ddd
- location /namea/ {
- rewrite /namea/([^/]+) /yongfu?namea=$1 break;
- proxy_pass http://127.0.0.1:8801;
- }
-
- # 情形G
- # 访问 http://www.test.com/nameb/eee
- # 后端的request_uri为: /yongfu?nameb=eee
- location /nameb/ {
- rewrite /nameb/([^/]+) /yongfu?nameb=$1 break;
- proxy_pass http://127.0.0.1:8801/;
- }
-
- access_log /data/logs/www/www.test.com.log;
- }
-
- server {
- listen 8801;
- server_name www.test.com;
-
- root /data/www/test;
- index index.php index.html;
-
- rewrite ^(.*)$ /test.php?u=$1 last;
-
- location ~ \.php$ {
- try_files $uri =404;
- fastcgi_pass unix:/tmp/php-cgi.sock;
- fastcgi_index index.php;
- include fastcgi.conf;
- }
-
- access_log /data/logs/www/www.test.com.8801.log;
- }
-
文件: /data/www/test/test.php
- <?php
- echo '$_SERVER[REQUEST_URI]:' . $_SERVER['REQUEST_URI'];
通过查看 $_SERVER['REQUEST_URI'] 的值,我们可以看到每次请求的后端的request_uri的值,进行验证。
小结
情形A和情形B进行对比,可以知道proxy_pass
后带一个URI,可以是斜杠(/)也可以是其他uri,对后端request_uri
变量的影响。
情形D说明,当location为正则表达式时,proxy_pass
不能包含URI部分。
情形E通过变量($request_uri, 也可以是其他变量),对后端的request_uri
进行改写。
情形F和情形G通过rewrite配合break标志,对url进行改写,并改写后端的request_uri
。需要注意,proxy_pass
地址的URI部分在情形G中无效,不管如何设置,都会被忽略。
说明
本文永福原创,原文地址: https://my.oschina.net/foreverich/blog/1512304 永福原创,未经授权,不得转载!
===========
本篇文章 主要是配合 上一篇 opn 穿透内网来使用的
通过 公网服务器 + opn 实现了 内网穿透, 然后我们通过 nginx stream转发 就可以实现 tcp stream转发,这样就可以 做到:
外网ip + port 访问到内网的服务(本教程实现)
进一步的实现就是 多个域名 访问 内网不同项目
一、 centos 安装 nginx
yum install -y nginx 即可完成安装
vim /etc/nginx/nginx.conf
编辑nginx 配置文件
配置很简单, 和 ngx负载均衡配置相似, 只需要加上 steam 相关配置即可
- # For more information on configuration, see:
- # * Official English Documentation: http://nginx.org/en/docs/
- # * Official Russian Documentation: http://nginx.org/ru/docs/
-
- user nginx;
- worker_processes auto;
- error_log /var/log/nginx/error.log;
- pid /run/nginx.pid;
-
- # Load dynamic modules. See /usr/share/nginx/README.dynamic.
- include /usr/share/nginx/modules/*.conf;
-
- events {
- worker_connections 1024;
- }
-
- http {
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
-
- access_log /var/log/nginx/access.log main;
-
- sendfile on;
- tcp_nopush on;
- tcp_nodelay on;
- keepalive_timeout 65;
- types_hash_max_size 2048;
-
- include /etc/nginx/mime.types;
- default_type application/octet-stream;
-
- # Load modular configuration files from the /etc/nginx/conf.d directory.
- # See http://nginx.org/en/docs/ngx_core_module.html#include
- # for more information.
- include /etc/nginx/conf.d/*.conf;
-
- server {
- listen 80 default_server;
- listen [::]:80 default_server;
- server_name _;
- root /usr/share/nginx/html;
-
- # Load configuration files for the default server block.
- include /etc/nginx/default.d/*.conf;
-
- location / {
- }
-
- error_page 404 /404.html;
- location = /40x.html {
- }
-
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- }
- }
-
- # Settings for a TLS enabled server.
- #
- # server {
- # listen 443 ssl http2 default_server;
- # listen [::]:443 ssl http2 default_server;
- # server_name _;
- # root /usr/share/nginx/html;
- #
- # ssl_certificate "/etc/pki/nginx/server.crt";
- # ssl_certificate_key "/etc/pki/nginx/private/server.key";
- # ssl_session_cache shared:SSL:1m;
- # ssl_session_timeout 10m;
- # ssl_ciphers HIGH:!aNULL:!MD5;
- # ssl_prefer_server_ciphers on;
- #
- # # Load configuration files for the default server block.
- # include /etc/nginx/default.d/*.conf;
- #
- # location / {
- # }
- #
- # error_page 404 /404.html;
- # location = /40x.html {
- # }
- #
- # error_page 500 502 503 504 /50x.html;
- # location = /50x.html {
- # }
- # }
-
- }
-
- stream {
-
- server {
-
- listen 10000;
- proxy_pass 192.168.131.6:8080;
- }
- }
需要注意的配置错误
通过 nginx -t
显示一直报错, 后来发现, 这个多了个 http scheme。 这里是stream转发, 各种 scheme 的数据stream都会有。只需要 ip:port
即可。(upstream 负载均衡的时候也需要注意哦)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。