阿里云服务器部署python Django项目(nginx+uWSGI)

avatar 2019年9月16日11:34:29 评论 1,791

前言:部署的前提是你的项目已经在本地完成可以运行了,我的本地环境是ubuntu16.04+python3.5+Django2.1.2+Mysql,在python虚拟环境(virtualenv)下建的项目。阿里云部署用的是nginx+uWSGI。

一、云服务器购买和配置

去阿里云官网购买一台云服务器ECS(Elastic Compute Service),可以直接支付宝扫码登录。个人用的话入门级就可以了,我买的是1核2G的,原价还是挺贵的。个人练手的话1核1G应该也是够用了,看实际需求。关于《阿里云新手购买服务器优惠大合集》,本站整理好了,可以参考。

购买的时候会让你选操作系统,因为我本地用的就是Ubuntu,所以选的ubuntu16.04  64位。除了操作系统选择,还有几个要设置的地方,等下说。先说下这个云服务器ECS(Elastic Compute Service)是个什么东西,简单的就可以把它理解为一台电脑,我们租的一台电脑,可以一直运行。我们可以通过远程连接对它进行操作,只能通过终端命令操作,不能用鼠标。

购买成功后进入控制台→云服务器(ECS)→实例,就能看到你买的服务器。上面的公网IP就是这台服务器所在的IP地址,部署成功后浏览器通过这个地址访问你部署的项目。这里还有两个密码要设置,一个是远程连接的密码,第一次点击上图的远程连接会出现一个6位数字密码,只出现一次,所以要记住这个密码,后面也可以修改。第二个是ubuntu登录的账户密码,帐户名默认为root,密码需要设置。点击上图的管理,点击更多-重置密码 设置ubuntu登录密码。

除此之外还有一个要设置的就是安全组,设置允许访问的端口。点击安全组--配置规则 进入如下界面,最下面三条是系统的默认设置。

点击添加安全组规则进行端口添加,只需要填端口范围和授权对象,比如80端口,端口范围写80/80,授权对象写0.0.0.0/0,表示所有IP地址都能访问。常用的几个端口号,SSH(22),HTTP(80),HTTPS(443)。

到此,云服务器的基本设置完成了。点击 实例页面的远程连接,输入6位密码,就可以远程登录。然后会让你输入Ubuntu的账户名和密码。输入成功后就可以远程登录ubuntu的终端,可以像在本地一样通过各种命令操作。

二、项目资料上传和环境搭建

1、把我们本地Django项目工程文件拷贝到阿里云上

这里要用到一个工具:Xftp,可以用来在本地和远程Linux之间拷贝文件。

进入官网,https://www.netsarang.com/products/xfp_overview.html 。点击Free License,填写下姓名、邮箱就可以免费下载安装。

安装成功后,打开,点击左上角新建,主机 输入你阿里云的公网IP,确定。然后点击对话,输入ubuntu的账户名,密码,就可以实现本地和阿里云的连接。

左边就是你的PC桌面,右边是阿里云ubuntu的root目录。可以直接按住把文件从左边拖到右边的文件夹中。因为本地是在虚拟机中运行的ubuntu,项目文件叫做myweb,先把文件从ubuntu中拷贝到桌面,再从桌面拖到阿里云ubuntu的home文件夹下。这里还有一点设置是如何显示ubuntu中的隐藏文件,在工具栏--选项--显示隐藏文件。

2、虚拟环境(virtualenv)的安装

本地项目是建在python虚拟环境下的,所以在阿里云上也要先建下虚拟环境。安装如下步骤如下:

1、安装virtualenv

sudo pip install virtualenv
sudo pip install virtualenvwrapper #安装虚拟环境管理工具

2、在home下创建虚拟环境安装目录

mkdir .virtualenvs

3、为virtualenv配置环境变量,打开.bashrc文件,在末尾加上两行代码,在阿里云的ubuntu上,你想编辑文件只能用vi/vim打开,对于没用过vi的话还是需要点时间学习的。或者你可以在本地pc编辑好,再用Xftp工具上传覆盖原来的文件。

用vim打开.bashrc ,一般就在home文件夹下

sudo vim ~/.bashrc

在末尾添加两行代码

export WORKON_HOME=$HOME/.virtualenvs # 所有虚拟环境存储的目录
source /usr/local/bin/virtualenvwrapper.sh

使配置文件生效

source ~/.bashrc

4、创建虚拟环境,默认命令创建的是python2的虚拟环境,指定创建python3.5的虚拟环境可以使用以下命令

mkvirtualenv -p /usr/bin/python3.5 XX #XX是虚拟环境的名字,创建python3.5的虚拟环境

其他命令:
workon xx #进入虚拟环境XX
deactivate #退出虚拟环境

3、在虚拟环境中安装相应的工具包

我们在本地写django项目肯定是安装了一堆相应的包,需要把他们移植到阿里云上。首先在本地ubuntu进入虚拟环境,在项目根目录下,执行以下命令收集安装的包,就是生成一个包的清单文件plist.txt。

pip freeze > plist.txt

然后用xftp把这个plist.txt文件上传到阿里云项目的根目录home/myweb,然后进入虚拟环境test(test是我新建的虚拟环境的名字)。

workon test #进入虚拟环境test

cd到plist.txt所在目录
pip install -r plist.txt #安装txt文件上的包

4、Mysql数据库的安装和数据的迁移

安装Mysql:输入以下命令,安装过程会设置密码,设置成和原来本地一样的,就不用在setting中修改了。

​sudo apt-get update
sudo apt-get install mysql-server 
sudo apt-get install mysql-client

创建数据库:先登录数据库, 然后创建数据库v1,数据库名字也创建成和原来本地一样的,我的叫v1。

create database v1;

数据的迁移:把本地数据库中的数据复制到阿里云上的数据库中。先在本地生成备份文件,v1是要备份的数据库,v1.sql是生成的备份文件。然后用Xftp把v1.sql文件上传到阿里云。

mysqldump -u root -p v1 >v1.sql

数据还原:阿里云终端 cd到v1.sql所在目录,输入以下命令

mysql -u root -p v1<v1.sql

mysql配置:找到mysqld.cnf文件注释掉bind-address这一行

/etc/mysql/mysql.conf.d/mysqld.cnf #配置文件路径

#bind-address = 127.0.0.1 #注释掉这一行

5、修改django的setting文件:

DEBUG = False
ALLOW_HOSTS=['XXXXXX'] #改成阿里云的公网IP

至此,我们已经完成了项目文件迁移、环境建立、数据库迁移 。可以在阿里云的终端中运行Django项目,先进入虚拟环境,然后cd到项目目录下,python manage.py runserver 看能不能启动项目,如果可以说明项目本身已经没有问题了。如果不能说明项目本身还有问题。有些包安装好后需要设置配置文件,看是不是没设置。到目前为止的操作其实基本都和本地是一样,下面我们要安装两个额外的东西,nginx和uWSGI。

三、nginx、uWSGI的安装

在安装前先了解下这几个是什么东西:WSGI、uWSGI、nginx。

WSGI:PythonWeb服务器网关接口(Python Web Server Gateway Interface),这是一种协议规范,用于规范web server(比如uWSGI)和web application(Flask、Django等)之间的通信方式。这种协议其实是将我们和更加底层的HTTP、TCP等协议分隔开来,使我们在开发的时候可以不用自己去实现这些协议的处理,只关注于更高层次的逻辑处理,实现面向对象的编程。

uWSGI:uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。它本身可以作为一个服务器单独使用,但是也可以和nginx组合使用。一般Django部署都是用的nginx+uWSGI,可以理解为这种组合性能更优。

nginx:这是一个高性能的web服务器/反向代理,类似Apache。什么叫反向代理,客户端通过一个代理去访问服务器,这样的代理叫正向代理;同样的服务器前加一个代理和客户端通信,这样的代理叫反向代理。nginx就是用来放在uWSGI前做反向代理。

我们在本地开发的时候没有安装过以上服务器,但是也可以python manage.py  runserver运行项目,那是因为Django等框架自带了WSGI服务器,性能不强,可以用于调试。

nginx安装:

直接在终端安装,不用装在虚拟环境中,输入以下命令:

sudo apt-get update
sudo apt-get install nginx

安装成功后,用浏览器访问你的阿里云IP地址,可以看到以下提示 :

nginx常用命令:

service nginx start #启动
service nginx stop #停止
service nginx reload #重启

nginx配置:打开配置文件default,路径/etc/nginx/sites-available/default,设置以下内容。一个是server_name后面换成你的阿里云公网IP,有的文章说不换也行。关键是下面2个location,第一个location是设置的和uWSGI的关联。第二个location /static是设置的静态文件的路径。如果你的项目还有media文件夹,那还要加一个location /media,把路径设置上。注意:location 和alias后面有空格。

server_name 47.106.84.245;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404;
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000; 
}
location /static {
alias /home/myweb/static;
}
 更新(2018.11.26):

上面nginx配置静态文件有一个问题,就是上面的目录/home/myweb/static只是我们自己的静态文件的目录,你登录admin后发现admin页面的样式都丢失了。因为django自带的admin的静态文件路径没有导入。所以就需要新建一个文件夹,我的是/home/myweb/nginx/static,然后执行命令把整个项目的所有静态文件都收集到这个目录下,再修改下上面的配置。

第一步:新建文件夹 /home/myweb/nginx/static

第二步:修改setting.py文件,增加STATIC_ROOT

STATIC_ROOT='/home/myweb/nginx/static/' #添加收集静态文件的目录
STATIC_URL = '/static/'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,'static'), 
)

第三步:执行以下代码收集静态文件

python manage.py collectstatic

第四步:修改nginx的配置

location /static {
alias /home/myweb/nginx/static;
}

uWSGI安装:

这个是安装在虚拟环境中,先workon test进入虚拟环境,安装uWSGI前需要先安装依赖,输入以下命令完成安装

apt-get install build-essential python
apt-get install python-dev
pip install uwsgi

配置uWSGI:在django项目的根目录下,新建两个文件,uwsgi.ini和run.log 。第一个是uWSGI的配置文件,第二个是日志记录文件。设置uwsgi.ini文件如下:

[uwsgi]
chdir = /home/myweb 
module = myweb.wsgi:application 
socket = 127.0.0.1:8000 
master = true 
daemonize = /home/myweb/run.log
disable-logging = true
wsgi-file = /home/myweb/myweb/wsgi.py
pidfile=/home/myweb/uwsgi.pid

chdir是django项目所在目录,socket后面的地址是和上面nginx配置文件中的地址uwsgi_pass  127.0.0.1:8000对应的,规定nginx和uWSGI之间的通信端口。daemonize就是日志文件的路径。disable-logging = true 表示不记录正常信息,只记录错误信息。wsgi-file是你django项目根目录下项目同名目录中有一个wsgi.py文件的路径。pidfile是uwsgi.pid文件的路径,这个文件是uWSGI运行后自动生成的,里面记录了uWSGI的进程号,可以用来重启uWSGI。但是我的uwsgi.pid文件记录的进程号老是不对,用不了。

uWSGI基本命令:

启动:uwsgi --ini uwsgi.ini
停止:uwsgi --stop uwsgi.pid
重启:uwsgi --reload uwsgi.pid

全部配置好后,重启nginx和uWSGI,因该就可以用浏览器访问你的项目了。

以下是我部署的django项目,前端基本是用的现成的,一些js和后端是自己写的。

http://47.106.84.245/

水平有限如有问题,望指正。

 

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: