リバースプロキシサーバーとしてのNginxは、主要なインターネット企業で広く使用されています。シンプルで使いやすく、ビジネスニーズに応じてさまざまな業種をさまざまなサーバーにプロキシし、サイト全体の要求圧力を種類ごとにさまざまなサーバーに分散できます。この方法により、サイト全体のリクエストパフォーマンスが大幅に向上します。この記事では、参考のために、Nginxのいくつかの異なるシナリオでのプロキシのデモンストレーションについて簡単に説明します。
コンピュータネットワークでは、リバースプロキシは、クライアントに代わって1つ以上のサーバーからリソースを取得するプロキシサーバーです。これらのリソースは、Webサーバー自体から発信されたかのようにクライアントに返されます。フォワードプロキシとは異なり、フォワードプロキシは、任意のサーバーに関連付けられたクライアントと接続する仲介者であり、リバースプロキシは、任意のクライアントが関連付けられたサーバーと接続する仲介者です。
フォワードプロキシについては、[CentOS 7に基づいてNginxフォワードプロキシを構成する](https://cloud.tencent.com/developer/article/1177901?from=10680)を参照してください。
バックエンドApacheサーバーのホスト名とIP
# hostname
centos7-web.example.com
# more /etc/redhat-release
CentOS Linux release 7.2.1511(Core)
# ip addr|grep inet|grep global
inet 172.24.8.128/24 brd 172.24.8.255 scope global eno16777728
# systemctl start httpd.service
# echo "This is a httpd test page.">/var/www/html/index.html
# curl http://localhost
This is a httpd test page.
フロントエンドNginxサーバーのホスト名とIP
# hostname
centos7-router
# more /etc/redhat-release
CentOS Linux release 7.2.1511(Core)
# ip addr |grep inet|grep global
inet 172.24.8.254/24 brd 172.24.8.255 scope global eno16777728
inet 192.168.1.175/24 brd 192.168.1.255 scope global dynamic eno33554960
Nginxバージョン
# nginx -V
nginx version: nginx/1.10.2
リバースプロキシとして使用する新しい構成ファイルを追加します
# vim /etc/nginx/conf.d/reverse_proxy.conf
server {
listen 8090;
server_name localhost;
location /{
proxy_pass http://172.24.8.128; ###逆プロキシコア命令
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
proxy_cache_valid 200302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;}}
# systemctl reload nginx
# ss -nltp|grep nginx|grep 8090
LISTEN 0128*:8090*:* users:(("nginx",pid=78023,fd=8),("nginx",pid=78021,fd=8))
# curl http://localhost:8090 ##ローカルテストに基づく
This is a httpd test page.
Apacheサーバーログを表示する
# more /var/log/httpd/access_log ##リクエストIPアドレスは172です.24.8.他のマシンから要求された場合は254、172.24.8.254このIP
172.24.8.254- - [30 /Oct/2017:14:02:38+0800]"GET / HTTP/1.0"20027"-""curl/7.29.0"
Nginxサーバーのプロキシを追加します_set_ヘッダー命令、次のように変更
# grep proxy_set_header -B2 /etc/nginx/conf.d/reverse_proxy.conf
location /{
proxy_pass http://172.24.8.128;
proxy_set_header X-Real-IP $remote_addr;}
# systemctl reload nginx.service
バックエンドサーバーのApacheログ形式の設定
# vim /etc/http/conf/httpd.conf
# LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined #この行にコメントを付け、次の行を追加します
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined #主な説明{X-Real-IP}i
# ip addr|grep inet|grep global #1から.132ホストアクセス
inet 192.168.1.244/24 brd 192.168.1.255 scope global eth0
# curl http://192.168.1.175:8090 #1から.244ホストアクセス
This is a httpd test page
# 次のように、apacheアクセスログを再度確認します。これはプロキシサーバーのIPアドレスではなくなり、この時点では1として表示されます。.244192.168.1.244--[30/Oct/2017:15:49:07+0800]"GET / HTTP/1.0"20027"-" "curl/7.19.7(x86_64-redhat-linux-gnu)
libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
バックエンドサーバーはNginx構成を使用します
# more /etc/redhat-release ##osプラットフォームとipアドレス
CentOS release 6.7(Final)
# ip addr|grep eth0|grep global
inet 192.168.1.132/24 brd 192.168.1.255 scope global eth0
# nginx -v ##nginxバージョン
nginx version: nginx/1.10.2
# mkdir -pv /usr/share/nginx/html/images ##画像カタログを作成する
mkdir: created directory `/usr/share/nginx/html/images'
# cp /usr/share/backgrounds/nature/*.jpg /usr/share/nginx/html/images/. ##画像ファイルをコピーする
# cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bk
# vim /etc/nginx/conf.d/default.conf ##ここでデフォルトの構成ファイルを直接変更します
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
location /images {
alias /usr/share/nginx/html/images; ##エイリアスはここで構成されます
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# /etc/init.d/nginx reload
Reloading nginx: [ OK ]
フロントエンドNginx構成
# vim /etc/nginx/conf.d/reverse_proxy.conf
server {
listen 8090;
server_name localhost;
location / {
proxy_pass http://172.24.8.128;
proxy_set_header X-Real-IP $remote_addr;
}
location /images { ##imagesディレクトリ内のファイルを192にプロキシします.168.1.132
proxy_pass http://192.168.1.132;
proxy_set_header X-Real-IP $remote_addr;
}
}
# systemctl reload nginx
代理店の状況を確認する
ipで192.168.1.imagesディレクトリ内のjpgファイルに対する244のテストリクエスト(jpgはブラウザに基づいて正常に表示され、テクスチャはここでは省略されています)
# ip addr|grep inet|grep global
inet 192.168.1.244/24 brd 192.168.1.255 scope global eth0
# curl -I http://192.168.1.175:8090/images/Garden.jpg
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Tue, 31 Oct 2017 01:48:18 GMT
Content-Type: image/jpeg
Content-Length: 264831
Connection: keep-alive
Last-Modified: Mon, 30 Oct 2017 08:21:28 GMT
ETag: "59f6e108-40a7f"
Accept-Ranges: bytes
phpサーバー側の構成(ip 192.168.1.132)
# ss -nltp|grep php
LISTEN 0128192.168.1.132:9000*:* users:(("php-fpm",7147,8),("php-fpm",7148,0),("php-fpm",7149,0))
# mkdir -pv /data ###phpコードを保存する
# echo "/data 192.168.1.0/24(rw)">/etc/exports
# /etc/init.d/rpcbind start
# /etc/init.d/nfslock start
# /etc/init.d/nfs start
# echo "<?php phpinfo();?>">/data/index.php
Nginxプロキシ構成(ip 192.168.1.175)
# mkdir /data
# mount -t nfs 192.168.1.132:/data /data
# ls /data
index.php
# vim /etc/nginx/conf.d/reverse_proxy.conf
server {
listen 8090;
server_name localhost;
location /{
proxy_pass http://172.24.8.128;
proxy_set_header X-Real-IP $remote_addr;}
location /images {
proxy_pass http://192.168.1.132;
proxy_set_header X-Real-IP $remote_addr;}
location ~ \.php$ {
root /data;
fastcgi_pass 192.168.1.132:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;}}
# systemctl restart nginx
phpへの逆プロキシをテストします
[ root@ydq05 ~]# ip addr|grep inet|grep global
inet 192.168.1.244/24 brd 192.168.1.255 scope global eth0
[ root@ydq05 ~]# curl -I http://192.168.1.175:8090/index.php
HTTP/1.1200 OK
Server: nginx/1.12.2
Date: Tue,31 Oct 201703:22:59 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.0
Nginxアップストリームコマンドは、リクエストをバックエンドサーバーにプロキシすることもできます
次の例をアップストリーム命令と組み合わせて、tomcatへのプロキシを示します
# vim /etc/nginx/conf.d/tomcat.conf
upstream app {
server localhost:8080;
keepalive 32;}
server {
listen 80;
server_name localhost;
location /{
proxy_set_header Host $host;
proxy_set_header x-for $remote_addr;
proxy_set_header x-server $host;
proxy_set_header x-agent $http_user_agent;
proxy_pass http://app;}}[root@node132 conf.d]# ss -nltp|grep java
LISTEN 01::ffff:127.0.0.1:8005:::* users:(("java",39559,45))
LISTEN 0100:::8009:::* users:(("java",39559,43))
LISTEN 0100:::8080:::* users:(("java",39559,42))
トムキャットバージョン
[ root@node132 conf.d]# /usr/local/tomcat/bin/catalina.sh version
Using CATALINA_BASE:/usr/local/tomcat
Using CATALINA_HOME:/usr/local/tomcat
....
Server version: Apache Tomcat/7.0.69
Server built: Apr 11201607:57:09 UTC
Server number:7.0.69.0
OS Name: Linux
OS Version:2.6.32-573.el6.x86_64
Architecture: amd64
JVM Version:1.7.0_79-b15
JVM Vendor: Oracle Corporation
検証結果
# curl http://localhost
<! DOCTYPE html><html lang="en"><head><title>Apache Tomcat/7.0.69</title><link href="favicon.ico" rel="icon" type="image/x-icon"/><link href="favicon.ico" rel="shortcut icon" type="image/x-icon"/><link href="tomcat.css" rel="stylesheet" type="text/css"/></head>......
プロキシモジュールで使用できる構成手順は多数あります。これらは、接続タイムアウト期間やプロキシ時に使用されるHTTPプロトコルバージョンなど、プロキシモジュールの多くの属性を定義するために使用されます。一般的に使用されるコマンドの簡単な説明は次のとおりです。
proxy_connect_timeout
nginxがアップストリームサーバーに要求を送信する前に待機する最大時間。
proxy_cookie_domain
Set-Cookieヘッダーを介してアップストリームサーバーによって設定されたドメイン属性を、文字列、正規表現のパターン、または引用符で囲まれた変数などの指定された値に変更します。
proxy_cookie_path
Set-Cookieヘッダーを介してアップストリームサーバーによって設定されたパス属性を、文字列、正規表現のパターン、または引用符で囲まれた変数などの指定された値に変更します。
proxy_hide_header
クライアントに送信されるメッセージで非表示になるようにヘッダーを設定します。
proxy_pass
リクエストをアップストリームサーバーにプロキシするためのURLパスを指定します。
proxy_set_header
upsreamサーバーに送信されたメッセージの特定のヘッダーを書き換えます。
proxy_redirect
場所を書き換え、アップストリームサーバーから受信したメッセージのヘッダーを更新します。
proxy_send_timeout
接続が切断される前にアップストリームサーバーに送信される2つの書き込み操作間の最大間隔。
proxy_read_timeout
接続が切断される前に、受信側のアップストリームサーバーから受信した2つの読み取り操作間の最大間隔。
以下の例として:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 30;
proxy_send_timeout 15;
proxy_read_timeout 15;
注:最終更新日20171110、tomcatコンテンツにリバースプロキシを追加
Recommended Posts