リバースプロキシ Apache は遠隔地にあるドキュメントをローカルのサーバの URL 空間に 持ってくることもできます。この手法はリバースプロキシと呼ばれています。 ウェブサーバが遠隔地のドキュメントを取得してクライアントに送り返すのが プロキシサーバの動作のように見えるからです。クライアントにはドキュメントが リバースプロキシサーバから送られてきているように見える点が通常の プロキシとは異なります。
次の例では、クライアントが /foo/ ディレクトリの下にある ドキュメントをリクエストすると、サーバが internal.example.com の /bar/ ディレクトリから取得して、さもローカルサーバからの ドキュメントのようにしてクライアントに返します。
ProxyPass /foo/ http://internal.example.com/bar/
ProxyPassReverse /foo/ http://internal.example.com/bar/
ProxyPassReverseCookieDomain internal.example.com public.example.com
ProxyPassReverseCookiePath /foo/ /bar/ProxyPass ディレクティブは サーバが適切なドキュメントを取得するように設定し、 ProxyPassReverse ディレクティブは internal.example.com からのリダイレクトがローカルサーバの 適切なディレクトリを指すように書き換えます。 同様に ProxyPassReverseCookieDomain と ProxyPassReverseCookiePath でバックエンド側サーバの発行した Cookie を書き換えることができます。
ただし、ドキュメントの中のリンクは書き換えられない、 ということは知っておいてください。 ですから、internal.example.com への絶対パスによるリンクでは、 クライアントがプロキシサーバを抜け出して internal.example.com に 直接リクエストを送る、ということになります。 サードパーティ製モジュールの mod_proxy_html は、HTML と XHTML 中のリンクを書き換えることができます。
必要があれば設定する。
$ docker run -d -p 8080:80 --name my-app -v "$PWD":/var/www/html php:7.2-apache
SSHログイン
$ docker exec -it my-app /bin/bash
Apacheバージョン確認
apache2 -v
Server version: Apache/2.4.38 (Debian)
Server built: 2020-08-25T20:08:29
mod_proxy
とproxy_http
を有効化/etc/apache2/mods-availables/proxy.conf
に設定$ apache2ctl configtest
$ service apache2 restart
※ $ service apache2 restart
を実行したら、毎回なぜかコンテナが停止するので $ docker start
で再開。
http://localhost:8080にアクセスするとhttp://example.comの内容が表示された。
mod_proxy
とproxy_http
を有効化mod_proxy
はデフォルトで有効なのでproxy_http
を有効化。
$ sudo a2enmod proxy proxy_http
// or mod_proxyがデフォルトで有効な場合
$ sudo a2enmod proxy_http
# If you want to use apache2 as a forward proxy, uncomment the
# 'ProxyRequests On' line and the <Proxy *> block below.
# WARNING: Be careful to restrict access inside the <Proxy *> block.
# Open proxy servers are dangerous both to your network and to the
# Internet at large.
#
# If you only want to use apache2 as a reverse proxy/gateway in
# front of some web application server, you DON'T need
# 'ProxyRequests On'.
#ProxyRequests On
#<Proxy *>
# AddDefaultCharset off
# Require all denied
# #Require local
#</Proxy>
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
#ProxyVia Off
ProxyRequests Off
# バックエンドがSSLの場合は SSLProxyEngine on が必要
SSLProxyEngine on
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://example.com/
ProxyPassReverse / http://example.com/
</IfModule>
上記のように記載して保存すると自動で先頭に<IfModule mod_proxy.c>
が追加されるよう?
ref. https://www.server-world.info/query?os=Ubuntu_16.04&p=httpd2&f=5
設定ファイル: /usr/local/etc/httpd/httpd.conf
SSL(mod_ssl)を有効化する。
- #LoadModule ssl_module lib/httpd/modules/mod_ssl.so
+ LoadModule ssl_module lib/httpd/modules/mod_ssl.so
- #LoadModule proxy_module lib/httpd/modules/mod_proxy.so
+ LoadModule proxy_module lib/httpd/modules/mod_proxy.so
- #LoadModule proxy_http_module lib/httpd/modules/mod_proxy_http.so
+ LoadModule proxy_http_module lib/httpd/modules/mod_proxy_http.so
efine('WP_HOME', 'https://hiroshi-sawai.com/proxy/');
define('WP_SITEURL', 'https://hiroshi-sawai.com/proxy/dx-sandbox/');
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
$_SERVER['REQUEST_SCHEME'] = 'https';
}
if ( ! empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_HOST'] ) ) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}