概要
リバースプロキシという機能について、
設定や挙動に興味が出てきたため、自分の環境で構築を試みました。
(リバースプロキシアクセス先サーバーについて、コンテンツは必要ないが、WPを設置しています。)
プロキシ とは?
「プロキシ」とは、インターネットを接続する際に、
ネットワークの内部から外部へのアクセスを代理で行うシステムのこと。
インターネットへの接続は、通常は PC やモバイルなどの端末のブラウザを経由して、直接 Web サイトにアクセスする。プロキシを使用すると、端末はプロキシにアクセスを行い、プロキシが代わりに目的のサイトにアクセスしてデータを受け取ってブラウザに表示させる。

プロキシの種類
プロキシサーバーには複数の種類があり、
用途と設定方法の違いで4種類に分類されます。

フォワードプロキシ
クライアント(ユーザー)の代わりにインターネットへアクセスする。
主に キャッシュによる高速化・セキュリティ向上・アクセス管理 を目的とする。

リバースプロキシ
クライアントからのリクエストを受け取り、適切なサーバーに転送する。
負荷分散・セキュリティ向上 を目的とする。

明示型プロキシ
プロキシの設定方法の一つ。
プロキシを利用したいクライアント端末でプロキシの設定を入れる(明示する)ことで
プロキシサーバーを利用することができる。

透過型プロキシ
プロキシの設定方法の一つ。
管理側のネットワーク制御により、強制的にプロキシサーバーを経由させるプロキシ。
事前にプロキシサーバーの証明書をクライアント側にインストールしておくだけで、
プロキシサーバーを経由することができる。
ユーザー側でクライアントマシンの細かな設定をする必要がないため、
プロキシ設定の手間を省きたいときなどに利用される。

主な役割
負荷分散
複数のWebサーバーにトラフィックを分散させ、特定のサーバーへの負荷集中を防ぐ。
セキュリティ
クライアントが直接Webサーバーにアクセスすることを防ぐため、
WebサーバーのIPアドレスや内部構造を隠蔽できる。
不正なアクセスやDDoS攻撃などの脅威からWebサーバーを保護する役割も果たす。
キャッシュ
頻繁にアクセスされるコンテンツをキャッシュすることで、
Webサーバーへのアクセスを減らし、応答速度を向上させる。
SSL/TLS終端
SSL/TLS通信の暗号化・復号化をリバースプロキシで行うことで、
バックエンドのWebサーバーの負荷を軽減できる。
同一ドメインで複数サーバーの内容を表示
同一ドメイン内で、別サーバーのサービスやコンテンツを表示ができる。
ECサイトがECサーバーで、ブログがブログサーバーで動いていても、
一貫して ECサイト のドメインで表示することが可能。
これにより、サイト間のナビゲーションがシームレスになり、ユーザーの利便性が向上する。
SEO対策
複数のサーバーで提供されているコンテンツを同一ドメインで表示することで、
各コンテンツのSEO評価をそのドメインに集約させることができる。
環境
サービス
Conoha VPS
リバースプロキシ設定サーバー
◇OS
ubuntu
◇サーバー
Nginx
◇ipアドレス
163.44.111.147
◇表示ページ
https://v163-44-111-147.s1yy.static.cnode.jp./blog/
リバースプロキシアクセス先サーバー
◇OS
CentOS_Stream_10
◇サーバー
Apache
◇ipアドレス
163.44.111.205
◇表示ページ
http://163.44.111.205/test01/wordpress/
VPS接続の環境構築
◇Conoha にて、VPSの契約
※「セキュリティグループ」を「80 443 22」が空いているグループに変更
(今回は該当のグループがなかったため、自分で作成)
◇tera term にて、接続
・ユーザid
root
・PW
自分で設定したPW
環境構築(リバースプロキシアクセス先サーバー)
参考ページ
https://www.server-world.info/query?os=CentOS_Stream_10&p=mysql8&f=6
https://www.server-world.info/query?os=CentOS_Stream_10&p=httpd2&f=2
Apacheをインストール
詳細は割愛
WP環境
WPの構築まで
詳細は割愛
WPの構築後
■wp-config.php
・リバースプロキシ設定サーバーから閲覧した時の、URL置換処理を追加。
※できる限りファイルの上部(DB_NAMEより上あたり)に追加。
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// リバースプロキシ経由でのアクセス
define('WP_SITEURL', 'https://v163-44-111-147.s1yy.static.cnode.jp./blog');
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;
$_SERVER['HTTP_HOST'] = 'v163-44-111-147.s1yy.static.cnode.jp.';
} else {
// 直接アクセス
define('WP_HOME', 'http://163.44.111.205/test01/wordpress');
define('WP_SITEURL', 'http://163.44.111.205/test01/wordpress');
}
■function.php
・リバースプロキシ設定サーバーから閲覧した時の、URL置換処理を追加。
・重複コンテンツ対策を追加。
// リバースプロキシ環境でのURL変換フィルター
function convert_urls_for_reverse_proxy($url) {
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// ドメインとパスを変換
$url = str_replace('http://163.44.111.205/test01/wordpress', 'https://v163-44-111-147.s1yy.static.cnode.jp./blog', $url);
$url = str_replace('https://163.44.111.205/test01/wordpress', 'https://v163-44-111-147.s1yy.static.cnode.jp./blog', $url);
}
return $url;
}
// WordPressの初期化後にフィルターを追加
add_action('init', function() {
// add_filter('home_url', 'convert_urls_for_reverse_proxy'); home_urlを変更すると、サイトが繋がらなくなるため、変更なし。
add_filter('site_url', 'convert_urls_for_reverse_proxy');
add_filter('post_link', 'convert_urls_for_reverse_proxy');
add_filter('page_link', 'convert_urls_for_reverse_proxy');
add_filter('attachment_link', 'convert_urls_for_reverse_proxy');
add_filter('wp_get_attachment_url', 'convert_urls_for_reverse_proxy');
add_filter('the_permalink', 'convert_urls_for_reverse_proxy');
});
// リバースプロキシ環境でのcanonical設定
function simple_canonical_for_proxy() {
$canonical = '';
if (is_front_page()) {
// トップページは直接指定
$canonical = 'https://v163-44-111-147.s1yy.static.cnode.jp./blog/';
} elseif (is_singular()) {
$canonical = get_permalink();
$canonical = str_replace(
'http://163.44.111.205/test01/wordpress',
'https://v163-44-111-147.s1yy.static.cnode.jp./blog',
$canonical
);
} else {
$canonical = home_url($_SERVER['REQUEST_URI']);
$canonical = str_replace(
'http://163.44.111.205/test01/wordpress',
'https://v163-44-111-147.s1yy.static.cnode.jp./blog',
$canonical
);
}
if (!empty($canonical)) {
echo '<link rel="canonical" href="' . esc_url($canonical) . '" />' . "\n";
}
}
// WordPressデフォルトのcanonicalを削除して、カスタム版を追加
remove_action('wp_head', 'rel_canonical');
add_action('wp_head', 'simple_canonical_for_proxy', 1);
// 他のプラグインのcanonicalを無効化
add_filter('wpseo_canonical', '__return_false');
add_filter('rank_math/frontend/canonical', '__return_false');
■wp設定「検索エンジンがサイトをインデックスしないようにする」
チェックはいれない
※チェックをいれると、リバースプロキシアクセス先のページだけでなく、
リバースプロキシ設定元のページにも、noindexが付与される。
(参照する際、noindexも引き継いでしまう。)
■robots.txt
設定してもしなくてもよい。
(canonicalの設定をしているため)
※robotx.txtによるnoindexは、上記のwp設定「検索エンジンがサイトをインデックスしないようにする」とは
異なり、リバースプロキシ設定元のページには引き継がない。
環境構築(リバースプロキシ設定サーバー)
参考ページ
https://www.server-world.info/query?os=Ubuntu_24.04&p=nginx&f=1
https://www.server-world.info/query?os=Ubuntu_24.04&p=nginx&f=10
nginxをインストール
詳細は割愛
SSL証明書の取得
サーバーを立ち上げて直ぐにssl証明書を取得しようとして「apt -y install certbot」コマンドを実行すると、ロックされていて取得できないことがある。
→しばらく待ってから再度コマンドを実行
※この時点では、httpsで閲覧できない。
→設定ファイルにsslの設定を記述すると閲覧できるようになる。
nginxの設定ファイルを作成
vi /etc/nginx/sites-available/ssl-proxy.conf
※conf.d に記述しない理由は下記ページ参照
https://qiita.com/tomokon/items/e782636c1e5ec6b5dfdc
設定ファイルにSSLとリバースプロキシの設定内容を記述
/etc/nginx/sites-available/ssl-proxy.conf
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name v163-44-111-147.s1yy.static.cnode.jp;
ssl_certificate "/etc/letsencrypt/live/v163-44-111-147.s1yy.static.cnode.jp/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/v163-44-111-147.s1yy.static.cnode.jp/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location ~ ^/(test01/wordpress/wp-content/|test01/wordpress/wp-includes/|test01/wordpress/wp-admin/) {
proxy_pass http://163.44.111.205$request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
location /blog/ {
# proxy_pass http://163.44.111.205/test01/wordpress/;
rewrite ^/blog$ /blog/ permanent;
rewrite ^/blog/(.*)$ /test01/wordpress/$1 break;
proxy_pass http://163.44.111.205;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 10s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
location / {
try_files $uri $uri/ =404;
}
}
上記設定ファイルの有効化
ln -s /etc/nginx/sites-available/ssl-proxy.conf /etc/nginx/sites-enabled/ssl-proxy.conf
結果
https://v163-44-111-147.s1yy.static.cnode.jp./blog/ にアクセスすると、
http://163.44.111.205/test01/wordpress/ の内容が表示されました。


GA4の挙動について
リバースプロキシのアクセス先にGA4が設置されている場合、
リバースプロキシ設定サーバーでページを閲覧すると、
どのような挙動になるか確認したかったため、実装しました。
設置内容
どちらの環境にも、同様のgaタグを設置。
※GTMは未使用
リバースプロキシ設定サーバー
G-BWKF1X3TG4
リバースプロキシアクセス先サーバー
G-BWKF1X3TG4
前提
リバースプロキシ設定サーバーについて、
GA4には逆引きURL(https://v163-44-111-147.s1yy.static.cnode.jp.)の登録ができなかったため、
IPアドレスのURL(http://163.44.111.147)を登録している。
上記環境構築、「環境構築(リバースプロキシアクセス先サーバー)」では、
逆引きURLに対しては、リバースプロキシを設定しているが、
IPアドレスのURLに対し、リバースプロキシを設定していない。
本章では、IPアドレスのURLに接続すると、
「http://163.44.111.205/wordpress/」の内容が見れるように、
追加でリバースプロキシの設定をしている。
/etc/nginx/sites-available/default
下記コードを追加
location /blog/ {
proxy_pass http://163.44.111.205/test01/wordpress/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
}
結果
リバースプロキシが設定されているページに
GA4を設置すると、リバースプロキシ設定元では、
リバースプロキシ設定元のURLとして計測される。

注意事項
上記設定では、
リバースプロキシのアクセス先に直接接続した場合、
リバースプロキシのアクセス先のURLで集計されてしまう。
例:
①http://163.44.111.205/test01/wordpress/ にアクセス
②GA4には、「test01/wordpress/」として、集計される。
※リバースプロキシのアクセス先を集計対象にしたくない場合は、
GTMで設置することをおすすめする。
(トリガーの発火条件を「リバースプロキシ設定サーバーのURLだった場合に発火」として、GA4タグを紐づける。)