在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程


Posted in Python onApril 25, 2015

最近尝试把项目迁移到Python环境下,特别新装了一台干净的Debian系统,准备重新配置环境,上网找了一些运行Python Web的环境方案,最后敲定Nginx+uWSGI组合,Nginx用得比较多,熟练些;uWSGI据说性能不错,想尝试一下。

网上大部分教程都是要求到uWSGI官方网站下载源码包,然后通过编译的方式安装,比如对于一台新Debian系统,可以通过下面的命令安装:

apt-get update
apt-get upgrade
apt-get install build-essential psmisc
apt-get install python-dev libxml2 libxml2-dev
apt-get install python-setuptools
cd /opt/
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar -zxvf uwsgi-latest.tar.gz
mv uwsgi-latest/ uwsgi/
cd uwsgi/
python setup.py install

还有一些配置我就不介绍了,大家可以参考Linode Library的《Deploy Python Code with WSGI using uWSGI and nginx on Debian 6 (Squeeze)》介绍。

今天要介绍的是利用APT源直接apt-get install安装配置我们所需要的环境,首先按惯例先安装MySQL和Nginx:

然后通过Debian Packages网站找到我们所需要的uWSGI在sid里,sid版里的东西表示仍在开发测试中,不是最终稳定版,不过对于我们测试来说是够用了,为了用sid里面的软件包,我们还需要修改我们的/etc/apt/sources.list源,添加deb http://ftp.tw.debian.org/debian sid main non-free contrib这一行,或者直接输入命令:

echo "deb http://ftp.tw.debian.org/debian sid main non-free contrib" >> /etc/apt/sources.list

配置过源列表后,我们就可以通过下面的命令安装了:

apt-get update
apt-get install uwsgi uwsgi-core uwsgi-plugin-python

安装完成后,配置文件按惯例放在了/etc/uwsgi里面,服务控制可以通过invoke-rc.d uwsgi后面跟命令参数来实现,不过这里有个小插曲我不得不提一下,安装时可能会报这样的错误:

The following packages have unmet dependencies: 
libc6-dev : Breaks: gcc-4.4 (< 4.4.6-4) but 4.4.5-8 is to be installed. 
E: Broken packages

看样子是依赖包gcc版本不匹配,我后来通过下面的方式解决了:

apt-get update
apt-get upgrade # 先尝试升级系统软件包
 
apt-get install libc6-dev

接下来就是安装django以及Python的MySQL支持,继续APT命令:

apt-get install python-django python-mysqldb

通过上面的步骤,Python环境应该安装到你的系统里了,切换到/usr/lib:

cd /usr/lib
ls -l | grep python

你可能会发现系统内被默认安装了几个版本的Python,比如我这里就安装有3个版本:

/usr/lib/python2.6
/usr/lib/python2.7
/usr/lib/python3

如何确定当前的Python默认版本呢?很容易,直接通过下面的命令就可以了:

python --version

大家知道django是安装到python目录下的site-packages下的,但是这几个python目录下都没有site-packages这个文件夹,其实我们可以先通过下面的命令定位一下:

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

上面的命令会在控制台上打印Python包路径,比如这里我们可能获得dist-packages这个目录,切换到这个目录你就会发现django在那儿啦。给django-admin.py加上权限,再做个符号连接,便于我们以后操作(我这里Django在Python2.7下):

chmod 777 /usr/lib/python2.7/dist-packages/django/bin/django-admin.py
ln -s /usr/lib/python2.7/dist-packages/django/bin/django-admin.py /usr/local/bin

记下Django所在的Python版本,然后通过下面的命令切换uwsgi的默认Python版本(一般不需要切换):

update-alternatives --config uwsgi-plugin-python

好啦,到这里基本上安装部分就介绍完了,下面讲解配置部分,首先建立我们项目的文件夹,比如说放在/home/user/www下,然后通过下面的命令创建名为mysite的Django项目:

cd /home/user/www
django-admin.py startproject mysite

好了,这下/home/user/www目录下应该有个子文件夹名字叫mysite,我们需要丢个wsgi的配置文件到/home/user/www/mysite/里面去,配置文件命名为wsgi.py,内容如下:

接下来是修改uwsgi配置文件,先通过如下命令按照刚才的设置建立个配置文件:

cat > /etc/uwsgi/apps-enabled/www.ini << EOF
[uwsgi]
socket = /var/run/uwsgi/app/www/socket
chmod-socket = 666
limit-as = 256
processes = 6
max-request = 2000
memory-report = true
enable-threads = true
pythonpath = /home/user/www
chdir = /home/user/www/mysite
wsgi-file = /home/user/www/mysite/wsgi.py
EOF
 
# 重启uwsgi
invoke-rc.d uwsgi restart

注意上面的socket配置,这个在我机子上是这个路径,大家可以cd /var/run里面找下,然后配置正确,接下来建立Nginx配置文件:

cat > /etc/nginx/sites-enabled/www << EOF
server {
    listen  80;
    server_name localhost;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:///var/run/uwsgi/app/www/socket;
    }
}
EOF

这里的uwsgi_pass依旧是上面我们找到的socket,注意一下server_name,这个是我们绑定的域名,通过nginx -s reload重新加载nginx。

好了,现在可以访问看看是不是成功了?如果出现502 Bad Gateway,可以检查一下uwsgi是否正常启动,通过ps aux | grep uwsgi看下进程列表,最后在检查下socket路径是否正确。

假如出现uWSGI Error:Python application not found这个问题,主要是路径配置问题,这点你可以查阅/var/log/uwsgi下面的日志文件,比如我就遇到过ImportError: No module named django.core.handlers.wsgi这个问题,实际上是wsgi.py里面路径配置不正确。

Python 相关文章推荐
Python单链表简单实现代码
Apr 27 Python
请不要重复犯我在学习Python和Linux系统上的错误
Dec 12 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
python实现倒计时小工具
Jul 29 Python
Python中最好用的命令行参数解析工具(argparse)
Aug 23 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
如何卸载python插件
Jul 08 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
python之基数排序的实现
Jul 26 Python
使用PDB简单调试Python程序简明指南
Apr 25 #Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 #Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 #Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 #Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 #Python
安装Python的web.py框架并从hello world开始编程
Apr 25 #Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 #Python
You might like
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
php在字符串中查找另一个字符串
2008/11/19 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
python访问sqlserver示例
2014/02/10 Python
Python中模块string.py详解
2017/03/12 Python
Python 文件处理注意事项总结
2017/04/10 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
对python:print打印时加u的含义详解
2018/12/15 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
建筑专业自荐信
2013/10/18 职场文书
司机检讨书
2014/02/13 职场文书
门面房租房协议书
2014/08/20 职场文书
安全例会汇报材料
2014/08/23 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
教师三严三实心得体会
2014/10/11 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
离婚上诉状范文
2015/05/23 职场文书
学生会自荐信
2019/05/16 职场文书
导游词之吉林吉塔
2019/11/11 职场文书