Cockpit 的反向代理在其服务器块不使用时使用 HTTP2,但主服务器块使用
Reverse proxy with Cockpit uses HTTP2 when its server block doesn't, but main server block does
我有一个主服务器块:
conf.d/mydomain.conf
server {
listen 80;
listen [::]:80;
server_name mydomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name mydomain.com;
root /var/www/mydomain.com;
index index.html index.php;
include modules/ssl.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location / {
try_files $uri $uri/ =404; autoindex on;
}
}
以及用于 Cockpit 反向代理的服务器块:
conf.d/system.mydomain.com.conf
server {
listen 80;
listen 443 ssl;
server_name system.mydomain.com;
location / {
# Required to proxy the connection to Cockpit
proxy_pass https://127.0.0.1:9090;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# Required for web sockets to function
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Pass ETag header from Cockpit to clients.
# See: https://github.com/cockpit-project/cockpit/issues/5239
gzip off;
}
}
我还有一条从 system.mydomain.com 到 mydomain.com 的 CNAME 记录。
这很好用,除非我想让主服务器块使用 HTTP2:
listen 443 ssl http2;
listen [::]:443 ssl http2;
然后,在 system.mydomain.com
returns 登录 Cockpit 一个只显示 protocol-error
的页面和与 system.mydomain.com
returns 的连接状态代码 500
.
有什么方法可以配置 nginx 来处理使用 HTTP 1.1 的 Cockpit 请求和 HTTP2 上的所有其他流量?
不幸的是,您不能 运行 HTTP/1.1 和 h2 在同一个端口 (443) 上。如果您能够选择不同的端口,您当然可以解决这个问题。
如果您让一台服务器阻止 http2,则所有其他具有相同端口的服务器也会隐式 运行 在 h2 上阻止。
我这里当然只是指Nginx。我不知道 Apache 或 HAProxy 怎么样。
我有一个主服务器块:
conf.d/mydomain.conf
server {
listen 80;
listen [::]:80;
server_name mydomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name mydomain.com;
root /var/www/mydomain.com;
index index.html index.php;
include modules/ssl.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location / {
try_files $uri $uri/ =404; autoindex on;
}
}
以及用于 Cockpit 反向代理的服务器块:
conf.d/system.mydomain.com.conf
server {
listen 80;
listen 443 ssl;
server_name system.mydomain.com;
location / {
# Required to proxy the connection to Cockpit
proxy_pass https://127.0.0.1:9090;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# Required for web sockets to function
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Pass ETag header from Cockpit to clients.
# See: https://github.com/cockpit-project/cockpit/issues/5239
gzip off;
}
}
我还有一条从 system.mydomain.com 到 mydomain.com 的 CNAME 记录。
这很好用,除非我想让主服务器块使用 HTTP2:
listen 443 ssl http2;
listen [::]:443 ssl http2;
然后,在 system.mydomain.com
returns 登录 Cockpit 一个只显示 protocol-error
的页面和与 system.mydomain.com
returns 的连接状态代码 500
.
有什么方法可以配置 nginx 来处理使用 HTTP 1.1 的 Cockpit 请求和 HTTP2 上的所有其他流量?
不幸的是,您不能 运行 HTTP/1.1 和 h2 在同一个端口 (443) 上。如果您能够选择不同的端口,您当然可以解决这个问题。
如果您让一台服务器阻止 http2,则所有其他具有相同端口的服务器也会隐式 运行 在 h2 上阻止。
我这里当然只是指Nginx。我不知道 Apache 或 HAProxy 怎么样。