阿里云Centos 7部署DJango2.0应用(uwsgi3 +Nginx)

目录

前言

上传以及服务器环境部分

uwsgi部分

nginx部分

静态文件

阿里云端口权限开启


前言

先概括下访问流程:

首先客户端发起请求,这里会有TCP的握手,三次握手结束之时,客户端会带上http数据给服务器(请求行,请求头,请求体),服务器会接收到http协议,Nginx会接收到数据,然后根据里面的配置进行判断是否需要转发,如果是static,直接拿资源返回,如果需要在转发继续socket连接后面的应用,这里就是uwsgi,该程序可以理解为DJango的运行环境,只要都遵循wsgi协议,都能和uwsgi和DJango一样连接起来,DJango处理并返回

DJango开发环境

Mac OS High sierra 10.13.4
 
mintoudeMacBook-Pro-2:~ mintou$ python3 -m django --version
2.1
mintoudeMacBook-Pro-2:~ mintou$ ipython3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.
 
 

这里一个简单的DJango应用就不介绍了,详细的可以看这里

首先明白一点,阿里云服务买了之后(怎么买就不说了),Nginx是已经有了的,而且有自带的Python2.7,但是我们还是要装3x以上的Python来玩,毕竟新时代马上要来了,看看需要安装什么先。这里提到的几个名词画一张图介绍下

Python3.6详细安装教程还有pip3

centos安装mysql

vim 批量注释,会用到的

参考文章之一

介绍完了一些安装和逻辑,开始操作、

 

上传以及服务器环境部分

首先开发的电脑上安装的我们都要在服务器上安装 

pip3 freeze > plist.txt
  • 通过ftp软件将开发好的项目上传到此服务器的某个目录
  • 然后在服务器上执行
pip3 install -r plist.txt

就拿最简单的Demo为例,以下是目录

更改根目录下的setting.py

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['*']

...


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT='/var/www/upload/static/'

STATIC_ROOT在开发环境没用,生产环境用来指定收集静态文件到哪里,只有这个作用,上面两个是开发环境测试用的,Nginx里面的静态文件地址也配成STATIC_ROOT一样的

小结:

1.搭建一个DJango应用,修改配置文件到生产部署之前的配置

2.pip3 导出安装包语句

3.ftp推上去

以下是推上去的目录

[root@izj6cgebrvv84gtntwiyagz static]# cd /root/Desktop/uploadProject/upload/
[root@izj6cgebrvv84gtntwiyagz upload]# ls -a
.  ..  .DS_Store  manage.py  static  templates  upload  userinfo  uswgi.log  uwsgi.ini  uwsgi.pid

 

uwsgi部分

  • python manage.py runserver:这是一款适合开发阶段使用的服务器,不适合运行在真实的生产环境中
  • 在生产环境中使用WSGI
  • WSGI:Web服务器网关接口,英文为Python Web Server Gateway Interface,缩写为WSGI,是Python应用程序或框架和Web服务器之间的一种接口,被广泛接受
  • WSGI没有官方的实现, 因为WSGI更像一个协议,只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行
  • 命令django-admin startproject会生成一个简单的wsgi.py文件,确定了settings、application对象
    • application对象:在Python模块中使用application对象与应用服务器交互
    • settings模块:Django需要导入settings模块,这里是应用定义的地方
  • 此处的服务器是一个软件,可以监听网卡端口、遵从网络层传输协议,收发http协议级别的数据
  • uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器
  • uWSGI代码完全用C编写
  • 安装uWSGI
pip3 install uwsgi

cd到项目根目录,创建一个uwsgi.ini的文件

[uwsgi]
socket=外网ip:端口(使用nginx连接时,使用socket) 127.0.0.1:8000或者是阿里云私有ip地址
# http=外网ip:端口(直接做web服务器,使用http) 没有nginx的使用,一般不管他
chdir=项目根目录 (/root/Desktop/uploadProject/upload)
wsgi-file=项目中wsgi.py文件的目录,相对于项目根目录 (upload/wsgi.py)
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log
  • 启动:uwsgi --ini uwsgi.ini
  • 停止:uwsgi --stop uwsgi.pid
  • 重启:uwsgi --reload uwsgi.pid
  • 如果重复开始,stop的时候会失败,可以执行如下强制杀死  sudo killall -9 uwsgi

小结:

  1. 在项目根目录创建uwsgi.ini文件并设置
  2. 执行命令开启uwsgi --ini uwsgi.ini让DJango项目接收传过来的http参数
  3. 修改了任何配置需要uwsgi --stop uwsgi.pid 如果失败可以查看pid并且修改uwsgi.pid,或者强制杀死在启动

 

nginx部分

  • 使用nginx的作用
    • 负载均衡:多台服务器轮流处理请求
    • 反射代理:隐藏真实服务器
  • 实现构架:客户端请求nginx,再由nginx请求uwsgi,运行django框架下的python代码
  • nginx+uwsgi也可以用于其它框架的python web代码,不限于django
  • 阿里云已经安装好了,不需要再安装

nginx目录

cd /usr/sbin/nginx 安装目录

vim /etc/nginx/nginx.conf  配置文件所在目录
  • 查看版本:sudo sbin/nginx -v
  • 启动:sudo sbin/nginx
  • 停止:sudo sbin/nginx -s stop
  • 重启:sudo sbin/nginx -s reload

那么nginx是uwsgi之前最先收到数据的,咱们打开nginx配置文件修改路由,指向uwsgi程序


# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    以上不用我们管  下面一个个的server就是配置的

    server {
        listen      ip地址: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;

        # 默认转发到 DJango
        location / {
            include uwsgi_params;
            # 这里配置的和项目下面的uwsgi.ini里面socket一样才能接收
            uwsgi_pass ip地址:8002;
        }
        # 在服务器配置的静态文件目录
        location /static {
            alias /var/www/upload/static/;
        }
        # 这个是例外,给我的iOS客户端配置的bundlejs/ActivityPage.js来使用 不转发到DJango        
        location /bundlejs {
            alias /usr/share/nginx/html/bundlejs/;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
以下是阿里云nginx默认的配置
#
#     server {
#         listen       8001;
#         #listen       [::]:80 default_server;
#         server_name  upload;
#         #root         /usr/share/nginx/html;
#
#         # Load configuration files for the default server block.
#         include /etc/nginx/default.d/*.conf;
#
#         location / {
#              include uwsgi_params;
#              uwsgi_pass 127.0.0.1:8002;
#         }
#
#         #error_page 404 /404.html;
#          #   location = /40x.html {
#         #}
#
#         #error_page 500 502 503 504 /50x.html;
#         #   location = /50x.html {
#        #}
# 	 }                                                                                                                              37,0-1        37%

这是配置文件,我们需要改的就是server,如果不改默认端口80那一坨,也可以直接另起一个监听另一个端口比如8000.

在server下添加新的location项,指向uwsgi的ip与端口
location / {
    include uwsgi_params;将所有的参数转到uwsgi下
    uwsgi_pass uwsgi的ip与端口;
}

我们试着改了默认的server,让用户输入ip之后直接指向我们配置的页面即可。如果listen对了,默认是会匹配location里面的的正则,匹配到了就路由到指定ip+端口,static是配置不走DJango的,如127.0.1.1/static/xxxx.png,这样的url直接拿服务器上的资源,不走Django,直接返回,配置好了nginx,指向uwsgi,再指向DJango服务,一套就配置好了。

小结:

  1. 阿里云自带,熟悉安装目录和配置文件目录
  2. 配置nginx listen location以及static 这里的static配置的路径是后续静态文件存放路径
  3. 配置location之后切换到项目根目录重新配置uwsgi.ini  修改uwsgi.ini文件,启动socket,禁用http
  4. 重启nginx、uwsgi(上面有介绍如何重启)

 

静态文件

本地开启的DJango应用,我们执行

python3 manage.py runserver 

之后,我们是可以根据img标签里面的src=/static/xxx.png获取静态资源,那么我们在服务器上启用了nginx之后,静态资源就由nginx来拦击处理了,如上配置的static正则,指定了一个路径,该路径就是我们服务器上自己配置的静态资源路径。

  • 所有的静态文件都会由nginx处理,不会将请求转到uwsgi
  • 配置nginx的静态项,打开conf/nginx.conf文件,找到server,添加新location
location /static {
    alias /var/www/upload/static/;
}

一开始这些目录是没有的,需要自己创建

  • 在服务器上创建目录结构“/var/www/upload/”
  • 修改目录权限
sudo chmod 777 /var/www/upload
  • 创建static目录,注意顺序是先分配权限,再创建目录
mkdir static

这里就可以再看下项目根目录下的setting.py了

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT='/var/www/upload/static/'

上面两个是开发环境下的,最后一个配置是采集DJango的静态文件的。不想出错的话直接配置好三个即可,上面两个是针对项目目录来的,下面的STATIC_ROOT是采集用的,就是服务器上的一个地址,和nginx查找的static配置文件匹配。

执行

python3 manage.py collectstatic

就会把DJango项目中的STATIC_URL对应的目录下的资源采集到STATIC_ROOT目录,让nginx查找匹配。采集资源如下,和项目是一一对应的,只是由nginx来匹配了

[root@izj6cgebrvv84gtntwiyagz nginx]# cd /var/www/upload/
[root@izj6cgebrvv84gtntwiyagz upload]# ls -a
.  ..  static
[root@izj6cgebrvv84gtntwiyagz upload]# cd static/
[root@izj6cgebrvv84gtntwiyagz static]# ls 
admin  bundlepic  js  weexJS
[root@izj6cgebrvv84gtntwiyagz static]# 

小结

  1. 新建服务器静态资源目录和权限配置
  2. nginx配置文件static配置路径
  3. 项目setting.py下配置路径,采集路径和nginx统一目录下
  4. 执行采集,静态资源转移
  5. 重启nginx、uwsgi

 

阿里云端口权限开启

进入安全组配置,开启指定端口权限

 

至此,输入你的阿里云ip地址,就可以访问到DJango写的匹配到urls.py下的第一个views.py对应的html模板页面,逻辑搞明白了,后面就是写模块了,后面改了什么就重启nginx或者uwsgi

 

DJango 2.1教程

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页