26970


NginxとGoの[Echoフレームワーク](https://github.com/labstack/echo)を使ったアプリケーションにHTTP2での通信を実装したいです。そこでNginxとアプリケーションサーバの設定を以下のようにしました。

**nginx.conf**

[code]

    user  nginx;
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
    
        server_tokens off;
    }
    
[/code]

**default.conf**

[code]

    server {
      listen 80;
      listen [::]:80;
      return 301 https://$host$request_uri;
    }
    
    server {
      listen 443 ssl http2;
      listen [::]:443 ssl http2;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      server_name ドメイン;
    
      ssl_certificate /etc/letsencrypt/live/ドメイン/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/ドメイン/privkey.pem;
      ssl_prefer_server_ciphers on;
      ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;
    
      ssl_dhparam /etc/nginx/ssl/dhparam.pem;
      add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
      client_max_body_size 64M;
    
      # OCSP Staplingを有効にする
      ssl_stapling on;
      ssl_stapling_verify on;
      ssl_trusted_certificate /etc/letsencrypt/live/ドメイン/fullchain.pem;
    
      # OCSP StaplingのためにはDNSリゾルバを指定する必要がある
      resolver 8.8.8.8;
    
    
      # Deny access to any files with a .php extension in the uploads directory
      location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
      }
    
      location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect http:// https://;
        proxy_pass http://127.0.0.1:ポート;
      }
    
      location ^~ /.well-known/acme-challenge/ {
        root /home/user1/public;
      }
    
      location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
        root /home/user1/public;
      }
    }
    
[/code]

**アプリケーションサーバの起動部分**

[code]

    e.Run(standard.WithConfig(engine.Config{
                Address:     ":" + os.Getenv("PORT"),
                TLSCertfile: os.Getenv("CERT"),
                TLSKeyfile:  os.Getenv("KEY"),
            }))
    
[/code]

しかし、Golangのサーバ単体でローカルでテストしたところHTTP2で通信出来ましたが、本番環境のNginxをリバースプロキシとして実行するとHTTP2ではなくなってしいます。  
SSL通信はできています。pemファイルへのパーミッションの問題かと考えアプリケーションサーバをroot権限で実行してみたりもしましたができませんでした。

ローカルで動いていたのでNginxの設定ではないかと考えていますが、設定の不備などがわかりません。どのようにすればHTTP2での通信を実現できるのでしょうか。

ちなみにGolangでの設定例は[このサイト](https://echo.labstack.com/recipes/http2)を参考にしました。


CC BY-SA 3.0
2016-06-20T03:36:57.340
26878
2016-06-23T01:54:49.610
7232
question
go nginx http2
Nginx+GolangのアプリケーションにHTTP2を導入したい


nginxの一般的なhttp2プロキシサンプルのようにhttp2からhttpへの転送ではなく、http2をhttp2のまま転送したいのでしようか？

nginxは <https://trac.nginx.org/nginx/ticket/923>
のようにバックエンドプロトコルにhttp2サポートは無さそうです。

nghttpxなどのサポートされたフロントをお使いください。


CC BY-SA 3.0
2016-06-22T00:15:31.880
26926
2016-06-22T00:15:31.880
11051
26878
answer


以下の設定でTCP接続自体をプロキシすることで  
goからhttp2のサービス(リッスンポート127.0.0.1:8443)が動きました。

**nginx.conf** (nginx1.9以降、streamモジュール有効)

[code]

    events {
        worker_connections  768;
    }
    
    http {
        server {
            listen          80;
            listen          [::]:80;
            return 301 https://$host$request_uri;
        }
    }
    
    stream {
        upstream backend {
            server 127.0.0.1:8443 weight=5 max_fails=3 fail_timeout=30s;
        }
        server {
            listen 443;
            proxy_connect_timeout 1s;
            proxy_timeout 3s;
            proxy_pass backend;
        }
    }
    
[/code]


CC BY-SA 3.0
2016-06-23T01:54:49.610
26970
2016-06-23T01:54:49.610
11051
26878
answer