背景
通常我们的web应用都是部署再Liunx环境里面的,但是由于一些历史原因,例如旧系统使用的是.Net
,在不增加新服务器的情况下,我们只能选择使用windows server环境来部署了。
今天和我一起实际操作一下。
环境介绍
服务器使用的是腾讯云的基础款,并安装了windows server 2016,示例项目后端使用的是Django + GraphQL ,前端使用的是NodeJS + bootstrap。
由于我们这次演示的是如何部署,因此就不从头开始写Django项目了,如果有需要后期可以单独出文章。
基础环境搭建
我们需要用到的软件如下:
- Git: https://git-scm.com/download/win
- miniconda: https://docs.conda.io/projects/miniconda/en/latest/
- Nginx: http://nginx.org/en/download.html
miniconda安装
双击下载好的软件
选择默认安装盘,由于我这里没有分区,因此直接安装在C盘了
设置环境变量
这里的路径大家根据自己的实际情况设置,路径之间要用英文分号隔开。
将我们新建的conda
环境变量添加到path中
打开cmd验证一下
conda --version
git
git 安装没有什么特别的,一路下一步即可
打卡cmd验证
git --version
Nginx
安装非常简单,将下载好的文件夹之间解压即可,我们直接解压到C盘根目录
启动并验证
在没有配置环境变量的情况下,可以直接进入到nginx的解压目录下,运行start nginx
然后打开浏览器输入localhost
这个是在服务里面验证,如果是服务器外部,则需要输入公网IP进行验证。
创建Python虚拟环境
为了和之后的项目环境隔离,我们需要创建一个虚拟环境
conda create --name mail_env python==3.11 -y
激活虚拟环境
conda activate mail_env
克隆项目到服务器
我们在克隆之前,先在C盘的根目录下创建一个www
文件夹,用来保存我们的项目
mkdir www
cd www
这里用的是私人仓库,就不展示git clone 地址了
进入到我们的项目目录,安装环境依赖文件
设置pip的源为国内镜像,我们这里使用的是腾讯的镜像源
pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
pip config set global.trusted-host mirrors.cloud.tencent.com
开始安装环境依赖
pip install -r requirements.txt
启动试试环境是否正常
python manage.py runserver
我们在服务器内部输入http://127.0.0.1:8000/
看看效果
我们框架使用GraphQL, 因此我额外安装edge浏览器。以防ie上的效果展示有问题。
可以看到正常显示了,但是我们这里只是使用了debug
的方式运行的。
接下来我们开始今天的重要部分,通过nginx + waitress来运行项目。
配置Nginx的静态文件路径以及项目路径
我们进入到nginx的配置目录下,备份一下默认配置文件
修改nginx.conf
文件
worker_processes 2;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;pid logs/nginx.pid;
events {
worker_connections 1024;
}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;
sendfile on;
keepalive_timeout 65;#gzip on; server { listen 80; server_name localhost 124.xxx.xxx.xxx; location / { proxy_set_header Host $host; proxy_pass http://127.0.0.1:8000; } location /static { alias C:\Users\Administrator\www\mail_system\backend\static; } location /media { alias C:\Users\Administrator\www\mail_system\backend\media; } }
}
server_name localhost 124.xxx.xxx.xxx;这里换成你的真实服务器IP地址
配置waitress启动文件
在我们项目的根目录下创建一个run.py
, 这个文件名你随意。
from waitress import serve
from config.wsgi import application
serve(
app=application,
host='127.0.0.1',
port=8000
)
from config.wsgi import application
这里的config是我当时创建django项目时使用的名字,大家根据自己的修改。
我们在试试通过这个文件来启动项目
我们新建一个cmd窗口,并激活虚拟环境,然后进入到项目根目录
conda activate mail_env
cd C:\Users\Administrator\www\mail_system\backend
python run.py
我们可以看到它运行了。
我们重新加载一下nginx的配置
nginx -s reload
在浏览器中如输入http://localhost/graphql/
可以看到我们的项目可以正常启动了,
在服务器外部通过IP访问试试看
同样可以正常访问,至此我们的配置以及完成的大部分,还有一些收尾工作。
收尾设置
我么们希望nginx和run.py
能随服务器启动一起启动,这样每次服务器重启,就不需要我们手动做这些了,另外我们希望run.py
能在后台运行,而不是在cmd窗口中显示,因为这样很容易被误关。
在 Windows 上设置Nginx开机自启动可以通过以下步骤进行操作:
- 打开 Nginx 的安装目录
- 复制 nginx.exe 文件路径。
- 打开开始菜单,搜索并打开 "运行",或者使用快捷键 Win + R。
- 输入
shell:startup
并按下回车键,这将打开 Windows 的启动文件夹。 - 在启动文件夹中点击鼠标右键,并选择 "新建" -> "快捷方式"。
- 在弹出的窗口中,粘贴刚才复制的 nginx.exe 文件路径,并点击 "下一步"。
- 输入快捷方式的名称,例如 "Nginx",然后点击 "完成"。
现在,每次开机启动时,Nginx 将自动运行。
我们在项目根目录下在创建一个run.bat
文件,文件内容如下
@echo off
setlocalrem 设置 Conda 环境的路径
set CONDA_PATH=C:\ProgramData\miniconda3rem 设置要激活的 Conda 虚拟环境
set ENV_NAME=mail_envrem 设置要运行的 Python 脚本路径
set SCRIPT_PATH=C:\Users\Administrator\www\mail_system\backend\run.pyrem 检查 Conda 环境是否存在
if not exist "%CONDA_PATH%\Scripts\conda.exe" (
echo Conda not found at %CONDA_PATH%
exit /b 1
)rem 激活 Conda 虚拟环境
call "%CONDA_PATH%\Scripts\activate.bat" "%ENV_NAME%"rem 后台运行 Python 脚本
start /B python "%SCRIPT_PATH%"
endlocal
具体路径大家根据自己的路径进行设置即可
在创建一个vbs文件,主要是为了让bat静默运行,
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c C:\Users\Administrator\www\mail_system\backend\run.bat",0
bat的路径大家根据自己的设置一下。
我们关闭所有的cmd窗口验证一下
这时在访问我们的网站
可以看到502
报错,然我们双击上面的vbs文件(正常情况下,我们重启服务器时它会自动执行,我们这里只是模拟一下。)
再次访问浏览器,我们可以看到内容正常显示了。
结束语
我们今天和大家一起在windows server环境中部署了django项目,并实现了windows重启后自动运行的功能,其实组后vbs和bat的方案我们有更好的解决方案基于supervisor-win
,这一部分我们后续再介绍。
好了,今天的内容就是这些,如果对你有所帮助欢迎转发给你个朋友。
我是Tango, 一个热爱分享技术的的程序猿,我们下期见。
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!