flask + nginxで静的サイトを構築
環境を整える
nginxをインストール。
$ sudo apt-get install nginx
nginxのよく編集・見るファイルたちのパス。
#設定ファイルのパス cd /etc/nginx #ログファイルのパス #アクセス用のログファイルとエラー用のログファイルがある cd /var/log/nginx #公開ディレクトリのパス cd /var/www
静的サイトということでhtmlファイルを用意
wwwは公開ディレクトリとなり、アクセスしてくるユーザーはwwwに来ることになる。
htmlファイルは、/var/www/の直下に作成する。
$ sudo mkdir bot /var/www/bot
適当なindex.htmlを作成する。
$vi index.html #index.html <html> <head> <title>hi!</title> </head> <body> <h1>Hello World!!</h1> </body> </html>
nginxの設定
nginxはデフォルトの設定があり、邪魔なためデフォルトの設定を読み込まないようにする。
デフォルトの設定が書かれているファイルはこれ。(コレイラナイ)
$ /etc/nginx/sites-available/defaut
nginxの基本的な設定はnginx.confにまとめられている。
デフォルトの設定を消すために、nginx.confの以下のコードをコメントアウトする。
$ cd /etc/nginx/ $ vi nginx.conf #before include /etc/nginx/sites-enabled/*; #after #include /etc/nginx/sites-enabled/*;
ちなみに、これを消す理由↓
nginxの初期設定では、conf.dより先にdefautを読み込みに行くため、conf.dで設定を追加してもdefautで設定されていれば反映されない。(defaultでの設定が優先される)
さて、そろそろnginxの設定をしていく。
nginxは、基本的な設定がnginx.confに書かれており、追加の設定を書きたい場合はconf.dフォルダの中にファイルを追加することで書く。(拡張子は.conf限定)
なので。。。
$ cd /etc/nginx/conf.d $ vi mybot.conf server { listen 80; server_name default_server; location / { root /var/www/bot; index index.html; } }
listen : 80番のポートからきたアクセスのみ扱いますよ〜、ってやつ
server_name : ホスト名を適当につければいい。(なぜ必要なのか未だよくわかっていない)
location > root : さっき作ったindex.htmlに飛ばしたいのでbotフォルダを指定
location > index : botフォルダのどのファイルをレスポンスするかをここで指定
nginxの起動・状態・停止のコマンド一覧。
Ubuntuはこのコマンドでnginxを起動させたり、停止されることができる。
$ systemctl status nginx.service $ systemctl start nginx.service $ systemctl restart nginx.service $ systemctl stop nginx.service
nginxを起動(start)させ、ブラウザにipアドレスをうつと「Hello World!!」と表示されるはず
ipアドレスはifconfigコマンドで確認可能。
これで立派な静的WEBページの作成できた。
エラーまとめ
エラー1
発生タイミングは、nginxを再起動した時。
$ systemctl restart nginx.service
以下、エラーログ。
still could not bind()
エラーの意味は「ポート80番を割り当てれない」って言ってる。
ポート80を専有しているプロセスがあるっぽいので、ポート80を指定して、見てみる。
$ sudo lsof -i:80 #80番のポートを使用しているプロセスをkillする $ kill 10054
解決!
エラー2
発生タイミングは、たしかnginxを再起動したタイミングかな。
エラーの意味は、そのままファイルが見つかりません、ってやつ。
nginx.confのプロセスIDの参照先が間違っていた。
unlink() "/run/nginx.pid" failed (2: No such file or directory)
$ vi /etc/nginx/nginx.conf #before pid /run/nginx.pid; #after pid /var/run/nginx.pid;
解決!!
エラー3
発生タイミングは、nginxを起動せさせた状態でブラウザからIPアドレスをうってアクセスしようとした時。
一番、解決に時間がかかった。
応答時間が長過ぎます
アクセスログを見ても、ログがないのでそもそもアクセスすらできていない。
ということは、ポート80が空いてなくてアクセスできていないのか、と当たりをつけてみる。
ファイヤーウォールの設定を見て、ポートが空いているかを確認。
$ sudo ufw status Status: active To Action From -- ------ ---- 80/tcp ALLOW Anywhere 80/tcp (v6) ALLOW Anywhere (v6)
ポート80は空いている。
なぜ?
サーバーに接続した状態で、接続を確かめてみる。
$ curl localhost #これが返ってくる <html> <head></head> <body> <p> hello </p> </body> </html>
nginxの設定はあっているということになる。
ポートが開いていないことが原因だと確信する。(じゃないと説明が出来ない)
conohaのHPに行ってみる。
ポートの80が許可されていなかったので許可。(そういえばconoha側でもポートの設定できるんだった)
これや、原因はconoha側の設定でポートを開けていなかったから。
こんなイレギュラーなエラーにかかる人は少ないと思うが、念の為残しておく。
解決!!!
まとめ
以下、参考資料。
【nginxの勉強資料】
コメント:スライドシェアでnginxについての概要がわかりやすくまとめられている
コメント:webサーバーとアプリケーションサーバーの違いがまとめられている
qiita.com
コメント:リクエストをwebサーバーとアプリケーションサーバーでの処理の流れをする
「WASへのリクエスト転送」の章必見
webサーバーとアプリケーションサーバーの通信方法についての記載あり
www.ibm.com