AWSのEC2インスタンスでnginx+uwsgiサーバーを立てる
EC2インスタンスの作成
Elastic IP
EC2インスタンスは再起動の度に動的にパブリックIPが変動するとのことで、 Elastic IPというサービスで固定IPを作成し、EC2インスタンスに関連付けます。 インスタンスを複製して冗長性を持たせる構成でも、複数インスタンスに対して同一のIPを関連付けることが出来ます。
EC2のセキュリティグループ設定
まずは、http通信が出来るように構成します。セキュリティグループ設定で、インバウンドルールにhttpを追加します。
サーバーへのファイル配置
色々と方法はあると思いますが、シェルスクリプトのrsyncコマンドでアップロードとダウンロードが出来るようにしました。
- アップロード
rsync -auz --delete -e "sudo ssh -i {秘密鍵PATH}" {ローカルディレクトリ} {EC2ユーザー}@{パブリック DNS }:~/
- ダウンロード
rsync -auz --delete -e "sudo ssh -i {秘密鍵PATH}" {EC2ユーザー}@{パブリック DNS }:~/ {ローカルディレクトリ}
サーバーセットアップスクリプト
- nginxインストール
sudo yum install gcc git sudo amazon-linux-extras install nginx1
- python仮想環境の構築とuwsgiのインストール
sudo yum install python3 sudo yum -y install python3-devel python3 -m venv python_venv source ./python_venv/bin/activate pip3 install uwsgi
サーバー設定
今回は、/var/www/uwsgiをWEBサイトのルートディレクトリとします。 動作確認の為に以下のファイルを配置します。
- /var/www/uwsgi/index.py
def application(env, start_response): main() start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World!"]
以下、サーバーを動作させるための設定を行います。
- /etc/nginx/nginx.conf 以下の部分の設定を変更します。
root /var/www/uwsgi; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { include uwsgi_params; uwsgi_pass unix:/var/www/uwsgi/socket.sock; }
rootにルートディレクトリを入力し、トップlocationのincludeにuwsgi_params、uwsgi_passにsockファイル出力PATHを設定します。 sockファイルは自動的に作成されるため予め用意する必要はありません。
- /var/www/uwsgi/uwsgi.ini
[uwsgi] master = True socket = /var/www/uwsgi/socket.sock chmod-socket = 666 wsgi-file = /var/www/uwsgi/index.py stats = 127.0.0.1:9191 logto = /var/www/uwsgi/uwsgi.log pidfile = /var/www/uwsgi/uwsgi.pid
socketをnginx.confのuwsgi_passで指定したファイルPATHと一致させて下さい。
サーバー起動
nginxとuwsgiを起動します。
sudo systemctl -l enable nginx sudo systemctl -l start nginx uwsgi --ini /var/www/uwsgi/uwsgi.ini
動作確認
http://{パブリックDNS}でWebサイトにアクセス出来ます。