Nginxのrewrite機能でURLの書き換えをしてみる

f:id:komeiy:20141210231407p:plain

Apacheだとmod_rewriteで実現するのですが、今回Nginxのrewrite機能を使ってURLの書き換えをしてみます。

公式で見ると、この記事を記載している現在の最新バージョンは1.7.8です。Stable versionは1.6.2ですので、今回は1.6.2を使用します。

  1. Nginxインストール
  2. Nginxをリバースプロキシとして設定する
  3. 動作確認
  4. Nginxのrewrite設定をする
  5. rewriteで正規表現を使用する
  6. 動作確認

Nginxインストール

インストールでは特に気をつけることはないので簡単に記載します。

Repository追加

[komei@localhost ~]$ wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

[komei@localhost ~]$ rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm

[komei@localhost ~]$ cat /etc/yum.repos.d/nginx.repo
# nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

Nginxをyumでインストールする

[komei@localhost ~]$ sudo yum info nginx.x86_64
Installed Packages
Name        : nginx
Arch        : x86_64
Version     : 1.6.2
Release     : 1.el6.ngx
Size        : 828 k
Repo        : installed
From repo   : nginx
Summary     : High performance web server
URL         : http://nginx.org/
License     : 2-clause BSD-like license
Description : nginx [engine x] is an HTTP and reverse proxy server, as
            : well as a mail proxy server.

[komei@localhost ~]$ sudo yum -y install nginx

Nginxをリバースプロキシとして設定する

Nginxの設定をする前に、事前準備としてindex.htmlを以下のように設定しています。

[komei@localhost ~]$ curl localhost
indexだよ!

Nginx upstream設定

upstream hogehogeの記載以降で、リバースプロキシサーバとしてバックエンドのサーバに処理を受け渡す設定が可能です。ここでは以下の通りの動作をconfファイルに記載しています。

  • フロントとしてNginxが9000番ポートで待ち受け
  • 同一のサーバの80番ポート(apache)をバックエンドとして使用
[komei@localhost ~]$ sudo vi /etc/nginx/conf.d/default.conf
server {
    listen       9000;
    server_name  localhost;

    location / {
        proxy_pass http://backend;
    }
}

upstream backend {
    server localhost:80;
}

location設定でupstream名を指定して処理を受け渡します。

Nginx upstream設定 その他

このような記載方法を取る事も可能です。通常は80番ポート×2台で待ち受けweightに従いbackend1を優先的に使います。backupは80番が不通の時に使用されます。

upstream hogehoge {
  server backend1.example.com       weight=5;
  server backend2.example.com;

  server backup1.example.com:8080   backup;
  server backup2.example.com:8080   backup;
}    

他には以下のようなパラメータがあり、どこかで見たような動作が可能です。

  • least_conn
  • health_check
  • sticky_cookie_insert

それではdefault.confを使用してnginxを起動します。

[komei@localhost ~]$ sudo service nginx start
Starting nginx:                                            [  OK  ]

Nginxリバースプロキシの動作確認

9000番にアクセスしてみます。最初に確認したindex.htmlが表示されました。

[komei@localhost ~]$ curl localhost:9000
indexだよ!

Nginxのrewrite設定をする

続いてrewriteを確認します。先に事前確認してrewriteする予定のURLを叩いておきます。

当然、現時点では404が返ってきます。

[komei@localhost ~]$ curl localhost:9000/rewrite-dekirukana.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /rewite-dekirukana.html was not found on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at backend Port 80</address>
</body></html>

Nginx rewrite設定

location配下にrewriteコマンドを使って設定が可能です。ここではrewrite-dekirukana.htmlをindex.htmlへ301リダイレクトを使ってリダイレクトしています。

server {
    listen       9000;
    server_name  localhost;

    location / {
        proxy_pass http://backend;
        rewrite /rewrite-dekirukana.html index.html permanent;
    }
}

upstream backend {
    server localhost:80;
}

今回はpermanetを使用しましたが、以下の通りパラメータを選択可能です。

  • last - completes processing of current rewrite directives and restarts the process (including rewriting) with a search for a match on the URI from all available locations.
  • break - completes processing of current rewrite directives and non-rewrite processing continues within the current location block only.
  • redirect - returns temporary redirect with code 302; it is used if the substituting line begins with http://
  • permanent - returns permanent redirect with code 301

動作確認をすると以下の通り301が返ってきます。ブラウザで見るとしっかりとリダイレクトされています。

[komei@localhost ~]$ curl localhost:9000/rewrite-dekirukana.html
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.6.2</center>
</body>
</html>

f:id:komeiy:20141210231546j:plain

rewriteで正規表現を使って設定する

rewriteでは正規表現を使用可能です。また引数として入力された文字列を$1として受け取って利用しています。

server {
    listen       9000;
    server_name  localhost;

    location / {
        proxy_pass http://backend;
        rewrite /(.*)/index.html $1.html permanent;
    }
}

upstream backend {
    server localhost:80;
}

事前に以下の通りrewrite.htmlを準備しておきます。

[komei@localhost ~]$ curl localhost:9000/rewrite.html
rewite!!!

以下の通りアクセスするとrewite.htmlへリダイレクトされます。

[komei@localhost ~]$ curl localhost:9000/rewrite/index.html
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.6.2</center>
</body>
</html>

f:id:komeiy:20141210231557j:plain

以下、公式から抜粋です。参考にしてください。

rewrite  ^(/download/.*)/media/(.*)¥..*$  $1/mp3/$2.mp3  last;
rewrite  ^(/download/.*)/audio/(.*)¥..*$  $1/mp3/$2.ra   last;

最近流行りのNginxは覚えておいて損はないと思います。参考書や雑誌でも取り上げられているので、この機会に読んでみるのが良いかと思います。


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

ハイパフォーマンスHTTPサーバ Nginx入門

ハイパフォーマンスHTTPサーバ Nginx入門