</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 100sudo 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 = FalseALLOWED_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 uwsgipip3 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