nginx部署python
⑴ Nginx+python 怎麼搞才好
python服務後台運行
由於python程序一般只有單進程,因此要用uwsgi啟動多個python進程來同時服務,寫代碼時就要求所有請求必須是無狀態的。
為了保證python程序能一直運行,一般用supervisor來拉起並運行在後台。
supervisor配置這樣寫:
[program:app]
command = uwsgi
--socket 0.0.0.0:6580
--chdir /app
--mole app.wsgi
--processes 8
--master
--uid root
--listen 100
stopsignal=QUIT
autostart=true
autorestart=true
user=root
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
stdout_logfile=/app/log/debug.log
redirect_stderr=true
nginx轉發
要將請求轉到python,一般用nginx轉發請求到uwsgi,nginx配置文件中server段這樣寫:
server {
listen 8000;
location / {
uwsgi_pass 127.0.0.1:6580;
include uwsgi_params;
}
}
總結一下:一般的實踐是用uwsgi+supervisor啟動多個python程序的服務進程,再用nginx轉發uwsgi請求到python模塊。
⑵ 如何部署python web程序
Python Web 程序的部署方案
綜合而言, 高性能的Python web站點部署方式首推 nginx + uwsgi
apache + mod_wsgi 是簡單穩定但性能一般的方式
API伺服器 可以直接使用tornado或者gevent
mod_python
非常原始的cgi模式部署python已經沒有什麼好介紹了。對於不太追求性能的管理系統和網站來說,使用 Apache 部署是一個不錯的選擇。較早的時候,使用 mode_python 部署python的web應用十分流行,在Django 0.96 的時候官方文檔甚至推薦這種方式。
它將Python解釋器嵌入到Apache server,以提供一個訪問Apache server內部的介面。mod_python 在現在看來性能是不佳的,每一個http請求 mod_python 都會由一個進程初始化python解釋器、載入代碼、執行、然後銷毀進程。
mod_wsgi
如果非要用Apache來部署python應用,mod_wsgi是一個更好的選擇。WSGI 全稱是 Web Server Gateway Interface ,由 PEP-333 定義。 基本上所有的python web框架都實現了wsgi介面,用mod_wsgi 能部署任何實現了wsgi的框架。實際上,不需要任何框架也可以用mod_wsgi 部署python程序。使用mod_wsgi的daemon模式,python程序會常駐內存,不會有很大的初始化和銷毀進程方面的開銷,所以性能是好於mod_python的。綜合來說,使用Apache部署python web程序,推薦使用mod_wsgi的daemon模式。
Fastcgi
先說觀點:不建議用fastcgi的方式部署Python web。
前幾年由於lighttpd風頭正勁和豆瓣的成功案例,fastcgi是一種很流行的部署方式。fastcgi與具體語言無關,也與web伺服器無關。是一種通用的部署方式。fastcgi是對於cgi的增強,CGI程序運行在獨立的進程中,並對每個Web請求建立一個進程。面對大量請求,進程的大量建立和消亡使操作系統性能大大下降。
與為每個請求創建一個新的進程不同,FastCGI使用持續的進程來處理一連串的請求。這些進程由FastCGI伺服器管理,而不是web伺服器。 當進來一個請求時,web伺服器把環境變數和這個頁面請求通過一個socket比如FastCGI進程與web伺服器都位於本地)或者一個TCP connection(FastCGI進程在遠端的server farm)傳遞給FastCGI進程。
主流的web伺服器,Apache,lighttpd,nginx 都支持fastcgi,在幾年前,lighttpd的mod_fcgi模塊性能強勁,lighttpd+fastcgi十分流行。無論是python,ruby還是php,都有大量的站點使用這種方式部署。由於nginx的崛起,現在很少有人使用lighttpd了。
fastcgi 並不是專門為python設計,並不是所有的python框架天然的支持fastcgi,通常需要flup這樣的容器來配適。flup由python編寫,和專門的c實現的wsgi容器比起來性能顯得相當不堪。fastcgi的穩定性對於新興的wsgi容器來說也有差距。無論從哪個方面來看,部署python web程序,fastcgi 都已經是過去式。
uwsgi
前幾年nginx還未內置uwsgi模塊的時候,部署uwsgi還是一件挺麻煩的事情。隨著能夠在nginx中直接使用uwsgi模塊,uwsgi已經是最可靠,最方便的高性能python web程序的部署方式了。
在1U的四核XEON伺服器上,一個簡單的wsgi handler甚至能用AB壓到8000以上的qps,這已經是完爆tornado,接近gevent的性能了。 同時,uwsgi的穩定性極好。之前我們有個每天500w-1000w動態請求的站點使用uwsgi部署非常穩定,在一個渣HP 1U 伺服器上,基本不用管它。
上面提到的部署方式都是相對於web網站的方式,在移動互聯網的時代,我們需要的是高性能的API服務,上面這些都是過時的東西。
tornado
tornado 號稱高性能,如果拿他寫網站,其實一般般,只不過跟uwsgi加一些簡單框架差不多而已。它真正的作用,是用來寫API伺服器和長連接的伺服器。
由於tornado能夠直接處理http請求,很多人直接拿他來裸奔直接提供服務。這種方式是不可取的,單線程的tornado只能利用cpu的一個核心,並且一旦阻塞直接就廢了。通常情況下,由supervisor啟動多個tornado進程,通過nginx進行反向代理負載均衡。nginx 1.14 以後的版本反向代理支持長連接,配合tornado的comet效果很好。
tornado還有一些比較奇葩的用法,比如用來做wsgi容器之類的。
gevent
gevent是一個神器,能做的事情很多。在web方面,處理http請求,用起來其實跟tornado差不多,但是要簡陋很多,cookie之類的都沒有。用gevent寫的一些API服務,部署方式還是類似tornado,用supervisor管理多個守護進程,通過nginx做負載均衡。 同樣的它的奇葩用法也和tornado一樣,可以當wsgi容器用。
⑶ 如何用Nginx部署Django
如果你在windows上開發的django項目。部署的話,需要分三步。
第一步:在linux下下載python用的依賴包,搭建python環境。將windows下的項目復制到linux下,使用django自帶服務進行啟動。
第二步:下載uwsgi模塊並且編寫配置文件來替代django自帶的服務模塊。
第三步:下載nginx包,編譯安裝。然後創建配置文件,配置nginx啟動django項目的信息。然後訪問即可。
⑷ 如何快速有效的安裝Python+Nginx+Tornado+Mysql
下面我將介紹在UNIX(LINUX、MAC下的配置方法其本一致)下如何快速搭建其運行環境:
1、安裝Python
wget http //www python org/ftp/python/2.7.5/Python-2.7.5.tgz tar xvfz Python-2.7.5.tgzcd Python-2.7.5 ./configure
make
sudo make install
2、安裝Python的包管理工具setuptools、pip和打包工具distribute
wget http //peak telecommunity com/dist/ez_setup.py python ez_setup.py
wget http //python-distribute org/distribute_setup.py python distribute_setup.py
wget https //github com/pypa/pip/raw/master/contrib/get-pip.py python get-pip.py
3、安裝Readline
sudo pip install readline
4、安裝Mysql
#安裝cmake wget http //www cmake org/files/v2.8/cmake-2.8.8.tar.gz
tar xvfz cmake-2.8.8.tar.gz
cd cmake-2.8.8
./configure
make
sudo make install #安裝mysql wget http //cdn mysql com/Downloads/MySQL-5.5/mysql-5.5.29.tar.gz
tar xvfz mysql-5.5.29.tar.gz
cd mysql-5.5.29
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/localmysql/data/ -DMYSQL_UNIX_ADDR=/usr/localmysql/data/mysqld.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/etc -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_unicode_ci -DWITH_DEBUG=0
make
sudo make install #下載安裝mysql-python wget http://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz
tar xvfz MySQL-python-1.2.3.tar.gz
cd MySQL-python-1.2.3 #修改site.py中mysql_config的路徑(為mysql安裝路徑下的/bin/mysql_config), site.py
mysql_config = /usr/local/mysql/bin/mysql_config #更改完進行編譯和安裝 python setup.py build
sudo python setup.py install #將mysql安裝路徑下的lib加入到環境變數LD_LIBRARY_PATH中 export LD_LIBRARY_PATH=/usr/local/mysql/lib/:$LD_LIBRARY_PATH
5、安裝一些Python的常用模塊和tornado
pip install tornado
pip install torndb
pip install requests
pip install markdown
6、配置Mysql
groupadd mysql useradd -g mysql mysql chown mysql.mysql -R /service/mysql/ /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
7、安裝Nginx
wget http://nginx.org/download/nginx-0.8.33.tar.gz tar zxvf nginx-0.8.33.tar.gz
cd nginx-0.8.33 ./configure
make
make install
8、配置nginx,編輯/usr/local/nginx/conf/nginx.conf文件
user nobody;
worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
upstream snail {
server 127.0.0.1:8888;
}
sendfile on; #tcp_nopush on; keepalive_timeout 65;
proxy_read_timeout 200;
tcp_nopush on;
tcp_nodelay on;
gzip on;
gzip_min_length 1000;
gzip_proxied any;
server {
listen 80;
server_name localhost; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host; # proxy_redirect false; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://snail; }
}
}
9、創建一個項目
vi demo.py
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
]) if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
10、運行這個項目
#啟動項目 nohup python demo.py & #重啟Nginx /usr/local/nginx/sbin/nginx -s reload
在瀏覽器中輸入http://127.0.0.1 看到頁面輸出hello word!
轉載,僅供參考,祝你愉快,滿意請採納。
⑸ Nginx+Python 怎麼搞才好
介紹NGINX和Python如何配合使用
Python以易用,有趣而出名,它讓軟體開發變得簡單,據說運行性能也高於其他腳本語言(PHP最新版本PHP 7的性能好像可以與Python一較高下)
每一個人都希望自己的網站或應用可以運行得更快。但是每一個網站在大流量和流量激增時都容易遇到性能問題,甚至當機,業務繁忙時,這種情況會更加糟糕。其實無論流量是穩定增長,還是陡峭增長,所有網站都面臨性能和當機的困擾。
NGINX和NGINX插件的出現就是為了解決這個問題。他們通過三種不同的方式來改善網站性能:
1、web服務 – 最初開發NGINX是為了解決 C10K 問題 – 可以輕松支撐10,000或更多的並發連接。使用NGINX為你的Python應用提供web服務,可以讓你的網站運行更快,即便在小流量的情況下也有效果。當你的用戶成千上萬時,確定無疑,它可以提供更高的性能,更少的崩潰,以及更少的當機時間。你也可以使用NGINX提供靜態文件緩存或者微緩存服務,一個獨立的NGINX反向代理也是很好的選擇(見下一段)。
2、反向代理– 你可以在應用服務的前端用NGINX做反向代理。NGINX接收Web請求並分發到你的應用服務。這個「怪招」可以讓你的網站運行得更快,減少當機,消費更少的服務資源,而且可以提高安全性。你也可以在反向代理伺服器上緩存靜態資源(非常高效),添加靜態內容的微緩存,以減少應用自身的負載,等等。
3、為多個應用服務提供動態均衡 – 通過布署反向代理服務。通過多應用服務並行運行和NGINX或者NGINX插件來做流量負載均衡。通過這種布署,根據流量需要,增長穩定性和運行時間需要,你可以很輕松地在線擴展網站性能。如果你需要讓給定用戶的會話在同一個服務上,你只需要配置負載均衡以支持會話持久化。
不管是為你的Python應用提供網站服務,還是做反向代理服務,還是做負載均衡,或者三者都用,NGINX和NGINX插件都會給你帶來優勢。
這是本系列(由兩部分組成)中的第一篇文章,將會介紹五個提升Python應用性能的技巧,包括如何使用NGINX或NGINX插件提供web服務,如何實現靜態文件的緩存,如何為動態內容做微緩存。在第二部分,我們將介紹如果用NGINX或NGINX插件提供反向代理服務,以及如何為多個應用服務提供負載均衡。
技巧 1– 定位Python性能瓶頸
有兩種截然不同的情況會讓你的Python應用遇到性能問題– 第一,每天有海量用戶;第二,高負載。大部分網站長都不需要擔心性能問題,因為他們的負載很小,根據我們的拙見,他們應該努力降低響應時間。將響應時間控制在毫秒級是一個非常困難且不被關注的工作。但可以讓我們的用戶體驗更好,業績更優秀。
但是這篇博文和剩下的第二部分,將關注每個人都確實關注的場景:當網站繁忙時可能會出現的性能問題,如性能大幅下降和當機。還有黑客模擬大量用戶攻擊造成的流量激增,同時提高網站性能也是處理攻擊的重要步驟。
像Apache HTTP Server這樣的系統會為每個用戶分配一定數量的內存,隨著用戶的不斷增加,物理內存不堪重負。伺服器開始使用磁碟的交換分區,性能直線下降,性能問題和當機接踵而至。這篇博文中所介紹的遷移到NGINX,有助於解決這一問題。
Python特別容易出現內存相關的性能問題,因為與其他腳本語言相比,Python通常是使用更多的內存來執行任務(所以執行速度快)。所以在相同條件下,與用其他語言寫的應用相比,你的Python應用更容易在少量用戶的情況下而「絆倒」。
優化你的應用對解決問題會有所幫助,但要解決流量相關的性能問題,這通常不是最好最快的方式。這篇博文及剩下的第二部分,將介紹一種最好並且最快的方式。在實施這些措施之後,再採取一切方法優化你的應用,或者使用微服務架構重寫。
技巧 2 – 選擇單服務或者微服務布署
小網站在單個伺服器上就可以運行得很好。大的網站需要多個伺服器。但如果你處於中間地帶–或者你的網站從一個小網站變成一個大網站– 你可以做一些有趣的選擇。
如果你使用單機布署,大流量和瀏覽激增會給你帶來很大的風險。你的擴展手段非常有限,無外乎優化你的應用,把web服務切換到NGINX,使用一個更大更快的伺服器,或者使用內容分發網路(CDN)。所有這些可選項的實施都耗時耗錢,而且在實施過程中還有引入bug的風險。
另外一個很顯然的風險是單機布署存在單點故障問題 – 很多問題可以導致你的站點掛掉,而且沒有快速簡單的解決方案。
使用NGINX做為應用的代理服務
如果你把服務切換成NGINX並且使用單機布署,你可以自由地選擇使用開源的NGINX或者NGINX插件。NGINX包括企業級支持和一些擴展功能。像實時活動監測這樣的擴展功能是支持單機布署的。如果做為反向代理,採用分布式布署,你可以使用其他NGINX插件,如負載均衡和會話持久化。
有很多事情都要考慮周詳,除非你確定你的網站在未來很長時間內都是一個小網站,不需要關心當機問題,否則,你要明白,單機布署存在很多風險。分布式布署比較易於擴展 – 單點故障可以通過工程解決,性能可以按需調整,可以快速擴充伺服器能力。
技巧 3 – 使用NGINX替換你的Web服務
在Web時代的早期,Apache就是web服務的同義詞。但NGINX自2000年出現以來,迅速流行開來;現在已經是排名第一的web服務,被1,000, 10,000多個網站和世界上最繁忙的100,000多個網站使用。
NGINX最初是為了解決C10K問題而開發 – 在給定內存預算下支持10,000+並發。其他web服務需要為每個連接分配內存塊,所以他們會耗盡物理內存,當數以千記的用戶在同一時間訪問一個網站,它會變慢甚至崩潰。NGINX處理器可以單獨處理一個請求,也可以優雅地擴展,同時處理多個用戶。(這可以很好地解決額外問題,後面會詳述。)
一個高層NGINX架構圖如下所示。
NGINX 架構, 選自開源應用架構第二卷
在上圖,一個Python應用服務被布署在後端的應用服務塊中,如圖所示,它通過FastCGI被訪問。NGINX不「知道」怎麼運行Python,所以它需要一個網關連結需要的環境。FastCGI是一個被PHP,Pyhton和其他語言廣泛使用的介面。
但是,連結Python和NGINX的流行方案是網路服務網關介面(WSGI)。WSGI工作在多線程和多進程環境下,所以他兼容本文所提到的所有布署選項。
如果你將web服務遷移到NGINX,這里有一些有用的軟體:
Configuring gunicorn – 「Green Unicorn」是一個流行的WSGI服務,配合NGINX使用。
Configuring uWSGI – 另一個流行的WSGI服務,配合NGINX使用. uWSGI包含NGINX指令支持。
Using uWSGI, NGINX, and Django – 一個流行的Python web框架。
下面的代碼片斷將向你展示如何配置NGINX和uWSGI – 這個案例中的工程使用Python框架Django。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
http
{
...
upstream
django {
server
127.0.0.1:29000;
}
server
{
listen
80;
server_name
myapp.example.com;
root
/var/www/myapp/html;
location
/ {
index
index.html;
}
location
/static/
{
alias
/var/django/projects/myapp/static/;
}
location
/main {
include
/etc/nginx/uwsgi_params;
uwsgi_pass
django;
uwsgi_param
Host $host;
uwsgi_param
X-Real-IP $remote_addr;
uwsgi_param
X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param
X-Forwarded-Proto $http_x_forwarded_proto;
}
}
}
技巧 4 – 實現靜態文件緩存
緩存靜態內容包括:為不經常變更的文件保存副本 – 不經常是指數小時或者永遠 – 副本保存在其他位置而不是應用服務中。典型的靜態內容是網頁中經常用到的JPEG圖片。
緩存靜態文件是提升應用性能的常用手段,經常被用到:
1、用戶瀏覽器
2、互聯網提供商 – 從公司網路到互聯網提供商(ISP)
3、web服務, 也就是本文所講的
在web服務端實現靜態文件緩存有兩個好處:
1、為用戶提供快速服務 – NGINX 專門為靜態文件緩存做過優化,對靜態內容請求的處理比應用服務要快。
2、減少應用服務負載– 應用服務不需要處理已經緩存的靜態文件,已經由web服務接管。
緩存靜態文件在單伺服器上也可以很好的實現,但底層硬體資源仍然是由web服務和應用服務所共享。如果web服務要處理頻率的靜態文件訪問 – 甚至是海量 – 應用服務可以使用的硬體資源就會變少,一些功能可能就會變慢。
如果要支持瀏覽器緩存,需要正確設置靜態文件的頭部信息。如HTTPCache Control(特別是它的max age設置),Expires,和Entity標記。如果想深入了解,參見NGINX Plus的管理員指南:使用NGINX為uWSGI和Django提供應用網關
下面的NGINX配置代碼用來緩存靜態文件,包括JPEG文件,GIF文件,PNG文件,MP4文件,Powerpoint文件,和一些其他文件,請把www.example.com替換成你自己的網址。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server
{
#
substitute your web server's URL for
"www.example.com"
server_name
www.example.com;
root
/var/www/example.com/htdocs;
index
index.php;
access_log
/var/log/nginx/example.com.access.log;
error_log
/var/log/nginx/example.com.error.log;
location
/ {
try_files
$uri $uri/ /index.php?$args;
}
location
~ \.php$ {
try_files
$uri =404;
include
fastcgi_params;
#
substitute the socket, or address and port, of your Python server
fastcgi_pass
unix:/var/run/php5-fpm.sock;
#fastcgi_pass
127.0.0.1:9000;
}
location
~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg
|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid
|midi|wav|bmp|rtf)$
{
expires
max;
log_not_found
off;
access_log
off;
}
}
技巧 5 – 實現微服務
微緩存可以很明顯的大幅提升Python, PHP和一些其他語言開發的應用服務性能,根據是否適合緩存,可以把網頁分成三類:
靜態文件 – 這類文件適合緩存,見技巧4所述。
動態,非個性化頁面 – 因為它們需要刷新,這些文件通常不適合做緩存。例如未登錄前的電商用戶所看到的頁面(見下一點) – 可用商品和推薦相似商品經常要發生改變,所以必須生成新頁面。但是,如果有另外一個用戶,在10毫秒之後發送同樣請求,將前一用戶看到的網頁緩存並發送給後一用戶就變得合情合理。
動態,個性化頁面 –這些不適合緩存,因為它們是針對具體用戶的,同一個用戶不希望兩次看到同一個個性化頁面。例如一個電商用戶登錄後的頁面不應該展示給另外一個用戶。
靜態文件和非個化性動態內容可以緩存
微緩存適用於上面提到的第二類頁面–動態,非個性化頁面。「微」是指很短的時間。如果你的網站在一秒內要多次生成同一個頁面,如果你把這個頁面只緩存一秒,並不影響該頁面的刷新。但這個短暫的緩存可以極大的降低應用服務的負載,特別是流量較大時。將原來在一個緩存區間內,同一內容生成10,或者20,甚至100次,調整為只生成一次並緩存,為其他用戶提供緩存內容。
這個效果是很神奇的。一個服務如果一秒鍾要處理大量請求會變得很慢,但如果只處理一個請求,就會變得很快。(包括任何個性化頁面)。我們自己的Owen Garrett有一篇博客對微服務的優勢做了詳情介紹,裡面還有配置代碼。主要要修改的地方是把代理緩存過期時間設為一秒,只需要幾行配置代碼就可以搞定。
1
2
3
4
5
6
proxy_cache_path
/tmp/cache keys_zone=cache:10m levels=1:2
inactive=600s max_size=100m;
server
{
proxy_cache
cache;
proxy_cache_valid
200
1s;
...
}
更多配置樣例,參見Tyler Hicks Wright關於Python和uWSGI如何使用NGINX的博客。
總結
在第一部分,我們回顧了一下在單機環境下提高Python應用性能的解決方案,還有緩存的使用,在單機情況下緩存可以應用於反向代理伺服器或者獨立緩存服務(緩存比獨立服務性能更好)。在下一部分,我們將會介紹分布式環境下的性能提升方案。
如果你想在應用中使用更多的NGINX Plus特性,如實時事件監測,在線修改配置,你可以馬上開通30天免費試用,或者聯系我們,可以獲得一個真實例子。
⑹ 在Windows系統上搭建Nginx+Python+MySQL環境的教程
1 安裝nginx
下載windows上的nginx最新版本,/en/download.html。
解壓後即可。
運行nginx.exe後本地打開localhost,將會看到歡迎頁面,這證明nginx在本地運行良好,如果沒有出現歡迎頁面,請檢查是否有進程佔用了80埠。
2 安裝flup
下載對應版本的flup,這里下載flup3.x版本,適合python3.2,下載地址:https:///chxanders/flup3
解壓(比如解壓到D:flup)
安裝(進入到python的安裝路徑,然後執行下面的命令
1 python setup.py install )
!注意,如果提示缺少setuptools,安裝distribute-0.6.49.tar.gz,安裝方法和flup安裝一樣,下載地址:https:///pypi/distribute/0.6.49
3 安裝Mysql
在這里我使用的是5.1版本。在win系統上雙擊安裝文件,下一步下一步完成。下載地址:/downloads/
4 安裝資料庫驅動
下載用於win上對應py版本的的python-mysql驅動,雙擊安裝即可。下面的下載地址是3.2:
/wangqc/distribute-0.6.49.zip
5 配置伺服器
首先需要修改nginx的配置文件nginx.conf。
找到:
1 2 3 4 location / { root html; index index.html index.htm; } 在裡面加上:
1 2 3 4 5 6 7 8 9 10 11 12 # host and port to fastcgi server fastcgi_pass 127.0.0.1:55880; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param QUERY_STRING $query_string; fastcgi_param SERVER_NAME $server_name; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_pass_header Authorization; fastcgi_intercept_errors off; 然後測試該配置文件是否正確,在cmd中切換到nginx安裝目錄里,輸入
1 nginx.exe -t 即可開始對配置文件測試,如果提示成功,說明配置正確,
這是可以結束掉任務管理器中所有的nginx.exe進程,重新運行ngin.exe重啟nginx服務。
6 運行Server.py
在cmd下切換到項目目錄,輸入命令
1 python Server.py runfcgi method=threaded host=127.0.0.1 port=55880 注意,
這條命令只能用來啟動項目,如果出現錯誤並不會給出提示。下面是正確的情況.
用瀏覽器打開127.0.0.1:8080 測試一下,項目是不是已經跑起來了(第一次運行等待的時間稍長,請耐心等待)。
7 一些注意事項
(1)、首先應該改的地方,這個大家應該都知道:
1 DEBUG = TEMPLATE_DEBUG = False#將debug設置為False (2)、改一下ALLOWED_HOSTS,我死死的就將這個給忘了,我的`配置:
1 2 3 4 if DEBUG:#根據DEBUG來確定 ALLOWED_HOSTS = [""] else: ALLOWED_HOSTS = ["localhost","127.0.0.1"] (3)、重頭戲來了,配置nginx:
這里相關的代碼網上很多,但是幾乎都沒有說明一件事:
配置location ~ ^/static/ 的位置,一定要在location ~ ^/的前面,而且不能單純的使用 location /static/ 或者location /static ,不然,static文件夾中的靜態文件都不能載入!!!
ps:提起這個,慢慢的淚啊,就錯在這里了。
嫌麻煩可以寫成批處理,運行的時候雙擊一下就好了。
⑺ 在阿里雲伺服器使用nginx+uwsgi+venv部署Django項目
1.首先先把項目上傳到阿里雲伺服器
2.需要安裝python3.0以上版本(centeros7自帶2.75版本)
3.在此不介紹如何安裝python高版本和虛擬環境
4.在項目根目錄創建虛擬環境,就像你在Pycharm里一樣
然後啟動虛擬環境
5.在虛擬環境下安裝你項目所需要的依賴
pip3 install requirements.txt
6.編寫nginx配置文件和uwsgi配置文件
配置如下
nginx.conf
注意編寫完nginx配置文件需要檢查語法
nginx -t 注意別忘記加;或者文章尾末多空格都會導致出錯
nginx -s reload 重啟nginx
uwsgi.ini配置如下
7.都配置好之後
啟動虛擬環境
在venv里 uwsgi uwsgi.ini 即可啟動你的項目
⑻ CentOS+nginx+uwsgi+Python 多站點環境搭建
轉自 Xiongpq
http://www.cnblogs.com/xiongpq/p/3381069.html
略有補充(可能出現錯誤及解決辦法)
環境:
CentOS X64 6.4
nginx 1.5.6
Python 2.7.5
正文:
一:安裝需要的類庫及Python2.7.5
安裝必要的開發包
yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
CentOS 自帶Python2.6.6,但我們可以再安裝Python2.7.5:
cd ~
wget http://python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2
tar xvf Python-2.7.5.tar.bz2
cd Python-2.7.5
./configure --prefix=/usr/local
make && make altinstall
安裝完畢後,可是使用」python2.7」命令進入python2.7的環境。
二:安裝Python包管理
easy_install包 https://pypi.python.org/pypi/distribute
方便安裝Python的開發包
cd ~
wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
tar xf distribute-0.6.49.tar.gz
cd distribute-0.6.49python2.7 setup.py install
easy_install --version
紅色部分必須是「python2.7」,否則將安裝到默認的2.6環境內。
pip包 https://pypi.python.org/pypi/pip
安裝pip的好處是可以pip list、pip uninstall 管理Python包, easy_install沒有這個功能,只有uninstall
easy_install pip
pip --version
三:安裝uwsgi
uwsgi: https://pypi.python.org/pypi/uWSGI
uwsgi參數詳解: http://uwsgi-docs.readthedocs.org/en/latest/Options.html
pip install uwsgi
uwsgi --version
測試uwsgi是否正常:
新建test.py文件,內容如下:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
然後在終端運行:
uwsgi --http :8001 --wsgi-file test.py
在瀏覽器內輸入: http://你購買的雲主機公網ip:8001 ,看是否有「Hello World」輸出,若沒有輸出,請檢查你的安裝過程。
四:安裝django
pip install django
測試django是否正常,運行:
django-admin.py startproject demosite
cd demositepython2.7 manage.py runserver 0.0.0.0:8002
在瀏覽器內輸入: http://1 你購買的雲主機公網 :8002,檢查django是否運行正常。
五:安裝nginx
cd ~
wget http://nginx.org/download/nginx-1.5.6.tar.gz
tar xf nginx-1.5.6.tar.gz
cd nginx-1.5.6
./configure --prefix=/usr/local/nginx-1.5.6 \
--with-http_stub_status_mole \
--with-http_gzip_static_mole
make && make install
安裝Nginx時報錯
錯誤提示:
./configure: error: the HTTP rewrite mole requires the PCRE library.
安裝pcre-devel與openssl-devel解決問題
yum -y install pcre-devel openssl openssl-devel
./configure --prefix=/usr/local/nginx
make
make install
六:配置uwsgi
uwsgi支持ini、xml等多種配置方式,但個人感覺ini更方便:
在/ect/目錄下新建uwsgi9090.ini,添加如下配置:
[uwsgi]
socket =
master = true //主進程
vhost = true //多站模式
no-stie = true //多站模式時不設置入口模塊和文件
workers = 2 //子進程數
reload-mercy = 10
vacuum = true //退出、重啟時清理文件
max-requests = 1000
limit-as = 512
buffer-sizi = 30000
pidfile = /var/run/uwsgi9090.pid //pid文件,用於下面的腳本啟動、停止該進程
daemonize = /website/uwsgi9090.log
設置uwsgi開機啟動,在/etc/init.d/目錄下新建uwsgi9090文件,內容如下:
uwsgi9090
#! /bin/sh
# chkconfig: 2345 55 25
# Description: Startup script for uwsgi webserver on Debian. Place in /etc/init.d and
# run 'update-rc.d -f uwsgi defaults', or use the appropriate command on your
# distro. For CentOS/Redhat run: 'chkconfig --add uwsgi'
### BEGIN INIT INFO
# Provides: uwsgi
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the uwsgi web server
# Description: starts uwsgi using start-stop-daemon
### END INIT INFO
# Author: licess
# website: http://lnmp.org
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="uwsgi daemon"
NAME=uwsgi9090
DAEMON=/usr/local/bin/uwsgi
CONFIGFILE=/etc/$NAME.ini
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
$DAEMON $CONFIGFILE || echo -n "uwsgi already running"
}
do_stop() {
$DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
rm -f $PIDFILE
echo "$DAEMON STOPED."
}
do_reload() {
$DAEMON --reload $PIDFILE || echo -n "uwsgi can't reload"
}
do_status() {
ps aux|grep $DAEMON
}
case "$1" in
status)
echo -en "Status $NAME: \n"
do_status
;;
start)
echo -en "Starting $NAME: \n"
do_start
;;
stop)
echo -en "Stopping $NAME: \n"
do_stop
;;
reload|graceful)
echo -en "Reloading $NAME: \n"
do_reload
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2
exit 3
;;
esac
exit 0
uwsgi9090
然後在終端執行:
-- 添加服務
chkconfig --add uwsgi9090
-- 設置開機啟動
chkconfig uwsgi9090 on
七:設置nginx
找到nginx的安裝目錄/usr/local/nginx,打開conf/nginx.conf文件,修改server配置
server {
listen 80;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass ; //必須和uwsgi中的設置一致
index index.html index.htm;
client_max_body_size 35m;
}
}
注意 :安裝django這步中startproject的demosite路徑,需要和nginx.conf中 uwsgi_param UWSGI_CHDIR /demosite;對應上。
設置nginx開機啟動,在/etc/init.d/目錄下新建nginx文件,內容如下:
nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/opt/nginx-1.5.6/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/opt/nginx-1.5.6/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
nginx
然後在終端執行:
-- 添加服務
chkconfig --add nginx
-- 設置開機啟動
chkconfig nginx on
八:測試
OK,一切配置完畢,在終端運行
service uwsgi9090 start
service nginx start
錯誤1:
[root@VM_23_251_centos nginx-1.5.6]# service uwsgi9090 start
env: /etc/init.d/uwsgi9090: Permission denied
[root@VM_23_251_centos nginx-1.5.6]# service nginx start
env: /etc/init.d/nginx: Permission denied
解決辦法1:把可執行勾選上
錯誤2:
[root@VM_23_251_centos ~]# sudo service nginx start
env: /etc/init.d/nginx: No such file or directory
解決辦法1:
Be careful what text editors you use on your local Windows computer. Some create Windows-style line endings (\r\n, CR-LF), which cause problems like this on Unix-like systems such as Linux or Mac OS X.
If you use such an editor, adjust its settings so that it creates files with Unix-style line endings. If the editor has no such setting, you should not be using it at all.
文本格式由windows 改為unix版
錯誤3:
*** WARNING: Can't find section "uwsgi" in INI configuration file /etc/uwsgi9090.ini ***
解決辦法3:
在瀏覽器輸入: http:// 雲主機公網ip,恭喜你可以看到django的「It work」了~
九:多站配置
我採用運行多個uwsgi服務的方法來實現多個站點。
重復第六步,創建uwsgi9091.ini,並相應修改文件中的
socket = 127.0.0.1:9091
pidfile = /var/run/uwsgi9091.pid
daemonize = /website/uwsgi9091.log
並創建服務uwsgi9091,設置開機啟動。
然後修改nginx的配置文件為:
nginx
然後我們就可以通過 http://127.0.0.1:1300 來訪問新的網站了。
十:其他配置
防火牆設置
CentOS默認關閉外部對80、3306等埠的訪問,所以要在其他計算機訪問這台伺服器,就必須修改防火牆配置,打開/etc/sysconfig/iptables
在「-A INPUT –m state --state NEW –m tcp –p –dport 22 –j ACCEPT」,下添加:
-A INPUT -m state --state NEW -m tcp -p -dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p -dport 3306 -j ACCEPT
然後保存,並關閉該文件,在終端內運行下面的命令,刷新防火牆配置:
service iptables restart
安裝Mysqldb
yum -y install mysql-develeasy_install-2.7 MySQL-python
注意紅色部分,easy_install-2.7,否則它將默認安裝到Python2.6環境內。
------------------------------------------------------------------------------------------------------------------
2014年12月02日添加:
CentOS 7中默認使用Firewalld做防火牆,所以修改iptables後,在重啟系統後,根本不管用。
Firewalld中添加埠方法如下:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload