uWSGIのiniファイルの文法まとめ




# はじめに

uwsgiでは、オプションの設定値をコマンドライン引数、ini、xml、jsonなど複数の形式から指定できる。

本記事では視認性に長けているini形式の文法について記載する。

# iniファイルの文法

## コメント文

冒頭に記載された下記の3文字はコメントとして扱われる。

* ;
* /
* #

## 基本構成

一般的なアプリケーション開発で使用されるiniファイルと同じ形式で、セクションとキー(設定項目)で構成される。

```
[uwsgi]
socket = /tmp/uwsgi.sock
socket = 127.0.0.1:8000
workers = 3
master = true

[section1]
socket = /tmp/uwsgi.sock
socket = 127.0.0.1:8000
workers = 3
master = true
```

### キー (オプション)

設定可能なキーは下記URLのuwsgiのオプション一覧に記載されている。

省略系なども含めると1200以上のオプションが存在する。

https://uwsgi-docs.readthedocs.io/en/latest/Options.html
https://qiita.com/11ohina017/items/4cd29ec3e5c58685d784

下表に一部の項目を記載する。

|オプション|内容|例|
|---|---|---|
|async |指定されたコアで非同期モードで実行する|100|
|chdir        |アプリをロードする前に、指定したディレクトリに移動|/var/www/uwsgi|
|chdir2|アプリをロードした後に、指定したディレクトリに移動|/var/www/uwsgi|
|chmod-socket |sockファイルのパーミッションを指定|666|
|gid          |実行するグループID|nginx|
|http-websockets |WebSocket接続を自動的に検出してセッションをRAWモードにする|true|
|logto           |ログファイル、UDPアドレスの設定|/var/log/uwsgi/uwsgi.log|
|master|マスターモードで実行するか否か|true|
|max-requests |ワーカーのリロードを実施するリクエストの閾値|100|
|pidfile      |出力するpidファイルパスの設定|/var/www/uwsgi/uwsgi.pid|
|print|標準出力にメッセージを出力|test message|
|processes    |実行するプロセス数|1|
|socket       |ソケットの設定|127.0.0.1:3031|
|stats|指定したアドレスでuWSGI Stats Serverを起動する|127.0.0.1:9191|
|touch-reload |指定されたファイルが変更または修正された場合は、uWSGIをリロードする|/var/www/uwsgi/uwsig_reload|
|ugreen |uWSGI Green Threadsを有効にするか否か|true|
|uid          |ユーザID|nginx|
|vacuum     |プロセス終了時にファイル/ソケットをすべて削除する|true|
|version|uwsgiバージョンを標準出力に出力|指定不可|
|home, virtualenv, venv, pyhome|virtualenv使用時のPYTHON_HOMEディレクトリを指定|/usr/local/virtualenv/test|
|python-path, pythonpath, pp|アプリがあるディレクトリを指定|/var/www/uwsgi/|
|module
wsgi|loadするwsgiモジュールを指定||
|pyargv|Python実行時の引数を指定 ( sys.argv )|"foo bar"|
|wsgi-file|ロードするuswgiファイルを指定|/var/www/uwsgi/index.py|


### セクション

実行時にiniファイルだけしか指定しない場合、デフォルトのセクションuwsgiが実行される。
セクションを指定すると、対象のセクションが実行される。

```
* デフォルトセクションで実行
uwsgi --ini config.ini

* セクションを指定して実行
uwsgi --ini config.ini:section1
```



### 他のセクションを外部参照

ファイル名を省略してセクション名だけを指定することによって、
同一または、外部のiniファイルに定義されている他のセクションを読み込みすることも可能。
することも可能。

※ 読み込まれるセクションは、最後にロードされた.iniファイルからセクションを読み込むことになるので、注意が必要

```
[uwsgi]
# 同一iniファイル内のsection1を読み込む
ini = :section1

# 外部iniファイルのsection2を読み込む
ini = reference.ini
ini = :section2

[section1]
socket = /tmp/uwsgi.sock
socket = 127.0.0.1:8000
```

---

## マジック変数

uwsgiに標準で用意されている特別な変数。

https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html#magic-variables

「%」から始まり、特定の文字列へと置換することができる。

例えば、%n とするとiniファイルのファイル名に置換される
※ 拡張子(ini)は外される


```
uwsgi.ini
[uwsgi]
socket = /tmp/%n.sock → /tmp/uwsgi.sockに置換される
```

---

## プレースホルダ

標準で用意されたものではなく、
ユーザが独自にiniファイルに定義するマジック変数のこと。

定義の方法として、下記の2つがある。

* オプションなしで変数を定義
* set-placeholder (set-ph) オプションを使って定義する

```
[uwsgi]
# オプションなしで定義
value1 = 1
socket = %(value1).sock

# オプションを使って定義
set-ph = value2=2
socket = %(value2).sock

set-placeholder = value3=3
socket = %(value3).sock
```

set-placeholderを使用すると、プレースホルダであることが明確になり、
uWSGiに標準で用意されているオプションとの誤認を避けることができる。

## 算術プレースホルダ

計算式に%をつけると、計算結果への置換を行う。

```
[uwsgi]
x = 1
y = 2

total = %(x + y + 3 * 4)

# インクリメントも可能 (plus = 2になる)
plus = %(x ++)

```

## @マジック

@(ファイル名) と記載するとファイルの内容への置換を行う。

```
[uwsgi]
sock = @(/tmp/socket)
```

---

## ロジック設定

for、ifなどプログラミング形式での設定を行う。

### for

下記のようにスペースで区切られた文字列を、
プレースホルダ %(_) を置換する。

```
[uwsgi]
for = 3031 3032 3033
socket = 127.0.0.1:%(_)
endfor =
```

### if-env

環境変数が定義されているかを確認し、
その値をプレースホルダに置換する。

```
[uwsgi]
if-env = PATH
print = Path is %(_)
endif =

```

## 用語

### harakiri ( リクエストタイムアウト )

過度に長時間リクエストを処理しているワーカーを中止するuWSGIの機能。
harakiriタイムアウトに指定した秒数より長い時間がかかるリクエストはすべて破棄され、
対応するワーカーはリサイクルされる。

### master

uWSGIの内蔵prefork +スレッディングマルチワーカー管理モード。
一般的にはマスターモードで実行することが推奨されている。

### Emperor

uWSGI Emperorは、指定したディレクトリにある複数のuWSGIの設定ファイルを読み込んでuWSGIプロセスを起動する機能。 

設定を読み込みプロセス起動を一括管理することができる。

### ugreen

uWSGI Green Threadsの略。
グリーンスレッドは、OSではなく仮想マシン (VM) によってスケジュールされるスレッド。
グリーンスレッドはネイティブのOSの機能に依存せずにマルチスレッド環境をエミュレートする。

## 参考

* [公式HP : 用語集](https://uwsgi-docs.readthedocs.io/en/latest/Glossary.html?highlight=master)

* [公式HP :  設定ファイル説明](https://uwsgi-docs.readthedocs.io/en/latest/Configuration.html)

* [uWSGI入門](https://www.python.ambitious-engineer.com/archives/1959)
* [Qiita記事 : 運用するときのuWSGI設定 ](https://qiita.com/yasunori/items/64606e63b36b396cf695)

* [Qitta記事 : uWSGi性能に関係するオプション](https://qiita.com/wapa5pow/items/f4326aed6c0b63617ebd)

* [Qiita記事 : Nginx uWSGI Flask 入門記事](https://qiita.com/morinokami/items/e0efb2ae2aa04a1b148b)

* [Nginx+uWSGIでDjangoとWebSocketをUnixSocketで同時に管理する](https://7me.oji.0j0.jp/2017/uwsgi-nginx-websocket-emperor.html)



* [CentOS7　nginxで/tmp配下のsocketが読み込めない場合の対応](http://lxyuma.hatenablog.com/entry/2015/08/29/200443)