FreeBSD11+python3.6+Bottleで作り直すメモ(11)-nginxとuWSGIで公開してみる

FreeBSDのポリシーが変わって2018年10月いっぱいでFreeBSD 10-Releaseは終了したとのことなのでタイトル変更。

これまではBottleが内蔵していたWebサーバで動作確認を行っていたが性能がいまいちなので実運用するなら適当なWSGIサーバを使ってね、とマニュアルにも書かれているので検討してみる。基本的にはh_kabocha氏によるBottle + uWSGI+ Nginx Quick Tutorialのやり方をそのまま使わせて頂いた。ここではFreeBSD環境特有の箇所のみ記載する。

nginx、uwsgi共にpkgでインストール可能。python3.6の場合はuwsgi-py36というパッケージをインストールすればよいようだ。(uwsgiというパッケージもある)。また、FreeBSDの場合は(他のサーバ系パッケージと同様)必要に応じてサーバを動作させるユーザとグループを作ってくれる(nginxについてはもとから用意されていたwww:wwwを利用、uwsgiについてはuwsgi:uwsgiを作成してくれる)。

uwsgiの設定ファイルのデフォルトは/usr/local/etc/rc.d/uwsgiを見る限り/usr/local/etc/uwsgi/uwsgi.iniなのでそこを編集。socketも特にしていてなければ/tmp/uwsgi.sockになるようだ。

まず、Bottleで動かすサイトのソースコードを開き、先頭に下記のコードを追加する。

from bottle import default_app

そして、末尾の

run(host='IPアドレス', port=ポート番号, debug=True, reloader=True)

を、以下のように変更する。

if __name__ == '__main__':
  run(host='IPアドレス', port=ポート番号, debug=True, reloader=True)
else:
  application = default_app()

(2018/11/17追記)正式公開まではバグフィックスの為にソースの先頭にfrom bottle import debugを追加し、application = default_app()の前にdebug(mode=True)を入れてデバッグモードにしておいた方がよさそう。これが無いとpythonコードのエラーがすべて"Internal Server Error"になってしまって原因が特定できない。(追記終わり)

次に、/usr/local/etc/uwsgi/uwsgi.iniを作成する。単純に下記のようにした。

[uwsgi]
chdir = アプリのコードが保存されているディレクトリ
file = アプリのファイル名

続いて、/usr/local/etc/nginx/nginx.confを編集。まず、httpセクションの中に下記を追加する。

upstream _bottle {
    server unix:/tmp/uwsgi.sock;
}

そして、http→server→location / セクションを以下のように変更する。

location / {
    include uwsgi_params;
    uwsgi_pass _bottle;
}

最後に、/etc/rc.confnginx_enable="YES"uwsgi_enable="YES"を追加してuwsgiとnginxを起動すれば完了。

複数のBottleアプリを使いたい場合(例えばコンテンツ表示用のものとコンテンツ編集用のものを別のポートで動かしたい時)は、uWSGIのエンペラーモードを利用する。FreeBSDの場合は/etc/rc.confuwsgi_emperor="YES"を追加する。各アプリのiniファイルは/usr/local/etc/uwsgi/vassals/に移し、socket=/tmp/ソケット名.sockという行を追加する。ソケット名はアプリ毎に違うものを用意する。で、/usr/local/etc/uwsgi/uwsgi.iniは、wapa5pow氏のApacheにかわるwebサーバ: uWSGIパフォーマンスチューニングという記事を参考に以下のようにしてみた(なお、uwsgi自体は、エンペラーモードならuwsgi.iniが無くてもFreeBSDが適当なパラメータを設定してくれる)。また、環境変数LANGを正しく設定していないとSimpleTemplateの起動でこけるのでこれも設定。

[uwsgi]
max-requests = 6000
max-requests-delta = 300
env = LANG=ja_JP.UTF-8

さらに/usr/local/etc/nginx/nginx.confの方はupstreamセクションとserverセクションをソケット毎に用意する。

(2020/6/10追記) uWSGIではiniファイル中に logto = ログファイルのパス でログを記録できるが、実運用する時にログを記録すると膨大な量となったのでログは記録しないほうがよさそう。アクセスログはNginxでもとれるわけだし。

コメント(0)

コメントを投稿する際はここをクリック

Blog category: Ultima | Adventure games | BSD and Linux | FM TOWNS and Japanese home computers | Computers | Bottle | 広島新球場 | 日本プロ野球 | 広島市民球場跡地とサッカースタジアム | その他スポーツ | Other topics
2002 08 09 10 11 12
2003 01 02 03
2004 01 02 03 04 06 08 09 10 11 12
2005 01 02 03 04 05 06 07 08 09 10 11 12
2006 01 02 03 04 05 06 07 08 09 10 11 12
2007 01 02 03 04 05 06 07 08 09 10 11 12
2008 01 02 03 04 05 06 07 08 09 10 11 12
2009 01 02 04 05 06 07 09 10
2010 01 03 04 05 08 11
2011 01 02 03 04 07 11 12
2012 01 02 03 09 10 11
2013 01 02 03 05 06 07 08 09 10 11 12
2014 01 02 03 04 05 06 07 10 11 12
2015 01 02 03 04 05 07 08 11 12
2016 03 04 05 07 08 09 10 11
2017 06
2018 11 12
2019 01 04 10
2020 05 06 07

Note

本サイトのハイパーリンクの一部は、オリジナルのサイトが閉鎖してしまったため"Internet archive Wayback Machine"へのリンクとなっています。そのようなリンクにはアイコン[archive]を付与しています。

本サイトはCookieを使用しています。本サイトにおけるCookieは以下の三種類のみであり、Cookieの内容に基づいてサイトの表示を変更する以外の用途には用いておりません。