질문; nginx(centos 6)에서 http2 프로토콜을 활성화합니다.

질문; nginx(centos 6)에서 http2 프로토콜을 활성화합니다.

로드 밸런싱된 서버(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을 지원하지 않습니다.

관련 정보