1. 程式人生 > >Django 部署到微信炸金花程序開發

Django 部署到微信炸金花程序開發

acc number pid proto buffers reload 鏈接 etc 連接

在網上搜了很多篇微信炸金花程序開發( h5.super-mans.com Q:2012036433)微信炸金花程序開發
,忙了一下午頭昏腦脹,最終完成了部署。部署文章流程講解都很好,但在細節上或許缺乏一些註意力,導致我多篇文章來回切換在字裏行間尋找蛛絲馬跡。既然我完成了部署,那我何不寫下自己的流程和心得,讓後來人有一些參考?

原理

Django+uwsgi+Nginx的工作模式如下圖所示,三個服務各司其職,分別為:

Nginx負責接收瀏覽器的連接,靜態文件Nginx能夠自己處理,有諸如查詢數據庫,判斷輸入數據等,調用uwsgi。
uwsgi為web網關服務網關接口,起到橋梁的作用,連接Django應用和Nginx。對於Nginx的調用,會發回給Django應用。

Django實際的生產者,處理業務邏輯,讀寫數據庫,流程判斷等,實現網站具體的功能。

部署流程

一、完成的Django項目

首先,要有一個完成的Django項目,通過瀏覽器能打開。

在我的服務器上有一個tutotial的Django項目,是個博客的學習項目。

使用python manager.py runserver 0.0.0.0:8000能夠運行。通過瀏覽器訪問是正常的。

二、安裝uwsgi並配置

2.1 安裝uswgi。

使用pip工具安裝uswgi,pip install uswgi

使用一個測試程序來測試uswgi能否正常運行。新建一個test.py,內容如下。

test.py

使用命令:uwsgi --http :8002 --wsgi-file test.py,開啟一個uswgi的服務。--http指訪問端口為8002,--wsgi-file 指uwsgi的請求處理函數為test.py。如下圖所示,為開啟之後正常的輸出項

通過瀏覽器能夠訪問到該服務。當訪問端口8002時,處理函數為test.py中的application,返回一個text,格式為html,內容是“hello world”。

2.2 配置uswgi文件

使用uswgi作為nginx和django之間的搬運工,要將服務長久化就必須寫一個配置文件。如下配置文件,路徑在django主目錄,是對上一步驟的命令行中命令的文件化。其中我們熟悉的配置項:

對外端口 http:9000,指定服務的開啟端口
wsgi-flie tutorial/wsgi.py 指定請求的處理文件,在django項目中自動創建的文件。位於tutorial/tutorial/wsgi.py
除此之外還有:

chdir django的主目錄
socket 和nginx交互的端口。
daemonize 讓程序後臺運行。默認開啟程序時如上圖中會在終端中輸出連接信息,開啟該項配置關閉輸出信息。
uwsgi起到一個橋梁的作用,具體體現在:wsgi-file連接django項目,socket連接Nginx。

uwsgi.ini

復制代碼
[uwsgi]

對外提供 http 服務的端口

http = :9000

#the local unix socket file than commnuincate to Nginx 用於和 nginx 進行數據交互的端口
socket = 127.0.0.1:8001

the base directory (full path) django 程序的主目錄

chdir = /home/ccf/code/django_learn/tutorial

Django‘s wsgi file

wsgi-file = tutorial/wsgi.py

maximum number of worker processes

processes = 4

#thread numbers startched in each worker process
threads = 2

#monitor uwsgi status 通過該端口可以監控 uwsgi 的負載情況
stats = 127.0.0.1:9191

clear environment on exit

vacuum = true

後臺運行,並輸出日誌

daemonize = /var/log/uwsgi.log
復制代碼

2.3 運行uwsgi

使用uwsgi可執行文件,載入uwsgi.ini配置文件。

當程序運行之後,有兩個端口可以訪問到:

http:9000 能夠通過端口9000訪問
socket 預留給Nginx訪問。
如下使用9000端口,訪問到django的項目。

三、安裝Nginx服務器

3.1 安裝Nginx

使用apt-get install nginx,一鍵安裝nginx。

3.2 配置nginx

上面的配置中,uswgi已經連接到django,大橋的一端已經通車,剩下的就nginx和uwsgi合龍。nginx的配置項路徑為:/etc/nginx/nginx.conf。如下是nginx的完整配置文件,修改如下藍色字體。在http的配置項中增加了一個server配置項,該server就是連接uwsgi服務的配置。

/etc/nginx/nginx.conf

復制代碼
user root;
worker_processes auto;
pid /run/nginx.pid;

events {
worker_connections 768;

multi_accept on;

}

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

server {
#這裏是訪問時用到的端口
listen 8000;
server_name 127.0.0.1;
charset UTF-8;
#這塊存讓日誌文件
access_log /var/log/nginx/SchoolBuy_access.log;
error_log /var/log/nginx/SchoolBuy_error.log;
client_max_body_size 75M;
location / {
#一定要有該配置項
include uwsgi_params;
#同uwsgi內容,連接uwsgi的socket。
uwsgi_pass 127.0.0.1:8001;
#鏈接超時時間
uwsgi_read_timeout 30;
}

      location /static/ {
           autoindex on;
           #這裏的路徑一定要到達靜態文件的文件夾。即collectedstatic/,重點在最後的橫杠。不然會報錯
           alias /home/ccf/code/django_learn/tutorial/collectedstatic/; 
           }

      location /media/ {
              autoindex on;
            alias /home/ccf/code/django_learn/tutorial/media/;
      }

}
}

#mail {

See sample authentication script at:

http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript

auth_http localhost/auth.php;

pop3_capabilities "TOP" "USER";

imap_capabilities "IMAP4rev1" "UIDPLUS";

server {

listen 8088;

protocol pop3;

proxy on;

}

server {

listen localhost:143;

protocol imap;

proxy on;

}

#}
復制代碼
listen nginx監聽的端口

include uwsgi_params 必填項

uwsgi_pass 127.0.0.1:8001 連接uwsgi的socket的端口。

其中稍難理解的是location/staic 和 location/media。簡單來講,在一個完整的django項目中,為了便於django發布應用,就是部署到web服務器,會將所有的靜態文件和圖形圖像文件放在一個指定的文件夾中,這樣Nginx收到請求之後就不用再去詢問django,而是直接去指定的靜態文件夾中獲取。該方法極大的增加了並發的數量。static和media就是django的兩個靜態文件夾,在我的環境中如下:

media文件根據django項目而定是否有,如果沒有collectedstatic文件夾要執行如下兩步:

1、配置setting.py文件,添加STATIC_ROOT配置項,指定靜態文件的收集文件夾當前路徑下的collectedstatic/,當前路徑指django主項目路徑。

2、執行 python manage.py collectstatic,收集所有的靜態文件。

3、可以查看在django主目錄下出現了collectedstatic,內容如下,為admin的後臺的css,js等文件和blog項目的靜態文件。

3.3 使配置生效

Nginx檢查配置文件

nginx -t 是nginx檢查配置文件是否有錯誤的命令,如果正常,輸出如下:

使配置文件生效

nginx -s reload 是nginx重新載入配置文件的命令,可以讓配置項生效。

3.4 瀏覽器訪問

瀏覽器能夠正常訪問,部署成功。

在部署中每個人都會遇到自己的問題,我的經驗也不適用於所有人。參考我的過程,如果遇到問題,歡迎留言交流。

Django 部署到微信炸金花程序開發