NginxではURIごとにアクセス制御が可能。
アクセスされたくないページには404を返したりするのに使うと良い。
今回は、前回(https://shiro-secret-base.com/?p=468)から一気に飛躍して簡易掲示板を作ってみた。
作業環境
OS | Ubuntu 18.04.3 LTS |
nginx -v | 1.14.0 (Ubuntu) |
phpfpm -v | PHP 7.3.9 (fpm-fcgi) (built: Sep 17 2019 09:26:12) |
sqlite3 --version | 3.22.0 |
今回は投稿内容をSQLiteで保存するようにします。(DB作るのも面倒いし、インサートとセレクトできればいいので)
ソースコード(GitHub)
今回のソースはこちら(https://github.com/smithshiro/nginx-neko-neko)でも確認できます。
今回作るもの
今回作るページはこちらです。
名前とコメントを入力して保存する。ザ・フツーの掲示板です。猫は特に関係ないです。
ディレクトリ構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
├── README.md ├── css │ └── style.css ├── index.php ├── js │ └── main.js # <= APIを叩くスクリプトファイル └── src ├── api # <= APIが叩かれるエンドポイント │ ├── getPost.php # <= 投稿を取得 │ └── sendPost.php # <= 投稿 ├── modules │ ├── initializeDatabase.php # <= テーブル初期化 │ └── model │ ├── abstractModel.php #< = DB操作の抽象クラス │ └── posts.php # <= 投稿テーブルの操作を行うクラス └── sqlite └── database.sqlite3 # <= sqliteファイル(手動で作成) |
DBにはSQLiteを使うので、src/sqlite配下にdatabase.sqlite3を作成します。
また、PHPでsqliteを実行できるようにphp.iniを編集します。多分以下をコメントアウトすれば、いけるはず。
1 2 |
extension=pdo_sqlite extension=sqlite3 |
その後、initializeDatabase.phpを実行すればテーブルが作成されます。
Nginx設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
server { listen 8888; server_name sample-site.com; try_files $uri $uri/ /index.php /index.html = 404; index index.php index.html; root /var/www/html/sample-site; access_log /var/log/nginx/sample-site/access_log; error_log /var/log/nginx/sample-site/error_log; include fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; location /README.md { return 404; } location / { location ~* \.php(/|$) { if (!-f $document_root$fastcgi_script_name) { return 404; } fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } } location /api { # <= /apiから始まるURIは/srcディレクトリをルートにする location ~* \.php(/|$) { if (!-f $document_root$fastcgi_script_name) { return 404; } root /var/www/html/sample-site/src; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } } location /src { # <= /srcからは直接入れない return 404; } location /image/ { root /var/www; } } |
API用のlocationディレクティブを作成
投稿を取得したり、投稿を追加するのはAPIで行います。
そのため、Webページから叩くAPIのURIを"/api"スタートしてます。
25~33行目のlocationディレクティブでは/apiからアクセスされた場合は、プロジェクトソースの/srcを参照するようになっています。
srcから直接アクセスはできないように制御
ただ、sample-site:888/src/... てアクセスしたときにソースファイルに直接されてしまうのはまずいので
34~36行目では404(500系ではファイルがあると思わせるので)を返すようにしています。
ソース等はGitに上がっているので、そちらからどうぞ。説明に関しては省きます。
まとめ
- locationディレクティブをネストすることで、ページ用のURIとAPI用のURIにアクセスするルートディレクトリを分けることができる。
- アクセスされたくないURIなどもlocationディレクティブで制御することが可能。
nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。
nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。