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>
この設定では、プロキシが ウェッブソケット ではなく 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 様のお役に立てれば幸いです。
お気をつけて。
閉じのメモ:
- 私たちの Apache2 リバースプロキシ設定では
haproxyを使用していない点にご注意ください。haproxyは、ほとんど実用的な利点をもたらさずに不要な複雑さを追加するだけです。そのため、私たちは Apache2 を「簡単な方法」でリバースプロキシとして動作させています。haproxyを使用したい場合は YMMV(人により結果が異なる)ですが、正直なところ、私たちは(本番環境での複数の Apache2 リバースプロキシ設定において)haproxyを使用しておらず、Apache2 をリバースプロキシとして使用した際に問題が発生したことはありません。
mod_pagespeedを使用していない場合は、それらの行をコメントアウトしてください。ただし、mod_pagespeedを実行している場合は、Discourse へのリバースプロキシ時にバーチャルホストごとにmod_pagespeedを無効にしてください。
すべてがうまくいくことを願っています。そして、これが少しでもお役に立てれば幸いです。