目录
一.准备工作
1.1基础知识
1.2安装环境介绍
1.3准备工作
二.安装MYSQL数据库
2.1安装mysql数据
2.2配置mysql数据库
2.3生成项目数据库
三.python环境部署
3.1升级pip
四.安装uWSGI服务器
4.1安装uWSGI
4.2测试uWSGI
五.安装Nginx服务器
5.1安装Nginix
5.2测试Nginx
六.项目部署前的工作
6.1修改项目配置
6.2在服务器的目录设置
6.3项目代码上传
6.4安装虚拟环境
6.5在服务器中配置项目
七.配置Nginx和uWSGI
7.1配置Nginx
7.2配置uWSGI
八.结果测试
在开发测试阶段,python3 manage.py runserver 命令可以使得django项目很便捷地在本地运行,但该方式运行效率低,只允许少量用户访问。在实际的生产环境中的应用系统要考虑系统安全、响应速度、运行效率、静态文件处理、动态页面性能等问题,一般在生产环境部署django项目的方案大多基于Linux+uWSGI+Nginx组合方式进行部署。
Nginx是一款轻量级HTTP服务器,它能提供一个负载均衡器和一个HTTP缓存,具有占用内存少、稳定性高、并发服务能力强等优势;Nginx最适合处理静态文件,如CSS文件、JavaScript文件、HTML文件、图片文件等,在生产环境中动态文件一般由Nginx转交给uWSGI进行处理。
uWSGI是实现了uWSGI、WSGI、HTTP等协议的Web服务器,具有超强性能、低内存占用、多应用程序管理、高可定制性等优势。在生产环境中,uWSGIke可作为Nginx服务器部署的补充选项,它相当于一个中间桥梁,Nginx服务器通过HttpUwsgiModule模块和uWSGI服务器进行数据交换,uWSGI服务器通过在配置文件中指定application的地址能直接和应用框架中的WSGI application通信。
本项目部署的系统架构如下图所示,该架构充分利用了Nginx服务器和uWSGI服务器各自的优势,静态文件由Nginx服务器处理,动态文件由uWSGI和应用程序共同高效处理。
本项目部署在腾讯云服务器中(ubuntu系统),相关软件版本如下:
''' Ubuntu 18.04.3 LTS Nginx 1.14.0 uWSGI 2.0.18 Python 3.6.8 Django 1.11.11 virtualenv 16.7.7 MYSQL 5.7.27 '''
与其他操作系统不同,Ubuntu把系统管理员rootz收起,禁止了root直接登录。系统默认使用操作系统安装过程中建立的用户进行登录,这个用户是系统使用者级别。后续相关的操作都需要使用root权限,所以要知道如何获取root权限。切换到管理员的命令如下:
sudo -i #该命令会提示输入密码,密码验证后命令提示符由$变成#,说明已获取root权限 #退出root权限使用logout logout #可以直接通过sudo + 待执行命令的方式来使用root权限
在项目部署之前最好更新系统,避免因为版本问题导致后续的软件安装出现问题,更新命令如下:
sudo apt-get update sudo apt-get dist-upgrade #ubuntu中的/etc/apt/source.list中的源可能比较旧,最好也是更新一下 sudo apt-get -y update #更新python安装工具 sudo apt-get install python-setuptools
sudo apt-get install mysql-server #安装mysql 上述命令会安装如下包: apparmor mysql-client-5.7 mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7 因此不需要再安装mysql-client等
对数据库进行安全配置和初始化操作,主要步骤如下:
安装验证密码插件。
设置root管理员在数据库中的专有密码。
随后删除匿名账户,并使用root管理员从远程登录数据库,以确保数据库上运行的业务的安全性。
删除默认的测试数据库,取消测试数据库的一系列访问权限。
刷新授权列表,让初始化的设定立即生效。
sudo mysql_source_installation
具体细节如下:
进入MYSQL是数据库配置文件所在目录,修改my.cnf文件
cd /etc/mysq/ sudo vim my.cnf
在my.cnf文件后添加如下内容
#原内容如下 !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ #添加内容如下 #配置客户端 [client] #配置端口号 port=3306 #配置socket socket=/var/lib/mysql/mysql.sock #配置mysql默认字符集 default-character-set=utf8 #配置服务端 [mysqld] port=3306 socket=/var/lib/mysql/mysql.sock character-set-server=utf8 [mysql] #禁用MySql命令自动补全功能 no-auto-rehash default-character-set=utf8
接下来,配置数据库权限,让用户不使用sudo命令也可以使用和管理mysql,命令如下:
sudo chmod 775 /var/lib/mysql #重启数据库,让更改生效 sudo service mysql restart
在myproject项目的settings.py文件中,对数据库进行如下配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'py_mysql', 'USER':'root', 'PASSWORD':'root', 'HOST':'127.0.0.1', 'PORT':3306, 'CHARSET':'utf8' } }
根据settings.py中的配置,进入mysql数据库管理界面,用如下命令生成数据库py_mysql
create database py_mysql default character set utf8 collate utf8_general_ci;
django1.11.11对应可使用python3.4-3.6,ubuntu18.04.3 默认安装了python3.6,所以不需要再另外安装python。如果版本高于3.6,那么建议更换版本,避免可能出现的兼容性问题。
具体命令如下:
sudo pip3 install --upgrade pip
系统自带的pip源下载速度很慢,可以换成国内源,更换方法如下:
在用户根目录下新建.pip目录,在该目录下新建pip.conf文件,命令如下。
sudo mkdir ~/.pip sudo vim ~/.pip/pip.conf
然后在pip.conf文件下加入如下内容
[global] index-url=http://mirrors.aliyun.com/pypi/simple/ [install] trusted-host=mirrors.aliyun.com
安装uwsgi之前需要安装一个C编译器,命令如下:
sudo apt-get install gcc
安装python开发相关模块,命令如下:
sudo apt-get install python3-dev
安装uWSGI
sudo pip3 install uwsgi
在终端输入uwsgi测试是否安装成功,结果如下则说明安装成功
建立一个文件test.py,在文件中输入如下内容:
def application(env,start_response): start_response('200 OK',[('Content-Type','text/html')]) return [b'welcome uwsgi!']
输入如下命令启动test.py
sudo uwsgi --http :9000 --wsgi-file test.py
然后在浏览器中输入http://127.0.0.1:9000/并回车,网页结果如下则说明uwsgi安装成功。
Nginx服务器用来处理静态文件请求,安装命令如下:
sudo apt-get install nginx
Nginx服务器的默认端口是80,可以重启Nginx服务器后直接输入ip地址即可访问,结果如下:
#重启命令 sudo service naginx start
(1)在settings.py文件加入如下配置项
#加入一个配置项,为使用Nginx做准备 STATIC_ROOT=os.path.join(BASE_DIR,'/static/') #STATIC_ROOT指明了静态文件的收集目录,这里设置收集目录为根目录下的static文件夹 #static 两边都要加上"/",否则会报错
(2)关闭debug选项和设置允许访问的域名
#在settings.py文件下找到如下参数,并设置对应值 DEBUG=FALSE ALLOWED_HOSTS=['*']
(3)在每个app的migrations文件夹下,把以数字开头的文件都删除
(4)将项目用到的静态文件复制到项目根目录下的static文件夹中,在命令行终端输入以下命令进行复制
python3 manage.py collectstatc
(5)在项目开发中,为了方便一次性安装所需要的第三方python库,可以将项目导入的第三方库的名字写入requirements.txt文本文件,命令如下:
pip3 freeze>requirements.txt
myproject是放置项目程序的目录,myenv是虚拟环境目录
/home/ubuntu/ myweb/ myproject/ myenv/
可通过FileZilla等工具将项目目录上传至服务器对应目录中
virtualenv可以搭建虚拟且独立的python运行环境,使得单个项目的运行环境与其他项目隔离,也就是安装在虚拟环境里面的所有软件均不会对环境外的其他软件包产生影响,反之,在虚拟环境中只能调用虚拟环境中安装的软件包,不能调用外部的软件包。
#安装virtualenv sudo pip3 install virtualenv
安装完成后,就可以在项目目录下建立虚拟目录,进入myweb目录,通过如下命令建立虚拟目录:
cd myweb sudo virtualenv --python=python3 myenv
提示:要用--python=python3来指定虚拟环境使用的python3环境,因为Ubuntu操作系统可能安装了多个版本的python,如果不特别指定的话,virtualenv可能会使用其他版本的python环境,导致各种问题。
配置项目之前先激活虚拟环境
source myenv/bin/activate
看到命令提示符前面多了myenv,说明我们已经成功激活了虚拟环境,接下来就可以开始安装Django和项目中用到的第三方python库,这些可以按照requirements.txt中列出的软件包进行安装,命令如下。
sudo pip3 install -r requirements.txt
运行如下命令在ubuntu中Mysql的py_mysql数据库中创建表
python3 manage.py makemigrations python3 manage.py migrate
生成Django Admin后台管理员,命令如下
python3 manage.py createsuperuser #根据提示输入相关信息即可
首先进入myproject目录下,把/etc/nginx/下的uwsgi_params复制到项目根目录下,最后检查是否成功复制。
cd myweb/myproject sudo cp /etc/nginx/uwsgi_params . ls
在项目根目录下用sudo vim myproject_nginx.conf 创建nginx配置文件,输入如下内容:
upstream django { server 127.0.0.1:8001; } #server{ # listen 80; #表示监听80端口 # server_name 70cug.cloud 124.223.197.148; # rewrite ^(.*) https://$host$1 permanent; #将http 请求跳转https #} server { #监听端口号 listen 8000; #服务器ip或者域名 server_name 124.223.197.148; charset utf-8; #django static location /static { #静态文件所在文件夹 alias /home/lighthouse/code/MyWeb/myproject/static; } #最大上传字节数 client_max_body_size 75M; location / { uwsgi_pass django; #uwsgi_params 路径,已复制到项目根目录 include /home/lighthouse/code/MyWeb/myproject/uwsgi_params; } }
上述代码说明:
以上代码第一行的upstream模块主要配置网络数据的接收、处理和转发等内容,这里命名为django,花括号内通过server指定接收、转发的IP和端口号,127.0.0.8001这个地址与uWSGI的socket设置一致。
在server块中的server_name指明提供Nginx的计算机的IP或者是域名
在server块中的location /static {...}指定所有URL带有/static的请求均有Nginx处理,花括号中的alias指明了静态文件的存放目录,Nginx服务器根据请求到这个地址寻找对应的文件。同理其他的静态文件请求也是由Nginx处理,按照格式编写即可。
在server块中的location /{...}指定其他请求转发给uWSGI处理,由proxy_pass指定处理对象,这里的django就是前面所说的upstream块。
在项目根目录下配置完成myproject_nginx.conf后,需要把这个配置文件加入到启用的网站列表中去,使Nginx能够使用它。Nginx能读取的配置文件包含在/etc/nginx/sites-enabled文件夹下,我们需要通过链接命令把该文件加入到该目录下,命令如下:
sudo ln -s myproject_nginx.conf /etc/nginx/sites-enabled/
配置完成后,要重启Nginx才能生效,命令如下:
sudo service nginx restart
在项目根目录下用sudo vim myproject_uwsgi.ini 创建配置文件,内容如下:
#uwsgi配置文件 [uwsgi] #django项目根目录,全路径 chdir=/home/lighthouse/code/MyWeb/myproject #django项目中wsgi.py文件路径,以.分隔 module=py_django_test_0312.wsgi #masyer=True表示以主进程模式运行 master=true #运行进程数目 processes=10 #设置socket socket=127.0.0.1:8001 chmod-socket=662 #退出时清除Python、Django虚拟环境变量 vacuum=true
以上配置文件中的socket值要与myproject_nginx.conf中的uwsgi_pass一致,这样Nginx和uWSGI两个服务器才能进行数据交换。
经过前面的一系列的部署工作,接下来就可以进行服务器测试,检查是否能正常登录。
uwsgi --ini myproject_uwsgi.ini
在浏览器中输入Log in | Django site admin,若能正常打开Django admin管理后台,才说明部署成功。
若要让该项目常驻后台,可以使用nohup命令将想要执行的命令不挂起。可参考菜鸟教程的命令介绍