01 - 配置服务器
这里使用阿里云作为案例,阿里云上有详细的购买和使用教程。【年龄小于24岁的一律可以享受学生优惠,114RMB/年,】
本人购买的阿里云配置:1核CPU、2GiB内存、1Mbps的宽带,操作系统是Ubuntu 16.04 64位,价格是114RMB/年。这个配置对于起初搭建一个个人博客是完全够用的。
设置网络端口,如果还需要开启别的端口,可以自行添加。
选择安全组,然后选择 配置规则,选择快速添加,把22(SSH),443(HTTPS),3306(MySQL),80(HTTP),都添加到安全组。如果使用Django自带的sqlite数据库,则可以不打开3306端口。我这里由于需要用到8080端口,因此也添加了8080端口。
02 - 连接服务器
连接服务器的方法有很多,可以使用阿里云自带的workingbench,也可以使用xshell、git等远程连接工具。由于本人不想在网页编辑,所以我选择xshell作为远程连接工具。我们需要将代码部署到服务器,所以同时也可以使用文件上传工具连接服务器,Filazilla等,也可以安装git,在服务器上直接clone代码。
远程连接工具的使用也很简单,只需要输入服务器ip地址,端口【记得开启22端口】,用户名和密码就可以连接了。各款连接工具差别不大,选一款称手的即可。
03 - 代码部署
进入服务器后,为了防止系统太久引起的问题,首先升级系统。
apt-get update # 升级ubantu系统
apt-get upgrade # 升级ubantu系统
遇到需要点击Y/N的时候,输入Y即可,接下来,安装需要用到的库。
apt-get install nginx # 安装nginx
apt-get install python3
apt-get install python3-pip
#apt-get install git # 用于clone github上的代码,如果使用文件上传工具上传代码则不需要
pip3 install virtualenv # 用于创造虚拟环境
sudo apt-get install mysql-server # 安装mysql,安装过程需要设置数据库密码
阿里云的ubantu自带python2.7.12和python3.5.2,但python2.7.12优先级更高,如果要使用python3,我们需要调整python3的优先级。
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 200 # 调整优先级
python # 查看对应的版本,显示3.5.1则配置成功
03 - 1 更改数据库默认编码方式【不使用MySQL则直接跳到03 -2】
调整MySQL数据库的默认编码格式,因为MySQL数据库的默认编码格式不是utf8,如果不调整,后期上传文章会导致不能写入的问题,因此我们需要调整默认编码格式。
# 进入MySQL的配置目录
sudo vim /etc/mysql/conf.d/mysql.cnf
# 在[mysql]标签下添加下列代码
default-character-set=utf8
# 打开另一个位置的cnf文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 在[mysql]下添加下列代码
character-set-server=utf8
# 修改完成后重启MySQL
sudo service mysql restart
# 进入MySQL,查看是否修改成功 database后为数据库名
show create database my_blog;
03 -2 代码部署和数据迁移
在对应目录下创建虚拟环境,本人是在/home下创建虚拟环境。
cd /home
virtualenv --python=python3.5 env # 使用virtualenv创建虚拟环境
source env/bin/activate # 进入虚拟环境
克隆仓库代码,或者使用FileZilla等文件上传工具直接上传。
# 仓库url: https://github.com/yujunke/My_blog
(env) root@iZuf6bhk70n1s67mi79aerZ: git clone https://github.com/yujunke/My_blog.git
设置Django项目的settings.py文件。
DEBUG = False # 关闭debug模式
ALLOWED_HOSTS = ["127.0.0.1",'106.15.204.94'] # 把106.15.204.94改为自己服务器的ip地址
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
STATIC_URL = '/static/'
# 设置Django搜集静态文件的目录,存于当前项目的collected_static文件夹内
STATIC_ROOT =os.path.join(BASE_DIR,'collected_static')
STATIC_ROOT会把所有的静态文件收集起来,包括Django自带的后台管理的css样式等静态文件。方便我们后期使用Nginx统一在此文件下调用静态文件。
使用requirements.txt文件下载项目的所有环境库,如果repository下没有设置requrements.txt,可以自行在服务器逐个下载对应版本的库。
# 进入项目目录
(env) root@iZuf6bhk70n1s67mi79aerZ: cd my_blog
# 下载requirements文件中对应版本的所有库
(env) root@iZuf6bhk70n1s67mi79aerZ: pip3 install -r requirements.txt
# 收集静态资源
python3 manage.py collectstatmic
修改Django文件settings.py下数据库的部分,需要将数据库的host、password等信息改为当前环境下的数据库信息,ALLOWED_HOSTS
改为127.0.0.1
和可以访问的ip和域名。
cd my_blog # 进入Django项目文件下
vim settings.py
# vim进入settings.py文件,键入i进行修改,修改DATABASES信息【密码、数据库名等信息】,完成后按Ctrl+c,然后输入:wq保存
# 修改ALLOWED_HOSTS参数 ALLOWED_HOSTS = ['127.0.0.1','其他允许访问的ip或域名']
cd .. # 退出到manage.py所在的目录
python3 manage.py migrate # 使用migrate完成数据迁移
到这里,就已经把Django的项目部署到了服务器上了。
04 - Nginx的配置
上面下载相关软件的时候,已经安装了Nginx
在本机浏览器上,输入对应服务器的外网ip地址,如果能看到Welcome to nginx 画面,则说明Nginx启动成功。
以下为Nginx相关指令,用于后期调试,需要时copy即可
/etc/init.d/nginx restart (&start / stop ) # 开启、重启、停止
vim /var/log/nginx/access.log # 查看access.log日志
vim /var/log/nginx/error.log # 查看error.log日志
进入Nginx安装目录 /etc/nginx,更改nginx.conf的user为root
vim /etc/nginx/nginx.conf
# 把第一行的user XXX 改为 user root
user root
配置当前项目的nginx.conf文件
# 进入/etc/nginx/sites-enabled文件夹
cd /etc/nginx/sites-enabled
# 自己创建的.conf文件,名字可以随意,这里使用mu_blog.conf命名
vim my_blog.conf
进入my_blog.conf文件后,加入以下代码
server {
charset utf-8;
listen 80; #开启80端口,用于外部用于访问;默认nginx是使用80端口
server_name www.yujunke.cn; # 域名,没有域名则写服务器ip
location /static/ {
alias /home/my_Blog/collected_static/; # 使用djngo收集静态文件后的静态目录
}
location = /media/ {
root /home; # 媒体文件存放目录
}
location /{
uwsgi_pass 127.0.0.1:8080; # 与uwsgi对接的端口
include uwsgi_params; # 只需要写uwsgi_params即可,不需要完整写路径
}
}
修改完毕后,可以使用/etc/init.d/nginx restart
重启Nginx
注意,上面的location如果配置错误,会找不到对应静态文件,发生404报错。此时可以详细了解下location的相关用法。网上有很多相关文档,也可查看官方文档。具体关注 alias和root的区别;location后的匹配规则即可。
05 - Uwsgi的配置
在虚拟环境下安装uwsgi
(env) root@iZuf6bhk70n1s67mi79aerZ: pip3 install uwsgi # 在虚拟环境下安装
下载完成后,可以输入以下代码来测试下uwsgi的运行情况uwsgi --http :8000 --module my_Blog.wsgi
配置uwsgi文件,文件名.ini,注意文件后缀名一定不能错
先进入项目目录下,使用vim uwsgi.ini创建uwsgi目录
cd /my_Blog/My_blog # 进入项目目录,manage.py所在的目录
vim uwsgi.ini # 创建uwsgi.ini文件
在uwsgi.ini目录下,输入以下代码,按注释提示修改相关内容
[uwsgi]
daemonize = /home/log # 在/home/log下生成运行日志
chdir = /home/my_Blog/ # 项目文件所在
module = my_Blog.wsgi # 项目名.wsgi
home = /home/env # 运行环境为/home下的env
master = true
socket = 127.0.0.1:8080 # 使用8080端口,用于和nginx对接,记得在服务器开启8080端口
processes = 4 # 开启4个进程
threads = 2 # 开启2个线程
vacuum = true
mod-socket = 666 # 相关权限
配置完成后,进入相关目录,输入uwsgi 文件名.ini
命令启动,然后去浏览器输入我们的ip地址,看能否连接。
06 - 调试
在配置Nginx和Uwsgi时,难免会发生很多错误。错误无非存在于四个地方,Django、uwsgi、Nginx和数据库。调试时可以在Chrome的开发者工具调试 。Chrome下按F12,查看Console和Network,可以查看报错信息。
静态文件不能加载,出现404报错,一般为Nginx的location配置错误,导致Nginx找不到对应的文件位置。此时不断调试location即可。
遇到500错误,则可能是写入数据库错误,或者是文件权限问题,此时打开Django的debug模式,查看报错信息解决即可。
如何是502错误,而且输入端口不出现welcome to Nginx的字样,则为Nginx出现错误,一般是配置文件出现问题,重新配置后重启Nginx即可。
如果uwsgi不能正常开启,查看uwsgi生成的日志,查看报错信息,修改后使用
lsof -i:端口号
查看进程PID,然后使用kill -9 PID
关闭所有uwsgi进程后重启即可。一般是自己添加的配置文件存在问题。