目录

7.1 Python WSGI部署原理

7.2 本地服务器部署

7.2.1 准备部署环境

7.2.2 安装和配置IIS

7.2.3 开放端口

7.2.4 部署

7.3 云服务器部署

7.3.1 云服务器申请和配置

7.3.2 部署

7.3.3 域名申请和备案



7.1 Python WSGI部署原理

前面的章课程已经将企业门户网站的整个开发步骤阐述完毕,为了便于项目管理,整个项目采用了Django的多应用功能,将各个模块放置在各个对应的应用中进行开发。每个应用通过Django自带的开发服务器进行了功能测试,能够在本地浏览器上正常运行。Django框架自带的这个开发服务器用来调试Django 应用程序非常方便,但是这个服务器只能在本地环境中运行,不能承受由多个用户同时访问网站所产生的负载。因此,需要将Django应用程序部署到生产级Web服务器,比如Apache、Nginx、Lighttpd、IIS等。本章将从部署原理切入,通过实现本地服务器和云服务器部署,使读者能够完整的掌握Python Web项目部署方法。

与开发阶段相比,Python Web项目的部署是一个相对繁琐的过程,尤其在Windows下面部署Django项目。为了简化部署过程同时为了使Windows下的读者能够轻松的使自己的项目上线,本节课将重点阐述如何使用Windows提供的IIS服务器来实现快速、高效的项目部署,部署平台为Windows系统。

在进入正式的部署前,先简单了解一下Python Web项目部署的基本原理,其核心依赖一种称为WSGI的框架协议。WSGI是建立在CGI的基础上的,CGI的全程是Common Gateway Interface,即“通用网关接口”,而WSGI就是只针对Python的网页应用接口Python Web Server Gateway Interface。WSGI只是一个接口定义,它不负责服务器的实现,也不负责网页应用的实现,它只是一个两边接口方式的约定,只是一种规范,描述Web服务器如何与Web应用通信的规范。要实现WSGI协议,必须同时实现Web服务器和Web应用。简单来说,WSGI规范了一种简单的接口,将服务器和应用分开来,使得两边的开发者能够更加专注自身的开发。例如,在前面门户网站的开发过程中,一直采用的是Django提供的开发者服务器进行项目调试,从这个意义上来说,网站的完整项目代码即为对应的Web应用,而开发者服务器即为这里的Web服务器,只是我们并没有进行服务器开发,因为这是Django直接提供好的。
WSGI协议主要包括Web服务器和应用两部分,如下图所示:

  •  Web服务器: 即HTTP服务器,按照HTTP协议接受用户HTTP请求并提供并发访问,调用Web应用处理业务逻辑。通常Web服务器采用C/C++编写,典型Web服务器有:Apache, Nginx和IIS。WSGI服务器负责从客户端接收请求request,然后将request转发给应用,处理完以后再将应用返回的response返回给客户端;
  • Python Web应用:应用程序接收由服务器转发的request,处理对应的请求,并将处理结果返回给服务器。应用中可以包括多个栈式的中间件middlewares,主要起调节作用;

 传统CGI接口性能较差,每次HTTP服务器遇到动态程序时需要重启解析器来执行解析,然后才将结果返回给HTTP服务器。这种方式在处理高并发访问时几乎是不可能完成任务的的,因此诞生了FastCGI。这是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口。主要优点是把动态语言和HTTP服务器分离开来。目前,多数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx、IIS等。

wfastcgi即为支持Python语言的FastCGI,接口方式采用C/S架构,可以将HTTP服务器和Python脚本解析器分开,同时在脚本解析服务器上启动一个或者多个脚本解析并守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

在实际搭配时可以选择任意的服务器和应用进行组合。例如Nginx和IIS都是实现了WSGI server协议的服务器,而Django和Flask都是实现了WSGI协议的Web应用框架,可以根据项目实际情况自由组合使用。本课程将采用IIS+Django的方式构建和部署Web项目。

IIS(Internet Information Server)是Windows Server自带的互联网信息服务器,是架设网站服务器的常用工具,由于是微软直接推出的Web服务器,因此使用它在Windows系统下面架设Web站点相对于其它服务器更具有先天优势,部署更加容易。

7.2 本地服务器部署

7.2.1 准备部署环境

Django项目开发完成后,需要了解此项目所依赖的库有哪些,从而方便在其它机器上进行环境部署。Django提供了一种方便的依赖库生成方式,可以将当前环境中的所有依赖库的库名及其对应的版本号生成到一个名为requirements.txt的文件。

首先在cmd或VS Code的命令终端中输入命令:

pip freeze > requirements.txt

运行命令后Python会自动搜索当前环境中的所有依赖包名及其对应的版本号,并将这些信息写入到requirements.txt文件中,如下所示:

asgiref==3.4.1
Django==3.2.7
django-widget-tweaks==1.4.8
DjangoUeditor==1.8.143
Pillow==8.3.2
pytz==2021.1
six==1.16.0
sqlparse==0.4.2
yapf==0.31.0

如果需要部署项目到新的机器上,此时只需要安装此文件中的依赖即可,在目标机器上
输入下述命令即可快速安装项目相关的依赖包:

pip install -r requirements.txt

这样我们就可以快速配置好Python依赖,当然,本小节我们还是在本地部署,之前在开发过程中已经装好所有的依赖库了,所以这里我们就可以不用再安装了。

7.2.2 安装和配置IIS

本小节简单阐述如何安装和配置IIS。在Windows系统中依次打开“控制面板”→“程序和功能”→“打开或关闭Windows功能”,找到Internet Information Services(Internet 信息服务),然后按照下图进行勾选,最后单击确定按钮完成IIS服务器的安装。

 注意:完成上述安装后,最好重启一次系统

7.2.3 开放端口

在前面的章节中我们经常使用python manage.py runserver命令来启动开发服务器,启动后默认的访问网址为127.0.0.1:8000,此处的8000即为网站的部署端口。一般情况下访问某个特定网站需要网站的IP地址以及对应的网站端口号才能正确访问,但是实际情况中很多网站部署在80端口,该端口较为特殊,80是http协议的默认端口,在输入网站IP的时候如果不输入端口号则默认会访问80端口,例如访问百度时输入http://baidu.com此时真正的完整的访问路径为http://baidu.com:80。通常一个服务器上会部署多个网站,每个网站部署在不同的端口来进行区分,这些端口并不是可以随意使用,需要提前进行端口开放,这种方式也是为了服务器安全性考虑。

在谈及服务器安全时端口是最不可忽视的一个重要板块,在日常服务器维护时及时有效的端口管理可以隔绝大多数网络攻击,那么服务器端口如何管理呢?其实就是确定业务层需要使用的端口,除了开放这些使用的端口之外,其他不使用的端口全部隔绝,下面以开放8001端口为例阐述如何在Windows中开放特定端口。

首先打开Windows操作系统的“控制面板”,单击“系统和安全”,找到“Windows Defender 防火墙”,单击进入防火墙配置界面,如下图所示。

单击左侧菜单栏中的“高级设置”按钮进入高级设置界面,在左侧“入站规则”面板中单击“新建规则”按钮,进入入站规则向导界面,如下图所示:

选择“端口”,然后单击“下一步”,进入端口设置界面,将8001端口开放,如下图所示。:

其中应用规则选择“TCP”,规则应用范围选择“特定本地端口”。最后,依次单击“下一步”即可完成整个端口开放任务。

7.2.4 部署

下面开始正式的部署。

(1)安装并启动wfastcgi

为了将Django项目能够部署到IIS服务器上,需要安装Python包wfastcgi,该包作为Python的脚本解析器在动态程序和IIS服务器间实现脚本解析。以管理员身份打开命令行工具进行安装(注意此处必须要以管理员身份打开,否则会安装失败),输入命令:

pip install wfastcgi

安装完成后需要启动wfastcgi,继续在终端中输入命令:

wfastcgi-enable

正常会在控制台输出类似下面的结果:

C:\Windows\system32>wfastcgi-enable
已经在配置提交路径“MACHINE/WEBROOT/APPHOST”向“MACHINE/WEBROOT/APPHOST”的“system.webServer/fastCgi”节应用了配置更改
"d:\toolplace\python3.8.10\python.exe|d:\toolplace\python3.8.10\lib\site-packages\wfastcgi.py" can now be used as a FastCGI script processor

到这一步说明wfastcgi安装成功并且已经成功启动。输出结果最后冒号中的内容即为当前Python和wfastcgi解释器核心脚本的具体路径,用符号“|”隔开,该路径在后面的web配置文件中会使用到。

(2)配置web.config文件

为了能够让IIS服务器准确的运行项目,需要配置和设定一些参数,包括项目路径、项目配置文件路径、解析器等。一种简单办法就是通过添加服务器配置文件实现。具体的,在前面开发的企业门户网站项目hengDaProject根目录下创建一个web.config文件,添加内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="d:\toolplace\python3.8.10\python.exe|d:\toolplace\python3.8.10\lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
        </handlers>
        <httpErrors errorMode="Detailed" />
    </system.webServer>
    <appSettings>
        <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
        <add key="PYTHONPATH" value="d:\code\hengDaProject" />
        <add key="DJANGO_SETTINGS_MODULE" value="hengDaProject.settings" />
    </appSettings>
</configuration>

这里对照着自己的网站,修改三处地方替换即可

  • scriptProcessor中冒号部分分别填入前面对应的python和wfastcgi解释器核心脚本文件所在路径;
  • <add key="PYTHONPATH" value="d:\hengDaProject" /> ,这里的value要替换成当前的项目根目录(跟manage.py同目录);
  • <add key="DJANGO_SETTINGS_MODULE" value="hengDaProject.settings" />,这里value处需要写入项目配置模块名称;

(3)静态文件迁移

在项目根目录下的static文件夹中同样创建一个web.config文件,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="Python FastCGI" />
    </handlers>
  </system.webServer>
</configuration>

该文件用于为IIS指明静态资源文件的渲染方式。接下来需要将项目所有的静态资源文件css、js、img等全部导入到项目根目录下的static文件夹中。打开项目配置文件settings.py,将:

STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"), )

替换为:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

然后在命令终端中执行命令:

python manage.py collectstatic

然后按照提示输入yes即可完成静态文件迁移。从本质上来说,静态文件迁移就是将原先分散在各个应用下的静态文件全部拷贝到项目根目录下的static文件夹中,这样做是为了方便IIS服务器查找静态资源文件。

(4)IIS创建网站

在控制面板的管理工具中打开“Internet Information Services(IIS)管理器”。在IIS管理器左侧导航面板中右键“网站”,在弹出菜单中选择“添加网站”选项进入网站添加界面。然后按照下图进行网站创建,其中物理路径为项目根目录,IP地址和主机名可以不用填写,端口号采用之前开放的端口,端口号的设置不能与本机当前其它网站或程序冲突。最后单击“确定”按钮完成项目的部署。

完成整个部署后,即可通过浏览器访问http://127.0.0.1:8001,查看效果。尽管与启动Django开发服务器之后呈现的页面效果相同,但此时我们的网站是采用IIS服务器部署的,相比Django提供的开发者服务器具备更好的并发访问能力,性能更加稳定 ,另外,我们这个网站是一直开着的,即便关机重启后,网站也会自动恢复,不需要我们手工启动。

7.3 云服务器部署

为什么要将项目部署到云服务器?简单来说,一旦部署到云上,那么我们就可以通过互联网访问我们的网站(电脑浏览器、手机浏览器等),别人也可以通过互联网访问我们的网站,这才是我们的网站真正发挥作用的场所,也是开发网站真正的价值所在(让所有人通过互联网访问你的作品,同你进行交流)。

云服务器(Elastic Compute Service, ECS)是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务,其管理方式比物理服务器更简单高效。用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器。采用云服务器的用户可根据不同需求,自由选择CPU、内存、硬盘、带宽等配置,还可随时不停机升级带宽,支撑业务的持续发展。如果发现需要的配置超出正常限制,则可以及时进行扩容。这对于成长型企业来说非常有帮助,可以从小型存储开始,然后在业务扩展时逐渐扩大规模。云服务器不但提供强大的云计算和互联网响应能力,还通过分布式存储技术提供可快速恢复的快照备份服务。

目前,国外有名的云服务器提供商有亚马逊、谷歌、微软等,国内的有阿里云、百度云、腾讯云、华为云等。从本质上来说,云服务器就是大型供应商通过硬件资源整合和动态分配所提供的一种线上电脑。用户可以通过远程登录方式操控分配给自己的电脑,实际操作体验与真实的物理服务器相同。

下面以百度云为例,讲解云服务器申请和部署项目的一些具体操作流程。

7.3.1 云服务器申请和配置

进入百度云首页https://cloud.baidu.com/,然后在菜单“产品”中选择“云服务器(BCC)”,可以看到在热门机型子页面提供了多种配置的云服务器。对于本项目实例来说,只需要选择入门型云服务器即可,如下图所示,选择类似179元的这种1核1G3M就可以。后期可以根据实际需求对服务器进行升级(新用户一般价格比较便宜)。

 单击“立即购买”,进入购买页面(需要先注册和登录),然后进行地域选择。在配置子页面中选择“Windows Server”操作系统,系统型号为“2012 R2x86 (64bit)中文版”,如下图所示:

在系统信息子页面,创建自定义的管理用户名和密码,后面将通过该用户名和密码来远程登录云服务器。其它选项使用默认配置,然后单击右侧“下一步”按照提示完成购买。

完成云服务器购买后进入控制台的云服务器BCC管理界面,可以查看当前购买的云服务器,如下图所示。其中“公网IP”即为当前云服务器的外网IP:

 下面就需要登陆云服务器来进行操作。云服务器登陆可以采用Windows自带的远程桌面连接功能。在Windows系统菜单中打开mstsc远程桌面连接,然后输入对应的公网ip来连接远程云服务器,如果需要账户,那么账户名默认是administrator,密码就是购买云服务器时设置的那个。

该云服务器与普通的物理服务器操作基本相同,唯一区别在于不需要再去关心物理实体,读者可以自行操作并体验相关功能。

7.3.2 部署

首先按照上一节介绍的方法通过Windows远程桌面连接mstsc进入云服务器,然后按照下面的步骤开始进行项目部署。

(1) 安装python

参照第一节课方法在云服务器上安装Python。可以将离线安装包直接拷贝到云服务器上进行安装,安装时需要将安装目录添加至环境变量,即勾选“Add Python 3.8 to Path”选项。完成安装后打开云服务器上的cmd命令工具进行测试,输入python即可进入python交互式环境,输入“exit()”可以退出交互式环境。

(2) 安装python依赖包

将项目中的requirements.txt文件拷贝到云服务器上,然后通过cd定位到该文件所在目录,输入下述命令一次性完成第三方依赖库的安装:

pip install -r requirements.txt

在安装过程中可能会因为网络原因出现中断或者部分安装包无法安装成功,可以针对错误提示使用pip命令独立安装对应的依赖包。

(3) 安装和配置IIS

首先在服务器管理器仪表板页面中单击“添加角色和功能”,如下图所示:

 然后按照提示依次单击“下一步”,其中在“服务器角色”上勾选“Web服务器(IIS)”,如下图所示:

然后在弹出的“添加角色和功能向导”中直接单击“添加功能”按钮,如下图所示:

然后依次单击“下一步”直到进入“角色服务”页面,然后按照下图进行勾选: 

最后点击安装即可。

安装完成后重启系统,此时,通过外网访问该服务器所在外网IP,例如:http://106.12.159.30/,即可看到IIS默认提供的初始页面,如下图所示:

(4) 项目配置

 首先按照前面本地服务器部署的方式,在云服务器上安装wfastcgi包并启动,

pip install wfastcgi
wfastcgi-enable

将输出结果中冒号部分对应的路径记录下来,如下所示:

PS C:\Users\Administrator> wfastcgi-enable
已经在配置提交路径“MACHINE/WEBROOT/APPHOST”向“MACHINE/WEBROOT/APPHOST”的“system.webServer/fastCgi”节应用了配置更改
"c:\toolplace\python3.8.10\python.exe|c:\toolplace\python3.8.10\lib\site-packages\wfastcgi.py" can now be used as a FastCGI script processor

打开项目的settings.py文件,找到DEBUG字段,默认情况下该字段设置为True,表示处于调试模式,建议第一次尝试项目部署的读者依然将该字段保持为True,这样在部署过程中出现的错误会有比较详细的提示,等到项目完全部署成功以后再将该字段设置为False。

完成上述配置后将整个hengDaProject项目拷贝到云服务器C盘上,接下来按照前面本地服务器的部署方式修改web.config文件,并且对路径进行修改。注意,在项目的static目录下也需要修改一个web.config文件,内容参照前面本地服务器部署方式。

因为最终上线部署我们采用release模式(即设置了debug=False),在这个模式下,我们需要添加一下静态资源和媒体资源配置。打开settings.py文件,添加代码如下:

# release 新增
STATIC_URL = '/static/' # release新增行
STATIC_ROOT = 'static' ## 新增行
STATICFILES_DIRS = [
  os.path.join(BASE_DIR, '/static/'), ##修改地方
]

然后修改urls.py文件,首先添加头部引用:

from django.views import static ##新增
from django.conf import settings ##新增
from django.conf.urls import url ##新增

然后在urlpatterns中添加如下代码:

urlpatterns = [
    path('admin/', admin.site.urls),                        # 管理员
    path('', home, name='home'),                            # 首页
    path('aboutApp/', include('aboutApp.urls')),            # 公司简介
    path('contactApp/', include('contactApp.urls')),        # 人才招聘
    path('newsApp/', include('newsApp.urls')),              # 新闻动态
    path('productsApp/', include('productsApp.urls')),      # 产品中心
    path('scienceApp/', include('scienceApp.urls')),        # 科研基地
    path('serviceApp/', include('serviceApp.urls')),        # 服务支持
    path('ueditor/',include('DjangoUeditor.urls')),         # 富文本服务
    url(r'^media/(?P<path>.*)$', static.serve,        # release 模式下需要添加这个
      {'document_root': settings.MEDIA_ROOT}, name='static'),
]

最后有一点很重要(否则后面容易出现Server 500错误),本课程开发的企业门户网站目前采用sqlite作为数据库,其本质是一个文件,将其拷贝到云服务器上后该文件自动会产生写保护,因此需要开放权限。

在云服务器上找到项目根目录下的db.sqlite3文件,右键该文件选择“属性”,然后在“安全”面板中选择Users,单击“编辑”按钮,然后勾选“完全控制”选项,如下图所示。最后单击“应用”保存修改。

 (5) IIS部署网站

 参照本地服务器部署实现方法,创建项目网站,这里将网站端口设置在80,配置如下图所示。

后单击确定完成项目部署。通过浏览器外网访问云服务器IP地址,查看网站效果。

首页效果:

后台效果:

7.3.3 域名申请和备案

首先了解下域名注册和备案的概念。

域名是由一串用点分隔的英特网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。因特网会将域名和IP地址相互绑定和映射,能够使人更方便地访问互联网网站,而不用去记住IP地址数字。以百度为例,百度的外网IP为14.215.177.39,其对应的域名为www.baidu.com,在我们日常访问时为了简便一般使用域名进行访问。

备案是指将网站在工信部系统中进行登记,相当于给网站做实名认证(即将域名指向一个网站)。现在我国规定注册了域名并且用国内空间的必须要备案,否则网站会被关闭。此外,还要注意有些域名后缀是无法备案的,所以如果用的是国内的空间,则要注意申请域名时要申请有在工信部收录的可以备案的域名。

登录百度云管理系统,在左侧菜单中找到“域名服务BCD”即可进入域名管理界面,如下图所示。

 在该页面中,可以对已购买的域名进行续费、解析。如需要购买新的域名,可以在左侧菜单中选择“域名概览”查看并购买域名。为了能够使我们的网站能够与购买的域名进行绑定,即实现访问域名等价于访问云服务器外网IP的效果,需要对域名进行解析。单击域名右侧的“解析”按钮,进入域名解析界面,然后可以对域名和服务器外网IP进行绑定,如下图所示。

 相对于域名申请来说,域名备案的时间较长,建议在开发门户网站的同时即申请备案。单击控制台中的“ICP备案”按钮或者直接访问https://beian.bce.baidu.com进入备案页面,如下图所示:

按照该网页上操作步骤进行备案信息录入,本书对此不再详细阐述。

至此,我们就完成了整个服务器的外网部署。我们可以在浏览器中直接输入我们购买的域名,即可跳转到我们的网站。

到这里,本节课程内容已结束。

 本节课完整代码和数据下载地址如下:

百度网盘:https://pan.baidu.com/s/1VopOYCXZ8RftPI0J2jWIsg

提取码:z2zy 

后记:最近有不少读者询问如何在ubuntu系统上部署django项目,这里可以参考我的另一篇博文,里面有详细的部署方法:腾讯云Ubuntu18.04部署Django应用(Django 3)完整教程_冰海的博客-CSDN博客

本课程介绍链接:Python Web企业门户网站—系列博客教程介绍_冰海的博客-CSDN博客_python web开发从入门到实战

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐