質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

HTTP2

HTTP2は、Hypertext Transfer Protocolのバージョンの1つでWWWで用いられます。接続を多重化し複数のリクエスト処理でき、HTTP1.1との互換性を持たせています。

Q&A

1回答

4237閲覧

Nginx+GolangのアプリケーションにHTTP2を導入したい

Zousan

総合スコア29

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

HTTP2

HTTP2は、Hypertext Transfer Protocolのバージョンの1つでWWWで用いられます。接続を多重化し複数のリクエスト処理でき、HTTP1.1との互換性を持たせています。

0グッド

0クリップ

投稿2016/06/21 12:06

NginxとGoのEchoフレームワークを使ったアプリケーションにHTTP2での通信を実装したいです。そこでNginxとアプリケーションサーバの設定を以下のようにしました。

nginx.conf

nginx

1 user nginx; 2 worker_processes auto; 3 4 error_log /var/log/nginx/error.log warn; 5 pid /var/run/nginx.pid; 6 7 8 events { 9 worker_connections 1024; 10 } 11 12 13 http { 14 include /etc/nginx/mime.types; 15 default_type application/octet-stream; 16 17 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 18 '$status $body_bytes_sent "$http_referer" ' 19 '"$http_user_agent" "$http_x_forwarded_for"'; 20 21 access_log /var/log/nginx/access.log main; 22 23 sendfile on; 24 #tcp_nopush on; 25 26 keepalive_timeout 65; 27 28 gzip on; 29 30 include /etc/nginx/conf.d/*.conf; 31 32 server_tokens off; 33 }

default.conf

nginx

1 server { 2 listen 80; 3 listen [::]:80; 4 return 301 https://$host$request_uri; 5 } 6 7 server { 8 listen 443 ssl http2; 9 listen [::]:443 ssl http2; 10 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 11 server_name ドメイン; 12 13 ssl_certificate /etc/letsencrypt/live/ドメイン/fullchain.pem; 14 ssl_certificate_key /etc/letsencrypt/live/ドメイン/privkey.pem; 15 ssl_prefer_server_ciphers on; 16 ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS; 17 18 ssl_dhparam /etc/nginx/ssl/dhparam.pem; 19 add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;'; 20 client_max_body_size 64M; 21 22 # OCSP Staplingを有効にする 23 ssl_stapling on; 24 ssl_stapling_verify on; 25 ssl_trusted_certificate /etc/letsencrypt/live/ドメイン/fullchain.pem; 26 27 # OCSP StaplingのためにはDNSリゾルバを指定する必要がある 28 resolver 8.8.8.8; 29 30 31 # Deny access to any files with a .php extension in the uploads directory 32 location ~* /(?:uploads|files)/.*\.php$ { 33 deny all; 34 } 35 36 location / { 37 proxy_set_header Host $http_host; 38 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 39 proxy_set_header X-Forwarded-Proto https; 40 proxy_set_header X-Real-IP $remote_addr; 41 proxy_redirect http:// https://; 42 proxy_pass http://127.0.0.1:ポート; 43 } 44 45 location ^~ /.well-known/acme-challenge/ { 46 root /home/user1/public; 47 } 48 49 location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) { 50 root /home/user1/public; 51 } 52 }

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

go

1 e.Run(standard.WithConfig(engine.Config{ 2 Address: ":" + os.Getenv("PORT"), 3 TLSCertfile: os.Getenv("CERT"), 4 TLSKeyfile: os.Getenv("KEY"), 5 }))

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

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

ちなみにGolangでの設定例はこのサイトを参考にしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

openssl が ALPN 対応していないと nginx で http2 指定しても有効にならないかと思いますが、openssl のバージョンは幾つでしょうか? ALPN 対応は 1.0.2 からです。

投稿2017/06/23 11:15

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問