基于CentOS 7 ,用Nginx + uWSGI 部署Django项目上线 【多图、详细、附项目源码】

先放一张布置完成的图,为来者勖!

另外,此篇博客集多个博客之精华。这是我第二遍部署,重新申请的虚拟主机,并且一次成功。

网址是 http://157.230.141.185,音乐网站。感兴趣的小伙伴可以进去听听音乐哟~ 目前数据库里面有13首。
国外服务器,打开可能慢一些,稍安~~

估计2019.03 - 04月一直挂着这台虚拟机。后期若删除,导致无法访问还望理解~  ✿✿ヽ(°▽°)ノ✿

希望对你有所帮助,有问题请留言~ 欢迎交流。

一些细节的东西后期我会慢慢加上~

资源链接

链接:https://pan.baidu.com/s/10-9gyVWRUKt0p5fjYxpTJQ  提取码:v0a1 
包括项目以及数据库excel文件

正文部分开始:^_^

部署前的准备工作

1. 申请DigitalOcean虚拟主机,这里选用的系统是CentOS

多说一句:之所以选择DigitalOcean 是因为对于学邮注册的用户,充值5 $ 送50 $。。。 要不肯定首选国内的阿里云呀-_-#

假设你已经有相应账户。。。

若没有,这是邀请链接https://m.do.co/c/76433b03b4ed  嘿嘿... 这个没被墙,放心点开~

因为是测试部署项目,选择5美元每月的就行,服务器地点任意,这里选择的是旧金山。然后点击创建

会得到一个有公网ip的虚拟机

下面用ssh工具远程连接,这里我用的是Git Bash,昨天尝试部署踩坑时用的是putty。ftp工具我用的是SSH Secure File Transfer Client。 仅供参考!^_^

MAC系统请自动查阅想用的ssh工具和ftp工具

ssh ->     ftp ->    

2.修改root密码,并进入Terminal

然后就可以进行享受命令行带来的快感了。。。/手动捂脸 @_@

3.上传Django项目至 /home/ 目录

之所以单拉出来讲,并放这么靠前。主要是用的是国外服务器,上传速度慢。。。项目大小40多M呢,估计需要上传半个小时。。。T_T

FTP工具提前登场~~~~~~~~~ 撒花 ✿✿ヽ(°▽°)ノ✿

登录之后的样子,需要把music项目文件夹 上传至 home/ 目录,右键upload,让它慢慢上传着~~~

4.安装MySQL -- 如果你的项目中没用到,则跳过即可。(看一下也无妨,万一以后用到呢)

这里安装的是5.7,关于选择5还是8的版本,自行Google哟~

在 https://dev.mysql.com/downloads/repo/yum/ 找到 yum 源 rpm 安装包

安装yum 源

# 先安装Linux的wget工具,用于网上下载文件。
yum -y install wget

# 下载rpm安装包
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
# 安装 mysql 源
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm

用下面的命令检查 mysql 源是否安装成功,出现下图即为安装源安装成功

yum repolist enabled | grep "mysql.*-community.*"

安装MySQL  -- (别紧张,马上就好。前面是安装源)

yum install -y mysql-community-server  # 执行完这句才算安装完成

一些相关命令

# 查看mysql服务状态
systemctl status mysqld

# 启动mysql服务
systemctl start mysqld

# 停止mysql服务
systemctl stop mysqld


# 设置开机启动
systemctl enable mysqld
# 然后重载所有修改过的配置文件
systemctl daemon-reload

mysql 安装完成之后,生成的默认密码在 /var/log/mysqld.log 文件中。使用 grep 命令找到日志中的密码。

grep 'temporary password' /var/log/mysqld.log

首次通过初始密码登录后,使用以下命令修改密码

mysql -uroot -p  # 首次登陆不用输如密码

# 修改密码,第一次不用flush 
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';  

# 修改密码也可以用下面的语句
mysql> set password for 'root'@'localhost'=password('MyNewPass4!'); 

以后通过 update set 语句修改密码

mysql> use mysql;
mysql> update user set password=PASSWORD('MyNewPass5!') where user='root';
mysql> flush privileges;  # 需要flush

注意:mysql 5.7 默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 错误。查看 MySQL官网密码详细策略

查看编码,(修改前)

设置默认编码为utf-8:

mysql 安装后默认不支持中文,需要修改编码。
修改 /etc/my.cnf 配置文件,在相关节点(没有则自行添加)下添加编码配置,如下:

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

重启mysql服务,查询编码。可以看到已经改过来了

shell> systemctl restart mysqld
shell> mysql -uroot -p
mysql> show variables like 'character%';

默认配置文件路径:

配置文件:/etc/my.cnf
日志文件:/var/log/var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid

创建项目数据库

CREATE DATABASE 你的数据库名称 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

ps:这里的字符集用utf8mb4 或者用utf8mb4_unicode_ci 都可以。记得输入你的数据库名称哦~

至此,数据库配置完毕~~~  再次撒花✿✿ヽ(°▽°)ノ✿

5. 安装Python3 -- 为什么把python3放在这一步,因为下一步的迁移和收集需要用到。(这个解释能接受吗?^_^)

# 安装前准备 -- 卧槽 又是准备。。。

# 安装Linux的wget工具,用于网上下载文件。

yum -y install wget  # 前面安装mysql的时候好像安装了 wget工具。(人家是为了保证步骤的完整性才放到这里的,嘿...)

# GCC编译器环境,安装Python3时所需要的环境

yum -y install gcc

#  Python3 使用的依赖组件

yum -y install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite*-devel mysql-devel

# 然后用 wget 下载Python3.6 压缩包 (在home目录下)

wget "https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz"

# 解压

tar -zxvf Python-3.6.3.tgz

解压得到的Python-3.6.3文件夹是我们需要的开发环境。

最后将Python-3.6.3编译到CentOS7 系统

# 进图 Python-3.6.3文件夹

cd Python-3.6.3

# 依次输入编译指令 (指令含义参考 https://www.linuxidc.com/Linux/2011-02/32211.htm)

sudo ./configure

make && make install

国外服务器下载python,咔咔就是快。以上按命令来即可。。。就不配图了哈~

还是配一张吧~ 检验python3 有木有安装成功。 或者命令行直接输入python3。

(另外,系统自带python2.7的版本,别去管他。安装完3版本之后 用到的地方就敲python3

6. 安装Django 和 mysqlclient (因为下一步要用 (⊙o⊙)…

pip3 install mysqlclient

pip3 install django

7. Django项目settings.py文件修改 、迁移生成数据表 以及 收集静态文件

修改settings.py

DEBUG = False  # 关闭debug模式

ALLOWED_HOSTS = ['*']  # 允许任意域名主机访问
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'music_db',
        'USER': 'root',
        'PASSWORD': 'mysql密码',
        'HOST': '127.0.0.1',  # 注意:这里就是localhost,不能修改成公网ip
        'PORT': '3306',
    }
}
...
# STATIC_ROOT用于项目部署上线的静态资源文件
STATIC_ROOT = 'collected_static/'
STATIC_URL = '/static/'
# STATICFILES_DIRS用于收集admin的静态资源文件
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]

# 切记 STATIC_ROOT 和 STATICFILES_DIRS 不能重名!

注意:关于 STATIC_ROOT 和 STATICFILES_DIRS 路径的联系、区别 与配置,请移步https://www.qikqiak.com/post/django-staticroot-staticfilesdirs-function/

下面的两步就是需要用到python3 的地方。    撒花~ ✿✿ヽ(°▽°)ノ✿

迁移生成数据表

在 /home/music/ 目录下 依次执行:

python3 manage.py makemigrations  # 不加app名 代表对所有app执行此操作

python3 manage.py migrate

去数据库查看

趁热打铁:插入数据文件。细节性的东西先甭管,复制粘贴执行即可~

这里有4分数据文件,我已经转成对应的额SQL语句。如下:

由于表格之前有外键约束,下面的SQL得先执行前两条,后执行后两条!!!

INSERT INTO `music_db`.`index_label` (`label_id`, `label_name`) VALUES (1, '情感天地'),(2, '摇滚金属'),(3, '经典流行'),(4, '环境心情'),(5, '午后场景'),(6, '岁月流金'),(7, '青春校园');
INSERT INTO `music_db`.`index_song` (`song_id`, `song_name`, `song_singer`, `song_time`, `song_album`, `song_languages`, `song_type`, `song_release`, `song_img`, `song_lyrics`, `song_file`, `label_id`) VALUES (1, '爱 都是对的', '胡夏', '04:20', '胡 爱夏', '国语', '流行', '2010-12-08', '1.jpg', '暂无歌词', '1.m4a', 3),(2, '体面', '于文文', '04:42', '《前任3:再见前任》电影插曲', '国语', '伤感','2017-12-25', '2.jpg', '暂无歌词', '2.m4a', 4),(3, '三国恋', 'Tank', '04:06', 'Fighting!生存之道', '国语', '摇滚', '2006-04-15', '3.jpg', '暂无歌词', '3.m4a', 2),(4, '会长大的幸福', 'Tank', '04:32', '第三回合', '国语', '励志', '2009-05-29', '4.jpg', '暂无歌词', '4.m4a', 4),(5, '满满', '梁文音/王铮亮', '04:44', '爱,一直存在', '国语', '甜蜜', '2009-11-20', '5.jpg', '暂无歌词', '5.m4a', 1),(6, '别再记起', '吴若希', '04:04', '别再记起', '粤语', '场景', '2017-12-07', '6.jpg', '暂无歌词', '6.m4a', 4),(7, '爱的魔法', '金莎', '03:11', '他不爱我', '国语', '甜蜜', '2012-03-19', '7.jpg', '暂无歌词', '7.m4a', 1),(8, '演员', '薛之谦', '04:11', '演员', '国语', '流行', '2015-06-05', '8.jpg', '暂无歌词', '8.m4a', 3),(9, '放爱情一个假', '许慧欣', '03:24', '谜', '国语', '安静', '2006-10-01', '9.jpg', '暂无歌词', '9.m4a', 4),(10, 'Volar', '侧田', '03:52', 'No Protection', '粤语', '摇滚', '2006-07-05', '10.jpg', '暂无歌词', '10.m4a', 2),(11, '好心分手', '王力宏/卢巧音', '03:00', '2 Love 致情挚爱', '国语', '伤感', '2015-07-24', '11.jpg', '11.txt', '11.m4a', 1),(12, '就是这样', '林采欣', '05:13', '单曲', '国语', '流行', '2016-10-10', '12.jpg', '暂无歌词', '12.m4a', 3),(13, '爱过了 又怎样', '张惠春', '04:09', '单曲', '国语', '流行', '2016-09-07', '13.jpg', '暂无歌词', '13.m4a', 3);
INSERT INTO `music_db`.`index_dynamic` (`dynamic_id`, `dynamic_plays`, `dynamic_search`, `dynamic_down`, `song_id`) VALUES (1, 35, 45, 22, 1),(2, 47, 17, 21, 2),(3, 38, 34, 14, 3),(4, 4, 6, 2, 4),(5, 28, 7, 5, 5),(6, 206, 65, 42, 6),(7, 154, 53, 20, 7),(8, 15, 16, 33, 8),(9, 9, 12, 18, 9),(10, 68, 65, 35, 10),(11, 125, 70, 51, 11),(12, 53, 32, 45, 12),(13, 106, 54, 12, 13);
INSERT INTO `music_db`.`index_comment` (`comment_id`, `comment_text`, `comment_user`, `comment_date`, `song_id`) VALUES (1, '几好听', '匿名用户', '2018-04-20', 6),(2, '几好听', '匿名用户', '2018-04-20', 6),(3, '阿朵发放', '匿名用户', '2018-04-20', 6),(4, '阿朵发放', '匿名用户', '2018-04-20', 6),(5, '阿朵发放', '匿名用户', '2018-04-20', 6),(6, '阿朵发放', '匿名用户', '2018-04-20', 6),(7, '阿朵发放', '匿名用户', '2018-04-20', 6),(8, '好好听', '匿名用户', '2018-04-27', 11);

挑一个数据表看一下里面的数据~ 满足你们的好奇心 ^_^

收集静态文件

python3 manage.py collectstatic

ok... 至此准备工作完毕~  撒花~ ✿✿ヽ(°▽°)ノ✿

安装uWSGI 和 Nginx  -- 此处才正式开始部署工作

uWSGI 和 Nginx 的解释后面慢慢加进来吧。着急的小伙伴自行Google哟~ 

8.部署 uWSGI 服务器

uWSGI是一个web服务器,它实现了WSGI、uWSGI 和 HTTP 等协议。Nginx中 HttpUwsgiModule 的作用是与 uWSGI 服务器进行交换。 WSGI 是一种 Web 服务器网关接口,它是一个 Web 服务器与 Web应用 通信 的一种规范。(这里 web服务器 是 Nginx服务器,web应用是Django)。

部署 uWSGI 服务器之前,需要在Python3 中安装相应的板块,使用pip3 安装即可。

pip3 install uwsgi

完成之后,测试uWSGI 服务器能否正常运行。指令如下:

#  /home/music 是项目 music 的绝对路径,music.wsgi 是项目music 里面的 wsgi.py 文件

uwsgi --http :8009 --chdir /home/music -w music.wsgi

输入ip:8009 查看

吼~  一切正常~  撒花~ ✿✿ヽ(°▽°)ノ✿

下一步:ctrl + c 退出,然后编辑

music_uwsgi.ini 配置文件 (放在music项目目录下即可)

[uwsgi]
# Django-related settings
# 下面端口号随便指定一个,需要与nginx保持一致。但不能是80端口,因为nginx服务监听的就是80端口
socket= 157.230.141.185:8888

# the base directory (full path)
chdir=/home/music


# Django s wsgi file
module=music.wsgi:application

# process-related settings
# master
master=true

#maximum num of worker processes
processes=4

# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum=true

然后。。。

启动一下配置文件

uwsgi --ini music_uwsgi.ini

然后再次访问 ip:8888 (因为我们选择的端口是8888)

显示如下:

不要紧张。。。 因为我们还未配置Nginx。。。 -_-#

ctrl + c 停了uwsgi 服务,进行一下步!

9. 安装 Nginx 部署项目 ----  最后一步,生活要有仪式感  撒花~ ✿✿ヽ(°▽°)ノ✿

# 添加 Nginx 安装源

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 使用yum 安装 Nginx

yum -y install nginx

然后切换到 /etc/nginx/ 目录,打开并编辑 nginx.conf 文件。

# 在最后那个大括号 } 内,新增如下内容

    server  {
        listen      80;  # 监听80端口
        server_name     157.230.141.185;
        charset    UTF-8;
        access_log      /var/log/nginx/myweb_access.log;
        error_log       /var/log/nginx/myweb_error.log;

        client_max_body_size    75M;

        location / {
            include uwsgi_params;
            uwsgi_pass  157.230.141.185:8888;  # 这里ip和端口号 要和uwsgi.ini文件中一致
            uwsgi_read_timeout  2;
        }

        location    /static/ {
            expires 30d;
            autoindex   on;
            add_header  Cache-Control private;
            alias   /home/music/collected_static/;  # 这里要是收集静态文件的路径
        }
    }

然后启动Nginx服务

sudo nginx -c /etc/nginx/nginx.conf

sudo nginx -s reload

# 最后再次执行

uwsgi --ini music_uwsgi.ini

部署完毕!!!

浏览器输入网址 157.230.141.185 这次不用加端口号

成功啦!!! 撒花~ ✿✿ヽ(°▽°)ノ✿ ~ ✿✿ヽ(°▽°)ノ✿  ~ ✿✿ヽ(°▽°)ノ✿   

再看一下后台命令行:

当然也可以设置在后台运行 加上 -d 即可。

也可以把访问记录写到 日志 里面。 

相关工作后期慢慢加上吧。

Nginx 操作

# 停止
ps -ef | grep nginx

# 从容停止Nginx:
kill -QUIT 主进程号

# 快速停止Nginx:
kill -TERM 主进程号

# 强制停止Nginx:
pkill -9 nginx

nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确

关闭nginx:

nginx -s stop  :快速停止nginx

nginx -s quit  :完整有序的停止nginx

Reference:

1. https://www.jianshu.com/p/1dab9a4d0d5f

2. https://www.jianshu.com/p/c72e9dd2ab9b

3. http://www.itmuch.com/install/nginx-yum-install-in-centos7/

4. http://www.usday.cn/blog/51

5. https://blog.csdn.net/kriszhang/article/details/68941829

6. https://python012.github.io/2018/06/28/deploy-django-project-in-DigitalOcean-ubuntu/

7. https://www.qikqiak.com/post/django-staticroot-staticfilesdirs-function/

猜你喜欢

转载自blog.csdn.net/m0_38024592/article/details/88089249