Nginxのrewrite機能でURLの書き換えをしてみる
Apacheだとmod_rewriteで実現するのですが、今回Nginxのrewrite機能を使ってURLの書き換えをしてみます。
公式で見ると、この記事を記載している現在の最新バージョンは1.7.8です。Stable versionは1.6.2ですので、今回は1.6.2を使用します。
- Nginxインストール
- Nginxをリバースプロキシとして設定する
- 動作確認
- Nginxのrewrite設定をする
- rewriteで正規表現を使用する
- 動作確認
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>
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>
以下、公式から抜粋です。参考にしてください。
rewrite ^(/download/.*)/media/(.*)¥..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)¥..*$ $1/mp3/$2.ra last;
最近流行りのNginxは覚えておいて損はないと思います。参考書や雑誌でも取り上げられているので、この機会に読んでみるのが良いかと思います。
シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。
- 作者: Clement Nedelcu,長尾高弘
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2011/04/21
- メディア: 大型本
- 購入: 2人 クリック: 714回
- この商品を含むブログ (23件) を見る
Software Design (ソフトウェア デザイン) 2014年 07月号 [雑誌]
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/18
- メディア: 雑誌
- この商品を含むブログ (2件) を見る