如何配置nginx+uwsgi+django?
網上查了好多帖子了,都沒成功,從昨天到今天晚上,馬上就哭著報警了
(; ̄ェ ̄)推薦個鏈接也可以啊!!用的是CentOS6.5,django1.7,python3.
django簡易部署指南.md
----------------------------
首先 推薦使用virtualenv用於創建獨立的Python環境 使多個python多個Python相互獨立,互不影響 你比較高大上 用virtualenvwrapper 也沒關係。。。
virtualenv --no-site-packages test
cd test
source bin/activate
pip install gunicorn django
django-admin.py startproject hello
cd hello
# to test the base setup works
python manage.py runserver 0.0.0.0:8000
Gunicorn
Gunicorn「綠色獨角獸」是一個被廣泛使用的高性能的Python WSGI UNIX HTTP伺服器 與django搭配 效果拔群
Testing Django with Gunicorn is as simple as:
我們先來個simple Example來運行django
gunicorn_django -b 0.0.0.0:8000
當然 正常的合理的運行方法是寫個sh腳本來運行 like it
#!/bin/bash
set -e
LOGFILE=/var/log/gunicorn/hello.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3
# user/group to run as
USER=your_unix_user
GROUP=your_unix_group
cd /path/to/test/hello
source ../bin/activate
test -d $LOGDIR || mkdir -p $LOGDIR
exec ../bin/gunicorn_django -w $NUM_WORKERS
--user=$USER --group=$GROUP --log-level=debug
--log-file=$LOGFILE 2&>&>$LOGFILE
看起來很麻煩? 這裡在舉一個實際中使用的腳本供參考
#!/bin/bash
set -e
LOGFILE=/var/log/blog.log
# log路徑
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=1
#下面有解釋
# user/group to run as
USER=root
GROUP=root
cd /home/www/blog/
#web的路徑
test -d $LOGDIR || mkdir -p $LOGDIR
exec gunicorn -w $NUM_WORKERS -b 0.0.0.0:8000 lintcode.wsgi:application --user=$USER --group=$GROUP
#8000是埠 可隨意修改
ps 1.這裡要解釋下NUM_WORKERS參數的設置 gunicorn只需要啟用4–12個workers,就足以每秒鐘處理幾百甚至上千個請求了。 如果你的網站訪問量較大,
我推薦的合理的worker數量是:
(2 x $num_cores)
2.可能你要提升下腳本許可權 like
chmod ug+x script.sh
這裡有兩種選擇來維護上面的腳本持續運行 一種是 利用 Supervisor
另一種是 Upstart
UpstartUpstart是替換 /sbin/init 守護進程 這是一個例子 新建/etc/init/hello.conf
description "Test Django instance"
start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 10 5
exec /test/hello/script.sh
#腳本路徑為/test/hello/script.sh
運行下面指令 來試試吧
---ubuntu
service hello {start,status,stop}
#(as root).
---centos
start Hello
stop Hello
ps.(ubuntu)
如果上面指令沒效果 可能是鏈接沒做好 執行下面的指令
sudo ln -s /lib/init/upstart-job /etc/init.d/hello
么么噠 django就這樣安全的部署好嘍
- 創建一個django項目
django-admin.py startproject hello
然後你的目錄是這樣的
hello/
├── hello
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
- 配置uwsgi.ini,不清楚的配置自行搜索
[uwsgi]
chdir=/home/liaoziqian/hello
uid=nobody
gid=nobody
module=hello.wsgi:application
socket=/home/liaoziqian/hello/uwsgi.sock
master=true
workers=5
pidfile=/home/liaoziqian/hello/uwsgi.pid
vacuum=true
thunder-lock=true
enable-threads=true
harakiri=30
post-buffering=4096
daemonize=/home/liaoziqian/hello/uwsgi.log
- uwsgi相關命令
啟動uwsgi:uwsgi --ini uwsgi.ini
停止uwsgi:uwsgi --stop uwsgi.pid
重新載入配置:uwsgi --reload uwsgi.pid
- nginx配置
server {
listen 8080;
location / {
include uwsgi_params;
uwsgi_connect_timeout 30;
uwsgi_pass unix:/home/liaoziqian/hello/uwsgi.sock;
}
}
- 啟動uwsgi,啟動nginx,一個簡單的nginx + uwsgi + django示例就完成了
自己也是沒有經驗,根據網上的文章 折騰了好幾天時間,終於折騰出結果。你可以點擊下面網址看 也可以直接往下看,不過可能排版這麼好
Liunx之Ubuntu下Django+gunicorn+nginx部署_Linux_陳新明
一、uWSGI
1. 安裝
pip install uwsgi
2. 測試uWSGI是否安裝成功
在終端中輸入以下命令查看uwsgi的版本號,如果輸出正常,說明uswgi已安裝成功
$ uwsgi --version
2.0.15
3. 編寫一個簡單的wsgi應用測試uwsgi是否能正常使用
首先創建一個test.py文件(命令:vim test.py)
# test.py
def application(env, start_response):
start_response("200 OK", [("Content-Type","text/html")])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
4.運行uwsgi:
uwsgi --http :8000 --wsgi-file test.py
參數解釋:
http :8000表示使用http協議,埠號為8000,
wigi-file則表示要運行的wsgi應用程序文件。
uwsgi運行後打開瀏覽器,訪問http://127.0.0.1:8000/ ,或者是相應伺服器地址的8000埠,就可以看到hello world 頁面了。
運行截圖:
如果想要運行項目來測試
# uwsgi --http :8000 --chdir 項目路徑 -w 項目.wsg --static-map=/static=static
uwsgi --http :8000 --chdir /home/teacher/ -w teacher.wsgi --static-map=/static=static
uWSGI常用命令:
uwsgi --chdir=/path/to/your/project
--module=mysite.wsgi:application
--env DJANGO_SETTINGS_MODULE=mysite.settings
--master --pidfile=/tmp/project-master.pid
--socket=127.0.0.1:49152 # 可以ip地址,也可以是文件
--processes=5 # 進程數量
--uid=1000 --gid=2000 # 如果是root用戶,uwsgi可以有刪除許可權
--harakiri=20 # 一個請求超時時間
--max-requests=5000 # 一個工作進程最大請求數
--vacuum # 退出時清楚環境
--home=/path/to/virtual/env # virtualenv的路徑
-- static # 做一個映射,指定靜態文件
--http # 這個就和runserver一樣指定IP 埠
--daemonize=/var/log/uwsgi/yourproject.log # 日誌
5. 創建uwsgi配置文件
在項目統計目錄下創建文件夾script,(比如項目目錄路徑/home/project_teacher/teacher,那麼scrip文件存放在/home/project/teacher/script)
$ pwd
/home/project_teacher
$ mkdir script
$ vim uwsgi.ini
配置信息如下:
[uwsgi]
# 項目目錄
chdir=/opt/project_teacher/teacher/
# 指定項目的application
module=teacher.wsgi:application
# 進程個數
workers=5
pidfile=/opt/project_teacher/script/uwsgi.pid
# 指定IP埠
http=192.168.31.123:8080
# 指定靜態文件
static-map=/static=/opt/test_project/teacher/static
# 啟動uwsgi的用戶名和用戶組
uid=root
gid=root
# 啟用主進程
master=true
# 自動移除unix Socket和pid文件當服務停止的時候
vacuum=true
# 序列化接受的內容,如果可能的話
thunder-lock=true
# 啟用線程
enable-threads=true
# 設置自中斷時間
harakiri=30
# 設置緩衝
post-buffering=4096
# 設置日誌目錄
daemonize=/opt/project_teacher/script/uwsgi.log
# 指定sock的文件路徑
socket=/opt/project_teacher/script/uwsgi.sock
6. 啟動配置
$ uwsgi --ini uwsgi.ini # 啟動uwsgi配置
[uwsgi-static] added mapping for /static =&> /home/trunk/static # 啟動成功
$ uwsgi --stop uwsgi.pid # 關閉uwsgi
signal_pidfile()/kill(): Operation not permitted [core/uwsgi.c line 1659]
二、Nginx
1. 安裝
$ sudo apt-get install nginx #安裝
2. 檢查nginx是否安裝成功
$ /etc/init.d/nginx start
[ ok ] Starting nginx (via systemctl): nginx.service.
檢查nginx是否啟動成功
$ ps -ef |grep -i nginx
root 6961 1 0 03:56 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 6962 6961 0 03:56 ? 00:00:00 nginx: worker process
pala 6985 2090 0 03:57 pts/0 00:00:00 grep --color=auto -i nginx
然後打開瀏覽器,訪問ip地址,出現如下頁面即代表nginx安裝完成且可以正常啟動。
Nginx常用命令
$ /etc/init.d/nginx start #啟動
$ /etc/init.d/nginx stop #關閉
$ /etc/init.d/nginx restart #重啟
修改Nginx信息
nginx.conf文件
vim /etc/nginx/nginx.conf
三、Django + uWSGI +Nginx
1. 創建一個xxx.conf配置文件(nginx的默認配置目錄為/etc/nginx/conf.d)
server { # 這個server標識我要配置了
listen 80; # 我要監聽那個埠
server_name 10.129.205.183 ; # 你訪問的路徑前面的url名稱
access_log /var/log/nginx/access.log main; # Nginx日誌配置
charset utf-8; # Nginx編碼
gzip on; # 啟用壓縮,這個的作用就是給用戶一個網頁,比如3M壓縮後1M這樣傳輸速度就會提高很多
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; # 支持壓縮的類型
error_page 404 /404.html; # 錯誤頁面
error_page 500 502 503 504 /50x.html; # 錯誤頁面
# 指定項目路徑uwsgi
location / { # 這個location就和咱們Django的url(r"^admin/", admin.site.urls),
include uwsgi_params; # 導入一個Nginx模塊他是用來和uWSGI進行通訊的
uwsgi_connect_timeout 30; # 設置連接uWSGI超時時間
uwsgi_pass unix:/opt/project_teacher/script/uwsgi.sock; # 指定uwsgi的sock文件所有動態請求就會直接丟給他
}
# 指定靜態文件路徑
location /static/ {
alias /opt/project_teacher/teacher/static/;
index index.html index.htm;
}
2. 重啟nginx
$ /etc/init.d/nginx restart #重啟
我的系統是ubuntu server,nginx+uwsgi+django/flask都成功部署。
建議使用virtualenv。
我的部署方案可以做到各個項目獨立配置,互不影響(nginx,當然是從部署上的)。
以下是我寫的文檔:Ubuntu-Server-14.04-Nginx-uWSGI-Python-Django-Flask 雖然系統不一樣,但是除了配置文件path,其他區別不大。僅供參考。
建議使用docker。。。
可以參考:
Nginx + uwsgi + django + websocket(dwebsocket)環境部署
最簡單的方式,安裝docker,直接去docker hub上去下載一個別人配置好的鏡像,然後在本地以docker鏡像的方式啟動,一切都ok了。
docker pull dockerfiles/django-uwsgi-nginx1、升級Python以及安裝PIP
使用腳本安裝和升級pip,會自動安裝setuptools ,前提是需要下載get-pip.py2、安裝Django、uwsgi
pip install django==1.8.15pip install uwsgi3、安裝MySQL以及安裝mysql-python
選擇免安裝版本pip install mysql-pythonDjango同步資料庫模型(注意Django版本,syncdb為&
&>Django==1.7
[root@db1 demosite]# python manage.py makemigrationsMigrations for "west": 0001_initial.py: - Create model Character[root@db1 demosite]# python manage.py migrate
Operations to perform: Synchronize unmigrated apps: staticfiles, messages Apply all migrations: admin, west, contenttypes, auth, sessionsSynchronizing apps without migrations: Creating tables... Running deferred SQL... Installing custom SQL...Running migrations: Rendering model states... DONE Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying sessions.0001_initial... OK Applying west.0001_initial... OK[root@db1 demosite]#4、安裝Nginx以及配置uwsgi
uwsgi支持ini、xml等多種配置方式,下述以ini為例,在/etc目錄下創建uwsgi8090.ini,配置內容如下[root@db1 ~]# cat /etc/uwsgi8090.ini[uwsgi]socket=127.0.0.1:8090master=truevhost=trueno-size=trueworkers=2reload-mercy=10vacuum=truemax-requests=1000limit-as=512buffer-size=30000pidfile=/var/run/uwsgi8090.piddaemonize=/website/uwsgi8090.log[root@db1 ~]#Nginx配置,默認配置文件nginx.conf,修改並添加內容如下
location / { #root html; #index index.html index.htm; include uwsgi_params; uwsgi_pass 127.0.0.1:8090; uwsgi_param UWSGI_SCRIPT demosite.wsgi; uwsgi_param UWSGI_CHDIR /django/demosite; index index.html index.htm; client_max_body_size 35m; } location /static { #alias /django/demosite/static; alias /usr/local/lib/python2.7/site-packages/django/contrib/admin/static/; #注意是alias,而非root }5、Django admin頁面缺少css樣式
參考:解決Django Admin管理界面樣式表(CSS Style)丟失問題
Nginx+Django Admin界面無樣式問題解決步驟:(網路上說有兩種解決方式,我只是成功了一種)1、進入Python找到django靜態文件的目錄[root@db1 demosite]# pythonPython 2.7.9 (default, Oct 9 2016, 23:39:53)[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2Type "help", "copyright", "credits" or "license" for more information.&>&>&> import django&>&>&> django.__file__"/usr/local/lib/python2.7/site-packages/django/__init__.pyc"&>&>&>2、找出django靜態文件的絕對路徑,並修改項目工程下的settings.py
/usr/local/lib/python2.7/site-packages/django/contrib/admin/static在settings.py增加如下內容
STATIC_ROOT="/usr/local/lib/python2.7/site-packages/django/contrib/admin/static/"3、修改nginx配置文件,重啟uwsgi以及nginx
location /static { #alias /django/demosite/static; alias /usr/local/lib/python2.7/site-packages/django/contrib/admin/static/; }root@db1 demosite]# /usr/local/nginx/sbin/nginx -s reload
[root@db1 demosite]# uwsgi --reload /var/run/uwsgi8090.pid6、在伺服器重啟過後,因為是寫入/etc/rc.local,Uwsgi以及Nginx進程不正常,需要完善開機自啟動Python Web部署篇 -- 簡明現代魔法我看到的一個簡易的教程目前我們公司是是採用命令行啟動xml配置文件的方式啟動uwsgi服務
建議你換mez吧。。。一個fab就搞定了
我的方法是:nginx+apache(wsgi)+django+資料庫(mongodb,memcached,redis,pg等)
比較簡單參考http://www.i-8-i.com/?p=348
推薦閱讀:
※使用uwsgi和nginx做伺服器和django框架,為什麼每次修改代碼都需要重啟uwsgi呢?
※為什麼感覺現在搜索到的東西,越來越糟呢?
※varnish / squid / nginx cache 有什麼不同?
※微軟的 Web 伺服器為何能屹立不倒?
※Linux多進程模型比多線程更容易實現熱部署嗎?