ストックドッグ

KatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。サービスも運営してます→http://fmbrain.work

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に行ってみる。

f:id:doz13189:20171112192404p:plain

ポートの80が許可されていなかったので許可。(そういえばconoha側でもポートの設定できるんだった)

これや、原因はconoha側の設定でポートを開けていなかったから。

こんなイレギュラーなエラーにかかる人は少ないと思うが、念の為残しておく。

解決!!!

まとめ

以下、参考資料。


【nginxの勉強資料】

コメント:スライドシェアでnginxについての概要がわかりやすくまとめられている

www.slideshare.net

コメント:webサーバーとアプリケーションサーバーの違いがまとめられている
qiita.com

コメント:リクエストをwebサーバーとアプリケーションサーバーでの処理の流れをする
「WASへのリクエスト転送」の章必見
webサーバーとアプリケーションサーバーの通信方法についての記載あり
www.ibm.com