当前位置: 首页 > 后端技术 > Python

Django搭建个人博客:将项目部署到服务器上

时间:2023-03-26 11:47:31 Python

虽然我们的博客还有很多不完善的地方,但是不要紧。越早部署到互联网上,就越早发现独特的在线问题。现在也提倡增量开发,让产品在迭代中快速成长。部署的考验不是你的Django编程水平,而是你操作Linux和理解网络通信的能力。说多了也没用,干就干吧!配置服务器要建立网站,您首先需要一台连接到Internet的服务器。国内知名的云服务器有阿里云、腾讯云、百度云。三者各有优缺点。你应该自己去了解和比较,然后选择最适合你的。相关兴趣:博主本人使用的是阿里云,所以教程会以阿里云ECS为例进行讲解。新用户通过推广链接注册,可获得优惠和代金券(目前20元);学生有优惠服务器9.5元/月,性能还不错,非常划算。如果你想使用其他云服务器,操作过程类似,不用担心。首先进入阿里云ECS的购买页面:图片上的文字很小,看不清的同学可以放大看。重点说一下:实例从入门级选便宜的,以后流量大的时候再升级也不晚(土豪请无视)。图片选择Ubuntu16.0464位。其他Linux发行版也是可能的。先选一个20G的系统盘,够你用一段时间了。数据盘暂时不用,不用勾选。点击下一步进入网络和安全组页面:该页面默认即可,公网带宽最低1M,初期足够用。点击下一步进入系统配置页面:为了方便以后远程连接服务器,这里勾选自定义密码,即输入用户/密码的验证方式。其实密钥对的认证方式更加安全,熟悉后可以改回来。单击“下一步”进入群组设置页面。此页面上的所有默认设置都可以。点击下一步,确认订单无误后,即可付款。支付成功后,可以通过控制台看到购买的云服务器:有时候这里会出现黄字提醒你服务器的网口没有打开,点击黄字链接打开:放22(远程连接端口)、443(HTTPS端口)、80(HTTP端口)都打开了,顺便也打开了3389端口。至此,服务器的购买和配置就完成了。稍等几分钟,等待初始化完成,即可获取到服务器的公网IP地址。博主的是118.31.35.48,后面会用到。接下来就是正式部署了。我们在正式部署开发的时候,使用的是Django自带的开发服务器,但是性能太差,无法用于线上环境。因此,在进行线上部署时,我们不仅需要安装Django,还需要安装Nginx和Gunicorn。这三兄弟的工作流程是这样的:客户端发送http请求,Nginx作为直接对外的服务器接口解析http请求。如果是静态资源请求,由Nginx自己处理(效率高)。如果是动态资源请求,则转发给Gunicorn。Gunicorn对请求进行预处理后转发给Django,最终完成资源返回。如果用餐厅来比喻,Nginx就是迎宾小姐。如果客人点酒水,迎宾小姐会帮他们拿;Gunicorn是食物传递者,Django是厨师。它们一起可以满足客人对新鲜油炸食品的需求。远程连接部署的第一步就是想办法连接到云服务器,否则一切都是多余的。由于项目是在Windows环境下开发的,所以推荐使用XShell作为远程连接工具,非常好用。XShell有学校版和家庭版,填上你的名字和邮箱就可以免费使用了。不要不厌其烦地下载来路不明的“绿色版”和“纯净版”。如果有木马,你就哭不出来了。我不会详细介绍如何使用XShell。凭着读者的聪明才智,稍微研究一下就明白了。使用起来还是挺简单的,基本上只要填上主机IP,端口号(22)和登录验证就可以连接了。连接成功后,在XShell窗口可以看到阿里云的欢迎词:WelcometoUbuntu16.04.6LTS(GNU/Linux4.4.0-151-genericx86_64)*文档:https://help.ubuntu.com*管理:https://landscape.canonical.com*支持:https://ubuntu.com/advantage欢迎使用阿里云弹性计算服务!root@dusaiphoto:~$root@dusaiphoto:~$是命令提示符,输入您无需在订购时键入此内容。在本文后面,为方便起见,省略了root@dusaiphoto:字符。代码部署为了防止系统太老带来的各种麻烦,先升级库的版本:~$sudoapt-getupdate~$sudoapt-getupgrade完成后,再安装需要的包:~$sudoapt-getinstallnginx~$sudoapt-getinstallpython3~$sudoapt-getinstallpython3-pip~$sudoapt-getinstallgit~$sudopip3installvirtualenv分别安装了nginx、python3、pip、git、virtualenv。其中python3和pip3是写的,因为阿里云自带Python2.7,所以区分一下。之前开发的时候,虚拟环境使用的python是自带的。为了避免读者版本不同造成的各种错误,使用virtualenv库创建虚拟环境是安全的。操作步骤类似。接下来就是更改Django配置文件settings.py:my_blog/settings.py#关闭调试模式DEBUG=False#允许的服务器ALLOWED_HOSTS=['*']#静态文件集合目录STATIC_ROOT=os.path.join(BASE_DIR,'collected_static')在部署时关闭调试模式以避免安全问题(此时Django将不再处理静态资源)。ALLOWED_HOSTS表示允许访问的服务器名或IP,星号表示允许所有请求。实际部署时请改成自己的域名或IP,如ALLOWED_HOSTS=['.dusaiphoto.com','127.0.0.1']。项目中有很多静态文件。部署的时候需要找一个地方收集它们,就是STATIC_ROOT指定的地址。因为项目代码需要通过GitHub仓库下载(就像本教程中的示例代码一样),所以修改后需要将代码上传到GitHub。我不会在这里详细介绍如何上传它。博主之前在《Win 10 连接 GitHub》上写过一篇文章,有需要的读者可以稍微看一下。需要注意的是,一般需要在服务器上重新生成虚拟环境,所以我们需要把开发中用到的库做一个列表,统一安装到服务器上。在本地虚拟环境中输入:pipfreeze>requirements.txt项目中多了一个requirements.txt文件,里面记录了项目需要的库列表。出于演示目的,教程上传了媒体资源和数据库,实际开发时不上传。然后更新Git记录并上传到GitHub。回到服务器的命令行,为项目代码创建一个目录,进入这个目录:~$mkdir-p/home/sites/dusaiphoto.com~$cd/home/sites/dusaiphoto.com目录位置为由你决定,但建议找一个地方统一管理所有的网站项目。然后从GitHub上拉取项目代码:../dusaiphoto.com$gitclonehttps://github.com/stacklens/django_blog_tutorial.git博客教程的代码拉到这里。建议读者先拉取教程代码进行测试,成功后再重新部署自己的代码。完成后可以输入ls命令查看代码文件夹是否正常生成。然后在服务器上生成虚拟环境:../dusaiphoto.com$virtualenv--python=python3.5env../dusaiphoto.com$sourceenv/bin/activate(env)../dusaiphoto.com$Generatedwithvirtualenv并激活虚拟环境。python版本可以是3.5也可以是3.7,区别不大。接下来就是安装库,收集静态资源,迁移数据:(env)../dusaiphoto.com$cddjango_blog_tutorial(env)../django_blog_tutorial$pip3install-rrequirements.txt(env)../django_blog_tutorial$python3manage.pycollectstatic(env)../django_blog_tutorial$python3manage.pymigrate代码部署基本完成,接下来配置Nginx。Nginx之前我们安装了Nginx,我们试试安装是否正常。启动nginx服务:(env)~$sudoservicenginxstart打开浏览器,输入你的服务器公网IP地址:出现Nginx欢迎界面,惊艳。但是这个默认的配置显然是不能用的,所以需要重写Nginx的配置文件。进入/etc/nginx/sites-available目录,这是定义Nginx可用配置的地方。输入命令sudovidusaiphoto.com创建配置文件并打开vi编辑器:(env)~$cd/etc/nginx/sites-available(env)/etc/nginx/sites-available$(env)/etc/nginx/sites-available$sudovidusaiphoto.comvi编辑器的使用方法我就不多说了。这里只介绍两个基本操作:按i键切换到编辑模式,然后才能进行输入、删除、修改等操作。按Ctrl+c回到命令模式,再输入:wq+回车保存文件修改返回服务器命令行回到正题,用vi在dusaiphoto.com文件中写入:server{charsetutf-8;听80;服务器名称118.31.35.48;#更改为您的IP位置/static{alias/home/sites/dusaiphoto.com/django_blog_tutorial/collected_static;}location/media{别名/home/sites/dusaiphoto.com/django_blog_tutorial/media;}location/{proxy_set_header主机$host;proxy_passhttp://unix:/tmp/118.31.35.48.socket;#改成你的IP}}这个配置会监听80端口(一般是http请求的端口),监听的IP地址会写入你自己的服务器公网IP。配置中有3条规则:如果请求的是静态路径,Nginx会转发到查找静态资源的目录;如果请求媒体路径,Nginx会转发到目录中寻找媒体资源;其他请求交给Django;如果已经申请了域名,将配置中有IP的地方全部改成域名,例如:server_namewww.dusaiphoto.com;写完退出vi编辑器,回到命令行。因为我们只写了Nginx的可用配置,所以还需要把这个配置文件链接到active配置:(env)../sites-available$sudoln-s/etc/nginx/sites-available/dusaiphoto.com/etc/nginx/sites-enabled到这里,Nginx就配置好了,接下来Gunicorn就大功告成了。部分读者无论怎么配置都只能看到Nginx欢迎页面。可能是sites-enabled目录中的默认文件覆盖了您编写的配置。删除默认文件,就可以正常代理自己的配置文件了。gunicorn和testing先回到项目所在目录,进入虚拟环境,然后输入:(env)../django_blog_tutorial$pip3installgunicorn(env)../django_blog_tutorial$sudoservicenginxreload(env)../django_blog_tutorial$gunicorn--bindunix:/tmp/118.31.35.48.socketmy_blog.wsgi:application这里的三步是:installGunicornrestartNginxservicestartGunicornstartGunicorn同理,如果你已经有域名,只是把socket中的wsgi这个词中的IP地址换成了域名;wsgi这个词前面是项目的名称。另外sudoservicenginxreload可以替换成sudoservicenginxrestart。不同的是reload只是重新加载配置文件,restart是重启整个服务。接下来,尝试用浏览器访问服务器:大功告成,献花庆祝!后续工作遗留问题部署成功上线后,还有一些小问题没有解决。第一个问题是进入文章详情页,无法加载ckeditor,浏览器报prism_patched.jsNotFound的错误。这个问题的根源是我们在开发ckeditor的代码高亮功能时,直接将prism模块插入到虚拟环境的库中,但是问题是部署时需要重新建立虚拟环境,所以这个缺少棱镜插件导致错误。解决方法也很简单,在虚拟环境中找到prism插件的位置:..\env\Lib\site-packages\ckeditor\static\ckeditor\ckeditor\plugins\prism复制到项目的static中转到完全相同的目录:my_blog\static\ckeditor\ckeditor\plugins\prism这样做的原因是django-ckeditor也是一个应用程序。Django访问app资源时,会先在项目中搜索,没有的话会去virtual环境中搜索。然后通过GitHub更新服务器代码,重新收集静态文件:(env)../django_blog_tutorial$gitpulloriginmaster(env)../django_blog_tutorial$python3manage.pycollectstatic这个问题给了我们启发:对于三-方库1.改资源的时候最好不要直接修改源文件或者环境,而是想办法在项目副本中改,这样更容易维护。有读者发现旧的富文本评论中的表情没有显示,这个不用担心,新评论没问题。第二个问题是GitHub登录异常。这很可能不是代码问题,而是你的服务器和GitHub回调配置的问题。这里就不多说了,请回到上一篇关于第三方登录的文章再研究。第三个问题是开发阶段使用的sqlite数据库虽然很方便,但是性能较差。在线性能为王,所以数据库需要换成MYSQL等主流高性能数据库。远程安装配置MYSQL的方法可以参考刘江的博客,写的很清楚。第四个问题,教程的部署是由root用户进行的,也就是服务器中最高权限的用户。如果去掉自己的盲目操作,一旦被攻击者登录,那将是相当惨烈的(尤其是用户/密码登录方式,安全系数极低)。更好的方法是重新创建一个普通用户进行部署,并将登录方式改为密钥对。在网站后期的运维中,需要不断更新和优化代码。每次修改代码更新到服务器也很简单。在虚拟环境下,进入项目目录,依次执行以下命令(collectstatic和migrate可选):gitpulloriginmasterpython3manage.pycollectstaticpython3manage.pymigrate#restartgunicornpkillgunicornunicorn--bindunix:/tmp/118.31。35.48.socketmy_blog.wsgi:application加上cd命令切换目录,部署过程中有十几个命令,手动输入太麻烦。简单粗暴的方式就是使用XShell宏,将部署指令写成脚本,依次执行,点击几个按钮即可完成,非常方便。一种更高级的方法是编写用于在服务器上自动部署的脚本。这个读者以后慢慢研究。如果更改了Nginx配置文件,需要重启Nginx服务:sudoservicenginxreload最后,还记得上一章Recordfunction的开发日志吗?查看项目中是否有logs目录?域名及优化与部署相比,域名配置非常容易。阿里云提供域名购买、备案(需要顶级域名,10个工作日左右)、解析服务。提示有域名后修改的地方:settings.py中的ALLOWED_HOSTSNginx中IP/域名相关的位置Gunicorn中IP/域名相关的位置域名定下来之后,就可以考虑升级了网站改成https版本,这是大趋势,必须要做。(这个也留给读者去折腾。)另外,开发时为了效率,所有静态资源都下载到本地,但是部署时不建议这样做,因为静态文件通常比较大,你买的服务器用辛苦赚来的钱负担会员资格很慢。尝试进行远程CDN调用,像这样:国内推荐BootCDN,快速免费。媒体资源也是如此。小图不要紧,大图一定要放到七牛云这样的对象存储云上,不然你的网页加载速度会很惨。最后再次提醒大家,我们在开发的时候,把SECRET_KEY、邮箱密码等各种敏感信息写到settings.py中。部署的时候,不要直接上传到网上(GitHub库是公开的!),而是把这些信息写到本地服务器,在settings.py中读取。总结部署可以说是初学者最大的难点,也是检验结果、获得成就感的关键一步。多查资料,相信你遇到的问题其他人已经遇到过。部署是菜鸟的毕业典礼,也是新人的第一堂课。路漫漫其修远兮,上下寻觅。如有任何问题,请在杜赛个人网站留言,我会尽快回复。或者私信给我:dusaiphoto@foxmail.com项目完整代码:Django_blog_tutorial