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