MENU
カテゴリー
アーカイブ

Nginx で HTTP/2

舌の根も乾かないうちに Nginx を導入してみた。
ついでに HTTP/2 を試してみた。
導入の目的は・・・特にない。

目次

概要

構成イメージはこんな感じ。リバースプロキシとバックエンドで同じサーバー証明書と秘密鍵を適用させることが正しい方法かどうかググっても判らなかった。本を買おうかな。

Client --- (https) --- Server1[Nginx Reverse Proxy]
             |
             |
              + --- (https) +--- [Apache VirtualHost1]
             |       |   ex1.mydns.jp
             |       |
             |       +--- [Apache VirtualHost2]
             |          ex2.mydns.jp
         ~~~Server2~~~
             |
             |
             + --- (http) --- [Apache VirtualHost3]
                        nextcloud.mydns.jp

設定

Apache 設定ファイルの変更

/etc/apache2/sites-enabled/ の設定ファイルを、port 8443 で待ち受けるようにVirtualHost のディレクティブを変更する。ex1.mydns.jp.conf は要らない。

$ sudo vi /etc/apache2/sites-enabled/ex1.mydns.jp-le-ssl.conf 


<IfModule mod_ssl.c>
<VirtualHost *:8443>
ServerName ex1.mydns.jp
DocumentRoot /home/hoge/public_html/ex1.mydns.jp
ErrorLog /var/log/apache2/virtual.host.error.log
CustomLog /var/log/apache2/virtual.host.access.log combined
LogLevel warn

  <Directory /home/hoge/public_html/ex1.mydns.jp>
    Options FollowSymlinks Includes
    AllowOverride All
    AddType text/html .html
    Require all granted
  </Directory>


SSLCertificateFile /etc/letsencrypt/live/ex1.mydns.jp/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ex1.mydns.jp/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

ex2.mydns.jp も同様、port 8443 に変更する。

続い��� /etc/apache2/ports.conf の待ち受け port を変更する。port 8080 を残しているのは、 Nginx と競合させないため。実際には使用することはない。

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 8080

<IfModule ssl_module>
        Listen 8443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 8443
</IfModule>

最後に HTTP2 のモジュールを有効化、Apache を再起動する。

$ sudo a2enmod http2
$ sudo service apache2 restart

Nginx のインストール

既存の構成に Nginx を追加インストールする。SSL 証明書は取得済みのものを Server1 の VirtualHost と Apache の VirtualHost1 で共用することになる。

$ sudo apt -y install nginx python3-certbot-nginx

# 作業中なので停止しておく。
$ sudo apt service nginx stop

Nginx 設定ファイルの作成

インストール直後は /etc/nginx/sites-enabled/ に設定ファイル default のシンボリックがあるから削除する。

/etc/nginx/sites-available/ に移動して、ドメイン毎の設定ファイルを作成する。ファイル名に .conf はいらない。あとで certbot を使ってサーバー証明書と秘密鍵を設定するから、この時点では次のような内容でいい。もちろん、直接書き込んでも OK 。

$ sudo vi /etc/nginx/sites-available/ex1.mydns.jp


server {

    server_name ex1.mydns.jp;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

    location / {
        proxy_pass    https://192.168.1.5:8443;  # Server1のアドレス
    }
}



$ sudo vi /etc/nginx/sites-available/ex2.mydns.jp


server {

    server_name ex2.mydns.jp;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

    location / {
        proxy_pass    https://192.168.1.5:8443;  # Server1のアドレス
    }
}



$ vi /etc/nginx/sites-available/nextcloud.mydns.jp


server {

    server_name nextcloud.mydns.jp;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

    location / {
        proxy_pass    http://192.168.1.6;  # Server2のアドレス
    }
}

作成が終わったら /etc/nginx/sites-enabled/ にシンボリックを作る。

$ sudo ln -s /etc/nginx/sites-available/ex1.mydns.jp /etc/nginx/sites-enabled/ex1.mydns.jp
$ sudo ln -s /etc/nginx/sites-available/ex2.mydns.jp /etc/nginx/sites-enabled/ex2.mydns.jp
$ sudo ln -s /etc/nginx/sites-available/nextcloud.mydns.jp /etc/nginx/sites-enabled/nextcloud.mydns.jp

ufw

port 8443 への接続を許可する。

$ sudo ufw allow 8443
$ sudo ufw reload

certbot の実行

python3-certbot-nginx をインストールしたことで、既存サーバーの Apache と追加した Nginx を選択して設定することができるようになっている。ただ、今後は Apache の設定ファイルを書き換えることは無いから Nginx だけで用は足りる。

結果は次のとおり。

$ sudo certbot 
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate and install certificates?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Apache Web Server plugin (apache)
2: Nginx Web Server plugin (nginx)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: ex1.mydns.jp
2: ex2.mydns.jp
3: nextcloud.mydns.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn't close to expiry.
(ref: /etc/letsencrypt/renewal/ex1.mydns.jp.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Attempt to reinstall this existing certificate
2: Renew & replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Keeping the existing certificate
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/ex1.mydns.jp

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Traffic on port 80 already redirecting to ssl in /etc/nginx/sites-enabled/ex1.mydns.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://ex1.mydns.jp

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=ex1.mydns.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ex1.mydns.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ex1.mydns.jp/privkey.pem
   Your cert will expire on 2020-07-23. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

ex2.mydns.jp と nextcloud.mydns.jp も同様に実行する。

設定ファイルの微調整

certbot で修正された設定ファイルの listen に http2 を追加する。他は何も変更なし。

server {

    server_name ex1.mydns.jp;

    proxy_set_header    Host    $host;
    proxy_set_header    X-Real-IP    $remote_addr;
    proxy_set_header    X-Forwarded-Host       $host;
    proxy_set_header    X-Forwarded-Server    $host;
    proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;

    location / {
        proxy_pass    https://localhost:8443;
    }


    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/ex1.mydns.jp/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/ex1.mydns.jp/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = ex1.mydns.jp) {
        return 301 https://$host$request_uri;
    } # managed by Certbot



    server_name ex1.mydns.jp;
    listen 80;
    return 404; # managed by Certbot

}

一通りの設定が終わったら、念のため設定ファイルに間違いが無いか確認して、OK なら Nginx を再起動する。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

$ sudo service nginx restart

大まかな変更の流れは以上のとおり。

変更前後の PageSpeed Insights の結果は次のとおりでPC での改善効果が大きい
→画像は HTTP/2 ではなく、おそらく APCu Cocoon の高速化設定と OPcache の効果によるもの。
→またまた勘違い。この時点ではまだ APCu は機能していない。
 あとで備忘録として記事を書こう。

HTTP/2 確認

 

Nextcloud でセキュリティ警告が出てるから後日対応しよう。

コメント

コメントする

目次