项目部署

Posted python001-vip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目部署相关的知识,希望对你有一定的参考价值。

Django打造大型企业官网-项目部署

</div>

Django打造大型企业官网-项目部署


 一、准备工作

1、在开发机上的准备工作

 1)确认项目没有bug。
 2)打开终端,进入虚拟环境,再 cd 到项目根目录下,执行命令:pip freeze > requirements.txt,将当前环境的包导出到`requirements.txt`文件中,方便在部署的时候安装。

 技术图片

 3)将项目上传到服务器上的`/srv`目录下。这里以`git`的形式为例。

   我们使用第三方代码托管平台 -码云 Gitee

  技术图片

 选择码云作为代码托管平台的原因是因为在码云上传项目代码,即使是私有项目也不会被收费。

 码云官网:https://gitee.com/

  将项目上传到服务器上:

  3.1)在服务器中新建仓库/项目:

    技术图片

  3.2)将本地项目代码提交到服务器中:

   技术图片

  git 相关操作:

技术图片
# 本地项目代码 → 本地 git 仓库 → 服务器仓库

git init    # 初始化本地仓库

git remote add origin xxx.git   # 关联远程仓库,xxx.git:分为两种:SSH跟HTTPS,建议使用第一种方式

git add .         # 将本地项目的所有文件都预集合在一起,类似于打包
git commit -m "first commit !"   # 将本地代码添加到仓库,与 "git add ." 结合执行

git pull origin master --allow-unrelated-histories   # 从远程(服务器)的 master 中拉取代码下来,如果不是第一次拉代码,可以不用加后面的参数

git push origin master   # 确定没问题后,将本地仓库代码上传到服务器项目仓库中

git status  # 查看状态
技术图片

  如果在拉取远程代码或提交代码到远程时报错:

  技术图片

 在 git Bash 中执行下述命令:

1.输入命令:git fsck -.-lost-found,可以看到好多“dangling commit” 
2.清空他们:git gc   # 可以直接执行这行代码

 


 

2、在服务器上的准备工作

 本文介绍的服务器为 Ubuntu

 2.1、 Ubuntu 开启 root 用户

# 如果是新装的机子,开启root用户采用下述指令
> sudo passwd root
> 然后输入root 用户密码

# 如果已有 root 用户 ,直接进入
> su - 或 su root 都能进入root 用户

 2.2、为了方便Xshell 连接服务器,建议安装 OpenSSH(一般云服务器上都已经安装好的)

  xshell 连接服务器方式介绍:https://www.cnblogs.com/Eric15/articles/9459329.html

> sudo apt install openssh-server openssh-client    # 安装 openssh
> service ssh restart     # 重启 openssh

  2.2.1、安装 vim:

sudo apt install vim

 


2.3、安装`MySQL`服务器和客户端:

sudo apt install mysql-server mysql-client
sudo apt-get install libmysqld-dev

  MySQL 安装及相关操作参考链接:https://www.cnblogs.com/Eric15/articles/9198777.html

 

 MySQL简单操作指令:

技术图片
#linux/ubuntu mysql的启动关闭

# 一、 启动方式
1、使用 service 启动:service mysql start
2、使用 mysqld 脚本启动:/etc/inint.d/mysql start
3、使用 safe_mysqld 启动:safe_mysql&

# 二、停止
1、使用 service 启动:service mysql stop
2、使用 mysqld 脚本启动:/etc/inint.d/mysql stop
3、mysqladmin shutdown

# 三、重启
1、使用 service 启动:service mysql restart
2、使用 mysqld 脚本启动:/etc/inint.d/mysql restart

# 客户端连接MySQL 服务端

1.远程连接:

  mysql -h host -u user -<span style="color: #000000;">p

# 2.本地客户端连接:
mysql -uroot -p
# 回车后输入密码即可

技术图片

 


 

 2.4、安装 memcached

> sudo apt install memcached

 操作 memcached :

telnet 127.0.0.1 11211

 


 

2.5、安装 python

技术图片
# Linux/Ubuntu 默认装有 python2 python3

# 安装python2 、pip:
> sudo apt install python
> sudo apt install python-pip

# 安装python3 、pip3:
> sudo apt install python3
> sudo apt install python3-pip

# 设定python默认执行版本为python3:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150


# 如果提示 pip 版本过低,执行下述命令更新pip:

 pip install --upgrade pip

技术图片

 

pip 与 pip3 区别:

pip和pip3的区别:

pip是python的包管理工具,pip和pip3版本不同,都位于Scripts目录下:
如果系统中只安装了Python2,那么就只能使用pip。
如果系统中只安装了Python3,那么既可以使用pip也可以使用pip3,二者是等价的。
如果系统中同时安装了Python2和Python3,则pip默认给Python2用,pip3指定给Python3用


 

2.6、安装虚拟环境 :virtualenv  、virutalenvwrapper

 虚拟环境参考博文:https://www.cnblogs.com/Eric15/articles/9517232.html

技术图片
# 安装 virtualenv
> pip install virtualenv      # python2版本的virtualenv
> pip3 install virtualenv    # python3版本

# 使用指定 python 版本创建 virtualenv 虚拟环境
> virtualenv -p C:Python36python.exe virtualenv-name

# 安装 virtualenvwrapper
> pip install virtualenvwrapper # python2版本
> pip3 install virtualenvwrapper # python3版本

# 使用指定 python 版本创建 virtualenvwrapper虚拟环境 ,如python2 、python3均存在,创建虚拟环境时默认使用的解释器是python2版本,如果要使用python3版本,则需指定python版本
> mkvirtualenv --python==C:Python36python.exe virtualenv-name # Windows
>
mkvirtualenv --python=/usr/bin/python3 py3scrapy # linux/Ubuntu

# 注意点: # 1. 直接安装 virtualenvwrapper 时,会一同安装 virtualenv  # 2.当只安装python2版本 或 python3版本的 virtualenvwrapper时,创建 virtualenvwrapper虚拟环境 使用的就是对应的python版本  
技术图片

 

 配置文件配置:

技术图片
# 使用 vim 进入 /.bashrc 文件中做以下改动:

export WORKON_HOME=$HOME/.envs  #虚拟环境都保存到 .envs文件夹中

VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3  #指定创建 virtualenvwrapper 虚拟环境时默认采用 python3版本的解释器 ,针对使用 pip3 安装的virtualenvwrapper ,如是pip(python2)安装的virtualenvwrapper,默认是python2解释器,不需要添加此行代码   

source /usr/local/bin/virtualenvwrapper.sh  #启动文件路径  使用pip/pip3 安装 virtrualenvwrapper虚拟环境时,会生成virtualenvwrapper.sh并放置到python的bin目录下,找到该路径下的bin/virtualenvwrapper.sh文件并指定为默认的启动文件   

# 然后重启 /.bashrc 文件:
> source ~/.bashrc

技术图片

  如果安装过慢,可以采用豆瓣源安装的方式:

sudo pip install -i http://pypi.douban.com/simple/ virtualenvwrapper

 


 

2.7、安装 git :

sudo apt install git

 拉取远程代码到本地:

技术图片
# Linux/Ubuntu 
# 目录:/home/nan/pro_python/xfz

> git init   # git 初始化xfz文件夹为git仓库

> git remote add origin https://gitee.com/chenjiongnan/xfz.git     # 与远程仓库关联

> git pull origin master      # 将远程仓库的代码拉取到本地,回车后需要输入账号密码

# 验证通过后,等待系统将项目代码拉取到本地就可以了

技术图片

 如果以后开发机上有修改/更改项目代码,直接将代码 push 到远程仓库,再在服务器上 pull 远程代码下来即可:

git push origin master

git pull origin master 

 


 3、数据迁移等准备 

 3.1、安装 requirements.txt 中的所有包

 进入虚拟环境中,然后进入到项目所在目录,执行命令:`pip install -r requirements.txt`,安装好相应的包

pip install -r requirements.txt

 

3.2、在 MySQL 数据库创建相应的数据库

技术图片
> mysql -uroot -p       # 进入数据库
> 输入密码

# 进入数据库后 ,创建我们需要的数据库:
create database xfz charset utf8;

# 退出 数据库
> exit;

技术图片

 

关于数据库数据迁移,可参考博文:https://www.cnblogs.com/Eric15/articles/9704522.html


 

3.3、django 表数据 文件迁移

进入项目主目录下(有 manage.py文件的目录下),执行`python manage.py migrate`命令,将迁移文件,映射到数据库中,创建相应的表 

python manage.py migrate

 

 注意:由于项目部署前,在开发机上工作时我们已经生成了迁移脚本,因此不需要先运行 ‘python manage.py makemigrations‘ ,直接运行 ‘python manage.py migrate‘ 即可


 

3.4、设置`ALLOW_HOST`为你的域名(服务器域名),以及ip地址 ,同时设置`DEBUG=False`,避免如果你的网站产生错误,而将错误信息暴漏给用户

DEBUG = False

ALLOWED_HOSTS = ["192.168..",] # ALLOWED_HOSTS 填的是服务器的域名或ip


3.5、试启动项目

# 执行启动项目命令:
python manage.py runserver 0.0.0.0:8000

# 在网页中输入 http://服务器的ip地址:8000/ ,访问该网站
> http://192.168.1.145:8000


 3.6、静态文件收集

 收集静态文件是为了将静态文件提供给 nginx ,这样用户如果只是请求静态文件,就可以从Nginx中获取,而不需要进入服务端获取了

 在settings.py 中设置 STATIC_ROOT:

技术图片
# settings.py
 
STATIC_ROOT = os.path.join(BASE_DIR, "static_dist")   # static_dist:新建的文件夹,用于收集静态文件

# 然后将代码推到远程仓库,再在服务器中将远程代码拉取下来

在服务端执行以下命名,收集所有静态文件,也可以在处理Nginx 时再收集静态文件:

python manage.py collectstatic

技术图片

 

四、Nginx + uwsgi + Django 项目部署

 Nginx + uwsgi + Django 生产部署环境参考博文https://www.cnblogs.com/Eric15/articles/9484762.html 

1、Nginx

 1.1 Nginx 安装

  nginx是一个web服务器,用来加载静态文件和接收http请求的。通过命令`sudo apt install nginx`即可安装。

sudo apt install nginx

 

 1.2 Nginx 常用命令

service nginx start     # 启动nginx
service nginx stop     #  关闭nginx
service nginx restart  # 重启nginx

 在网页访问服务器ip + 80端口 (http://192.168.1.101:80) , 如果能成功访问则表示Nginx 安装成功且已启动

 1.3 编写 Nginx 配置文件

  在`/etc/nginx/conf.d`目录下,新建一个文件,叫做`xfz.conf`,文件名可以任意取,建议以项目名命名,然后将以下代码粘贴进去保存:

技术图片
upstream xfz {      # 项目名
    server unix:///home/nan/pro_python/xfz/xfz.sock;    # Nginx配置的server路径要与uwsgi 的server路径保持一致(位置:项目xfz目录下的xfz.sock),xfz.sock不需要手动创建,但Nginx与uwsgi 通信时会自动创建 
}

# 配置服务器
server {
# 监听的端口号
listen 80;
# 域名
server_name 192.168.0.101; # 服务器ip 、域名等
charset utf-8;

</span><span style="color: #008000;">#</span><span style="color: #008000;"> 最大的文件上传尺寸</span>

client_max_body_size 75M;

</span><span style="color: #008000;">#</span><span style="color: #008000;"> 静态文件访问的url</span>
location /<span style="color: #000000;">static {
    </span><span style="color: #008000;">#</span><span style="color: #008000;"> 静态文件地址</span>
    alias /home/nan/pro_python/xfz/static_dist;           <span style="color: #008000;">#</span><span style="color: #008000;"> STATIC_ROOT 静态文件的路径 </span>

}

</span><span style="color: #008000;">#</span><span style="color: #008000;"> 最后,发送所有非静态文件请求到django服务器</span>
location /<span style="color: #000000;"> {
    uwsgi_pass  xfz;    </span><span style="color: #008000;">#</span><span style="color: #008000;"> 与上面upstream对应</span>
    <span style="color: #008000;">#</span><span style="color: #008000;"> uwsgi_params文件地址</span>
    include     /etc/nginx/<span style="color: #000000;">uwsgi_params; 
}

}

技术图片

  写完配置文件后,为了测试配置文件是否设置成功,运行命令:`service nginx configtest`,如果不报错,说明成功

service nginx configtest

 

  每次修改完了配置文件,都要记得运行`service nginx restart`。

service nginx restart

 

2、uwsgi

 2.1 概述

  uwsgi是一个应用服务器,非静态文件的网络请求就必须通过他完成,他也可以充当静态文件服务器,但不是他的强项。uwsgi是使用python编写的,因此通过`pip install uwsgi`就可以了。(uwsgi建议安装在系统级别的Python环境中,不要安装到虚拟环境中) ,如果安装在虚拟环境中,则每次启动uwsgi ,必须先要进入虚拟环境,再进入项目目录下,才能启动。

 2.2 安装

# 安装
pip install uwsgi 

pip3 install uwsgi

 

 2.3 启动 django 项目

技术图片
# 启动 uwsgi
> uwsgi --http :8000 --module xfz.wsgi --vritualenv=/home/.envs/xfz

# 服务器网址为 :http://[服务器ip]:8000

xfz.wsgi :前缀为项目名称

virtualenv : 后面为项目所在的虚拟环境文件夹地址

技术图片

 输入网址: http://服务器地址/news:8000  :访问本项目新闻首页,如果能访问成功,说明uwsgi启动成功

 

 2.4 编写 uwsgi 配置文件

  在项目的根目录下面,创建一个文件叫做`xfz_uwsgi.ini`的文件,然后填写以下代码:

技术图片
[uwsgi]

# Django相关的配置

必须全部为绝对路径

项目的路径

chdir = /home/nan/pro_python/xfz
# Django的wsgi文件
module = xfz.wsgi # 项目xfz 下的wsgi.py文件

Python虚拟环境的路径

home = /home/nan/.envs/xfz

# 进程相关的设置

主进程

master = true
# 最大数量的工作进程
processes = 10
# socket文件路径,绝对路径
socket = /home/nan/pro_python/xfz/xfz.sock # 与 Nginx server 对应

设置socket的权限

chmod-socket = 666
# 退出的时候是否清理环境
vacuum = true

技术图片

 写完 uwsgi 的配置文件,以后通过uwsgi 启动 Django项目时,就可以通过启动uwsgi 配置文件的方式启动:

# 进入项目根目录下:/home/nan/pro_python/xfz(根目录下有xfz_uwsgi.ini 文件),然后执行下行命令:

uwsgi --ini xfz_uwsgi.ini

 


 3、supervisor

 3.1 概述

  supervisor 可以用来管理 uwsgi ,在uwsgi发生意外的情况下,可以自动让其重启。除了重启,也可以执行其他操作,如关闭、启动、重新启动 uwsgi 等。

 3.2 安装

  在系统级别的python环境下进行安装:

pip install supervisor

pip3 install supervisor

 

 3.3 编写 supervisor 配置文件

  在项目的根目录下创建一个文件叫做`xfz_supervisor.conf` ,将下述代码粘贴到里面:

技术图片
# supervisor的程序名字 ,可任取
[program:xfz]
# supervisor执行的命令:启动uwsgi
command=uwsgi --ini zlkt_uwsgi.ini
# 项目的目录
directory = /home/nan/pro_python/xfz
# 开始的时候等待多少秒
startsecs=0
# 停止的时候等待多少秒
stopwaitsecs=0  
# 自动开始
autostart=true
# 程序挂了后自动重启
autorestart=true
# 输出的log文件 , 需要提前先到项目根目录下新建log 文件夹 ,否则运行时会报错
stdout_logfile=/home/nan/pro_python/xfz/log/supervisord.log
# 输出的错误文件
stderr_logfile=/home/nan/pro_python/xfz/log/supervisord.err

[supervisord]
# log的级别
loglevel=info

[inet_http_server]
# supervisor的服务器
port = :9001
# 用户名和密码
username = admin
password
= 123

# 使用supervisorctl的配置
[supervisorctl]
# 使用supervisorctl登录的地址和端口号
serverurl = http://127.0.0.1:9001
# 登录supervisorctl的用户名和密码
username = admin
password
= 123

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

技术图片

 然后使用命令`supervisord -c xfz_supervisor.conf`运行就可以了:

# 在项目根目录下运行
supervisord -c xfz_supervisor.conf

 使用supervisord 成功运行后,以后如果想要启动或关闭`uwsgi`,就可以通过命令`supervisorctl -c xfz_supervisor.conf`进入到管理控制台,然后可以执行相关的命令进行管理:

技术图片
# 客户端操作 supervisor  ,相当于mysql客户端操作服务端一样
supervisorctl -c xfz_supervisor.conf    # 从客户端启动supervisor ,前提需开启supervisord ,且进入项目根目录下执行

# 可执行的相关命令:
* status # 查看状态
* start program_name #启动程序 ,即启动uwsgi ,因supervisor 中command配置的就是启动uwsgi 的命令,所以启动supervisor的同时就是启动uwsgi
* restart program_name #重新启动程序
* stop program_name # 关闭程序
* reload # 重新加载配置文件,即xfz_supervisor.conf
* quit # 退出控制台,即退出 supervisorctl

技术图片

  注:program_name:为 supervisor 的程序名:

  技术图片

 进入到 supervisorctl 时,输入 ‘help‘ ,可查看 supervisor 相关的一些操作:

  技术图片

 3.4 关系图

   使用 supervisor 管理 uwsgi ,而不管理 Nginx 的原因是:Nginx 自身是守护进程,当程序挂了会自动重启 ,而 uwsgi 自身不是守护进程 ,程序挂了就挂了。使用 supervisor 来管理 uwsgi ,相当于给uwsgi 起了个守护进去,当 uwsgi 程序挂了会自动给重启。

  技术图片


* Nginx 与 uwsgi 都安装及配置好配置文件后,启动项目:

技术图片
# 1. 没有 [supervisor] ,启动步骤 ↓:

# 1)启动 Nginx
service nginx start/restart

# 2)启动 uwsgi ,项目根目录下启动
uwsgi --ini xfz_uwsgi.ini

# =============================================

# 2. [supervisor]管理 uwsgi ,启动步骤 ↓:

# 1)启动 Nginx
service nginx start/restart

# 2)由 supervisor 启动 uwsgi ,项目根目录下启动
supervisord -c xfz_supervisor.conf

技术图片

 

 温馨提醒:

 1、在 copy 或编写 Nginx 、uwsgi 、supervisor 配置文件时 ,记得把注释都删掉

 2、放在服务器上的开发项目,建议放置在/srv 目录下(在根目录‘/‘ 下新建 srv 目录)










































































以上是关于项目部署的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab代码管理仓库安装部署

GitLab安装部署

持续集成与自动化部署 - gitlab部署

Gitlab部署及汉化操作

Gitlab+jenkins持续集成+自动化部署

centos 7部署并汉化Gitlab及基础操作