로드 밸런싱된 서버(nginx)가 있습니다. 트래픽은 로드 밸런싱 서버에 도달하여 이를 내부 웹 서버(업스트림 포함)로 전달합니다. (내 내부 웹 서버도 nginx입니다.)
아래와 같은 구성 파일이 있습니다. 내 로드 밸런서에는 이와 같은 많은 구성 파일이 있습니다. (다른 하위 도메인의 경우)
"http2" 프로토콜을 준수하는 80 및 443 트래픽을 실행하고 싶습니다. 내 웹 서버에서 http2 프로토콜을 활성화하고 싶습니다. "listen 80" 또는 "listen 443" 명령 뒤에 "http2" 매개변수를 추가합니다. 이 부분까지는 모든 것이 정상입니다. (어쩌면 이게 정상일 수도 있겠네요..)
이 섹션 이후에 몇 가지 질문이 있습니다.
1: 인터넷의 모든 기사는 포트 443에 대한 것입니다. 포트 80에 대해 이 작업을 수행할 수 없는 특별한 이유가 있습니까?
2: 아래와 같이 "/etc/nginx/conf.d" 디렉터리의 여러 구성 파일에 "http2" 매개 변수를 추가하면 웹 사이트를 열 수 없습니다. 사이트를 새로 고칠 때마다 페이지 다운로드를 시도합니다. 하지만 http2 매개변수를 제거하면 문제가 해결됩니다. 왜 이런 일을 하는가? 또한 nginx configtest에서는 오류가 발생하지 않습니다.
3: 이 분야에서 나에게 추천할 수 있는 정보가 있습니까?
#
[root@lbserver1 ~]# nginx -v
nginx 버전: nginx/1.12.0
[root@lbserver1 ~]# cat /etc/redhat-release
Red Hat Enterprise 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
. HTTP/2 호환성을 위해서는 최소한 OpenSSL 1.0.2d가 필요합니다.
OpenSSL 버전이 양호한지 --with-http_v2_module
확인할 수도 있습니다 nginx -V
.
이러한 전제 조건을 준수하지 않는 경우 nginx를 직접 다시 컴파일하거나 HTTP/2와 호환되도록 미리 빌드된 바이너리를 사용해야 합니다.
포트 443 관련: 대부분의 브라우저(및 nginx 구현 자체)는 실제로 HTTP/2에 대해 포트 80을 지원하지 않습니다.