华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)

《玩转Django 2.0》书中的项目“我的音乐”做好了,然后去服务器部署项目。这个过程中遇到过很多问题,2018年的双十一周末都花在这上面了。网上看过很多教程,走过很多弯路,心累!还好网站已经搭建出来了: www.mymusic.net.cn
霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光!


部署前,首先了解下项目流程和每个组件的用途,很重要哦!

项目流程:
1、首先客户端(如浏览器)请求服务资源。
2、nginx作为直接对外的服务接口,接收到客户端发过来的http请求,会解包、分析。
3、如果是静态文件请求,就根据nginx配置的静态文件目录,返回请求的资源。
4、如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI将接收到的包进行处理,并转发给wsgi。
5、wsgi根据请求调用django工程的某个文件或者函数,处理完后django将返回值交给wsgi。
6、wsgi将返回值进行打包,转发给uWSGI。
7、uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
注:不同的组件之间传递信息涉及到数据格式和协议的转换。

用途:
1、第一级的nginx并不是必须的,uWSGI完全可以完成整个的和浏览器交互的流程。
2、在nginx上加上安全性和其他限制,可以达到保护程序的作用。
3、uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡。
4、django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。


1、安装Python 3

CentOS 7 系统默认安装Python 2.7,但Django 2.0以上的版本不支持Python 2.7版本,因此需要我们在CentOS 7 系统中安装Python 3版本。Python 3.7安装过程中执行make install 命令后,结尾会有错误,显示pip、setuptools会安装失败,自己再去安装这些工具有点麻烦,所以用Python 3.6。
在安装Python 3.6之前,我们需要分别安装Linux的wget工具、GCC编译器环境以及Python 3 使用的依赖组件。

1.1、相关的安装指令如下

 1. 安装Liunx的wget工具,用于网上下载文件
 	yum -y install wget
 2. GCC编译器环境,安装Python 3 时所需的编译环境
 	yum -y install gcc
 3. Python 3 使用的依赖组件
 	yum install openssl-devel  bzip2-level  expat-devel   gdbm-devel  readline-devel  sqlite*-devel mysql-devel
 4.安装编译环境(非必需,为了减少后续安装错误)
	yum groupinstall 'Development Tools'

1.2、Python 3.6.3 安装

 1. 安装包下载:wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
 2. 解压安装包:tar -zxvf  Python-3.6.3.tgz,生成Python-3.6.3文件夹
 3. 进入Python-3.6.3文件夹:cd Python-3.6.3
 4. 将Python-3.6.3 编译到CentOS 7中:
    # 依次输入编译命令,指定位置安装python3.6.3
 	./configure --prefix=/usr/local/python3
 	make
 	make install

1.3、Python 3.6.3 建立软连接并加入PATH环境变量中

这一步很坑,Linux基础不熟,浪费了自己很多时间。切记小心!

# 查看/usr/bin中所有python文件的详细信息
ls -l /usr/bin/python*

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第1张图片
由上图可知,系统中默认的python版本是2.7,为了不影响yum插件,因为yum插件(python写的工具)使用的是python2.7。所以对于系统默认的python版本,我们不做变动。

1、建立新的软连接python3和pip3

# python 3.6 和 python3建立软连接
ln -s  /usr/local/python3/bin/python3.6 /usr/bin/python3
# pip3.6 和 pip3 建立软连接
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3
# 升级pip3到最新版
pip3 install --upgrade pip

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第2张图片
由上图所示,建立连接后,系统中就有两个版本的python了。安装模块时,切记需要弄清楚安装在哪个环境。如果是2.7版本,就用pip/pip2;如果是3.6版本,就用pip3。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第3张图片
通过指令:python,可以进入旧版2.7的交互环境;通过指令:python3,可以进入新版3.6的交互环境。

2、新版python3加入环境变量PATH中

vi /etc/profile     //编辑profile文件
#  在profile文件底部加入该行,即python安装目录的bin目录
export PATH=$PATH:/usr/local/python3/bin
source /etc/profile     //让修改立即生效

加入环境变量中的作用在于,执行python程序的时候,就会使用该版本的python环境。


2、安装mysql 8.0.13

2.1、下载MySQL二进制文件

地址:https://dev.mysql.com/downloads/file/?id=480751
下载后将mysql-8.0.13-linux-glibc2.12-x86_64.tar文件,通过xftp工具上传到阿里云服务器上,路径为:/usr/local/software。路径自选,随意。

2.2、 安装mysql,初始表

1、安装前检测系统是否自带安装了mysql

rpm -qa | grep mysql

如果你系统有安装,那可以选择进行卸载:

rpm -e mysql  // 普通删除模式
rpm -e --nodeps mysql  // 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除

2、解压缩mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz文件
如果文件是以tar.gz结尾的安装包,直接执行该命令解压缩:

cd /usr/local/software  //进入文件存放位置
tar -zxvf  XXX.tar.gz   //解压缩

而以tar.xz结尾的安装包,执行以下命令解压缩:

xz -d  mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz   //首先解压缩为tar包
tar -xvf  mysql-8.0.13-linux-glibc2.12-x86_64.tar   //解压缩

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第4张图片
3、复制mysql目录到系统的本地软件目录

cp -r mysql-8.0.13-linux-glibc2.12-x86_64. /usr/local/mysql

4、添加系统的mysql组和mysql用户

groupadd mysql   //添加系统mysql组
useradd -r -g  mysql mysql   //添加mysql用户,属于mysql组

5、初始化mysql配置表

cd  /usr/local/mysql             //转到mysql目录里
chown -R  mysql:mysql  ./       //修改当前目录为mysql用户
//初始化数据库
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 

在这里插入图片描述
提示没有libaio不能创建目录,所以需要安装libaio:

// 下载libaio, 注意:yum install libaio.so.1默认安装32系统的,本系统是64位系统的。
wget http://mirror.centos.org/centos/7.5.1804/os/x86_64/Packages/libaio-0.3.109-13.el7.x86_64.rpm
rpm -ivh libaio-0.3.109-13.el7.x86_64.rpm  //安装libaio

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第5张图片
由上图可知,初始化数据库已经完成,红色方框框起来的root@localhost:dVdAeKHwA08,是root用户的初始密码:dVdAeKHwA08,第一次登录需要用到。
在mysql目录下:

cd /usr/local/mysql   //进入mysql目录
chown -R root:root ./ //修改当前用户为root用户
chown -R mysql:mysql data //修改当前的data目录为mysql用户

6、复制配置文件
如果没有my-default.cnf就手动创建一个文件,并且配置权限:

touch my-default.cnf    //创建 my-default.cnf 文件
chmod 777 ./my-default.cnf   //对文件授权

复制my-default.cnf到/etc/my.cnf:

cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf   //复制文件

然后修改/etc/my.cnf文件:

vi /etc/my.cnf   //修改文件内容,i进入编辑模式->ESC退出编辑模式->:(冒号)进入底行模式->输入wq!,保存并退出

my.cnf文件内容,简单的配置:

[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8

2.3、加入开机启动项

1、将mysql/support-files/mysql.server 拷贝为/etc/init.d/mysql并设置运行权限,这样就可以使用service mysql命令启动/停止服务

cp mysql.server /etc/init.d/mysql  //复制文件
chmod +x /etc/init.d/mysql     //授权x,mysql就可以执行了

2、注册启动服务

chkconfig --add mysql    //注册启动服务

3、查看服务是否添加成功

chkconfig --list mysql

4、开启mysql服务

service mysql start  //开启服务
service mysql stop  //关闭服务
service mysql restart //重启服务

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第6张图片

2.4、配置环境变量

vi /etc/profile //编辑文件
写入文件内容:
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
保存退出之后,让文件生效,执行指令:source /etc/profile

2.5、登录并修改密码

mysql -u root -p  //执行命令,输入初始密码,进入mysql
alter user 'root'@'localhost' identified by '123456';  //修改密码

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第7张图片
提示密码修改成功后,退出,使用新的密码再重新登录,验证密码是否修改成功了。

2.6、Navicat远程连接mysql数据库

1、下载工具
网上下载navicat工具,资源很多,随便下载。

2、进入mysql,开启远程访问
进入mysql数据库:

mysql -u root -p //root用户登录mysql
use mysql;    //进入mysql数据库

使用以下命令开启root用户远程访问权限:

CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
GRANT ALL ON *.* TO 'root'@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';

刷新权限:

FLUSH PRIVILEGES; 

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第8张图片

3、navicat远程连接数据库
3.1、开放3306端口
远程连接需要在华为云控制台中新建安全组,开放3306端口,否则连接报10038错误。
操作步骤:
1、登录华为云,进入控制台,进入弹性云服务器ESC,点击更多,点击更改安全组,进入修改页面
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第9张图片
2、新建安全组–>配置规则–>入方向规则下,添加规则–>选择TCP协议,输入3306端口,点击确定端口即可开放
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第10张图片

3.2、navicat连接数据库
1、打开navicat–>文件–>新建连接–>MySQL…
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第11张图片
2、进行连接
连接名:随意,可以选择远程IP
主机名或IP地址: 远程数据库服务器IP地址,该位置填写华为云公网IP
密码:填写远程访问授权的密码
点击测试连接,是否可用。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第12张图片


3、部署uWSGI服务器

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

3.1、部署前,需要在Python3中安装相应的模块,使用pip3安装

使用到的模块安装:

pip3 install pymysql  
pip3 install django 
pip3 install uwsgi

3.2、使用xftp将本地项目music转移到华为云上

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第13张图片

3.3 修改settings文件,数据库迁移并导入数据和静态资源收集

1、上传后的项目,需要更改settings配置文件中的一些东西:

# 关闭debug模型
DEBUG = False
# 允许所有域名访问
ALLOWED_HOSTS = ['*'] 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'music_db',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',  # 如果是远程数据库需要填写远程计算机的IP,否则不变
        'PORT': '3306',
    }
}
# 静态资源路径,项目上线后使用
STATIC_ROOT = '/home/mymusic/static'  
# 将Admin的静态资源保存在static文件夹中
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

2、数据库迁移并导入数据

# 迁移之前,需要在mysql中创建settings.py中DATABASES设置的数据库music_db
create database music_db;  //创建music_db数据库
# 数据库迁移,music项目的根目录执行指令
python3 manage.py makemigrations
python3 manage.py migrate

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第14张图片
数据较少,数据可以从原先数据库中导出SQL数据,然后在服务器的数据库中执行这些SQL,即可导入数据。

3、静态资源收集

#  Admin静态资源的收集指令
python3 manage.py collectstatic

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第15张图片
首次指令收集,会提示有多少个文件被复制,以后执行指令,则会提示是否覆盖文件,覆盖的是变更的文件,并且提示覆盖文件数。之后music项目中的static有任何变更,都需要执行收集指令,否则变更不会起作用。因为服务器是从/home/mymusic/static调用静态资源的。

3.4、测试uWSGI是否能正常运行

1、输入uwsgi指令,启动服务器

# 首先去华为云开放入方向8080端口
# /home/music是项目的绝对路径,music.wsgi是项目music里面的wsgi.py文件
uwsgi --http :8080  --chdir /home/music -w music.wsgi.py

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第16张图片
如上图启动服务器成功,然后本地浏览器输入:华为公网IP:8080,即可访问网站。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第17张图片
uWSGI服务器测试成功后,下一步为项目music编写uWSGI配置文件。当项目运行上线时,只需执行uWSGI配置文件即可运行项目music的uWSGI服务器。在项目music的根目录下创建music_uwsgi.ini配置文件。

touch /home/music/music_uwsgi.ini   //创建uWSGI配置文件
vi /home/music/music_uwsgi.ini  //编辑配置文件,输入配置内容

配置文件内容:

[uwsgi]
# 通信端口
socket= :8080
# music项目的绝对路径
chdir=/home/music
# music的wsgi.py文件,.是指上一层目录
module=music.wsgi
# 允许主线程存在
master=true
# 开启进程的数量
processes=5
# 开启多线程
enable-threads=true
# 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件
vacuum=true
# 使进程在后台运行,并将日志打到指定的日志文件
daemonize=/var/log/uwsgi/uwsgi.log
# 以固定的大小(单位:KB),切割日志文件。这里配置是50M就切割
log-maxsize=50000000
# 不记录请求信息的日志,只记录错误已经uWSGI内部消息到日志中。
disable-logging=true
# 指定pid文件的位置,记录主进程的pid号,主要用于关闭服务器
pidfile=/tmp/uwsgi.pid

启动/终止指令:

# 启动时需要指定文件的绝对路径,如果进入到music项目中,则可以直接指定配置文件启动
uwsgi /home/music/music_uwsgi.ini
# 根据配置文件参数pidfile,关闭uwsgi服务器
uwsgi --stop /tmp/uwsgi.pid 

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第18张图片

注意:因为配置文件设置socket= :8080,所以启动uWSGI服务器时,本地系统不能浏览项目music的首页。配置属性socket= :8080用于uWSGI服务器和Nginx服务器的通信连接。

2、杀端口
有时候验证uWSGI配置文件参数时,有些参数存在问题,不正常启动了。修改成正确的参数后,启动,会报端口已经被占用。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第19张图片
这个时候,需要杀掉端口,然后重新启动即可。

# 列出所有被占用端口和程序名称
netstat -tnlp
# 指定pid号,强制杀掉端口
kill -9  pid

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第20张图片


4、安装Nginx 部署项目

项目上线部署最后一个环节是部署Nginx服务器。

4.1、yum安装Nginx服务器

指令如下:

# 添加Nginx的安装源
rpm -ivh  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 使用yum安装Nginx
yum install nginx
# 查看nginx版本
nginx -v

Nginx安装成功后,默认使用的是80端口,在华为云的安全组中开放80端口,再在CentOS 7上输入Nginx启动指令 systemctl start nginx。然后在本地系统的浏览器中输入CentOS 7系统的IP地址(华为云公网IP),可以看到Nginx 启动成功。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第21张图片

4.2、配置文件

下一步是修改Nginx的配置文件,实现Nginx服务器与uWSGI服务器的通信连接。将CentOS 7系统路径切换到/etc/nginx,打开并编辑nginx.conf文件,在nginx.conf文件中编写项目music的配置信息。其配置如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;
# 新增内容
	server{
	listen    80;
	server_name    127.0.0.1;
	charset  UTF-8;
	access_log    /var/log/nginx/music_access.log;
	error_log       /var/log/nginx/music_error.log;
	client_max_body_size 75M;
	# 连接uWSGI服务器,uwsgi_pass的端口与uWSGI设置的socket= :8080端口一致
	location / {
		include uwsgi_params;
		uwsgi_pass  127.0.0.1:8080;
		uwsgi_read_timeout  2;
	}
	# 设置静态资源路径
	location /static/ {
	expires 30d;
	autoindex on;
	add_header Cache-Control private;
	alias /home/mymusic/static/;
	}
}
# 新增内容
}

需要说明的是,include /etc/nginx/conf.d/*.conf;,注释掉,是为了可以直接使用80端口,浏览器直接输入ip即可访问网站。

4.3、服务启动并访问网站

使用工具连接华为云服务器,或者登录华为云,进入控制台,进入远程连接,然后去启动服务。

# 首先启动Nginx服务器
nginx -c /etc/nginx/nginx.conf
# 其次启动uWSGI服务器
uwsgi /home/music/music_uwsgi.ini

华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第22张图片

项目启动成功后,打开浏览器输入华为云公网IP,即可进入网站。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第23张图片
重启/关闭nginx服务器:

# 修改完/etc/nginx/nginx.conf配置文件,Nginx服务器重启
nginx -s reload
# 关闭nginx服务器
nginx -s stop

如此项目上线部署就完成 了,可以愉快的邀请小伙伴访问网站了,把华为云公网IP发给他们就可以了。


5、域名访问网站

前面的项目已经部署好了,可以通过华为云公网IP访问网站。但是IP比较难记,所以需要用一个域名去绑定我们的IP,然后通过域名访问我们的网站。

5.1、域名注册

华为云网站上注册一个域名:https://www.huaweicloud.com/product/domain.html
域名一年的费用不贵,十几块人民币就可以用一年。域名注册需要实名认证,一般提交1天左右,就可以注册成功。

5.2、域名解析

注册好域名后,需要进行域名解析,也就是域名绑定IP。通过添加记录集,可以绑定IP。
具体步骤:
1、进入华为云,进入控制台,点击进入域名注册,再点击左侧总览下面的 域名解析,可进入以下界面
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第24张图片
2、点击上图红色方框框起来的域名,进入以下界面
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第25张图片
3、点击红色按钮 添加记录集,在弹出框界面,输入具体值。红色方框中输入华为公网IP。如果是其他地方注册的域名,则需要改成华为的DNS服务器解析。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第26张图片
4、验证域名解析是否正确
cmd 打开DOS窗口,输入:nslookup 网址, 显示出绑定的IP地址,则域名解析正确。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第27张图片

5.3、备案

修改/etc/nginx/nginx.conf配置文件,server_name修改为www.mymusic.net.cn
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第28张图片
修改后重启服务器,浏览器输入网址:www.mymusic.net.cn,会出现非法阻断的界面,这就需要你去备案你的域名网址。
华为云服务器(CentOS 7.5)Django项目上线部署(Nginx+uWSGI+Django)_第29张图片

华为云备案,除了一些必要的个人和网站信息外,像上海、杭州还需要提供个人居住证。外地人居住地址填写户籍地址,那么需要上传幕布照,幕布可以申请,华为会用快递发过来。备案完成后,就可以在浏览器中输入:www.mymusic.net.cn,正常访问自己搭建的网站了,开心!唯一遗憾的是,服务器只租了3个月,但是性价比很高哈。

参考:
1、《玩转Django 2.0》 黄永祥
2、 https://www.linuxidc.com/Linux/2017-03/141785.htm
3、https://blog.csdn.net/changyinling520/article/details/80963015

你可能感兴趣的:(Linux,MySQL)