如何配置nginx+uwsgi+django?(知乎上面的看着不錯)

作者:知乎用戶
鏈接:https://www.zhihu.com/question/27295854/answer/36365005
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

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

Upstart

Upstart是替換 /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就這樣安全的部署好嘍

編輯於 2015-01-10

​贊同 22​​2 條評論

​分享

​收藏​喜歡收起​

小松鼠

小松鼠

死磕Python http://www.chenxm.cc/

9 人贊同了該回答

自己也是沒有經驗,根據網上的文章 折騰了好幾天時間,終於折騰出結果。你可以點擊下面網址看 也可以直接往下看,不過可能排版這麼好

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 #重啓

編輯於 2017-10-13

​贊同 9​​3 條評論

​分享

​收藏​喜歡收起​

廖子謙

廖子謙

26 人贊同了該回答

  1. 創建一個django項目
     
    django-admin.py startproject hello
    然後你的目錄是這樣的
    hello/
    ├── hello
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py
    
  2. 配置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
    
  3. uwsgi相關命令
    啓動uwsgi:uwsgi --ini uwsgi.ini
    停止uwsgi:uwsgi --stop uwsgi.pid
    重新加載配置:uwsgi --reload uwsgi.pid
  4. nginx配置
    server {
        listen 8080;
        location / {
            include uwsgi_params;
            uwsgi_connect_timeout 30;
            uwsgi_pass unix:/home/liaoziqian/hello/uwsgi.sock;
        }
    }
    
  5. 啓動uwsgi,啓動nginx,一個簡單的nginx + uwsgi + django示例就完成了

編輯於 2015-01-14

​贊同 26​​6 條評論

​分享

​收藏​喜歡收起​

logo優酷App

廣告​

不感興趣知乎廣告介紹

毫不誇張地說,今天優酷視頻VIP這個活動,很有點“喪心病狂”!

原價198的優酷會員,現在只需要99元,低至8.25元/月,海量片庫隨意看,廣告再見,福利來!查看詳情

kan tmac

kan tmac

1 人贊同了該回答

Python Web部署篇 -- 簡明現代魔法
我看到的一個簡易的教程
目前我們公司是是採用命令行啓動xml配置文件的方式啓動uwsgi服務

發佈於 2016-07-14

​贊同 1​​添加評論

​分享

​收藏​喜歡

知乎用戶

知乎用戶

6 人贊同了該回答

我的系統是ubuntu server,nginx+uwsgi+django/flask都成功部署。

建議使用virtualenv。

我的部署方案可以做到各個項目獨立配置,互不影響(nginx,當然是從部署上的)。

以下是我寫的文檔:Ubuntu-Server-14.04-Nginx-uWSGI-Python-Django-Flask 雖然系統不一樣,但是除了配置文件path,其他區別不大。僅供參考。

 

建議使用docker。。。

編輯於 2017-07-12

​贊同 6​​3 條評論

​分享

​收藏​喜歡

人間各種胸器

人間各種胸器

不會修電腦,再問弄死你信不信

2 人贊同了該回答

可以參考:

Nginx + uwsgi + django + websocket(dwebsocket)環境部署

發佈於 2017-03-17

​贊同 2​​添加評論

​分享

​收藏​喜歡

路強

路強

航天遙感/python/私有云/美食/羽毛球愛好者/投資

2 人贊同了該回答

最簡單的方式,安裝docker,直接去docker hub上去下載一個別人配置好的鏡像,然後在本地以docker鏡像的方式啓動,一切都ok了。

docker pull dockerfiles/django-uwsgi-nginx

發佈於 2015-03-19

​贊同 2​​2 條評論

​分享

​收藏​喜歡

liujt

liujt

IT 大叔

bitnami 的集成安裝包

Install Django, Download Django

或虛擬機鏡像

 

https://bitnami.com/stack/django/virtual-machine

編輯於 2018-02-27

​贊同​​添加評論

​分享

​收藏​喜歡

Coral

Coral

看戲的

1、升級Python以及安裝PIP
使用腳本安裝和升級pip,會自動安裝setuptools ,前提是需要下載get-pip.py

2、安裝Django、uwsgi
pip install django==1.8.15
pip install uwsgi

3、安裝MySQL以及安裝mysql-python
選擇免安裝版本
pip install mysql-python

Django同步數據庫模型(注意Django版本,syncdb爲<Django==1.7)
[root@db1 demosite]# python manage.py syncdb

>Django==1.7
[root@db1 demosite]# python manage.py makemigrations
Migrations 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, sessions
Synchronizing 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:8090
master=true
vhost=true
no-size=true
workers=2
reload-mercy=10
vacuum=true
max-requests=1000
limit-as=512
buffer-size=30000
pidfile=/var/run/uwsgi8090.pid
daemonize=/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]# python
Python 2.7.9 (default, Oct 9 2016, 23:39:53)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "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.pid


6、在服務器重啓過後,因爲是寫入/etc/rc.local,Uwsgi以及Nginx進程不正常,需要完善開機自啓動

編輯於 2016-10-09

​贊同​​添加評論

​分享

​收藏​喜歡收起​

吳明志

吳明志

炒股大老闆,秒入30億

建議你換mez吧。。。一個fab就搞定了

發佈於 2015-11-19

​贊同​​添加評論

​分享

​收藏​喜歡

leehark

leehark

我的方法是:nginx+apache(wsgi)+django+數據庫(mongodb,memcached,redis,pg等)

發佈於 2015-08-07

​贊同​​添加評論

​分享

​收藏​喜歡

Dreamcoin

Dreamcoin

 

我的網站部署​www.gaoblog.cn圖標

我在我的網站上面寫了部署的具體流程。

來源:https://www.zhihu.com/question/27295854?sort=created

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章