CentOS7に基づいてNginxリバースプロキシを構成する

リバースプロキシサーバーとしてのNginxは、主要なインターネット企業で広く使用されています。シンプルで使いやすく、ビジネスニーズに応じてさまざまな業種をさまざまなサーバーにプロキシし、サイト全体の要求圧力を種類ごとにさまざまなサーバーに分散できます。この方法により、サイト全体のリクエストパフォーマンスが大幅に向上します。この記事では、参考のために、Nginxのいくつかの異なるシナリオでのプロキシのデモンストレーションについて簡単に説明します。

1.リバースプロキシとプレゼンテーション環境の説明##

1、 リバースプロキシ###

コンピュータネットワークでは、リバースプロキシは、クライアントに代わって1つ以上のサーバーからリソースを取得するプロキシサーバーです。これらのリソースは、Webサーバー自体から発信されたかのようにクライアントに返されます。フォワードプロキシとは異なり、フォワードプロキシは、任意のサーバーに関連付けられたクライアントと接続する仲介者であり、リバースプロキシは、任意のクライアントが関連付けられたサーバーと接続する仲介者です。

フォワードプロキシについては、[CentOS 7に基づいてNginxフォワードプロキシを構成する](https://cloud.tencent.com/developer/article/1177901?from=10680)を参照してください。

2、 このデモのいくつかのサーバー##

2つの従来の逆プロキシ構成##

1、 バックエンドサーバー構成(Apache)###

バックエンド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.

2、 フロントエンドNginxリバースプロキシサーバー構成###

フロントエンド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"

3、 リバースプロキシサーバーとバックエンドサーバーのログ形式の設定###

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

3.特定のファイルタイプに基づくリバースプロキシ構成##

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

第4に、アップストリーム##に基づいてtomcatにリバースプロキシを構成します。

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>......

5、プロキシモジュール命令の説明##

プロキシモジュールで使用できる構成手順は多数あります。これらは、接続タイムアウト期間やプロキシ時に使用される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

CentOS7に基づいてNginxリバースプロキシを構成する
CentOS7に基づいてNginxフォワードプロキシを構成する
CentOS7に基づいてNginxロードバランシングを構成する
CentOS7に基づいて自動的に起動するようにNginxを構成します
CentOS6でOcservを構成する
Centos 7(仮想ホストを含む)に基づいてNginxを構築する
CentOS7でスワップスペースを構成する
CentOS7に基づくZabbix3.4をインストールします
CentOS7にNginxサーバーをインストールします
一般的なLinux操作(centos7に基づく)
CentOSでrsyslogログクライアントを構成する
CentOS8にNginxをインストールする方法
dockerに基づいてElasticsearch6.2.4(centos)を構築する
LinuxでNginx環境を構築する(CentOS)
centos7でpython3環境を構成し、
CentOSに基づいてDiscuzフォーラムを構築する
CentOSに基づいてWeChatアップルトサービスを構築する
CentOSに基づいてWeChatアップルトサービスを構築する
UbuntuシステムでNginxGitサーバーを構成する
Dockerをデプロイし、CentOSでNginxを構成します
Centos7.3はnginxをインストールします
CentOS7にElasticsearchをインストールして構成する方法
クラウドサーバーはCentOSに基づいてDiscuzフォーラムを構築します
CentOS8にVNCをインストールして構成する方法
CentOS8にRedisをインストールして構成する方法
Centos7はNginxをインストールします
CentOS6にphpMyAdminをインストールして構成する方法
CentOS8にOwncloudをインストールして構成する方法
Centos7はJDKを構成します
centos8にnginxをインストールするための詳細なチュートリアル(グラフィック)
CentOS8にRedmineをインストールして構成する方法
CentOS8でVsftpdを使用してFTPサーバーを構成する方法
Ubuntu18.04に基づいて固定IPを構成する方法
CentOS8にNFSサーバーをインストールして構成する方法
CentOS8でVsftpdを使用してFTPサーバーを構成する方法
Let&#39;sEncryptを使用してCentOS8でNginxを保護する方法
CentOS MONOnginxを実行しています
Centos7にDockerをインストールする
Centos7.4はLNMPをインストールします
centos7でk8s1.9.9をビルドする
Centos7にJavaをインストールする
centos7でのXfs構成
Nodejsはcentos7にインストールされます
CentOS8にFFmpegをインストールします
CentOS7にRabbitMQをインストールします
CentosにNode.jsをインストールします
Mavenはcentos7にインストールします
CentOS7にMongoDBをインストールします
ジェンキンスはセントスに基づいて構築されています
CentOS8にSurelogをインストールする
centos6.8でランプを構成する
Centos7はIPアドレスを構成します
centos7にvuepressをデプロイする
centos7へのOpenjdkのインストール
Jenkinsをcentos7にインストールします
CentOS7でRapidSVNを使用する
Centos7はnodejs環境を構成します
セントスにRabbitMQをインストールする
CentOS7にRabbitMQをインストールします
centos6.5にDockerをインストールします
セントスにオラクルをインストールする