第三篇文章主要介绍的是如何将Django网站部署到阿里云服务器上,具体的流程如下图所示:
我们会按照这张思维导图的顺序逐个展开讲解:
Section I, Ubuntu
(1)我们需要在阿里云上租一台新的服务器,选择系统类型;或者将一台已经租好的服务器停止运行,之后再重装系统。这次我们的演示用的是公共镜像 + Ubuntu16.04 64位系统 + 自定义密码。
点击右下角阿里云的确定按钮,然后会弹出一个小窗口,提示你通过“点击获取”验证码。一旦你点击了按钮之后,验证码会在你发到你手机上,输入验证码之后,点击确定,就会提示你返回阿里云控制台。一般系统重装需要一点时间,控制台会显示“启动中”,过一会就切换成“运行中”,代表系统重装并处于运行状态。
(2)如何用本地系统的终端的连接阿里云服务器?
如果你是ubuntu系统,尝试下面的操作:
我专门准备了一台Thinkpad,将系统重装为Ubuntu,目的就是为了方便本地连接服务器。大家也可以安装虚拟机来操作,参考B站小哥的视频:Linux(Ubuntu)零基础体验教学_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com
我们把系统的终端Terminal打开,输入下面这行命令:
ssh root@47.95.144.251
结果它提醒我,Host key verification failed,意思是说认证失败了。这是因为我之前连服务器的时候,是有认证过的;但是,因为我们更新了系统,老的认证就失效了(它会自动认证)。我们需要根据提醒,将就的认证先删除掉:
ssh-keygen -f "/home/psyjt/.ssh/known_hosts" -R "47.95.144.251"
然后再次输入:
ssh root@47.95.144.251
它会问你:小朋友,要不要更换认证啊?Are you sure?
答案当然是:yes
然后,阿里云会要求你输入密码,你把刚刚安装系统的密码输进去,你就成功从客户端连接到了阿里云服务器。
如果你是windows系统,尝试下面这个视频中的操作:Windows:使用 putty 远程控制服务器《 阿里云 ECS:Linux 服务器 》ninghao.net
(3)了解阿里云服务器的系统信息和已经安装的Python的版本情况。
当你来到一个陌生的环境的时候,通常要到处走走,探探周边的情况;同样的,来到阿里云服务器,你要知道这个系统是不是如你所愿,是Ubuntu16.04 64位系统,而且,里边的Python安装的版本情况又是怎样的?
如何获取系统信息?可以输入:lsb_release -a
如何获取Python版本信息呢?
你可以直接输入Python,它就会进入到Python环境中,并且会有提示当前是哪个Python2.x版本。同样,你也可以输入Python3,会提示当前属于Python3.x版本。
补充:退出python环境出了输入quit()之外,还可以用快捷键ctrl+D
这个时候,因为自己的Linux系统自带的是Python3.6,和阿里云服务器系统的版本有点不一样,所以我们可能会纠结,到底要不要把Python3.5升级Python3.6?
我这个人的特点一贯比较“怂”,不会轻易冒风险,在我不确定Python3.5和Python3.6之间的差异会必然导致某项功能无法实现之前,我选择不安装升级
Section II, 虚拟环境Virtualenv
在这个部分,我们需要了解pip的功能,pip和pip3的区别,安装pip3,并用pip3安装虚拟环境。本来这一步是单纯安装虚拟环境的,但是,为了强调pip和pip3的区别,很多小伙伴容易把两者搞混,我就故意把这个部分分解成四个问题。
·第一个问题,pip是用来干什么的?
pip是一个Python包管理工具,提供了对Python包的查找、下载、安装和卸载等功能。python安装包的工具有easy_install,setuptools,pip,以及distribute等。pip是easy_install的替代品。安装pip之前必须要先安装setuptools,而安装setuptools之前,必须要先安装python。
·第二个问题,pip和pip3的区别是什么?
如果系统同时装有python2和python3,那么pip默认给python2用,而pip3指定给python3用。
那是不是说,安装了python2的系统包含pip,安装了python3的系统就自带pip3?
我们可以用which查找某个命令是否存在,以及命令存在哪个位置。
这说明安装python3并不会自带pip3。
从网上查到的资料显示:使用pip install XXX,新安装的库会放在这个目录下面:
python2.x/site-packages
如果使用pip3 install XXX,新安装的库会放在这个目录下面:
python3.x/site-packages
我们可以由第三个问题的解决来检验是不是这样?
·第三个问题,如何安装pip3?
先更新,apt-get update;再安装,apt-get install python3-pip。
第四个问题,如何借助pip3安装虚拟环境?
在终端中输入pip3 install virtualenv virtualenvwrapper
结果报错了,显示说:
locale.Error: unsupported locale setting
这是语言设置问题,只需要在命令窗口中输入:export LC_ALL=C
这时候在终端再次输入pip3 install virtualenv virtualenvwrapper就可以跑了。
虚拟环境安装成功!
Section III, uWSGI
pip3 install uwsgi
Section IV, Nginx
sudo apt-get install Nginx
安装Nginx之后,就可以通过外网对网站进行访问了。如果是阿里云服务器,需要注意的是,你需要配置安全组的策略(截图如下):
点击安全组,然后右边有“修改”,“克隆”,“还原规则”,“管理实例”,“配置规则”,和“管理弹性网卡”六个选项,点击“配置规则”,就可以配置你的服务器的访问规则(分为入方向和出方向)。你要把80端口打开才能从外网对配置在阿里云服务器上对网站进行访问。具体可以参考下面这张图中的参数来设置:
设置好之后点击确定保存,你在本地计算机的浏览器中输入服务器公网ip地址,就可以看到:
这说明nginx安装成功了!当然,我们的目的不止于如此,肯定是要把在本地已经编写好的django项目上传到服务器,并让其他用户能够通过网址访问服务器,才是我们最终的目标。
SectionV, Django
(1)进入到nginx默认创立的www网站的文件夹位置,
cd /var/www/
(2)开启虚拟环境,然后安装django,
创建虚拟环境
virtualenv GoodProject01
激活虚拟环境
source GoodProject01/bin/activate
进入这个虚拟环境的文件夹
cd GoodProject01
·安装requirements.txt中的项目依赖包
重新打开一个端口Terminal,然后把本地的项目文件夹,生成好的requirements.txt,还有数据库文件db_psyBlog.sql都上传到服务器的这个虚拟环境文件夹GoodProject01中。
本地的requirements.txt如何生成?
输入下面这段代码:
pip freeze > requirements.txt
切记,这个一定要在虚拟环境中操作,有同学如果不是在虚拟环境中操作,有可能会引入项目之外的安装包。通常我们打开requirements.txt是这样的:
Django==1.11.7
pkg-resources==0.0.0
PyMySQL==0.9.3
pytz==2019.3
我们可以把第2项删掉,只保留3个项目即可。
利用scp命令,我们可以把本地机器上的requirements.txt上传到服务器上,比如像这样:
scp requirements.txt root@xx.xx.xx.xx:/var/www/GoodProject01/mBlog/requirements.txt
上传完毕之后,我们就可以安装django在python3虚拟环境下的一系列依赖工具包,执行pip3 install -r requirements.txt,读取文件requirements.txt中的扩展库信息并在服务器上的虚拟环境中进行安装。
·安装数据库
接下来是重点,就是要安装mysql数据库,并且把本地上传的这个数据库文件db_psyBlog想办法纳入到数据库里边。
一般我们都是要找一个安装数据库的教程作为参考,我通过百度找到了一个:Django+Ubuntu WEB部署(超详细版)www.jianshu.com
这里核心的安装的语句:
sudo apt-get install mysql-server
这一步是要你输入mysql的密码的,设置成你记得住的密码。然后按回车继续...
可以利用
mysql -uroot -p
输入密码,登录进mysql数据库中。其他数据库方面的操作与本地数据库操作是类似的。但是,这个时候数据库中并没有本地数据库,需要将本地的数据库迁移到服务器上。
·迁移数据库
迁移数据库的教程也找了一个,而且亲测有效:mysql-数据库备份与恢复(Ubuntu16.04)_数据库_student241的博客-CSDN博客blog.csdn.net
所以,可以跑到django项目文件夹(就是那个带manage.py文件的目录)中,运行
mysqldump -uroot -p db_mBlog > db_mBlog.sql
这样就可以把数据库中的db_mBlog数据库导出。利用scp命令,将 db_mBlog.sql 拷贝到服务器上的项目文件夹中。
这个时候,你先要在数据库中创建一个同名的数据库:
create database db_mBlog charset=utf8;
然后借助下面的命令将.sql数据库文件导入到数据库中:
mysql -uroot -p db_mBlog < db_mBlog.sql
因为,我们已经安装了uwsgi和nginx,我们可以进入到配置nginx.conf文件和GoodProject01.ini文件的操作。
·配置nginx.conf文件
在所有这些工作做好之后,可以把本地的Django项目,上传到服务器上,需要先迁移一次数据库,运行django的项目看看能不能正常运行。如果可以,说明django项目连接服务器上的数据库并且启动项目是可以的。然后,我们开始考虑用uwsigi 启动nginx。这里就涉及到如何配置nginx和uwsgi的问题:
nginx的配置文件nginx.conf,我们把这个文件从本地上传服务器,打开看看配置文件里边是什么样子(需要修改):
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
server {
listen 80;
server_name xx.xx.xxx.xxx;
charset utf-8;
location /static {
alias /var/www/GoodProject01/psyBlog/static;
}
location / {
uwsgi_pass 127.0.0.1:8000;
include /etc/nginx/uwsgi_params;
}
}
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
#include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # Using a PHP Script on an Apache Server as the IMAP Auth Backend
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
这里大部分内容是不需要修改的,需要调整的是两个地方,第一个是:
server_name xx.xx.xxx.xxx;
第二个是:
location /static {
alias /var/www/GoodProject01/psyBlog/static;
}
如果你有用到static文件夹的话,需要修改成项目的static路径。
·配置uwsgi.ini文件
我们需要自己新建一个uwsigi的启动文件,然后填入信息,这两部分的内容我都是从网络上收集好了的。新建一个文件我用的是touch命令,然后用vim打开,再将准备好的脚本拷贝进去(如下所示):
[uwsgi]
chdir =/var/www/GoodProject01/psyBlog
module =psyBlog.wsgi
home =/var/www/GoodProject01
master =true
processes =4
socket =127.0.0.1:8000
chmod-socket = 666
vacuum = true
启动的命令用
uwsgi --ini GoodProject01.ini
这一步需要进入nginx文件夹来执行,如果.ini文件是在nginx文件夹下面的话:
cd /etc/nginx/