0%

搭建Nginx+uWSGI+Django+MySQL服务器

为了将PHP改为Python,使用了Django搭建LNMP服务器,
下面命名默认Ubuntu系统,且用root账户登录,关于如何以管理员身份登录,请参考:Ubuntu Kylin14.04终于可以使用root登陆了
请注意:在创建mysite工程后,命令运行目录为:/python_workspace/mysite。

##

安装 python 和 python-dev

Ubuntu发行版自带python;
如果没安装python-dev会遇到”致命错误:Python.h:没有那个文件或目录”错误;
为了兼容性,选用Python2.x,python --version查看版本;
参考:五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)

安装 pip

1
2
# wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
# python get-pip.py

参考:pip安装和使用教程

安装并测试uWSGI

  • 利用pip安装uwsgi:

    1
    2
    # export LDFLAGS="-Xlinker --no-as-needed"
    # pip install uwsgi
  • 测试uwsgi:
    在你的机器上写一个test.py并填入:

    1
    2
    3
    def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

然后执行shell命令:

1
uwsgi --http :8001 --wsgi-file test.py

访问网页:http://127.0.0.1:8001/,看在网页上是否有Hello World。
引用:五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)

安装并配置Django

  • 安装Django
    1
    # pip install Django

参考:How to get DjangoDjango 环境搭建

  • 创建项目并测试:
    1
    2
    3
    4
    5
    # mkdir -p /python_workspace
    # cd /python_workspace
    # django-admin.py startproject mysite
    # cd mysite
    # python manage.py runserver 0.0.0.0:8001

在浏览器里输入localhost:8001127.0.0.1:8001查看效果。
参考:使用python搭建Django应用程序步骤及版本冲突问题解决nginx+uwsgi+django+python环境部署文档

  • uwsgi调用Django:
    Django1.4+在创建工程的时候会自动创建wsgi模块,进入工程目录(mysite),执行:
    1
    uwsgi --http :8001 --module mysite.wsgi

在浏览器里输入localhost:8001127.0.0.1:8001查看是否有Django页面。
参考:Setting up Django and your web server with uWSGI and nginx

安装Nginx并配置:

本节主要参考:Setting up Django and your web server with uWSGI and nginx

  • 安装测试Nginx
    1
    2
    # apt-get install nginx
    # /etc/init.d/nginx start # start nginx

在浏览器里输入localhost:80127.0.0.1:80查看是否有Nginx页面。

  • Nginx调用(连接)uWSGI
    将uwsgi_params拷贝到Django工程目录中:
    1
    # cp /etc/nginx/uwsgi_params ./

在工程目录中创建mysite_nginx.conf文件,内容如下:

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
32
33
34
# mysite_nginx.conf
#
# the upstream component nginx needs to connect to
upstream django {
server unix:///python_workspace/mysite/mysite.sock; # for a file socket
#server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
#
# configuration of the server
server {
# the port your site will be served on
listen 8001;
# the domain name it will serve for
server_name 127.0.0.1; # 测试用的是回环地址,应该设为公网IP或域名
charset utf-8;

# max upload size
client_max_body_size 75M; # adjust to taste

# Django media
location /media {
alias /python_workspace/mysite/media; # 媒体文件目录
}

location /static {
alias /python_workspace/mysite/static; # 静态文件目录
}

# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /python_workspace/mysite/uwsgi_params; # the uwsgi_params file you installed
}
}

在Nginx的相应目录中建立软链接,使其能找到该文件:

1
# ln -s /python_workspace/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/

部署静态文件:在mysite/settings.py最后添加:

1
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

运行python manage.py collectstatic将默认的静态拷贝到新目录。
重启Nginx

1
# /etc/init.d/nginx restart

放置media.png到上面设置的media目录,并在浏览器里访问:

1
127.0.0.1:8001/media/media.png

创建uWSGI运行脚本mysite_uwsgi.ini并填入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# mysite_uwsgi.ini file
[uwsgi]
#
# Django-related settings
# the base directory (full path)
chdir = /python_workspace/mysite
# Django's wsgi file
module = mysite.wsgi
# the virtualenv (full path)
#home = /path/to/virtualenv
#
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 3 # 开启3个uwsgi工作进程
# the socket (use the full path to be safe
socket = /python_workspace/mysite/mysite.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
# clear environment on exit
vacuum = true

运行脚本启动uWSGI:

1
# uwsgi --ini mysite_uwsgi.ini

(前提是Nginx要运行着)在浏览器里访问127.0.0.1:8001,应该可以看到Django页面。

安装配置MySQL

  • 安装MySQL
    1
    # apt-get install mysql-server

参考:MySQL安装指南
如果打开MySQL出现错误(仅在出现错误时尝试下面的方法):

1
2
3
ERROR 2002 (HY000): 
Can't connect to local MySQL server through socket
'/var/run/mysqld/mysqld.sock' (2)

需要将MySQL的socket设置为上面的路径(需要修改三处,该方法不一定有效):

1
gedit /etc/mysql/my.cn


参考:error: ‘Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)’

  • 选择MySQL DB API Drivers^Mysql-notes
  • ,本文使用MySQLdb,即mysql-python模块
    1
    2
    3
    4
    5
    # apt-get install python-setuptools
    # apt-get install libmysqld-dev
    # apt-get install libmysqlclient-dev
    # easy_install mysql-python
    # apt-get install python-mysqldb

测试下:
在python交互式窗口,import MySQLdb(注意:区分大小写)试试,不报错的话,就证明安装好了。
参考:ubuntu下mysql-python模块的安装

  • 修改mysite/settings.py,添加MySQL配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # Database
    # https://docs.djangoproject.com/en/1.7/ref/settings/#databases
    #
    DATABASES = {
    'default': {
    #'ENGINE': 'django.db.backends.sqlite3',
    #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
    'NAME': 'mysql', # 这里的名字一定要设为数据库名字否者会出现Unknown database 'xxx'
    # The following settings are not used with sqlite3:
    'USER': 'root',
    'PASSWORD': '123', # 改为自己设置的密码
    'HOST': '127.0.0.1', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
    'PORT': '3306', # Set to empty string for default.
    }
    }

注意,由于py文件默认用ASCII编码,如果有中文会出错,需要在文件的第一或第二行加入编码设置:# -*- coding: utf-8 -*-。参考:Python中文问题 或 SyntaxError: Non-ASCII character ‘\xe8’ in file
在python交互式窗口:

1
2
>>> from django.db import connection
>>> cursor = connection.cursor()

django.db注意区分大小写,不报错的话,就证明安装好了。
参考:python Django 学习笔记(四)—— 使用MySQL数据库Django-settings-databasesubuntu下Django连接mysql数据库出错及解决

  • 创建app并测试数据库
    1
    # django-admin startapp firstapp # firstapp为新创建的app名称

运行上述命令会在mysite工程目录里创建一个firstapp目录。
然后在mystite/settings.py中的INSTALLED_APPS模块的最下面加入firstapp,安装此app:

编辑app的模块文件firstapp/models.py,填入操作数据库的代码:

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
#vim: set fileencoding=utf-8 :
#
from django.db import models
#
# Create your models here.
#
class Company(models.Model):
full_name = models.CharField(u'公司全称' ,max_length=30)
address = models.CharField(u'地址', max_length=50)
tel = models.CharField(u'电话', max_length=15,blank=True)

def __unicode__(self):
return '%s %s %s' % (self.full_name,self.address,self.tel)
#
class Product(models.Model):
product_name = models.CharField(u'产品名称', max_length=30)
price = models.FloatField(u'价格')
stock = models.IntegerField(u'库存', max_length=5)
company = models.ForeignKey(Company)
create_date = models.DateField(u'生产日期')
#
def __unicode__(self):
return self.product_name
#设置一些与特定模型相关的选项
class Meta:
ordering = ['create_date']

采用 python manage.py validate 检查模型的语法和逻辑是否正确。
没有错误则执行 python manage.py syncdb创建数据表。
现在你可以看到你的数据库除了生成了products_company,products_product外还创建了其它好几个表,这些是django管理后台所需表暂不管。
参考:python Django 学习笔记(四)—— 使用MySQL数据库