websocket在线测试:http://www.blue-zero.com/WebSocket/,可以使用这个工具测试:
需求:大数据项目开开放2个端口8080和7398,一个走http协议,一个走tcp,也就是访问socket。当client访问这个项目socket会把client的信息抛出到web页面。现在要用nginx做代理,把这2个端口映射到内网,提供内网访问。
nginx代理http协议当然很好解决,
server {
listen 80;
server_name z.exam.com;
access_log /var/log/nginx/rdp.elenet.me_access.log main;
error_log /var/log/nginx/rdp.elenet.me_error.log;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
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_next_upstream http_502 http_504 http_404 http_503 error timeout invalid_header;
proxy_pass http://11.1.250.241:8080;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
tcp端口的代理用nginx,上面这段肯定是不行的。nginx官网参考文档:http://nginx.org/en/docs/http/websocket.html
其实只需要在nginx的http块和server分别加几行就可以了:
http块加以下几行:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server块加以下2行:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
配置如下,http块文件较大,就不展示了:
server {
listen 7398;
server_name z.exam.com;
access_log /var/log/nginx/rdp.elenet.me_access.log main;
error_log /var/log/nginx/rdp.elenet.me_error.log;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
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_next_upstream http_502 http_504 http_404 http_503 error timeout invalid_header;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://11.1.250.241:7398;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
以上配置可以贴在同一个conf配置文件中。