LoginSignup
8
6

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-06

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

実装は実装編

登場人物

Nginx

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

uWSGI

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

そもそもWSGIとは?

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

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

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

Flask

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

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

NetflixやRedditなどが使っている

Virtualenv

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

事前準備

リポジトリをアップデート

$ sudo apt update

パッケージの更新

$ sudo apt upgrade

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

$ sudo apt install build-essential

opensslをインストール

$ sudo apt install openssl

pip3をインストール

$ sudo apt install python3-pip

ファイアウォール

ファイアウォールの設定
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で接続している場合
この順番を守らないと接続できなくなる
可能性があるので注意

Nginx

最新版の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
で最新版かどうか確認できる

---ここまでが最新版を入れる方法---

インストール

$ 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>

でも確認しておく

Virtualenv

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:~$

uWSGI

virtualenvで作成した環境からpip3でインストール

$pip3 install uwsgi

バージョンを確認

$uwsgi --version

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

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

Flask

virtualenvで作成した環境からpipでインストール

$pip3 install flask

以上

まとめ

インストールの段階でだいぶ長くなってしまった

次は実装編

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6