SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Nginx】Nginx+Nginx Unit+Flaskのwebサーバ構築でつまったところ

前の記事で環境構築をしたときにはまったところなど。
一連の手順は以下の記事も参照。

www.wantanblog.com

環境情報とか

私の場合は以下の通り。構成特有のところもあるかもしれませんので注意。

ホストマシン:Windows10
仮想サーバ:CentOS7@Virtualbox
Python:Python3.6

ログ情報の出力先

構築中に困った場合にはやはりlogは役立つことが多いので一応確認。

・Nginx

/var/log/nginx/

・Nginx Unit

/var/log/unit/

つまったときはtailでログの出力を確認しながら調査しました。

・例

tail -f unit.log

Failed to apply new configuration.

事象

Nginx Unitの設定を行う際に「curl -X PUT」をしたら以下のようなエラーとなりました。

{
"error": "Failed to apply new configuration."
}

エラーログにより詳細を確認すると以下の通り。

2020/04/05 00:17:20 [alert] 18225#18225 Python failed to import module "main"
ModuleNotFoundError: No module named 'main'

原因・解決策

これぐらいはログまで確認できればすぐ解決できそうですが私の場合はパスが間違っていました。
具体的にはPUTするconfファイルのapplicationのpath部分です。

・修正前

  "applications": {
    "flask_sample": {
      "type": "python",
      "path": "/sample/",
      "module": "main"
    }
  }

・修正後

  "applications": {
    "flask_sample": {
      "type": "python",
      "path": "/usr/share/nginx/app/sample/",
      "module": "main"
    }
  }

参考にしたものと違ってフルパスで書くようにして再PUTしたら解決しました。

flaskのインポートに失敗する

事象

またまたNginx Unitの設定を行う際に「curl -X PUT」をしたら以下のようなエラーとなりました。

2020/04/04 01:23:45 [info] 26664#26664 "flask_sample" application started
2020/04/04 01:23:45 [alert] 26664#26664 Python failed to import module "main"
Traceback (most recent call last):
File "/usr/share/nginx/app/sample/main.py", line 1, in
from flask import Flask
ImportError: No module named flask

flaskのインポートに失敗しているようです。

原因・解決策

pipによるflaskインストールはしていることを前提とします。

python2とpython3が共存している環境の場合、Unitにpython3が使用されていない可能性があります。

APサーバであるNginx Unitはどんな言語で書かれたソースも勝手に読み込んでくれるということはなく、各種ソースを読み込ませるときに標準のモジュールを使用しているようです。
※構築作業の際にyumからインストールしているやつ

モジュールは以下に格納されています。

/usr/lib64/unit/modules/

ここに「python3系」のモジュールが存在しない場合は私と同じ上記の原因の可能性があります。

その場合はpython3系のモジュールを追加でインストールします。
とりあえずすぐに確認できたのはpython3.6のもの。

yum install unit-python36

その後Unit自体を再起動。

systemctl restart unit

ここまでやって再度PUTしてみたらうまくいきました。

変換先のURLに接続URLのパスが反映される

事象

Nginx Unitの設定はひと段落して今度はNginxの設定。

ブラウザ上のエラーは以下。

The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

エラーログには以下のように表示がされていました。

2020/04/05 00:56:33 [warn] 21110#21110: *122 upstream server temporarily disabled while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /sample/ HTTP/1.1", upstream: "http://[::1]:8081/sample/", host: "localhost:8080"

原因・解決策

事象の説明が分かりにくいと思いますが以下のようなことです。

・ブラウザのアクセスURL
http://localhost:8080/sample/

・変換されたUnitのURL??
http://localhost:8081/sample/

本来変換したかったUnitのURLは以下です。
http://localhost:8081/

原因としては「/etc/nginx/conf.d」配下に配置されるconfファイルに設定したproxy_passの最後に「/」が入っていなかったことと思われます。

・修正前

proxy_pass http://localhost:8081;

・修正後

proxy_pass http://localhost:8081/;

設定を直してリロードしなおしたら解消。
仕様の問題なのかな?

nginx -s reload

アクセス時のパーミッションエラー

事象

Nginxの設定もひと段落してブラウザからアクセスした際に接続エラー。
ブラウザ上には以下のようなエラーが表示されました。

An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.
If you are the system administrator of this resource then you should check the error log for details.
Faithfully yours, nginx.

エラーログには以下のような内容が表示されていました。

2020/04/05 01:27:01 [warn] 21663#21663: *137 upstream server temporarily disabled while connecting to upstream, client: 10 .0.2.2, server: localhost, request: "GET /sample/ HTTP/1.1",upstream: "http://127.0.0.1:8081/", host: "localhost:8080"

原因・解決策

この手のものでよくありそうな原因ですがSELinuxの問題だったようです。
問題なければSELinuxを無効化しましょう。

setenforce 0

これだけやったら無事ブラウザで画面結果が表示されるようになりました。