Django +uwsgi+python3+nginx + mysql 部署

半城伤御伤魂 提交于 2020-11-21 23:51:42

 

 

 

 

 

环境:

服务器ip:192.168.0.110

centos服务器 6.4 + mysql 5.6 + django1.11 +nginx 1.13.7 + uwsgi 2.0.18

 

uwsgi介绍

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  1. WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
  2. uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  3. 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
  4. uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

 

uWSGI的主要特点如下

  1. 超快的性能
  2. 低内存占用
  3. 多app管理
  4. 详尽的日志功能
  5. 高度可定制(内存大小限制,服务一定次数后重启等)

 

nginx+uwsgi

工作原理:

  nginx负责建立一个本地的工作环境,就是本地服务器,类似于pycharm的 run调试django一样,可以打开一个 http:127.0.0.1的本地服务页面

并开启一个可使用的端口。

  uwsgi 负责转发,将外网发过来的请求转发给 nginx,nginx就像处理内部访问一样来处理请求。(所以他们的端口明显不一样

 

nginx+uwsgi+django是我们常用的django部署方式。nginx作为最前端的服务器,他负责接收所有的客户端请求,对于请求的静态文件,由nginx服务器自己完成,因为它具有很好处理静态文件的能力,性能进行过优化,支持高并发量;uWSGI服务器作为支持服务器,是用来服务nginx的,nginx将请求的动态文件交给uWSGI进行处理。uWSGI实现了uwsgi、wsgi和http协议,uwsgi协议是uWSGI自定义的协议,定义的是框架(django)和服务器对接的接口

 

 

Nginx和uWSGI都是Web服务器 ,Nginx负责静态内容,uWSGI负责Python这样的动态内容,请求先交由Nginx,如果是静态内容就自己处理了,如果是动态内容就交给uWSGI服务器,uWSGI服务器处理整个Django项目的Python代码,响应请求,原路返回

nginx + uwsgi 提供高并发

mysql安装 参考

 http://www.cnblogs.com/mingerlcm/p/6792503.html

 

为centos系统增加编译功能

yum install gcc-c++

 

 

安装nginx依赖包

yum install pcre pcre-devel

安装wget

yum install wget

 

安装这个模块是为了让uwsig支持使用“-x"选项,能通过xml文件启动项目

yum install libxml*

 

安装python3.6可能使用的依赖
# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

 

 

下载python3

Python下载源
1.下载软件包
# wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
2.解压
# tar -xzvf Python-3.6.1.tgz 
3.创建目录
#mkdir -p /usr/local/python3.6    
4.把Python3.6安装到 /usr/local/python3.6 目录
# ./configure --prefix=/usr/local/python3.6
# make && make install

5.创建软连接
ln -s /usr/local/python3.6/bin/python3.6 /usr/bin/python3
ln -s /usr/local/python3.6/bin/pip3 /usr/bin/pip3

6.查看Python版本
#python --version
Python 3.6.1

 

给python3安装django和uwsgi,pymysql以及配置启动项目的xml文件

pip3 install pymysql

 

pip3 install django==1.11

 

pip3 install uwsgi

 

为了在终端中使用uwsgi命令,执行以下命令

ln -s /usr/local/python3.6/bin/uwsgi /usr/bin/uwsgi3

 

专门用来放我们的django项目

mkdir /www/

 

将你的django项目放到你想放的路径下,例如/www/,假设我们的Django项目名为"myproject"
在你的django项目下新建 myproject.xml,内容如下:

 

[root@mysql myproject]# vim myproject.xml

 

 

<uwsgi>
    <socket>127.0.0.1:8002</socket><!-- 内部端口,自定义 -->
        <chdir>/www/myproject</chdir><!-- 项目路径 -->
            <module>myproject.wsgi</module>
                <processes>4</processes> <!-- 进程数 --> 
    <daemonize>uwsgi.log</daemonize><!-- 日志文件 -->
</uwsgi>

 

wq保存 

 

 

安装nginx和配置nginx.conf文件

下载nginx,执行解压命令

wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -zxvf nginx-1.13.7.tar.gz

 

进入解压后的nginx-1.13.7文件夹,编译安装nginx

 

[root@mysql myproject]# cd /soft/
[root@mysql soft]# cd nginx-1.13.7
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make && make install

 

nginx一般默认安装好的路径为/usr/local/nginx
在/usr/local/nginx/conf/中打开nginx.conf,加入以下内容,先备份nginx.conf文件

 

 

[root@mysql nginx-1.13.7]# cd /usr/local/nginx/conf/
[root@mysql conf]# cp nginx.conf nginx.conf.bak

 

 

vim nginx.conf

 

 

server {
        listen       8001;  # 暴露给外部访问的端口
        server_name  localhost;

        charset utf-8;

        #access_log  logs/host.access.log  main;

        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8002; # 外部访问8001就转发到内部8002
        }

        location /static/ {
            alias /www/myproject/statics/; #项目静态路径设置
        }

 

关闭 selinux

vim /etc/selinux/config

 

SELINUX=enforcing

 

改为disabled

SELINUX=disabled

 

iptables加上允许8001,8002,3306,80端口

vim /etc/sysconfig/iptables

 

配置文件配置

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8002 -j ACCEPT

配置好重启iptables

[root@mysql myproject]# service iptables restart

 

启动nginx

[root@mysql conf]# /usr/local/nginx/sbin/nginx

 

 

访问项目页面

进入你的django项目路径,执行以下命令:

uwsgi3 -x myproject.xml

 

注:执行该xml后django就算是启动了,内部的nginx服务也将被启动,uwsgi将能够连接到nginx的服务了,此时网络应该是通畅的了。

以上步骤都没有出错的话,打开你的浏览器,输入以下链接,http://192.168.0.110:8001 (请将该ip替换成你的服务器ip)

网站访问成功!

 

部署完成之后发现django后台admin访问时无样式 

解决方法如下: 
1.先打开django项目中settings.py文件(/www/myproject/myproject/settings.py),添加如下配置

 

 

[root@mysql myproject]# vim settings.py

 

 

STATIC_ROOT = os.path.join(BASE_DIR, "statics")

2.然后在django项目下 执行 python3 manage.py collectstatic 此命令是搜集静态文件的命令,

 

[root@mysql myproject]# python3 manage.py collectstatic

You have requested to collect static files at the destination
location as specified in your settings:

    /www/myproject/statics

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes

 

 

 

搜集后的静态文件存放在/home/myproject/statics/中 

 

3.重新启动uwsgi和nginx

[root@mysql myproject]# /usr/local/nginx/sbin/nginx -s reload

 

[root@mysql myproject]# pkill uwsgi
[root@mysql myproject]# uwsgi3 -x myproject.xml 
[uWSGI] parsing config file myproject.xml

 

 可以看到admin样式

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!