Ubuntu14.04 + pyenv + Python3.5 + nginx + uwsgi で Hello World

Vagrant上のUbuntuに、uWSGI+nginxで動くPythonのアプリケーション環境を作っていくぞ。

以前、Ubuntu14.04の環境を用意したが、今回はpyenvをroot権限でインストールする。

Vagrantfileの下記部分のコメントアウトを削除して、192.168.33.10からアクセスできるようにしておく。

config.vm.network "private_network", ip: "192.168.33.10"

virtualenvは今回使わない。

pyenvをインストール

gitコマンドをインストール。

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

pyenvで使用するライブラリをインストール。

sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

pyenvを root権限でインストール。

cd /usr/local/
sudo git clone git://github.com/yyuu/pyenv.git ./pyenv
sudo mkdir -p ./pyenv/versions ./pyenv/shims

パスを通して、pyenvコマンドを使えるようにしておく。

echo 'export PYENV_ROOT="/usr/local/pyenv"' | sudo tee -a /etc/profile.d/pyenv.sh
echo 'export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"' | sudo tee -a /etc/profile.d/pyenv.sh
source /etc/profile.d/pyenv.sh

pyenvのバージョンを確認してみよう。

pyenv --version

# 以下が表示
pyenv 20160202-10-ga6f1f48

visudo時に使用するエディタを nanoから viに変更しておく。
3選ぶ。

sudo update-alternatives --config editor

sudo時に pyenvコマンドが使えるよう、パスが引き継げるよう設定する。
sudoの設定ファイル開く。

sudo visudo

以下のように変更。

#Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults env_keep += "PATH"
Defaults env_keep += "PYENV_ROOT"

pyenvよりPython3.5をインストール

pyenvで使えるpythonを確認する。

pyenv install --list

最新版は3.5.1だったので、今回はこれをインストール。

sudo pyenv install -v 3.5.1

pyenvで何かをインストールした際は、以下のコマンドを実行しておく。

pyenv rehash

インストールできたか確認。

pyenv versions
 
# 以下が表示
* system (set by /usr/local/pyenv/version)
 3.5.1

3.5.1を使うように変更。

sudo pyenv global 3.5.1

*が3.5.1に移動しているので変更完了。

pyenv versions
 
# 以下が表示
system
* 3.5.1 (set by /usr/local/pyenv/version)

pythonのバージョンも3.5.1になってる。

python --version
 
# 以下が表示
Python 3.5.1

pipのバージョンを確認。

pip -V
 
# 以下が表示
pip 7.1.2 from /usr/local/pyenv/versions/3.5.1/lib/python3.5/site-packages (python 3.5)

インストールされているもの一覧を表示。何も入ってないことを確認。

pip list
 
# 以下が表示
pip (7.1.2)
setuptools (18.2)

pipコマンドはsudoで実行。アップグレードしておく。

sudo pip install --upgrade pip

7.1.2から 8.0.2にアップグレードされた。

pip -V
 
# 以下が表示
pip 8.0.2 from /usr/local/pyenv/versions/3.5.1/lib/python3.5/site-packages (python 3.5)

uWSGIインストール

必要そうなものをいれる。

sudo apt-get -y install build-essential libc6 libpcre3 libpcre3-dev libpcrecpp0 libssl0.9.8 libssl-dev zlib1g zlib1g-dev lsb-base

uwsgiはpipからインストールする。

sudo pip install uwsgi

バージョンを確認。

uwsgi --version

# 以下が表示
2.0.12

公式サイトに載っているサンプルプログラムを動かしてみる。

vim foovar.py
def application(env, start_response):
   start_response('200 OK', [('Content-Type','text/html')])
   return [b"Hello World"]

uwsgiを起動。

uwsgi --http :9090 --wsgi-file foovar.py

以下のような文字がズラズラでる。

*** Starting uWSGI 2.0.12 (64bit) on [Sun Feb 28 04:11:11 2016] ***
compiled with version: 4.8.4 on 24 February 2016 13:30:44
os: Linux-3.13.0-77-generic #121-Ubuntu SMP Wed Jan 20 10:50:42 UTC 2016
nodename: vagrant-ubuntu-trusty-64
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/vagrant/wsgi
detected binary path: /usr/local/pyenv/versions/3.5.1/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 3838
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :9090 fd 4
spawned uWSGI http 1 (pid: 1844)
uwsgi socket 0 bound to TCP address 127.0.0.1:58835 (port auto-assigned) fd 3
Python version: 3.5.1 (default, Feb 24 2016, 12:08:33) [GCC 4.8.4]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x146b410
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72768 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x146b410 pid: 1811 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 1811, cores: 1)

起動した状態でブラウザから192.168.33.10:9090 へアクセスしてみよう。 HelloWorldが表示される。

コンソール上にはいかが表示される。

[pid: 2308|app: 0|req: 1/1] 192.168.33.1 () {38 vars in 678 bytes} [Sun Feb 28 05:02:13 2016] GET / => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)
[pid: 2308|app: 0|req: 2/2] 192.168.33.1 () {40 vars in 658 bytes} [Sun Feb 28 05:02:13 2016] GET /favicon.ico => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)

uWSGIの動作は問題なさそう。

Nginxインストール

Nginxと uWSGIを連携する。

Nginxをインストールする。
Nginxサイトが配布するPGPキーを追加。

curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

リポジトリを追加。

sudo sh -c "echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
sudo sh -c "echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"

アップデート後、Nginxをインストール。

sudo apt-get update
sudo apt-get install nginx
nginx -v

# 以下が表示
nginx version: nginx/1.8.1

nginx起動。

sudo service nginx start

自動起動設定しておく。

sudo update-rc.d nginx defaults

uwsgiと連携す設定を行っていく。
設定ファイルをバックアップとっておく。

sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.bak

設定ファイルを変更。最低限の設定のみ。

sudo vim /etc/nginx/conf.d/default.conf
server {
    listen 80;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
}

uwsgiを起動する。

uwsgi --socket /tmp/uwsgi.sock --wsgi-file foovar.py --chmod-socket=666

今度はポート指定せずにhttp://192.168.33.10/へアクセスする。
Hello Worldがでる。

nginxにもアクセスがきてるので、ちゃんと連携できてるんだろう。多分な!

sudo tail -f /var/log/nginx/access.log

参考

PyenvによるPython3.x環境構築(CentOS, Ubuntu)

Ubuntuに最新のnginxをインストールする

コメント

タイトルとURLをコピーしました