手牵手教你用Django+Nginx+uwsgi+MySQL部署个人Blog

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,查看ConsoleNetwork,可以查看报错信息。

  • 静态文件不能加载,出现404报错,一般为Nginx的location配置错误,导致Nginx找不到对应的文件位置。此时不断调试location即可。

  • 遇到500错误,则可能是写入数据库错误,或者是文件权限问题,此时打开Django的debug模式,查看报错信息解决即可。

  • 如何是502错误,而且输入端口不出现welcome to Nginx的字样,则为Nginx出现错误,一般是配置文件出现问题,重新配置后重启Nginx即可。

  • 如果uwsgi不能正常开启,查看uwsgi生成的日志,查看报错信息,修改后使用lsof -i:端口号查看进程PID,然后使用kill -9 PID关闭所有uwsgi进程后重启即可。一般是自己添加的配置文件存在问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354