Nginx+uWSGI+Flask+Ubuntuで作る本格サーバー(インストール編)

複雑になりがちなFlaskを用いたサーバーをインストールから

実装は[実装編](https://qiita.com/8128/items/c4cbb2b2209c3bcb1689)で

<h1>登場人物</h1>

<h2>Nginx</h2>
Webサーバー
基本的にクライアントからの接続はこいつを
通してから処理される
いわば元請け

<h2>uWSGI</h2>
アプリケーションサーバー
今回はWebサーバー(Nginx)とWebアプリケーション(Flask)
とを繋ぐ橋渡し役
いわば中間業者

<h3>そもそもWSGIとは？</h3>
WebServerGatewayInterfaceの略(ウィスキーと読むらしい)
Webアプリケーション(Flask)とWebサーバー(Nginx)間の取り決めのこと
ようするにプロトコル(仕様)

これがないと
例えばあるWebサーバー(A)を使った場合
その仕様に乗っ取ったWebアプリケーション(A')
を使わなければいけないことになる(現に昔はそうしてたらしい)
逆もまたしかり

その仕様を標準化した形がWSGIということ
当たり前だがこれから使うFlaskもWSGIの仕様に乗っ取ってる

<h2>Flask</h2>
ウェブアプリケーションフレームワーク
実際の処理はこいつが行う
いわば下請け

Pythonの主要なフレームワークとしてDjangoがあるが
Djangoと比べると必要最低限の機能しか搭載してないので
超軽量かつ簡単に実装できてしまう

NetflixやRedditなどが使っている

<h2>Virtualenv</h2>
Pythonの仮想環境
システムがパッケージで混雑になることを防止
なくても実装はできるがあった方がよい

<h1>事前準備</h1>
リポジトリをアップデート

```console
$ sudo apt update
```

パッケージの更新

```console
$ sudo apt upgrade
```

gcc,gdbなどの開発ツールをインストールしておく(uwsgiのビルドに必要)

```console
$ sudo apt install build-essential
```

opensslをインストール

```console
$ sudo apt install openssl
```

pip3をインストール

```console
$ sudo apt install python3-pip
```

<h1>ファイアウォール</h1>
ファイアウォールの設定
ubuntu側でもファイアウォールを設定しておく
必要ないと思ったら飛ばしてOK

ufwをインストール

```
$ sudo apt install ufw
```

すべてのポートを閉じる

```
$ sudo ufw default deny
```

必要なポートは開けておく
自分の場合はSSH(22), http(80)

```
$ sudo ufw allow 22
$ sudo ufw allow 80
```

ファイアウォールを有効化

```
& sudo ufw enable
```

ステータスを確認

```
$ sudo ufw status
```

ちなみにSSHで接続している場合
この順番を守らないと接続できなくなる
可能性があるので注意

<h1>Nginx</h1>
最新版のnginxを入れる方法は
https://nginx.org/en/linux_packages.html
https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3100
から

別に最新版を入れる必要はないならインストールまで
飛ばしてOK

PGPキーをダウンロード

```
$ wget https://nginx.org/keys/nginx_signing.key
```

キーをインポート

```
$ sudo apt-key add nginx_signing.key
```

リポジトリを登録

```
$ sudo vi /etc/apt/sources.list

# 末尾に追加 bionicの部分はubuntuの開発コード
deb http://nginx.org/packages/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/ubuntu/ bionic nginx
```

~/ubuntu/bionic nginxのbionicの部分は
Ubuntuのバージョンによって書き換える

|バージョン|開発コード|
|:---|:---|
|16.04|xenial|
|18.04|bionic|
|19.10|eoan|
|20.04|focal|

ubuntuのversion確認方法は

```
$ cat /etc/lsb-release
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
```

リポジトリ情報を更新

```
sudo apt update
```

バージョンを確認

```
$ apt show nginx
Package: nginx
Version: 1.18.0-1~bionic
```

記事を書いてる時点で1.18.0が安定版らしい

http://nginx.org/en/download.html
で最新版かどうか確認できる

<b>---ここまでが最新版を入れる方法---</b>

インストール

```
$ sudo apt install nginx
```

バージョン確認

```
$ nginx -v
nginx version: nginx/1.18.0
```

あらかじめサービスに登録しておく

```
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
```

アクセスできれば成功

```
$ curl http://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
```

80番ポートが開いているなら
許可されてるIPから

```
$ curl http://<パブリックIP>
```

でも確認しておく

<h1>Virtualenv</h1>
pip3でインストール

```
$ sudo pip3 install virtualenv
```

バージョン確認

```
$ virtualenv --version
```

環境を作成

```
$ virtualenv py36_flask_server --python=python3.6
```

ちなみに指定したバージョンのPythonが入っていない場合
作成に失敗するので事前にインストールしておく

下記で環境に入れればOK

```
$ . <環境名>/bin/activate
(py36_flask_server) ubuntu@ip-10-0-0-14:~$
```

<h1>uWSGI</h1>
<b>virtualenvで作成した環境からpip3でインストール</b>

```
$pip3 install uwsgi
```

バージョンを確認

```
$uwsgi --version
```

ちなみにVirtualenvではなくAnacondaを使うという手もあった
ただuWSGIをインストールする段階でエラーが多発するので注意

Anacondaを使いたい場合
時間はかかるが解決はするので下記の記事を参考
https://katsuwosashimi.com/archives/300/python-conda-install-uwsgi-failed/

<h1>Flask</h1>
<b>virtualenvで作成した環境からpipでインストール</b>

```
$pip3 install flask
```

以上

<h1>まとめ</h1>
インストールの段階でだいぶ長くなってしまった

次は[実装編](https://qiita.com/8128/items/c4cbb2b2209c3bcb1689)で