Django+MySQL+uwsgi+Nginx部署

来源:互联网 发布:韩信守荆州 知乎 编辑:程序博客网 时间:2024/05/21 05:39

配置环境:

System:CentOS6.8 64位Database Server version: 5.7.73 Nginx version1.10.2Python version:python 3.4.1Django version1.11.2

Nginx

Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:

当它作为 Web 服务器,相比 Apache来说,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,能够支持高达 50,000 个并发连接数的响应。

当它作为负载均衡服务器,Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。

当它作为邮件代理服务器, Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。

Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器。 Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。

安装

使用源码编译安装,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好。一般我们都需要先装pcre和 zlib,pcre为了重写rewrite,zlib为了gzip压缩。如果没有ssl的话应该先装上。

cd /usr/local/srcwget http://nginx.org/download/nginx-1.4.2.tar.gztar -zxvf nginx-1.4.2.tar.gzcd nginx-1.4.2./configure --sbin-path=/usr/local/nginx/nginx \--conf-path=/usr/local/nginx/nginx.conf \--pid-path=/usr/local/nginx/nginx.pid \--with-http_ssl_module \--with-pcre=/opt/app/openet/oetal1/chenhe/pcre-8.37 \--with-zlib=/opt/app/openet/oetal1/chenhe/zlib-1.2.8 \--with-openssl=/opt/app/openet/oetal1/chenhe/openssl-1.0.1tmakemake install

--with-pcre=/usr/src/pcre-8.34 指的是pcre-8.34 的源码路径。
--with-zlib=/usr/src/zlib-1.2.7 指的是zlib-1.2.7 的源码路径。

确保系统的 80 端口没被其他程序占用,运行/usr/local/nginx/nginx 命令来启动 Nginx,然后打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。

Nginx基本配置文件为nginx.conf文件,当然,也可以使用include包含其余的.conf文件。可以根据不同的需求添加配置,只需要在include写好配置文件的路径。

几个常用的Nginx命令:

  • service nginx start –>启动服务器
  • service nginx stop –>关闭服务器
  • nginx -s reload –>服务器重启
  • nginx -t –>服务器配置文件语法检查

安装使用参考网站:http://www.nginx.cn/doc/index.html


uwsgi

uWSGI,既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍,性能超好,内存占用低等诸多好处,而且和Nginx配合可以解决负载均衡等问题,是一种比较经典的配置方式。

安装uwsgi

安装方式也很简单,直接使用python的经典安装方式pip
pip install uwsgi
就OK了。

测试uwsgi

安装后应该进行测试是否使用OK:
首先可以在项目根目录下创建一个test.py文件,源码如下:

# test.pydef application(env, start_response):    start_response('200 OK', [('Content-Type','text/html')])    return [b"Hello World"]

直接使用8000端口和测试文件test.py运行uwsgi:

uwsgi --http :8000 --wsgi-file test.py

然后通过浏览器访问http://[ip]:8000可以看到测试文件的”Hello World”则uwsgi运行正常。


Django+uwsgi+Nginx配置

下面进行亲测成功的经典配置Django+uwsgi+Nginx。

Django+Nginx

使用Django内置服务器与Nginx反向代理可以测试Nginx能否正常工作。
首先,将Django项目运行起来,python manage.py runserver 0.0.0.0:8000运行起来。

然后,开始配置Nginx的相关文件:Nginx的配置文件为nginx.conf,我们可以单独设置项目文件的Nginx配置,然后将其include到原文件中。

比如,我们的nginx.conf/etc/nginx路径下,我们可以在这个目录下创建一个conf.d目录,然后再/etc/nginx/conf.f下创建default.conf文件,然后再***.conf文件中配置Nginx对这个项目的代理。

blogproject.conf文件如下:

## The default server##server {#    listen       80 default_server;#    listen       [::]:80 default_server;#    server_name  _;#    root         /usr/share/nginx/html;##    # Load configuration files for the default server block.#    include /etc/nginx/default.d/*.conf;##    location / {#    }##    error_page 404 /404.html;#        location = /40x.html {#    }##    error_page 500 502 503 504 /50x.html;#        location = /50x.html {#    }##}#配置开始server{    listen 80;    server_name 106.14.215.47;    rewrite ^/$ /blog/index/ break;    location / {        proxy_pass http://[ip地址]:8000;      }}#配置结束

然后重启服务器,nginx -s reload(确保内置服务器在运行中)然后就可以通过默认的80端口访问项目了。http://[ip]

Django+uswgi

首先,将用uwsgi服务器运行Django项目,这里我们使用之前创建的项目blogproject来进行测试。当然Django项目本身需要可以正常使用,也就是使用python manage.py runserver 0.0.0.0:8000可以正常访问。然后更改配置使用uwsgi做服务器:

  1. 更改wsgi.py文件

    import osfrom django.core.wsgi import get_wsgi_application#from django.core.handlers.wsgi import WSGIHandleros.environ.setdefault("DJANGO_SETTINGS_MODULE", "blogproject.settings")application = get_wsgi_application()#application = WSGIHandler() #注释掉的是原自动生成的manage.py的配置
  2. 启动uwsgi服务器
    在项目根目录下运行uwsgi --http :8000 --module blogproject.wsgi
  3. 打开浏览器,输入http://[ip]:8000+[django的内部urls]测试项目是否可访问。

Django+uswgi+Nginx

将以上两个服务器与Django配置连接。
保证nginx.conf同级目录下有uwsgi_params文件这是连接Nginx和uwsgi的关键。

首先,用uwsgi与django项目启动起来,配置与上文一样,不过只有最后不是直接用HTTP访问,而是和Nginx建立socket连接。也就是Django+uwsgi第二步改成运行uwsgi --socket :8000 --module blogproject.wsgi。然后通过8000端口和Nginx连接,下面配置Nginx:

在这里直接更改上文创建的blogproject.conf为:

upstream django{    server [ip]:8000;#与uwsgi的连接端口}server{    listen 80;#外部客户端默认接入端口    server_name [ip];    charset utf-8;    rewrite ^/$ /blog/index/ break;#默认输入域名或ip(默认的80端口)时跳转的网址    client_max_body_size 75M;    #Django media    location /media{        alias /usr/local/www/blogproject/blog/media;    }    #Django static    location /static{        alias /usr/local/www/blogproject/blog/static;    }    #Django server    location / {        uwsgi_pass django;        include /etc/nginx/uwsgi_params;     }}

然后重启Nginx服务器,(注意uwsgi服务器需要一直在运行状态)就可以通过http://[ip]或者域名访问编写的Django网站了。

配置完成。

Django+MySQL配置

Django默认的数据库为SQLite,如果需要更改自己的数据库时,需要自己重新配置。下面以MySQL为例:

首先,Django无法创建数据库,需要通过命令行或其他MySQL的软件创建一个需要的数据库,不需要创建table,Django可以创建。

  1. 创建数据库
    mysql>CREATE DATABASE blogproject;
  2. 更改settings.py中关于数据库的设置
    找到DATABASS设置,更改为:
DATABASES = {    'default': {        'ENGINE': 'django.db.backends.mysql',        'NAME': 'blogproject',#创建的数据库名        'USER':'root',#数据库用户名        'PASSWORD':'*******'#数据库密码    }}

然后执行python manage.py makemigrationspython manage.py migrate进行数据库迁移,就可以使用MySQL数据库进行数据库存取使用了。

ps:当使用数据库时,遇到问题:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)可能是数据库未启动使用初始启动命令service mysqld start