在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中使用Boolean操作符做真值测试实例
Jan 30 Python
Python命令启动Web服务器实例详解
Feb 23 Python
python实现数据写入excel表格
Mar 25 Python
django session完成状态保持的方法
Nov 27 Python
对pandas写入读取h5文件的方法详解
Dec 28 Python
anaconda如何查看并管理python环境
Jul 05 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
Pycharm IDE的安装和使用教程详解
Apr 30 Python
python 使用elasticsearch 实现翻页的三种方式
Jul 31 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 Python
pycharm代码删除恢复的方法
Jun 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
php 文件上传实例代码
2012/04/19 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
PHP框架性能测试报告
2016/05/08 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
js实现各浏览器全屏代码实例
2018/07/03 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
python使用心得之获得github代码库列表
2014/06/25 Python
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
python getpass模块用法及实例详解
2019/10/07 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
python中Django文件上传方法详解
2020/08/05 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
Django数据统计功能count()的使用
2020/11/30 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
土建专业毕业生自荐书
2014/07/04 职场文书
2016年教师节感言
2015/12/09 职场文书
基于Python实现将列表数据生成折线图
2022/03/23 Python
java项目构建Gradle的使用教程
2022/03/24 Java/Android
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python