基于腾讯云Windows Server 2016部署Django项目

背景

通常我们的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验证一下

代码语言:bash
复制
conda --version

git

git 安装没有什么特别的,一路下一步即可

打卡cmd验证

代码语言:bash
复制
git --version

Nginx

安装非常简单,将下载好的文件夹之间解压即可,我们直接解压到C盘根目录

启动并验证

在没有配置环境变量的情况下,可以直接进入到nginx的解压目录下,运行start nginx

然后打开浏览器输入localhost

这个是在服务里面验证,如果是服务器外部,则需要输入公网IP进行验证。

创建Python虚拟环境

为了和之后的项目环境隔离,我们需要创建一个虚拟环境

代码语言:bash
复制
conda create --name mail_env python==3.11 -y

激活虚拟环境

代码语言:bash
复制
conda activate mail_env

克隆项目到服务器

我们在克隆之前,先在C盘的根目录下创建一个www文件夹,用来保存我们的项目

代码语言:bash
复制
mkdir www
cd www

这里用的是私人仓库,就不展示git clone 地址了

进入到我们的项目目录,安装环境依赖文件

设置pip的源为国内镜像,我们这里使用的是腾讯的镜像源

代码语言:bash
复制
pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
pip config set global.trusted-host mirrors.cloud.tencent.com

开始安装环境依赖

代码语言:bash
复制
pip install -r requirements.txt

启动试试环境是否正常

代码语言:bash
复制
python manage.py runserver

我们在服务器内部输入http://127.0.0.1:8000/看看效果

我们框架使用GraphQL, 因此我额外安装edge浏览器。以防ie上的效果展示有问题。

可以看到正常显示了,但是我们这里只是使用了debug的方式运行的。

接下来我们开始今天的重要部分,通过nginx + waitress来运行项目。

配置Nginx的静态文件路径以及项目路径

我们进入到nginx的配置目录下,备份一下默认配置文件

修改nginx.conf文件

代码语言:bash
复制
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, 这个文件名你随意。

代码语言:python
代码运行次数:0
复制
Cloud Studio 代码运行
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窗口,并激活虚拟环境,然后进入到项目根目录

代码语言:bash
复制
conda activate mail_env
cd C:\Users\Administrator\www\mail_system\backend
python run.py

我们可以看到它运行了。

我们重新加载一下nginx的配置

代码语言:bash
复制
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文件,文件内容如下

代码语言:bash
复制
@echo off
setlocal

rem 设置 Conda 环境的路径
set CONDA_PATH=C:\ProgramData\miniconda3

rem 设置要激活的 Conda 虚拟环境
set ENV_NAME=mail_env

rem 设置要运行的 Python 脚本路径
set SCRIPT_PATH=C:\Users\Administrator\www\mail_system\backend\run.py

rem 检查 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静默运行,

代码语言:vbs
复制
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腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!