Apacheでリバースプロキシを使ってインストールしたい

@Teraterayuki

Discourse コンテナ内の Unix ドメインソケットへのリバースプロキシとして機能する、動作確認済みの Apache2 バーチャルホスト設定例をご紹介します。

ポート 80

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # 利用可能なログレベル: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # 特定のモジュールに対してログレベルを設定することも可能です。例:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # conf-available/ からの大部分の設定ファイルは、グローバルレベルで
        # 有効または無効にされていますが、特定のバーチャルホストのみに
        # 適用される行を含めることも可能です。例えば、以下の行は、
        # "a2disconf" でグローバルに無効化された後に、このホストのみの
        # CGI 設定を有効にします。
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =mysite.mydomain.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

ポート 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #リバースプロキシ上で Let's Encrypt の設定が完了したらこれを有効化
  	    RewriteEngine On
        
        RewriteCond %{HTTP_USER_AGENT}  (Bytespider|Yandex|Wget|seocompany|CCBot|Cincraw) [NC]
        RewriteRule . - [R=403,L]

  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # 利用可能なログレベル: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # 特定のモジュールに対してログレベルを設定することも可能です。例:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # conf-available/ からの大部分の設定ファイルは、グローバルレベルで
        # 有効または無効にされていますが、特定のバーチャルホストのみに
        # 適用される行を含めることも可能です。例えば、以下の行は、
        # "a2disconf" でグローバルに無効化された後に、このホストのみの
        # CGI 設定を有効にします。
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/mysite.mydomain.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mysite.mydomain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

@Teraterayuki

この設定では、プロキシが ウェッブソケット ではなく Unix ソケット を使用している点にご注意ください。

また、この設定では Let’s Encrypt の情報を手動で追加する必要はありません。まずは以下から始めてください。

Certbot を実行する前のポート 80

<VirtualHost *:80>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/

        # 利用可能なログレベル: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # 特定のモジュールに対してログレベルを設定することも可能です。例:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors.log
        CustomLog ${APACHE_LOG_DIR}/community.log combined

        # conf-available/ からの大部分の設定ファイルは、グローバルレベルで
        # 有効または無効にされていますが、特定のバーチャルホストのみに
        # 適用される行を含めることも可能です。例えば、以下の行は、
        # "a2disconf" でグローバルに無効化された後に、このホストのみの
        # CGI 設定を有効にします。
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off
     
</VirtualHost>

Certbot を実行する前のポート 443

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mysite.mydomain.com
        ServerAdmin webmaster@localhost
        #SSLProxyEngine on   #リバースプロキシ上で Let's Encrypt の設定が完了したらこれを有効化
  	    RewriteEngine On
        


  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/
        #ProxyPassReverse / http://127.0.0.1:8888/
        ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        # 利用可能なログレベル: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # 特定のモジュールに対してログレベルを設定することも可能です。例:
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/community_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/community_ssl.log combined

        # conf-available/ からの大部分の設定ファイルは、グローバルレベルで
        # 有効または無効にされていますが、特定のバーチャルホストのみに
        # 適用される行を含めることも可能です。例えば、以下の行は、
        # "a2disconf" でグローバルに無効化された後に、このホストのみの
        # CGI 設定を有効にします。
        #Include conf-available/serve-cgi-bin.conf
        ModPagespeed Off

</VirtualHost>
</IfModule>

その後、以下を実行してください。

certbot -d mysite.mydomain.com

親切な certbot が、必要な SSL コードを自動的に追加してくれます。

お友達である certbot が設定コードを追加し、すべてが期待通りに動作するようになったら、以下の行のコメントアウトを外してください。

#SSLProxyEngine on   #リバースプロキシ上で Let's Encrypt の設定が完了したらこれを有効化

その後、apache2 を再起動してください。

これが @Teraterayuki 様のお役に立てれば幸いです。

お気をつけて。


閉じのメモ:

  1. 私たちの Apache2 リバースプロキシ設定では haproxy を使用していない点にご注意ください。 haproxy は、ほとんど実用的な利点をもたらさずに不要な複雑さを追加するだけです。そのため、私たちは Apache2 を「簡単な方法」でリバースプロキシとして動作させています。 haproxy を使用したい場合は YMMV(人により結果が異なる)ですが、正直なところ、私たちは(本番環境での複数の Apache2 リバースプロキシ設定において) haproxy を使用しておらず、Apache2 をリバースプロキシとして使用した際に問題が発生したことはありません。
  1. mod_pagespeed を使用していない場合は、それらの行をコメントアウトしてください。ただし、 mod_pagespeed を実行している場合は、Discourse へのリバースプロキシ時にバーチャルホストごとに mod_pagespeed を無効にしてください。

すべてがうまくいくことを願っています。そして、これが少しでもお役に立てれば幸いです。

「いいね!」 6