您好,登錄后才能下訂單哦!
Nginx + uWSGI + Python + Django部署的實例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Nginx:
Nginx 是一個高性能的 Web 和反向代理服務器, 它具有有很多非常優越的特性:
作為 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的并發連接,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。能夠支持高達 50,000 個并發連接數的響應,感謝 Nginx 為我們選擇了 epoll and kqueue 作為開發模型.
作為負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP,也可以支持作為 HTTP代理服務器 對外進行服務。Nginx 用 C 編寫, 不論是系統資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。
作為郵件代理服務器: Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作為郵件代理服務器),Last.fm 描述了成功并且美妙的使用經驗。
Nginx 安裝非常的簡單,配置文件 非常簡潔(還能夠支持perl語法),Bugs非常少的服務器: Nginx 啟動特別容易,并且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。你還能夠在 不間斷服務的情況下進行軟件版本的升級。
uWSGI:
APP(應用程序),就是開發者寫的應用程序,例如django,bottle這些。記錄怎么處理客戶端發來的請求的邏輯部分。
WSGI,是一個協議,Python用于Web開發的協議
uWSGI,是一個程序,充當Web服務器或中間件。
如果架構是Nginx+uWSGI+APP,uWSGI是一個中間件
如果架構是uWSGI+APP,uWSGI是一個服務器
uwsgi,是uWSGI程序實現的一個自有的協議。
Web協議出現順序:
CGI -> FCGI -> WSGI -> uwsgi
CGI,最早的協議
FCGI,比CGI快
WSGI,Python專用的協議
uwsgi,比FCGI和WSGI都快,是uWSGI項目自有的協議,主要特征是采用二進制來存儲數據,之前的協議都是使用字符串,所以在存儲空間和解析速度上,都優于字符串型協議.
Django:
Django(維基百科) Django是一個開放源代碼的Web應用框架,由Python寫成。采用了MVC的軟件設計模式,即模型M,視圖V和控制器C。它最初是被開發來用于管理勞倫斯出版集團旗下的一些以新聞內容為主的網站的。并于2005年7月在BSD許可證下發布。這套框架是以比利時的吉普賽爵士吉他手Django Reinhardt來命名的。
Django的主要目標是使得開發復雜的、數據庫驅動的網站變得簡單。Django注重組件的重用性和“可插拔性”,敏捷開發和DRY法則(Don't Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和數據模型。
Django框架的核心包括:一個 面向對象 的映射器,用作數據模型(以Python類的形式定義)和關聯性數據庫間的媒介;一個基于正則表達式的URL分發器;一個視圖系統,用于處理請求;以及一個模板系統。
核心框架中還包括:
l 一個輕量級的、獨立的Web服務器,用于開發和測試。
l 一個表單序列化及驗證系統,用于HTML表單和適于數據庫存儲的數據之間的轉換。
l 一個緩存框架,并有幾種緩存方式可供選擇。
l 中間件支持,允許對請求處理的各個階段進行干涉。
l 內置的分發系統允許應用程序中的組件采用預定義的信號進行相互間的通信。
l 一個序列化系統,能夠生成或讀取采用XML或JSON表示的Django模型實例。
l 一個用于擴展模板引擎的能力的系統。
Django主要特點
Django基于“自備軍需”的理念,您不必使用單獨的庫來實現常見功能,例如身份驗證,URL路由,模板系統,對象關系映射器(ORM)和數據庫模型遷移。 如果您正在使用或曾經用過Flask,您一定注意到了它需要調用其他庫,如Flask-Login來執行用戶身份驗證。 Django不是這樣。
自由的API
使用Django,很容易根據您的模型生成Python API。 只需一個簡單的命令,不需要額外的編碼就足以開始生成API了。
獨特的管理頁面
即使在網站完全構建之前,您也可以從外部貢獻者處獲取有關信息。 這就是Django的力量。 該框架使您能夠快速輕松地從應用模型生成管理站點。
代碼設計
與大多數 Web 框架相反,Django 通過使用稱為 app 的東西,更容易地將新功能添加到產品中。 因此,開發者可以感受到 Django 鼓勵大家編寫模塊化的代碼。
Django對ORM的完善支持
Django的對象關系映射 (ORM) 對數據庫進行了完善的支持。所以,它用于查詢數據庫所需的數據時,沒有處理結構化查詢語言(SQL)的麻煩。 與許多通過SQL直接在數據庫上工作的Python框架不同,Django開發人員有一個獨特的選擇來操縱相應的Python的Model對象。 Django對于PostgreSQL,MySQL,SQLite和Oracle等數據庫都能做到開箱即用。
強大的內置模板系統
基于繼承系統,Django 的模板允許開發人員通過非常少量的前端代碼構建整個動態網站。這得益于使用其他上下文特定元素替換模板的某些元素的選項。 想象一下,你知道你網站的每個頁面都會有一個頁眉和一個頁腳。 現在,您首先需要在網站的基本模板中編寫代碼。 然后,您可以從應用程序的其他部分動態地更改這兩個內容之間的組件。
簡單可讀的網址
很難正確閱讀在PHP os ASP中開發的URL? 使用 Django,您可以創建簡單易讀的 URL,這對人和搜索引擎都有好處。 您也可以使用其他框架創建可讀 URL,但沒有一個與 Django 一樣容易進行 URL 構造
Django是一個Python編寫的,高級的,MVC風格的開源庫。 Django也被稱為“完美主義者的最終框架”,它最初是為新聞網站設計的,因為它允許開發人員編寫數據庫驅動的Web應用程序,而無需從頭開始編碼。
除了更快完成常見的Web開發任務,Django還可以保持設計干凈且實用。 Django是Python Web開發新人的最佳選擇,因為官方文檔和教程是幾個(同類)軟件開發框架中最好的。
技術市場充斥著一系列網絡框架,但Django在最受歡迎的服務器端Web框架里處于頂峰位置。設計Django背后的座右銘很簡單:避免重復。 Django是用Python編寫的,因此其減少了太多中間層代碼并突出提高了效率。Django可以支持云平臺,使其成為Web開發中更受歡迎的選擇。
部署 Nginx + uWSGI + Python + Django
nginx版本:1.5.9
Django版本:1.4.9
uwsgi版本:2.0.4
Python版本:2.6.6
安裝,Django,nginx,uwsgi,MySQL,采用編譯安裝,便于維護
[root@kurol ~]# mkdir -p /data/logs [root@kurol ~]# yum -y install gcc cc gcc-c++ [root@kurol ~]# tar -zxvf pcre-8.34.tar.gz [root@kurol ~]# cd pcre-8.34 [root@kurol pcre-8.34]# ./configure [root@kurol pcre-8.34]# make && make install [root@kurol pcre-8.34]# cd .. [root@kurol ~]# wget http://nginx.org/download/nginx-1.5.9.tar.gz [root@kurol ~]# tar -zxvf nginx-1.5.9.tar.gz [root@kurol ~]# cd nginx-1.5.9 [root@kurol nginx-1.5.9]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --without-http_gzip_module [root@kurol nginx-1.5.9]# make && make install [root@kurol nginx-1.5.9]# cd .. [root@kurol ~]# yum -y install MySQL-python mysql mysql-devel mysql-server [root@kurol ~]# yum -y install libxml2 python-devel [root@kurol ~]# wget http://projects.unbit.it/downloads/uwsgi-2.0.4.tar.gz [root@kurol ~]# tar -zxvf uwsgi-2.0.4.tar.gz [root@kurol ~]# cd uwsgi-2.0.4 [root@kurol uwsgi-2.0.4]# make [root@kurol uwsgi-2.0.4]# cp uwsgi /usr/bin [root@kurol uwsgi-2.0.4]# cd .. [root@kurol ~]# wget https://www.djangoproject.com/m/releases/1.4/Django-1.4.9.tar.gz --no-check-certificate [root@kurol ~]# tar -zvxf Django-1.4.9.tar.gz [root@kurol ~]# cd Django-1.4.9 [root@kurol Django-1.4.9]# python setup.py install
配置Nginx.
【/usr/local/nginx/conf/nginx.conf】 server{ listen 80; server_name www.mykurol.com; location / { uwsgi_pass 127.0.0.1:9001; include uwsgi_params; uwsgi_param UWSGI_CHDIR /data/www/board; uwsgi_param UWSGI_SCRIPT django_wsgi; access_log off; } location ~* ^.+\.(mpg|avi|mp3|swf|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|txt|tar|mid|midi|wav|rtf|mpeg)$ { root /data/www/board/static; access_log off; } }
配置uwsgi.
【/usr/local/nginx/conf/uwsgi.ini】 [uwsgi] socket = 0.0.0.0:9001 master = true pidfile = /usr/local/nginx/uwsgi.pid processes = 8 chdir = /data/www/board pythonpath = /data/www profiler = true memory-report = true enable-threads = true logdate = true limit-as = 6048 daemonize = /data/logs/django.log
啟動項目board
[root@kurol logs]# cd /data/www/ [root@kurol www]# django-admin.py startproject board [root@kurol www]# cd board/ [root@kurol board]# vim django_wsgi.py #!/usr/bin python # coding: utf-8 import os import sys reload(sys) sys.setdefaultencoding('utf8') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "board.settings") from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler() [root@kurol www]# ls board [root@kurol www]# tree . `-- board |-- board | |-- __init__.py | |-- settings.py | |-- urls.py | `-- wsgi.py `-- manage.py 2 directories, 5 files
啟動uwsgi和nginx服務.,其中uwsgi使用自定義位置配置文件
[root@kurol ~]# /usr/bin/uwsgi --ini /usr/local/nginx/conf/uwsgi.ini /usr/bin/uwsgi: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory [root@kurol ~]# ln -s /usr/local/lib/libpcre.so.1 /lib64 [root@kurol ~]# /usr/bin/uwsgi --ini /usr/local/nginx/conf/uwsgi.ini [root@kurol ~]# /usr/local/nginx/sbin/nginx [root@kurol ~]# netstat -ltunp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:9001 0.0.0.0:* LISTEN 15243/uwsgi tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15423/nginx tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 868/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 957/master
方便服務管理,創建nginx和uwsgi啟動腳本.
nginx:
[root@kurol board]# touch /etc/init.d/nginx [root@kurol board]# chmod 775 /etc/init.d/nginx [root@kurol board]# vim /etc/init.d/nginx #!/bin/sh # set -e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="nginx daemon" NAME=nginx DAEMON=/usr/local/nginx/sbin/nginx CONFIGFILE=/usr/local/nginx/conf/nginx.conf PIDFILE=/usr/local/nginx/logs/nginx.pid SCRIPTNAME=/etc/init.d/nginx # If the daemon file is not found, terminate the script. test -x $DAEMON || exit 0 d_start(){ $DAEMON -c $CONFIGFILE || echo -n " already running" } d_stop(){ kill -QUIT `cat $PIDFILE` || echo -n " no running" } d_reload(){ kill -HUP `cat $PIDFILE` || echo -n " could not reload" } case "$1" in start) echo -n "Starting $DESC: $NAME" d_start echo "." ;; stop) echo -n "Stopping $DESC: $NAME" d_stop echo "." ;; reload) echo -n "Reloading $DESC configuration..." d_reload echo "Reloaded." ;; restart) echo -n "Restarting $DESC: $NAME" d_stop # Sleep for two seconds before starting again, this should give the nginx daemon some time to perform a graceful stop sleep 2 d_start echo "." ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload)" >&2 exit 3 ;; esac exit 0
uwsgi:
[root@kurol board]# touch /etc/init.d/uwsgi [root@kurol board]# chmod 775 /etc/init.d/uwsgi [root@kurol board]# vim /etc/init.d/uwsgi #!/bin/sh # set -e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="uwsgi daemon" NAME=uwsgi DAEMON=/usr/bin/uwsgi CONFIGFILE=/usr/local/nginx/conf/uwsgi.ini PIDFILE=/usr/local/nginx/uwsgi.pid SCRIPTNAME=/etc/init.d/uwsgi # If the daemon file is not found, terminate the script. test -x $DAEMON || exit 0 d_start(){ $DAEMON --ini $CONFIGFILE || echo -n " already running" } d_stop(){ kill -QUIT `cat $PIDFILE` || echo -n " no running" } d_reload(){ kill -HUP `cat $PIDFILE` || echo -n " could not reload" } case "$1" in start) echo -n "Starting $DESC: $NAME" d_start echo "." ;; stop) echo -n "Stopping $DESC: $NAME" d_stop echo "." ;; reload) echo -n "Reloading $DESC configuration..." d_reload echo "Reloaded." ;; restart) echo -n "Restarting $DESC: $NAME" d_stop # Sleep for two seconds before starting again, this should give the nginx daemon some time to perform a graceful stop sleep 2 d_start echo "." ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload)" >&2 exit 3 ;; esac exit 0
創建數據模型:
[root@kurol board]# cd /data/www/board/webserver/ [root@kurol webserver]# vim models.py
from django.db import models class webserver(models.Model): username = models.CharField('用戶名',max_length=30) password = models.CharField('密碼',max_length=30) email = models.EmailField('電子郵件',blank=True) desc = models.TextField('描述',max_length=500,blank=True) class Meta: db_table = u'board_webserver' def __unicode__(self): return self.username
[root@kurol webserver]# vim /data/www/board/board/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'OBServer', # Or path to database file if using sqlite3. 'USER': 'root', # Not used with sqlite3. 'PASSWORD': '******', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } } INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'webserver', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', )
[root@kurol board]# export LC_ALL=en_US.UTF-8 [root@kurol board]# python manage.py sqlall webserver #檢查sql語句 BEGIN; CREATE TABLE `board_webserver` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `username` varchar(30) NOT NULL, `password` varchar(30) NOT NULL, `email` varchar(75) NOT NULL, `desc` longtext NOT NULL ) ; COMMIT;
SQL語句沒問題,繼續執行
#在Django 1.9及未來的版本種使用migrate代替syscdb.
syncdb會創建在setting.py下配置的INSTALL_APPS下的所有app,創建其對應的數據表到指定的數據庫,但只創建不存在的表比如上面
'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', 'webserver',
都會創建一個對應的表。
[root@kurol board]# python manage.py syncdb Creating tables ... Creating table board_webserver Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s)
報錯問題
[root@kurol board]# python manage.py syncdb
TypeError: decode() argument 1 must be string, not None
解決:
將export LC_ALL=en_US.UTF-8寫入到profile或者.bashrc中即可。
[root@kurol board]# export LC_ALL=en_US.UTF-8
生成應用,修改urls指定頁面,添加views視圖
[root@kurol webserver]# cd /data/www/board/ [root@kurol board]# python manage.py startapp webserver [root@kurol board]# vim board/urls.py from django.conf.urls import patterns, include, url urlpatterns = patterns('', (r'^$', 'board.views.index'), (r'^board/', include('webserver.urls')), ) [root@kurol board]# cd webserver/ [root@kurol webserver]# touch urls.py [root@kurol webserver]# vim urls.py from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^$', 'webserver.views.index'), (r'^random_number/$', 'webserver.views.random_number'), ) [root@kurol webserver]# cd .. [root@kurol board]# cd board [root@kurol board]# vim views.py # Create your views here. from django.http import HttpResponse def index(request): html = """<html> <title>Main</title> <body> <h2>Main Page</h2><hr> </body> </html>""" return HttpResponse(html)
瀏覽器打開,顯示Main Page就是成功部署了。
關于 Nginx + uWSGI + Python + Django部署的實例分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。