nginx 反向代理 wss - 客户端在读取客户端请求行时发送无效方法
nginx reverse proxying wss - client sent invalid method while reading client request line
设置 nginx 以反向代理 websocket(Mosquitto MQTT 服务)这个荒谬的问题。 以下配置适用于 ws:// 但不适用于 wss://
events {
worker_connections 768;
}
http {
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;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log info;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
server {
listen 80;
listen 443 ssl;
# nginx is smart enough to ignore these when serving HTTP instead of HTTPS
ssl_certificate /etc/nginx/cert;
ssl_certificate_key /etc/nginx/key;
location /ws {
# access_log off;
rewrite ^/ws$ / break;
rewrite ^/ws(.*)$ break;
proxy_pass http://mqtt:9001;
proxy_redirect default;
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 https;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_read_timeout 86400;
}
}
client_max_body_size 1M;
client_body_buffer_size 1M;
}
这是我在 nginx 日志中看到的内容:
10.142.0.4 - - [09/Apr/2016:19:15:16 +0000] "\x16\x03\x01\x012\x01\x00\x01.\x03\x03-\xFD\xD4C\x828\xDFai!\xB1\x87\x96l\x8E\xF6a\x00\x059\xC4!\xF1y:\x89\xFF$d^\x87\xE5\x00\x00z\xC0'\x00g\x00\x9C\xC0\x11\xC0\x07\xC0\x0C\xC0\x02\x00\x05\xC00\xC0,\xC0(\xC0$\xC0\x14\xC0" 400 173 "-" "-"
2016/04/09 19:15:17 [info] 7#7: *6 client sent invalid method while reading client request line, client: 10.48.0.1, server: , request: "2.��6OK���4f=4
�����jЁǐ���
我完全不知所措 - 请帮忙 :( 所有非 websocket 路由(为简单起见从原始片段中删除)都在使用 SSL,并且带有 TLS 的 websocket 也可以工作 :(
如果有帮助,我会 运行 Nginx 作为 GCP 上 Kubernetes 中的 Docker 容器。
我不敢相信我在这上面浪费了一整天。在我的 MQTT.JS 客户端中,我只是将 URL 从 wss://my.domain.com/ws
更改为 wss://my.domain.com:443/ws
并且它起作用了。把这个留在这里希望它能节省一些人的时间。
我始终能够通过修改服务器块上的 listen
行来重现该问题。
A - 错误: 重现乱码以及 client sent invalid method while reading client request line
错误。
server {
listen 443;
server {
listen ssl;
B - 已修复: 错误消失,我可以满足我的请求(普通 html、fastcgi_pass
等)。
server {
listen 443 ssl;
设置 nginx 以反向代理 websocket(Mosquitto MQTT 服务)这个荒谬的问题。 以下配置适用于 ws:// 但不适用于 wss://
events {
worker_connections 768;
}
http {
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;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log info;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
server {
listen 80;
listen 443 ssl;
# nginx is smart enough to ignore these when serving HTTP instead of HTTPS
ssl_certificate /etc/nginx/cert;
ssl_certificate_key /etc/nginx/key;
location /ws {
# access_log off;
rewrite ^/ws$ / break;
rewrite ^/ws(.*)$ break;
proxy_pass http://mqtt:9001;
proxy_redirect default;
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 https;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_read_timeout 86400;
}
}
client_max_body_size 1M;
client_body_buffer_size 1M;
}
这是我在 nginx 日志中看到的内容:
10.142.0.4 - - [09/Apr/2016:19:15:16 +0000] "\x16\x03\x01\x012\x01\x00\x01.\x03\x03-\xFD\xD4C\x828\xDFai!\xB1\x87\x96l\x8E\xF6a\x00\x059\xC4!\xF1y:\x89\xFF$d^\x87\xE5\x00\x00z\xC0'\x00g\x00\x9C\xC0\x11\xC0\x07\xC0\x0C\xC0\x02\x00\x05\xC00\xC0,\xC0(\xC0$\xC0\x14\xC0" 400 173 "-" "-" 2016/04/09 19:15:17 [info] 7#7: *6 client sent invalid method while reading client request line, client: 10.48.0.1, server: , request: "2.��6OK���4f=4 �����jЁǐ���
我完全不知所措 - 请帮忙 :( 所有非 websocket 路由(为简单起见从原始片段中删除)都在使用 SSL,并且带有 TLS 的 websocket 也可以工作 :(
如果有帮助,我会 运行 Nginx 作为 GCP 上 Kubernetes 中的 Docker 容器。
我不敢相信我在这上面浪费了一整天。在我的 MQTT.JS 客户端中,我只是将 URL 从 wss://my.domain.com/ws
更改为 wss://my.domain.com:443/ws
并且它起作用了。把这个留在这里希望它能节省一些人的时间。
我始终能够通过修改服务器块上的 listen
行来重现该问题。
A - 错误: 重现乱码以及 client sent invalid method while reading client request line
错误。
server {
listen 443;
server {
listen ssl;
B - 已修复: 错误消失,我可以满足我的请求(普通 html、fastcgi_pass
等)。
server {
listen 443 ssl;