阿里云ECS布署uwsgi+nginx+ubuntu+django

作者: 鲁智深 分类: django,Python 发布时间: 2018-01-31 21:16

为什么要布署?python manage.py runserver:这是一款适合开发阶段使用的服务器,不适合运行在真实的生产环境中,

在生产环境中使用WSGI,WSGI:Web服务器网关接口,英文为Python Web Server Gateway Interface,缩写为WSGI,是Python应用程序或框架和Web服务器之间的一种接口,被广泛接受,WSGI没有官方的实现, 因为WSGI更像一个协议,只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行。

布署从uwsgi、nginx、静态文件三个方面处理,每个环节都必须走正确才能进行下一个环节。

首先你的服务器是阿里云ecs,系统是ubuntu,这些在购买的时候已经阿里云默认给配置,常用的公有服务器,如阿里云、青云等,可根据需要,按流量收费或按时间收费。

未布署的程序

在ECS上运行django程序需要先配置服务器环境,在本地的虚拟环境中,项目根目录下,执行命令收集所有包

1
pip freeze > plist.txt

通过ftp软件将开发好的项目上传到此服务器的某个目录,安装并创建虚拟环境,如果已有则跳过此步。

构架沙盒环境

1
2
3
4
sudo apt-get install python-virtualenv
sudo easy_install virtualenvwrapper
mkvirtualenv [虚拟环境名称]
#指定版本 Mkvirtualenv 虚拟环境名 –p  python3.x / python2.x

在虚拟环境上工作,安装所有需要的包

1
2
3
workon [虚拟环境名称】
#source py3/bin/activate或者这个命令进入沙盒
pip install -r plist.txt

更改settings.py文件

1
ALLOW_HOSTS=['*',]表示可以访问服务器的ip

启动服务器,运行正常

1
python manage.py runserver

以上都是常规操作,如果都操作过可直接过!

网页打开正常进行下面开始配置

uWSGI

uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器

uWSGI代码完全用C编写

安装uWSGI

1
pip install uwsgi

配置uWSGI,在项目跟目录中新建文件uwsgi.ini,编写如下配置(manage.py同级目录)

1
2
3
4
5
6
7
8
9
10
[uwsgi]
socket=内网ip:端口(使用nginx连接时,使用socket
http=内网ip:端口(直接做web服务器,使用http)
chdir=项目根目录
wsgi-file=项目中wsgi.py文件的目录,相对于项目根目录
processes=4#进程
threads=2#线程
master=True#起一个主进程
pidfile=uwsgi.pid#在失去权限前,将master的pid写到当前文件中
daemonize=uswgi.log#使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(不会影响nginx日志的输出)

案例

1
2
3
4
5
6
7
8
9
10
11
[uwsgi]
#socket=172.17.132.227:8000
http=172.17.132.227:8000
chdir=/root/atguigu/bookstore2
wsgi-file=bookstore2/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
virtualenv=/root/py3

阿里云必须用内网id才能起uwsgi,也有用0.0.0.0起的,但我一般用内网的id

阿里云内网id

阿里云内网id

启动:uwsgi –ini uwsgi.ini

停止:uwsgi –stop uwsgi.pid

重启:uwsgi –reload uwsgi.pid

查看进程:ps ajx|grep uwsgi

查看进程

查看进程

使用http协议查看网站运行情况,运行正常。

网页打开正常进行下面开始配置

nginx

使用nginx的作用

负载均衡:多台服务器轮流处理请求

反射代理:隐藏真实服务器

实现构架:客户端请求nginx,再由nginx请求uwsgi,运行django框架下的python代码

nginx+uwsgi也可以用于其它框架的python web代码,不限于django

命令安装

1
sudo apt-get install nginx#nginx是全局的的nginx

或者到官网下载nginx压缩文件

1
2
3
4
5
解压缩: tar zxvf nginx-1.6.3.tar.gz
进入nginx-1.6.3目录依次执行如下命令进行安装:
./configure
make
sudo make install

我想一般人都会选择第一种安装方式!

命令

查看版本:sudo nginx -v

启动:sudo nginx

停止:sudo nginx -s stop

重启:sudo nginx -s reload

查看进程:ps ajx|grep nginx

nginx进程

nginx进程

iZ2zecsdy8flu603bmdg1bZ是阿里云创建服务器默认的hostname,错误其实没有什么影响

阿里云创建服务器默认的hostname

阿里云创建服务器默认的hostname

通过浏览器查看nginx运行结果

指向uwsgi项目:编辑conf/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
vim /etc/nginx/nginx.conf
#编辑配置文件,目录不确定,可以通过whereis nginx找
#在http中加入如下文件
        #include /etc/nginx/conf.d/*.conf;
        #include /etc/nginx/sites-enabled/*;

        server {
            listen 80;#监听80端口
            server_name localhost;
            location / {#首页 "/"
                include uwsgi_params;#将所有的参数转到uwsgi下
                uwsgi_pass 39.107.83.53:8000;#监听8000端口,记得阿里云加入安全组
                uwsgi_read_timeout 2;
            }
            error_page 500 502 503 504 /50x.html;
            location = /50x.html {
                root html;
            }
            location /media {
                alias /var/www/bookstore/static;
            }
            location /static {#静态文件路径
                alias /var/www/bookstore/static;
            }
        }

修改uwsgi.ini文件,启动socket,禁用http

案例

1
2
3
4
5
6
7
8
9
10
11
[uwsgi]
#socket=172.17.132.227:8000
http=172.17.132.227:8000
chdir=/root/atguigu/bookstore2
wsgi-file=bookstore2/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uwsgi.log
virtualenv=/root/py3

重启nginx、uwsgi,看进程,确认重启

在浏览器中查看项目,发现静态文件加载不正常,接下来解决静态文件的问题

静态文件

静态文件一直都找不到,现在终于可以解决了

所有的静态文件都会由nginx处理,不会将请求转到uwsgi

配置nginx的静态项,打开conf/nginx.conf文件,添加location

1
2
3
4
#就是上面的配置文件的内容
location /static {#静态文件路径
        alias /var/www/bookstore/static;
        }

在服务器上创建目录结构“/var/www/bookstore/static”

为什么不再root下面创建静态文件?

/root 目录默认是只有 root 能访问的。其权限存在问题

修改目录权限

1
2
#建议在一个修改权限,确定没有问题
sudo chmod 777 /var/www/bookstore/static

修改settings.py文件,一定要加

1
2
STATIC_ROOT='/var/www/bookstore/static'
STATIC_URL='/static/'

收集所有静态文件到static_root指定目录:

1
2
#在项目目录执行manage.py
python manage.py collectstatic

重启nginx、uwsgi

最后上传图片出现不进入静态文件目录

models.py中添加代码

1
2
3
4
5
6
7
from django.core.files.storage import FileSystemStorage
fs = FileSystemStorage(location='/root/bookstore/bookstore/collect_static')

class Books(BaseModel):
    ...
    image = models.ImageField(storage=fs, upload_to='books', verbose_name='商品图片')
    ...

后台运行命令

1
2
nohup 命令 &
sudo kill -9 端口号 #杀死进程

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注