我有一个负载均衡服务器(nginx)。流量到达负载平衡服务器并将其转发到内部 Web 服务器(带上游)。 (我的内部网络服务器也是 nginx。)
我有一个配置文件如下。我在负载均衡器上有很多配置文件,例如这个配置文件。 (针对不同的子域。)
我想运行符合“http2”协议的80和443流量。我想在我的网络服务器上启用 http2 协议。我在“listen 80”或“listen 443”命令之后添加“http2”参数。直到这部分一切都很正常。 (也许这对我来说很正常..)
在本节之后我有几个问题。
1:网上所有的文章都是针对443端口做的。这是否有特殊原因而我不能为80端口做?
2:当我将“http2”参数添加到“/etc/nginx/conf.d”目录中的几个配置文件时,如下所示,网站无法打开。每当我刷新网站时,它都会尝试下载页面。但是当我删除http2参数时,问题就解决了。它为什么要这样做?另外,nginx configtest 不会给出错误。
3:这方面有什么资料可以推荐给我吗?
#
[root@lbserver1 ~]# nginx -v
nginx版本:nginx/1.12.0
[root@lbserver1 ~]# cat /etc/redhat-release
红帽企业 Linux 服务器版本 6.7(圣地亚哥)
upstream k-testserver-pool {
# ip_hash;
server testserver.k.local;
}
server {
listen 80 http2;
server_name test.www.example.com test.example.com;
error_log /var/log/nginx/test.www.example.com.80.error.log;
set $mobile_rewrite_status D;
large_client_header_buffers 4 16k;
add_header Set-Cookie "device_type=desktop; Path=/; Domain=test.www.example.com";
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://k-testserver-pool;
proxy_intercept_errors on;
fastcgi_read_timeout 600;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
location ~* \.(pdf|css|js|png|gif|jpg|jpeg|ico|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://k-testserver-pool;
expires 7d;
add_header Cache-Control "public";
}
location ~ /\.ht {
deny all;
}
}
server {
listen 80 http2;
server_name test.m.example.com test.webapp.example.com;
error_log /var/log/nginx/test.www.example.com.80.error.log;
large_client_header_buffers 4 16k;
add_header Set-Cookie "device_type=mobile; Path=/; Domain=test.m.example.com";
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://k-testserver-pool;
proxy_intercept_errors on;
fastcgi_read_timeout 300;
}
location ~* \.(pdf|css|js|png|gif|jpg|jpeg|ico|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://k-testserver-pool;
expires 7d;
add_header Cache-Control "public";
}
location ~ /\.ht {
deny all;
}
}
server {
listen 443 ssl http2;
server_name test.www.example.com test.example.com;
ssl on;
ssl_certificate /etc/nginx/ssl/www.example.com.crt;
ssl_certificate_key etc/nginx/ssl/www.example.com.key;
ssl_ciphers ...+3DES:DH+3DES:RSA+AES:RSA:!aNULL:!MD5:!DSS;....
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
large_client_header_buffers 4 16k;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://k-testserver-pool;
proxy_intercept_errors on;
fastcgi_read_timeout 300;
}
location ~* \.(pdf|css|js|png|gif|jpg|jpeg|ico|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://k-testserver-pool;
expires 7d;
add_header Cache-Control "public";
}
}
答案1
您应该有一个使用包含 ALPN 协议的 OpenSSL 版本编译的 Nginx 版本。 (NPN 仍然适用于 Firefox)。您可以使用以下命令检查使用 nginx 编译的 OpenSSL 版本nginx -V
。您至少需要 OpenSSL 1.0.2d 才能与 HTTP/2 兼容。
如果您的 OpenSSL 版本是好的,您还可以--with-http_v2_module
检查nginx -V
.
如果您不遵守这些先决条件,您将必须自己重新编译 nginx 或使用预构建的二进制文件以与 HTTP/2 兼容。
关于端口 443:大多数浏览器(以及 nginx 实现本身)实际上并不支持 HTTP/2 的端口 80。