Windows 平台部署前后端分离项目
背景
因为公司业务主要与工业相关,工业使用的多数为Windows电脑,此时就需要将公司的系统部署在Windows平台上,这里使用Django来作为后端。
一、数据库部署
1.1 本地环境准备
在后端部署mysql,我们只需要准备好表结构sql文件,到时候直接执行sql文件即可。
二、后端部署
2.1 本地环境准备
python 虚拟环境的管理有很多种,之前使用的 virtualenvwrapper-win
这个工具,这个工具有一个好处就是可以实现全局的虚拟环境管理,但是会有一个问题,它无法做到项目中的实际依赖,什么叫实际依赖呢?就是说一个安装包它依赖一些第三方包,当我们不想使用该包的时候,会进行uninstall操作,此时python只会卸载当前这个包,并会删除它的依赖包。我们的想法是删除这个包的同时,它的依赖包也要删除。
我这边使用poetry来作为python的包管理工具,poetry使用教程
导出项目依赖包
# 导出项目依赖包信息 pip freeze > r.txt# 将虚拟环境中的包导出为离线包, 会在当前目录下创建文件夹(packages) pip download -r r.txt -d packages
整体文件打包
代码文件
安装包文件,如果客户环境无法使用网络则使用离线安装方式
python 解释器,若客户环境已存在python环境,则需要注意python版本是否一致,若不一致则需要采用客户的版本重新导出项目依赖包。
2.2 生产环境部署
(1)python环境安装
python解释器安装过程这里就不展示了
(2)项目依赖安装
有网络环境
如果当前环境有网络,可以使用 poetry
来安装依赖
# 进入到后端项目根目录
poetry install
- poetry 默认创建的文件夹目录是在c盘中,C:\Users{UserName}\AppData\Local\pypoetry\Cache\virtualenvs\
- poetry config virtualenvs.in-project true 可以将虚拟环境文件夹创建在当前目录下
无网络环境
若客户环境没有网络,我们可以使用离线安装的方式
pip install --no-index --find-links=/packages/ -r GOMusicApi\r.txt
启动Django项目
在启动项目前,需要我们配置好数据库信息,包含用户名、密码和端口等。
# 监听本地8000端口,若接收其他地址使用 python manage.py runserver 0.0.0.0:8000
python manage.py runserver
红色文字时提示我们的数据库表没有迁移,不用管他。我这边是仅测试,实际项目是不用django的migrate来迁移数据库表的。而且在数据库层面一般是不做外键关系,外键关系在控制层(视图层)进行约束。
2.3 Django 生成可执行exe文件部署后端
在上述部署后端的过程中存在一个很严重的问题,若客户电脑断电了,是不是我们的程序就会自动停止,或者说我们的cmd窗口不小心被客户给关闭了,此时后端服务也停止了。
pyinstaller安装
建议在虚拟环境下打包程序,这样可以有效避免被其他包所影响。
poetry add pyinstaller
生成pyinstaller 打包配置文件
pyinstaller -F manage.py# 执行上面命令,将看到详细的生成过程。当生成完成后,将会在此 app 目录下看到多了一个 dist 目录,并在该目录下看到有一个 app.exe 文件,这就是使用 PyInstaller 工具生成的 EXE 程序。
参考地址: http://c.biancheng.net/view/2690.html
在执行命令之后,会在当前目录下生成一个
manage.spec
文件,这个文件告诉我们这个项目的打包配置信息。下面我介绍一个django打包exe需要注意的点及配置# manage.specblock_cipher = Nonea = Analysis(['manage.py'],pathex=[],binaries=[],# datas 表示所依赖的资源文件,如static目录下的文件, 以及templates文件夹(有需要)datas=[(r'D:\PycharmProjects\o12307\templates', r'.\templates')],# 因为在打包过程中,程序依赖django本身的一些模块,所以我们需要在打包时主要将这些模块加入,主要为配置文件中,INSTALL_APP 及 MIDDLE 这两个对象中的配置hiddenimports=['api.apps','api.middleware','corsheaders.middleware.CorsMiddleware','django.middleware.security.SecurityMiddleware',......],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)exe = EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name='manage',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=True,disable_windowed_traceback=False,argv_emulation=False,target_arch=None,codesign_identity=None,entitlements_file=None,# 设置打包程序的ico信息icon='../logo.ico', )
启动程序
manage.exe runserver --noreload
在打包过程中会出现一些问题,主要包含以下几点:
- 资源文件丢失
- exe执行后报错: NoModule ,即上述中hiddenimports 配置没有写全,缺啥补啥
- 执行报错,使用 --noreload 模式
- 注意:在使用pyinstaller 一定要知道使用的虚拟环境中的还是本机中的pyinstaller
如何把打包的程序进行配置抽离
配置抽离,就是django在进行打包过程中,数据库的配置信息,以及一些settings中需要做出调整的配置项,如果我们写死在了settings中,在部署到生成环境中就无法对配置进行修改
我们可以创建一个用于打包setting配置文件,例如叫
win_exe_prod.py
,具体如下:# default_settings 是默认的django配置文件,即不需要需改的配置项 from .default_settings import * import sys import os import jsonif getattr(sys, 'frozen', False):APPLICATION_PATH = os.path.dirname(sys.executable) elif __file__:APPLICATION_PATH = os.path.dirname(__file__)# 加载当前目录下的config.json 文件 jsonConfig = json.load(open(os.path.join(APPLICATION_PATH, 'config.json')))DATABASES = jsonConfig['DATABASES'] REDIS_CONFIG = jsonConfig['REDIS_CONFIG']
Pyinstaller
可以将资源文件一起打包到exe
中,当exe
在运行时,会生成一个临时文件夹,程序可通过sys._MEIPASS
访问临时文件夹中的资源。if getattr(sys, 'frozen', False)
作用:Pyinstaller
程序打包成exe的时,会将一个变量frozen注入到sys中,这里使用判断,检测sys是否有frozen这个变量,如果有,就使用sys._MEIPASS访问临时文件夹路径,如果没有,就使用当前路径,当程序不管是以PyInstaller打包后形式运行,还是本地测试,都能找到正确的资源路径。config.json 配置
{# 本质就是把django settings中的DATABASES 抽离出来了DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2','NAME': "dev",'USER': "postgres",'PORT': 5432,'PASSWORD': "Dieteng109",'HOST': "192.168.1.109",}},REDIS_CONFIG = {"HOST": '192.168.1.103',"PORT": 6379,"PASSWORD": None,"DBID": 9} }
此时,我们修改django运行时加载的配置文件
# Windows 平台, 设置了django 启动时读取的配置文件 set DJANGO_SETTINGS_MODULE=website.settings.win_exe_prod.py# 执行打包程序,注意config.json、manage.spec、manage.py 处于同级目录下 poetry run pyinstaller manage.spec
2.4 使用winsw 将exe程序作为Windows后台服务
- 流程
- 下载
winsw.exe
程序 - 配置
winsw
配置文件 - 启动
winsw
- 下载
如何下载程序大家可以实行百度,我简单述说一下如何使用。
winsw install 安装服务winsw uninstall 卸载服务winsw start 开启服务winsw stop 停止服务winsw restart 重新启动服务winsw status 检查服务的当前状态
详细使用步骤后续有时间再补充
下面我给出两个配置文件,添加说明以供大家参考
nginx.xml
这是一个nginx配置windows服务的配置信息,在第三章使用winsw将nginx作为Windows后台服务
# nginx.xml 文件
<service># 服务id<id>Nginx</id># 服务执行命令<executable>D:\nginx\nginx.exe</executable># 描述<description>Nginx by WinSW</description># 参数 <arguments>-c conf/nginx.conf</arguments># 工作目录<workingdirectory>D:\nginx</workingdirectory><priority>Normal</priority># 15秒超时<stoptimeout>15 sec</stoptimeout># 停止winsw服务时,追加的后续命令,即停止nginx服务<stopexecutable>D:\nginx\nginx.exe</stopexecutable><stoparguments>-s stop</stoparguments># 表示会自动重启服务<startmode>Automatic</startmode></service>
使用该配置文件
> winsw.exe install -c nginx.xml
再补充一个python文件添加为后台服务
# python01.xml
<service><id>ServerID</id><name>ServerName</name><description>Server Desc</description># 使用python环境<env name="PYTHON_HOME" value="%BASE%"/># 自动重启<startmode>Automatic</startmode># 执行python<executable>python</executable># 指定python 执行的py文件,不写工作目录(workingdirectory)表示当前目录下<arguments>test.py</arguments><!-- 控制日志--><log mode="roll-by-size"><!-- 一个日志文件大小60k,单位是k--><sizeThreshold>60</sizeThreshold><!-- 一共有8个日志文件,--><keepFiles>8</keepFiles></log></service>
2.3 小节和 2.4 小节写的比较糙,很多详细细节没有写。但是基本思路是这样的。
三、前端项目部署
3.1 项目打包
修改前端请求地址
首先,我们需要配置请求的后端接口地址,如果后端和前端在一台电脑上,则不需要指定请求的url域名地址,直接写后端的api后缀即可,若是不在一台电脑上,则需指定后端的api的全路径,我这是请求的本地后端接口8000。
前端项目打包
yum run build
命令执行后会在本地生产一个dist文件,将dist文件夹拷贝到生产环境中
3.2 生产环境部署
此时前端的运行我们可以使用nginx
来作为转发前端访问(当然也可以使用IIS,即window自带的web服务程序),将nginx包拷贝到生产环境中。
nginx部署
配置conf 文件
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 localhost;location /api {proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# 追加请求proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 请求转发proxy_pass http://localhost:8000/api/; }location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}
}
检测配置文件是否有误
先启动nginx.exe 程序,然后检测配置文件是否有误
C:\GOMusic\nginx-1.15.2>nginx.exe -t
nginx: the configuration file C:\GOMusic\nginx-1.15.2/conf/nginx.conf syntax is ok
nginx: configuration file C:\GOMusic\nginx-1.15.2/conf/nginx.conf test is successful
如果后续修改了配置文件,使用 nginx.exe -s reload
重载配置文件
加载nginx web目录内容访
我们将拷贝的dist文件夹内容,移动到nginx目录下的html中
在配置和启动成功后,在浏览器中访问本地的80端口(http://127.0.0.1),即可查看访问系统。
上述便是在windows平台下部署项目的一些方式。大家要是有其他方式欢迎在评论区留言,写的时间比较赶,有任何疑问或意见欢迎大家指出。
Windows 平台部署前后端分离项目相关推荐
- (一)专题介绍:移动端安卓手机改造成linux服务器linux服务器中安装软件、部署前后端分离项目实战
快捷目录 前言 一.涉及到的相关技术简介 二.具体实现过程及踩坑杂谈 1.安卓手机改造成linux系统实现方案 2.改造后的手机Linux中软件的安装 3.手机Linux中安装MySQL5.7踩坑实录 ...
- linux --- 部署前后端分离项目
vue + uwsgi +nginx 部署前后端分离项目 准备项目 1.将前端vue项目包和后端django项目包上传服务器,通过lrzsz,直接从windows拖进linux中 2.解压缩操作 前端 ...
- 使用 Nginx 部署前后端分离项目,解决跨域问题
前后端分离这个问题其实松哥和大家聊过很多了,上周松哥把自己的两个开源项目部署在服务器上以帮助大家可以快速在线预览(喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了 ...
- Docker部署前后端分离项目
云主机 centos7 中Docker容器式部署前后端分离项目Django+Vue.js 前期准备: Docker安装Docker - CentOS Docker 软件包和依赖包已经包含在默认的 Ce ...
- tomcat vue 不用 前后端_部署前后端分离项目(后端 tomcat 前端 nginx)
关键词 spring-boot gradle 腾讯云 tomcat nginx vue 前后端分离 代理 前言 因为种种原因,把后端部署在 tomcat,前端项目部署在 nginx. Tomcat t ...
- weblogic部署前后端分离项目
环境说明 序号 服务名称 版本信息 1 weblogic weblogic 12.2.1.3.0 2 jdk jdk-1.8.0_111 环境准备 (1)jdk安装(已安装请忽略) 将发布包下的ins ...
- k8s部署前后端分离项目
文章目录 1. 项目准备 1.1 后端项目 1.1.1 数据库表 1.1.2 SpringBoot项目 1.2 前端项目 1.2.1 页面 1.2.2 nginx代理 1.2.3 页面效果 2. Do ...
- tomcat部署前后端分离项目404问题
最近在部署项目时,访问出现了404,特此记录一下 1.tomcat解压,最好不要放在C盘 2.将VUE开发的前端项目放在webapp目录下,目的是tomcat启动后可以访问网站 3.部署后端war包 ...
- 基于docker部署前后端分离项目--->docker+Dockerfile+vue+nginx+uwsgi+django+socket+负载均衡
1. 介绍 本文基于阿里云服务器,安装的ubuntu20.04系统 适用于conten7.5系列 适用于ubuntu16.04以上系列 vue已经打包完成,所以不能使用我的vue项目 2. 部署 部署 ...
最新文章
- Java如何拆分字符串
- java怎么输入数据_java怎么键盘输入数据啊?
- ElasticSearch入门 附.Net Core例子
- 使用maven 创建Quartz 任务示例_01
- Java RandomAccessFile getFilePointer()方法与示例
- 【hrbust2294】方方正正
- sql文件建立mysql库_使用.SQL文件创建MySQL数据库
- 06-ICMP: Internet 控制报文协议
- 从SQLSERVER/MYSQL数据库中随机取一条或者N条记录
- jxls能把html转成excel吗,如何用XLSTransformer生成excel文件?jxls的使用方法
- 情感分析资源大全(语料、词典、词嵌入、代码)
- 一个汉字到底是多少个字节
- 飞书接入ChatGPT,打造属于自己的智能问答助手
- shell脚本--三种引号的区别
- C# 9 新功能“源代码生成器”,你用了吗?
- 今天,昆山向全世界发出邀请!
- selenium中ByChained方法
- 提升.NET技术水平,我从不内卷!
- Unsatisfied dependency expressed through bean property ‘sqlSessionFactory‘报错解决
- 键的校核matlab仿真
热门文章
- SQL优化 —— in与not in
- win10如何改变登陆界面背景
- linux docker ps -a,docker ps-docker ps a-docker ps无反应-docker ps是什么意思-docker ps命令解析-docker进程ps-嗨客网...
- 边缘AI+视频监控,如何助力企业安全生产监管智能化升级?
- android 系统/本地日志打印
- 口红微商怎么引流?微商卖口红需要注意什么?
- 小程序之定位签到打卡=>腾讯地图SDK
- uimenu 菜单及设计
- 如何利用单反拍摄VR全景照片?
- 游戏体验之穿越火线手游