本人能力有限,本文只是簡單介紹基礎部署流程,沒有過多考慮系統安全等因素,請諒解。初學者參考瞭解,大神勿噴。html
純測試部署,採用阿里雲ECS,系統Ubuntu 16.04 64位,部署採用nginx+gunicorn+virtualenv+supervisor經常使用部署方式。python
nginx:輕量級高性能的Web 服務器/反向代理服務器,可處理靜態資源,負載均衡等, 是Apache服務器不錯的替代品。mysql
gunicorn:Python WSGI HTTP Server for UNIX。只支持在Unix系統上運行,使用prefork master-worker模型,通常用來管理多個進程,有進程掛了Gunicorn能夠把它拉起來,防止服務器長時間中止服務,還能夠動態調整 worker 的數量。中文文檔。linux
supervisor:基於linux操做系統的一款服務器管理工具,用以監控服務器的運行,發現問題能當即自動預警及自動重啓等功能。項目部署的目的是監控啓動 Gunicorn,即便Gunicorn 的管理進程掛了也能夠自動起來。nginx
virtualenv:建立獨立的python環境,多項目開發過程當中經常使用。具體介紹:virtuanenv。web
sudo apt-get update //更新源 sudo apt upgrade //更新軟件 sudo apt-get install python-virtualenv //安裝python虛擬環境 sudo apt-get install supervisor //安裝supervisor sudo apt-get install nginx //安裝nginx sudo apt-get install mysql-server //安裝mysql sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev
出於安全和方便管理的目的,使用專門的用戶組來操做web應用。sql
添加用戶組。groupadd 添加用戶組;--system 指定將要添加的用戶組是系統級別的;webapps 爲用戶組的名字。shell
sudo groupadd --system webapps
添加用戶。useradd 添加用戶;–gid 指定用戶所屬的組,後面緊跟的webapps就指定了用戶屬於webapps組;–shell 用戶使用shell的路徑,即/bin/bash;–home 用戶home文件夾位置,即/webapps,方便操做;qaq 爲用戶名(最好要有意義。數據庫
sudo useradd --system --gid webapps --shell /bin/bash --home /webapps qaq
修改用戶。在sudoers文件中,在root ALL=(ALL:ALL) ALL下一行添加qaq ALL=(ALL:ALL) ALL。django
sudo passwd qaq //爲新用戶設置密碼 sudo vim /etc/sudoers //給用戶添加執行sudo命令的權限 sudo mkdir -p /webapps //建立工做目錄 sudo chowm qaq /webapps //用戶受權
建立虛擬環境的時候千萬注意不能使用sudo,否則的話建立出來的venv文件夾屬於root用戶,以後操做會出現權限問題。pip安裝第三方包的時候也要注意不能用sudo。
sudo su - qaq //切換用戶 sudo mkdir learnDjango //新建項目目錄 cd learnDjango //進入項目目錄 virtualenv -p /usr/bin/python3.5 --no-site-packages venv //新建python虛擬環境 source venv/bin/activate //激活虛擬環境
關於virturlenv的使用,請參考:#Python學習#python虛擬環境——virtualenv。
(1)安裝Django和Gunicorn(虛擬環境),注意不要使用sudo前綴,安裝完畢以後能夠經過pip list命令查看當前安裝的第三方包列表。
pip install django pip install gunicorn pip install psycopg2
(2)建立django項目,名爲learn,並初始化數據庫。
經過vim編輯項目的設置文件,找到ALLOWED_HOSTS = []這一行,將其改成ALLOWED_HOSTS = ['*'],表示Django站點能夠投聽任意的主機/域名。在INSTALLED_APPS = [···]中添加gunicorn。保存退出。
django-admin startproject learn //新建項目 cd learn //切換目錄 python manage.py migrate //初始化數據庫 sudo vim /learn/settings.py //編輯設置文件
(3)啓動開發服務器,驗證django項目能夠正常運行。注意其中的IP地址換成本機的IP,雲服務器的話是私有IP。
python manage.py runserver xxx.xxx.xxx.xxx:8000 //啓動項目
若是你有界面,你可使用瀏覽器訪問xxx.xxx.xxx.xxx:8000;若是是雲服務器,有一個神奇的好用的第三方包,叫作w3m,經過apt-get安裝後,使用命令:w3m xxx.xxx.xxx.xxx:8000能夠在終端訪問網頁。訪問成功表明Django項目正常運行。
在項目目錄(/webapps/learnDjango/learn/)下,新建配置文件gunicorn.conf(vim gunicorn.conf)。內容以下,注意其中提到的127.0.0.1:9000這個地址。
import multiprocessing bind = "127.0.0.1:9000" workers = 2 errorlog = '/webapps/learnDjango/logs/gunicorn.error.log' #accesslog = ''/webapps/learnDjango/logs/gunicorn.access.log' #loglevel = 'debug' proc_name = 'gunicorn_learnDjango_project'
固然,你會發現其中提到一個日誌文件,須要對應地建立。
mkdir -p /webapps/learnDjango/logs/ touch /webapps/learnDjango/logs/gunicorn.error.log
測試一下能不能用,輸入以下命令,會輸出一個進程ID暫時也看不出可不可用,待會再說了。簡單來講,gunicorn就是代替「python manage.py runserver xxx.xxx.xxx.xxx:8000 //啓動項目」命令的,固然做用不只僅於此。
nohup gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf&
supervisor是一個監視和管理進程的工具,在進程當掉以後,能夠重啓。所以適合用此來啓動服務器進程。
(1)建立配置文件。/etc/supervisor/conf.d目錄下建立learn_supervisor.conf。內容以下:
[program:learn] command=/webapps/learnDjango/venv/bin/gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf user=qaq stdout_logfile = /webapps/learnDjango/logs/gunicorn_supervisor.log autostart=true autorestart=true redirect_stderr = true
(2)啓動並運行
注意: 記得清空記錄,否則會報一個Another....的錯誤。
sudo unlink /var/run/supervisor.sock //清空記錄 sudo supervisord -c /etc/supervisor/supervisord.conf //啓動 sudo supervisorctl -c /etc/supervisor/supervisord.conf //管理
不出意料,上述代碼直接運行報錯,百度錯誤。最後獲得的結果是配置文件寫的有問題。什麼問題了?最後發現是沒有進入虛擬環境運行gunicorn命令,想一想也是,gunicorn是安裝在虛擬環境中,那麼如何進入虛擬環境呢?須要利用命令source。那就在前面加一行吧。
command=source /webapps/learnDjango/venv/bin/avtivate ; /webapps/learnDjango/venv/bin/gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf
運行仍是報錯,告訴我can'ot find command ‘source’,最後找到的解決辦法:Supervisor source command not found 如何解決。原來source必須使用bash才能執行。最後的文件以下:
learn_supervisor.conf
[program:learn] command=bash /webapps/learnDjango/learn/init.sh directory=/webapps/learnDjango/learn user=qaq stdout_logfile=/webapps/learnDjango/logs/gunicorn_supervisor.log autostart=true autorestart=true redirect_stderr=true [supervisorctl]
init.sh
#! /bin/bash source /webapps/learnDjango/venv/bin/avtivate /webapps/learnDjango/venv/bin/gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf
(2)使用supervisor
sudo supervisord -c supervisord.conf 經過配置文件啓動supervisor sudo supervisorctl -c supervisord.conf status 察看supervisor的狀態 sudo supervisorctl -c supervisord.conf reload 從新載入 配置文件 sudo supervisorctl -c supervisord.conf start [all]|[appname] 啓動指定/全部 supervisor管理的程序進程 sudo supervisorctl -c supervisord.conf stop [all]|[appname] 關閉指定/全部 supervisor管理的程序進程
關於更多supervisor操做,請參考:使用 supervisor 管理進程
(1)建立配置文件。在項目目錄下(/webapps/learnDjango/learn/),新建配置文件learn_nginx.conf。內容以下,注意到其中proxy_pass參數對應的正是剛纔gunicorn配置文件中綁定的地址。對了這裏一樣提到了兩個日誌文件,記得在logs文件夾下建立。
server { listen 8500; server_name 47.94.99.248; access_log /webapps/hello/logs/nginx.access.log; error_log /webapps/hello/logs/nginx.error.log; location / { proxy_pass http://127.0.0.1:9000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
能夠看出這個 配置文件十分簡陋,沒有什麼額外信息,知識基礎而已。關於nginx配置的更多內容,請參考:。
(2)連接到對應的配置文件。須要sudo權限。
ln -s /webapps/learnDjango/learn/learn_nginx.conf /etc/nginx/conf.d/learn_nginx.conf
(2)大功告成,如今測試一下能不能用吧!
能夠發現,直接訪問雲服務器IP地址是能夠顯示nginx的默認頁面(80端口),可是8500端口爲何不能用呢?不是咱們配置的問題,而是雲服務器配置的問題。進入實例管理頁面,點擊左邊「本實例安全組」->「配置規則」,添加安全組規則,端口範圍寫咱們nginx監聽的8500。
OK,最後兩步,須要兩個終端,分別執行gunicore和重啓nginx。
nohup gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf& service nginx restart
Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL
本文版權歸做者AlvinZH和博客園全部,歡迎轉載和商用,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利.