Nginx+uWSGI部署django项目
一、python环境安装
1.首先解决环境依赖的问题
1.1 打开阿里云开源镜像站的官网https://opsx.alibaba.com/mirror
1.2 找到centos,点击帮助,找到对应系统的yum源。
yum源的工作目录,/etc/yum.repos.d目录下,只要在这个目录下名字叫做repo的文件,都会被yum取读取
centos7:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
1.3 找到epel,点击帮助,找到对应系统的yum源。
获取epel的yum源(第三方软件仓库,如nginx,redis等等)
epel(RHEL 7):wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
1.4 解决编译过程环境依赖
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y
2.下载python环境源码安装包
wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz
3.解压缩源代码包
解压xz格式:xz -d
解压tar:tar -xvf Python-3.6.7.tar -C /xxx :-C可以指定解压目录,不写默认当前目录
4.编译
4.1 切到Python-3.6.7目录下[执行configure脚本文件,指定安装路径] ,释放makefile编译文件 ,让gcc工具去编译的
[root@wupeiqi Python-3.6.7]#./configure --prefix=/opt/mypy/python36/
4.2 指定make指令,读取makefile,开始编译
make
4.3 执行make install ,开始安装python3,这一步会生成python3解释器
make install
注:4.2和4.3合并执行make && make install
5.环境变量的配置
5.1 配置path环境变量,让系统可以补全python3的命令
[root@wupeiqi bin]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
5.2 添加python3的环境变量,注意,要添加到开头
/opt/mypy/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
5.3 写入到全局变量配置文件中,每次开机都加载/etc/profile中
vim /etc/profile 到最后一行下面,加入如下配置
PATH="/opt/mypy/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
5.4 修改完毕/etc/profile 必须 source读取一下
source /etc/profile
二、虚拟环境安装
1.安装虚拟环境工具
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv 可以更换源
2.创建虚拟环境
第三方软件默认装在/opt下,切换到/opt目录下
virtualenv --no-site-packages --python=python3 虚拟环境的名字
不安装多余的包 指定解释器的python3
virtualenv --no-site-packages --python=python3 myenv
3.激活虚拟环境
虚拟环境中安装的东西和系统无关,只能在虚拟环境中使用
source myenv/bin/activate激活虚拟环境
4.退出虚拟环境
deactivate
三、将项目在linux系统上运行
1.将项目通过zip压缩后发送到linux系统上
2.在linux系统上解压
unzip xxx
3.激活虚拟环境source myenv/bin/activate
4.查看项目中是否有requirement.txt文件
有:安装项目中的模块pip3 install -i https://pypi.douban.com/simple -r requirements.txt
无:运行程序,逐一安装
以Django项目为例:python manager.py runserver 0.0.0.0:9000
把你当前解释器所有的模块信息,导出到一个文件中
pip3 freeze > requirement.txt
5.安装数据库mariadb
yum install mariadb-server mariadb -y
6.启动mariad,通过yum安装的软件,都可以用systemctl管理
systemctl start mariadb
7.导入数据库
7.1 一般项目在压缩发送到linux上都会包含数据信息。如果没有单独进行数据的导入
7.2 先将生产环境中的库导出,然后发送到linux
在终端直接执行:mysqldump -uroot -p123 库名 > C:\data\db.sql , 用户名密码以实际开发为主,不要用root。
7.3 在将数据导入
方法一,直接在终端执行:mysql -u用户名 -p密码 < 要导入的数据库数据(xx.sql)
方法二,登录数据库后执行:
本地创建库:create database db;
使用已创建的库:use db;
设置编码:set names utf8
导入:source /opt/database/db.sql;
8.对项目配置进行修改,如数据库信息,ALLOW_HOSTS相关的修改
9.解决完毕问题之后,启动python项目,注意防火墙
解决防火墙:iptables -F
10.python manager.py runserver 0.0.0.0:9000 可以运行
四、Nginx的安装使用
nginx是个web服务器,常用作静态文件服务器,反向代理服务器,邮件代理服务器,负载均衡服务器
1.安装淘宝nginx,编代码编译安装,先解决模块依赖
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
2.获取淘宝nginx的源代码
wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
3.解压源代码包
tar -zxvf tengine-2.3.2.tar.gz
4.进入源代码目录开始编译
4.1 指定安装路径
./configure --prefix=/opt/s21/tngx
4.2 编译且安装
make && make install
5.安装后生成4个目录,目录的含义
conf:存放配置文件 , 指定了这个软件各种功能的一个文件而已
html:存放前端页面
logs:nginx的运行日志
sbin:nginx的可执行命令目录
6.进入sbin目录,启动nginx
./nginx :启动nginx
./nginx -s stop :停止nginx
./nginx -t :检查nginx.conf的语法是否正确,最好每次更改配置文件后都执行一下,看看有无语法错误。
./nginx -s reload :不重启nginx,重新加载nginx配置,每次更改配置文件后都执行一次。
7.Nginx的配置
7.1 找到nginx.conf,学习语法
vim nginx.conf
http { include 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 logs/access.log main; .... #nginx支持多虚拟主机,只需要写入多个server关键字即可 #虚拟主机1 server { #基于端口的虚拟主机区分 listen 80; #基于域名的虚拟主机区分 server_name www.hello.com; #charset koi8-r; #access_log logs/host.access.log main; #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; #这里是nginx的url匹配,如同django的url规则一样 #当我请求 www.hello.com 的时候,就进入如下location匹配 #这个是最低级的匹配,只是访问进行静态页面。所有请求都会走到这里 location / { #root关键字定义虚拟主机的根目录, 这里是可以修改的,要访问的文件的根目录,hello下的index.html。 root /opt/hello/; #必须保证首页文件存在 index index.html; } } #虚拟主机2 server { listen 80; server_name www.world.com; #charset koi8-r; #access_log logs/host.access.log main; #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; #这里是nginx的url匹配,如同django的url规则一样 #当我请求www.world.com 的时候,就进入如下location匹配 #所有请求都会走到这里,world下的index.html location / { root /opt/world/; #index参数是定义首页文件的名字的 index index.html; } } }
8.几种location
# 第一种 location / { #root关键字定义虚拟主机的根目录,会自动跳转到 hello下的index.html,访问的是静态文件 root /opt/hello/; #index参数是定义首页文件的名字 index index.html; } # 第二种 location / { #实现反向代理的功能参数 #访问域名后,自动跳转到http://192.168.182.131地址 proxy_pass http://192.168.182.131; }
9.nginx的错误页面 404美化
server { listen 80; server_name www.hello.com; #通过这个参数定义即可, # 当访问www.hello.com出现错误时,跳转到指定error下的error.html,可以对错误页面进行美化。此代码写在哪个server下,就被哪个地址使用。 error_page 404 /404.html; location / { root /opt/error; index error.html; } }
10.Nginx负载均衡
10.1 准备好2台资源服务器,本应该提供一样的数据,进行负载均衡,实验目的,看到不同的页面,所以准备不同的页面数据
192.168.182.131 资源服务器1 ,返回hello的页面
192.168.182.132 资源服务器2 ,返回world的页面
10.2 准备负载均衡服务器,配置如下
在nginx配置文件中,添加如下配置,定义负载均衡池,写入后端项目地址
# 默认轮询方式 upstream myproject { server 192.168.182.131; server 192.168.182.132; } #权重方式 upstream myproject { server 192.168.182.131 weight=4; server 192.168.182.132 weight=1; } #ip哈希方式,根据用户的来源ip计算出哈希值,永远只指派给一个服务器去解析 #ip哈希不得与权重共同使用 upstream myproject { server 192.168.182.131 ; server 192.168.182.132 ; ip_hash; } #虚拟主机配置如下 server { listen 80; server_name www.hello.com; #charset koi8-r; #access_log logs/host.access.log main; #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; location / { # root /opt/xxx/; # index index.html index.htm; #请求转发给负载均衡池 proxy_pass http://myproject; } }
五、uWSGI
1.以往的python manage.py runserver 调用wsgiref去启动django,性能很低,单进程web,使用uWSGI启动django,可以支持并发,多进程,以及日志设置,多种功能。
2.安装uWSGI
pip3 install -i https://pypi.douban.com/simple uwsgi
3.nginx的配置,反向代理uWSGI
3.1 修改nginx.conf如下
server { listen 80; server_name www.hello.com; #charset koi8-r; #access_log logs/host.access.log main; #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main; location / { #转发请求的方式配置在这里 include uwsgi_params; uwsgi_pass 0.0.0.0:8888; } }
4.使用uWSGI的命令,参数形式启动项目
uwsgi --http :8888 --module myproject.wsgi
--http 指定是http协议,去启动项目
--module 指定django目录下的wsgi文件
5.uWSGI支持的热加载命令
uwsgi --http:8888 --module myproject.wsgi --py-autoreload=1
6.uWSGI以配置文件的形式启动 ,就是把你的启动参数,写入到一个文件中,然后,执行这个文件即可
配置文件名字可以叫做 uwsgi.ini ,内容如下,这个文件是手动生成的
touch uwsgi.ini ,写入如下内容
[uwsgi] # Django-related settings # the base directory (full path)填入项目的绝对路径 ,项目的第一层路径 chdir = /opt/s21/Aida_crm # Django's wsgi file指定第二层项目下的wsgi文件 module = Aida_crm.wsgi # the virtualenv (full path)找到虚拟环境的绝对路径 home = /opt/s21/s21uwsgi # process-related settings # master master = true # 以cpu核数来填写,uwsgi的工作进程数 processes = 2 # the socket (use the full path to be safe) 这是以uwsgi_socket协议启动的项目,无法再去通过浏览器访问,必须通过nginx以uwsgi协议去反向代理 socket = 0.0.0.0:8888 #也可以使用http协议去启动(仅用作调试使用) #http = 0.0.0.0:9000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true #后台运行参数,将uwsgi运行在后台,并且将django日志输出到uwsgi.log中 daemonize = uwsgi.log
7.指定配置文件启动django
uwsgi --ini uwsgi.ini
8.收集crm的所有静态文件,让nginx去解析
对django的settings.py配置修改如下
添加如下参数
STATIC_ROOT='/opt/mystatic'
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
在项目第一层目录下执行收集命令,执行命令,收集django的所有静态文件,系统会自动创建'/opt/mystatic' 这个文件夹
python manage.py collectstatic
9.配置nginx,找到crm的这些静态资源
location / {
include uwsgi_params;
uwsgi_pass 0.0.0.0:8888;
}
#添加一个location,针对nginx的url进行匹配处理
#当请求时 www.oldchouhuo.com/static/..... 这样的url的时候,nginx进行别名修改,去/opt/mystatic底下去寻找资源文件
location /static {
alias /opt/mystatic;
}
六、前后端分离项目部署
前言:前后端分离项目流程,通过访问nginx,会跳转到vue访问前端页面,然后前端向后端发请求,获取到后端数据。用户既不接触vue前端服务器的ip,也接触不到后端服务器ip。
1.前端项目的部署
1.1 将前端项目传到服务器
通过lrzsz,或者xftp传输到linux服务器上,并进行解压缩
1.2 前端vue
要在服务器上,编译打包vue项目,必须得有node环境
1.3 下载node.js
到网站https://nodejs.org/download/release/找到对应的项目使用版本进行下载,下载node二进制包就不用进行编译了。
wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz
解压缩 tar -zxvf node-v8.6.0-linux-x64.tar.gz
1.4 配置环境
将node命令,添加至linux环境变量,修改/etc/profile,写入下面代码
PATH=$PATH:/opt/node-v8.6.0-linux-x64/bin
1.5 读取文件,生效PATH
source /etc/profile
1.6 测试是否完成
[root@MiWiFi-R4-srv node-v8.6.0-linux-x64]# node -v
v8.6.0
1.7 node环境配置好后,安装模块
使用npm,npm 是 Node 的模块管理器。npm install
命令用来安装模块到node_modules
目录。
$ npm install <packageName>
进入vue项目源码目录 cd myvue
安装vue项目模块,npm install默认去装package.json的模块内容,如果出现模块安装失败,手动再装
注意,本地写的vue代码,接口文件请求url,很可能连接的服务器地址有问题,注意Axios.POST提交的地址,一定得发送给django应用(如果用了nginx,就发送给nginx的入口端口) 演示时,将vue项目和django项目放在了一台服务器,通过nginx反向代理功能(8888端口),转发vue请求给django(9999) 准备编译打包vue项目,替换配置文件所有地址,改为服务器地址 sed -i 's/127.0.0.1:8000/192.168.31.176:8888/g' /opt/myvue/src/restful/api.js
确保vue的route模式是history
路径:opt/myvue/src/router/index.js
export default new Router({
linkActiveClass:'is-active',
mode: 'history', //改成history模式
......
})
1.8 开始编译vue代码,生成dist静态网页文件夹
npm run build
1.9 检查dist文件夹
[root@MiWiFi-R4-srv myvue]#ls dist
index.html static
vue代码到此结束。。。配置nginx,让nginx找到vue的index.html文件
2.0 nginx配置
server { #用户访问域名或者ip,默认是nginx的80端口 listen 80; server_name 192.168.31.176; #url匹配 / 也就是请求地址是192.168.31.176端口80时,进入此location,返回vue的dist下index.html首页 location / { root /opt/myvue/dist; index index.html; } }
注:到此访问192.168.31.176就可以访问index.html页面,如果无法访问则是防火墙问题,iptables -F解决防火墙。即可访问
2.后端项目部署
nginx的配置
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name 192.168.31.176; location / { root /opt/myvue/dist; index index.html; #这一条参数确保vue页面刷新时候,不会出现404页面 try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 8000; server_name 192.168.31.176; location / { include uwsgi_params; uwsgi_pass 0.0.0.0:9999; } } }