Asial Blog

Recruit! Asialで一緒に働きませんか?

nginx(リバプロ)とapache(Webサーバ)でアクセス要求制御をしよう

カテゴリ :
バックエンド(プログラミング)
タグ :
PHP
Linux
Mac
皆様、ご無沙汰しております。笹亀です。
ブログを書くのが、去年以来となってしまい、年が変わってしまいました・・
遅れましたが、今年度もよろしくお願い致します。

本日はリバースプロキシとWebサーバを利用したサーバ構築方法についてご紹介したいと思います。リバースプロキシとは、外部のネットワークを内部のネットワークへ処理の振り分けをするサーバのことを示します。リバースプロキシは長いのでリバプロと言います。
一般的には下記のようなリバプロを使用せずにWebサーバへ直接アクセスをさせる方法が多いのです。


リバプロを使用した場合は、リバプロが受けた要求をWebサーバへ転送して、Webサーバ側でコンテンツを表示するといったフローになります。


大規模なサイトを構築する場合には役割をわけるためにリバプロを使用した構成で構築されていることもあります。nginxとApacheを使用しますが、どちらもWebサーバとしてもリバプロとしても動作させることが可能です。今回はnginxの方が高速に動作するということからnginxをリバプロにし、WebサーバをApacheにしたいと思います。

まずはnginxとApacheをインストールします。
 ※インストール処理はMacPortsをインストールしていることを前提とします
  1. $ sudo port install nginx
  2. $ sudo port install apache2

Apacheの設定ファイルを変更します。
80番はリバプロ側で処理するためApacheではListenポートを8010に変更する


nginx側の設定を変更します。
インストール後は「/opt/local/etc/nginx」に設定ファイルのサンプルがあり、
通常はこちらを参考にして設定しますが、今回は設定ファイルを下記のように設定します。

1.mimeタイプはデフォルトのものを利用します
  1. sudo mv /opt/local/etc/nginx/mime.types.default /opt/local/etc/nginx/mime.types

2.nginx.conf(基本設定)を作成します
  1. sudo vim /opt/local/etc/nginx/nginx.conf
設定内容:
  1. user  nobody;
  2. worker_processes  1;  
  3. error_log  logs/error.log  info;
  4. events {
  5.     worker_connections  256;
  6. }
  7. http {
  8.     include       mime.types;
  9.     default_type  application/octet-stream;
  10.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  11.                       '$status $body_bytes_sent "$http_referer" '
  12.                       '"$http_user_agent" "$http_x_forwarded_for"';
  13.     access_log  logs/access.log  main;
  14.     sendfile        on; 
  15.     keepalive_timeout  65; 
  16.     proxy_headers_hash_max_size 1024; 
  17.     proxy_headers_hash_bucket_size 256;
  18.     proxy_set_header X-Real-IP $remote_addr;
  19.     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  20.     proxy_set_header Host $host;
  21.     proxy_read_timeout 600s;
  22.     proxy_connect_timeout 10s;
  23.     include domains/*.conf;
  24. }

3.基本設定で読み込んでいるdomains/localhost.conf(ドメインごとの設定)を作成します。
  1. sudo vim /opt/local/etc/nginx/domains/localhost.conf
設定内容:
  1. upstream web-apache {
  2.   server localhost:8010;
  3. }
  4. server {
  5.   listen       80; 
  6.   server_name  localhost;
  7.   access_log  logs/localhost.access.log  main;
  8.   error_log logs/localhost.error.log debug;
  9.   location / { 
  10.     proxy_set_header X-Real-IP $remote_addr;
  11.     proxy_set_header X-Forwarded-For $remote_addr;
  12.     proxy_set_header X-CB-REMOTE-ADDR $remote_addr;
  13.     proxy_set_header Host $host;
  14.     proxy_pass http://web-apache/;
  15.   }
  16.   
  17. }
※port 80番のアクセスを受けたらlocalhost:8010(apache)へ転送する

4.ログ出力先のフォルダを作成して、権限を与える
  1. sudo mkdir -p /opt/local/logs/
  2. sudo chmod -R 777 /opt/local/logs/

ここまでで基本的なリバプロの設定完了です。
まずはnginxをスタートさせ、httpでローカルにアクセスします。
  1. sudo nginx -c /opt/local/etc/nginx/nginx.conf

Apacheの受け側が起動していないため、nginx側でエラーとなることがわかります。

それでは、受け側のApacheをスタートさせ、再度、httpでローカルにアクセスします。
  1. sudo /opt/local/apache2/bin/apachectl start

正しくApacheのhtdocsが表示されれば、リバプロにて転送がうまくいったことになります。

この例のようにリバプロとwebサーバを分けて構築することでリバプロでWebアクセスを一元管理し、処理させたいWebサーバをリバプロで制御をすることができます。例えば、ドメインごとに処理をさせたいWebサーバを選択して専用に処理をさせるようなことも行えますし、負荷がかかる特定のエイリアスに専用の処理をさせるWebサーバを設定するといったことも可能です。

リバプロサーバとWebサーバは分けて使うことでメリットが得られますので、サーバの台数的には増えてしまうというデメリットもあります。採用する際はメリットとデメリットの両方をしっかり考えて、採用をする必要がございます。

検証するだけでしたら、設定例のようにローカルマシーン1台でも試せますので、ぜひご興味がある方はお試しくださいませ。