1台のサーバ上で、nginxとApacheが共存している状態です。
- example.com 203.0.113.0
- nginx - リバースプロキシ
- 127.0.0.0 :80
- 127.0.0.0 :443 (SSL)
- Apache - バックエンド
- 127.0.0.0 :8080 - ローカルのみ
- 127.0.0.0 :8443 - ローカルのみ
nginxとApache間は、ローカルでHTTP通信をしています。
(SSLであっても、nginxでSSLを取り払って、Apacheへ渡しています。)
[課題]
問題としては、”Apache側のポート番号”がありました。
バックエンドであるApache自身でリッスンしているポート番号が8443であるために、
Apache上のCGIがリダイレクトなどを行う際に、
ユーザから見える本来のポート番号である"443"(=nginxのポート番号)ではなく
"8443"へリダイレクトしてしまうという状態となったのです。
もし、複数台のサーバ環境であれば、nginxとApacheを1台に共存させる必要がないため、
Apacheのポート番号を、nginxのポート番号と同じにしておけば良いのですが・・・。
今回はとりあえず、Apacheが都合よく、自分のリッスンしているポート番号ではなく
本来のポート番号をCGIなどに伝えてくれれば良いので、
Apache側の設定で環境変数を書き換えして解決しました。
これについてご指摘や正しい解決方法などありましたら、アドバイスお願いします m(_ _)m
(SSLであっても、nginxでSSLを取り払って、Apacheへ渡しています。)
[課題]
問題としては、”Apache側のポート番号”がありました。
バックエンドであるApache自身でリッスンしているポート番号が8443であるために、
Apache上のCGIがリダイレクトなどを行う際に、
ユーザから見える本来のポート番号である"443"(=nginxのポート番号)ではなく
"8443"へリダイレクトしてしまうという状態となったのです。
もし、複数台のサーバ環境であれば、nginxとApacheを1台に共存させる必要がないため、
Apacheのポート番号を、nginxのポート番号と同じにしておけば良いのですが・・・。
今回はとりあえず、Apacheが都合よく、自分のリッスンしているポート番号ではなく
本来のポート番号をCGIなどに伝えてくれれば良いので、
Apache側の設定で環境変数を書き換えして解決しました。
これについてご指摘や正しい解決方法などありましたら、アドバイスお願いします m(_ _)m
この構成ではあまりリバースプロキシにする意味がないのですが、
実は...この記事は端折っていて、実際の運用では
バックエンドとして、Apacheだけでなく他のアプリケーションも用意しており、
この記事のApacheへの振り分けと同様に
nginxのLocationディレクティブで振り分けるようにしています。
また、キャッシュや圧縮をnginx側で行なってもらっていたりします。
今回は、あくまでSSLまわりの設定の仕方をメモすることが目的の記事であるため、
これだけの内容に端折りました。 あとの詳しいことはまた追々(汗;)
nginxは、先日インストールしたものです:
Masanoriのプログラミング日誌++: nginxをEPELから導入して最新版上書き&モジュール導入
Apacheに”mod_rpaf”モジュールを適用。
http://stderr.net/apache/rpaf/
http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
尚、Apache 2.2なので、デフォルトでUseCanonicalName Off。
/etc/nginx/nginx.conf :
リバースプロキシであるnginxの設定
user apache apache;
error_log /var/log/nginx/error.log;
〜
http {
access_log /var/log/nginx/access.log main;
server {
listen 80;
listen 443 default_server ssl;
server_name _;
ssl_certificate /etc/pki/tls/certs/server-chained-ca.crt;
ssl_certificate_key /etc/pki/tls/certs/server.key;
charset utf-8;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Remote-Addr $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port $server_port;
location ~ ^.+ {
#この例では全てのアクセスを振り分けている
if ($server_port = 80){
proxy_pass http://127.0.0.1:8080;
break;
}
if ($server_port = 443){
proxy_pass http://127.0.0.1:8443;
break;
}
}
〜
}
}
バックエンドであるApacheのHTTPアクセス時設定
NameVirtualHost *:8080
Listen 8080
<VirtualHost *:8080>
DocumentRoot "/var/www/a/hogehoge"
ServerName example.com:80
CustomLog /var/log/apache/access.log combined
ErrorLog /var/log/apache/error.log
SetEnv SERVER_PORT 80
</VirtualHost>
/etc/httpd/conf.d/vhost_ssl.conf :
バックエンドであるApacheのHTTPSアクセス時設定
/etc/httpd/conf.d/rpaf.conf :
Apacheの”mod_rpaf”モジュールによって、
アクセス元であるリバースプロキシのIPアドレス(127.0.0.0)を
実際のアクセス元のIPアドレスに置き換えるための設定。
バックエンドであるApacheのHTTPSアクセス時設定
LoadModule ssl_module modules/mod_ssl.so別に..ファイルを分ける必要も、LoadModuleする必要も無い気がしますが(汗;)
NameVirtualHost *:8443
Listen 8443
<VirtualHost *:8443>
DocumentRoot "/var/www/a/hogehoge"
ServerName https://example.com:443
ErrorLog /var/log/apache/ssl_error.log
CustomLog /var/log/apache/ssl_access.log combined
SetEnv SERVER_PORT 443
SetEnv HTTPS ON
SSLEngine off
</VirtualHost>
/etc/httpd/conf.d/rpaf.conf :
Apacheの”mod_rpaf”モジュールによって、
アクセス元であるリバースプロキシのIPアドレス(127.0.0.0)を
実際のアクセス元のIPアドレスに置き換えるための設定。
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
こんな感じです。
参考にさせていただいたページ(感謝♪):
参考にさせていただいたページ(感謝♪):
- SSLアクセラレータ配下のapacheで、アクセスがhttpかhttpsかを判別する方法 - うまい棒blog
HTTPSアクセス時のApache側の設定で"ServerName https://〜"にしておかないと
Apacheの機能でリダイレクトする際に、http://へのリダイレクトになってしまう問題。 - 【apache】UseCanonicalNameって何? at softelメモ
0 件のコメント:
コメントを投稿
お気軽にコメントをお寄せください m(_ _)m♪
"コメントの記入者"欄から[名前/URL]を選ぶと、登録なしでコメント投稿していただけます。