31.项目部署

news2024/11/17 9:35:47

目录

1  一些概念

1.1  项目部署

1.2  WSGI

1.3  uWSGI

1.4  Nginx

2  安装环境与迁移项目

2.1  项目内容

2.2  项目配置

2.2.1  DEBUG

2.2.2  STATIC_ROOT

2.2.3  ALLOWED_HOST

3  uWSGI

3.1  安装uWSGI

3.2  配置uWSGI

3.3  启动 uWSGI

3.4  停止 uWSGI

4  nginx

4.1  安装nginx

4.2  配置nginx

4.2.1  基础配置

4.2.2  静态文件配置

4.3  启动nginx

5  常见错误

6  其他

6.1  自定义错误码页面

6.2  邮件告警

6.2.1  屏蔽post信息

6.2.2  屏蔽其他变量


1  一些概念

1.1  项目部署

项目部署是指将开发好的网站,放到专门的服务器上。一般服务器是具有公网IP的(从华为云,阿里云这些地方买)。部署一般有下面几步

  1. 将需要的环境全部装好,比如mysql,python相关环境等。

  2. 使用 sudo scp命令,将开发文件复制到云服务器上,比如

    • sudo scp /home/tarena/django/mysite1 username@88.77.66.55:/home/username/xxx

    username@88.77.66.55 是用户名和公网IP,输入完敲回车后会询问你username的密码,这个在你购买的时候客服都会告诉你

  1. 用uWSGI替代python manage.py runserver方法启动服务器
  2. 配置nginx反向代理服务器
  3. 用nginx配置静态文件路径,解决静态路径问题

1.2  WSGI

WSGI(Web Server Gateway Interface)web服务器网关接口,是python与web的一种接口

浏览器只能处理http协议,django只能处理WSGI协议,runserver既能处理HTTP协议,也可以处理WSGI协议,runserver是浏览器与django通讯的桥梁

1.3  uWSGI

我们之前是使用python manage.py runserver启动服务,使用runserver启动的服务性能不好。所以我们使用uWSGI替代runserver启动服务,uWSGI性能好

uWSGI是WSGI的一种,uWSGI既可以处理http协议,也可以处理WSGI协议,相当于替代了runserver。除了http与WSGI,uWSGI也可以处理很多其他的协议

uWSGI是一种服务,uwsgi是一种协议,uwsgi是二进制协议,比传统http协议效率更高

1.4  Nginx

Nginx是轻量级高性能的web代理服务器(软件),有下面几个重要特点

  • 可以代理HTTP
  • 可以反向代理,反向代理的意思就是把来的请求转发给其他服务器
  • 可以进行负载均衡,保持每个服务器的访问量都差不多
  • C语言编写,执行效率高
  • nginx可以接受HTTP协议,然后将其转为uwsgi协议发给uWSGI

客户会先请求nginx,然后由nginx将请求转发给uWSGI,因为uWSGI只能起一台机子的服务,当访问量过大时,需要开多台机子,这个时候就需要nginx进行分配了

2  安装环境与迁移项目

2.1  项目内容

我们仅仅为了走一遍项目部署的具体流程,我就不使用我之前的项目了,直接在Ubuntu中新建一个项目

  • 使用虚拟机模拟服务器,虚拟机的使用方式在这里有写 附录三 虚拟机的使用_Suyuoa的博客-CSDN博客
  • 在windows上无法安装uwsgi,在这里有验证 附录二 windows上直接安装uwsgi(不可行)_Suyuoa的博客-CSDN博客_uwsgi windows

我们这里就用安装django与创建一个新的django项目替代

像换pip源,安装pip3这些操作我就不在这里赘述了

项目里只有一个路由和一个视图

2.2  项目配置

修改setting.py中的一些内容

2.2.1  DEBUG

将DEBUG改成False

将DEBUG改为False后,静态文件就无法正常加载了,可以通过127.0.0.1/admin进行测试,发现已经不是原来的样子了,我们在最后可以让静态文件在nginx中加载

2.2.2  STATIC_ROOT

为了可以在nginx中进行加载,我们现在setting.py中添加一个新的变量 STATIC_ROOT,这个变量的值是你要储存静态文件的绝对路径,这个文件夹一般命名为 项目名_static,添加新的变量 STATIC_ROOT

  • 不需要提前创建文件夹

之后输入在manage.py处打开终端,输入 python manage.py collectstatic

  • 每改动一次静态文件,当你想让其生效的时候都需要重新执行python manage.py collectstatic,如果你只是想改动个别几个已经存在的文件,将新改动的文件名命名为与之前一样的文件名就可以了

会提示静态文件已经复制进去了,我当前自己写的路由没有用到静态文件,现在复制的全都是django的内置静态文件,我们打开看一下发现都是admin这个路由的内容

2.2.3  ALLOWED_HOST

ALLOWED_HOST改为域名或者使用的公网IP,我们这里都没有。如果只是本机用,就写127.0.0.1就行了,如果是内网用就写你本机192的那个IP就行了

这里如果什么都不加,到后面uwsgi的时候有可能前端会显示400

3  uWSGI

如果仅使用uWSGI,那么浏览器,uWSGI,Django的关系是这样的

3.1  安装uWSGI

uwsgi是一个python的库,使用pip install uwsgi直接安装会出问题

可能跟Ubuntu的版本有关,我当前Ubuntu是22

我们把包下载下来,然后使用python setup.py develop来搞

发现还是不行,我们使用conda安装,参考链接 Exception: you need a C compiler to build uWSGI_CV_William的博客-CSDN博客

这样uWSGI就安装完毕了

3.2  配置uWSGI

在项目路径下的项目同名文件夹下创建uwsgi.ini

之后写入如下内容,这些是uwsgi最简单的配置项,官网有uwsgi的所有配置项,有兴趣可以看一下 uWSGI选项 — uWSGI 2.0 文档

  • http是部署的IP与端口,这里写127.0.0.1后,如果settings.py中的ALLOW_HOST有你当前的IP,那么别的机子访问你当前的IP也是可以的
  • chdir是项目的绝对路径
  • wsgi-file是项目同名文件夹下的wsgi.py文件
  • process 最大进程个数,设置的值会与你当前机器的cpu核个数取最小值,所以写多了没事
  • threads 最大线程个数,这个的值根据不同的任务有不同的要求,首先根据你的同时访问用户数量来看,process*threads 应该大于等于你的访问用户数量,当然也和服务器性能有关,线程数越大对服务器要求的性能就越高
  • pidfile pid文件名称,uwsgi开启服务后会将主进程的信息写在这个文件中
  • daemonize 日志文件名称,开启服务后一些运行的信息会写在日志中
  • master 是否开启主进程管理模式

3.3  启动 uWSGI

cd到uWSGI配置文件目录,输入 uwsgi --ini uwsgi.ini

  • 注意环境中一定要安装uwsgi

运行过后会自动生成uwsgi.log与uwsgi.pid

可以使用ps -ef |grep uwsgi 来看一下开没开,下面这样就是开了

3.4  停止 uWSGI

当你想关闭的时候输入 uwsgi --stop uwsgi.pid 就可以关闭了

可以使用ps -ef |grep uwsgi 来看一下开没开,下面这样就是关了

关闭会使用到uwsgi.pid文件,文件中的内容是uwsgi的主进程,有时这个数会错导致关不上,到时候用ps看一下,然后给uwsgi都kill掉就关了

如果已经打开了,这个时候用浏览器访问你指定的路由已经可以访问了

所有的日志都会在uwsgi.log中,如果项目代码有任何修改并且你想生效的话需要重新启动uwsgi

4  nginx

启动nginx的目的是使用多个uWSGI,浏览器,nginx,uWSGI,Django的关系是这样的

nginx与uWSGI之间可以使用uwsgi协议或HTTP协议,uwsgi协议是二进制协议,效率上要比HTTP高,所以一般我们使用uwsgi协议

4.1  安装nginx

sudo apt install nginx

  • 这个是相当于在linux中安装一个软件,与你当前的环境没有关系

安装成功后输入 nginx -v可以查看nginx的版本

4.2  配置nginx

4.2.1  基础配置

nginx的配置文件在 /etc/nginx/sites-available 中,这个default就是默认配置文件

  • nginx中有sites-available与sites-enabled,我们一般在sites-available中进行修改,修改后重新运行nginx,可以使site-enabled与sites-available中正在使用的配置文件相同

我们可以通过浏览器访问127.0.0.1:80,会出现这个页面,这个页面的配置文件,就是上面的default

  • 浏览器访问80端口会自动隐藏,我们看url中如果没有端口,那么实际上端口都是默认的80

双击打开default可以看到default的全貌

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	# SSL configuration
	#
	# listen 443 ssl default_server;
	# listen [::]:443 ssl default_server;
	#
	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
	}

	# pass PHP scripts to FastCGI server
	#
	#location ~ \.php$ {
	#	include snippets/fastcgi-php.conf;
	#
	#	# With php-fpm (or other unix sockets):
	#	fastcgi_pass unix:/run/php/php7.4-fpm.sock;
	#	# With php-cgi (or other tcp sockets):
	#	fastcgi_pass 127.0.0.1:9000;
	#}

	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
	#	deny all;
	#}
}


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#	listen 80;
#	listen [::]:80;
#
#	server_name example.com;
#
#	root /var/www/example.com;
#	index index.html;
#
#	location / {
#		try_files $uri $uri/ =404;
#	}
#}

当前这个是80端口的配置,我们先不要在上面直接改,复制一份搞个备份

然后再到default上进行修改,首先删掉所有注释(只是看起来比较碍眼,已经有备份了,注释删掉也无所谓了)

之后在server中加入两组值,然后把try_files这一行注释掉

  • uwsgi_pass是你输入80端口后自动给你重定向到那个地址,这里写127.0.0.1后,如果settings.py中的ALLOW_HOST有你当前的IP,那么别的机子访问你当前的IP也是可以的
  • include是引用的文件,引用/etc/nginx/uwsgi_params这个文件,这个文件安装nginx后就自带的
  • try_files是将路由搞成一个文件,他尝试去在上面的root中找这个文件,如果没找到就给你404,我们是不希望nginx找文件的,所以屏蔽掉try_files

可以用sudo nginx -t 检测配置文件的语法有没有问题,如果语法没有问题会这样显示

nginx的配置并非只有上面提到的default,nginx包含内容较多,遇到什么问题要具体情况具体分析

搞完上面哪些配置你的nginx就可以运行了

4.2.2  静态文件配置

添加location /static并在其中中加入root,指定root的路径为在项目配置中 STATIC_ROOT的路径(static前一级)

之后修改 /etc/nginx/nginx.conf 中的user,将其改为你当前的用户名

4.3  启动nginx

修改nginx配置后,必须重启nginx才能生效

  • 如果未对nginx进行修改,那么只需要重新启动uwsgi就可以了

启动 sudo /etc/init.d/nginx start

停止 sudo /etc/init.d/nginx stop

重启 sudo /etc/init.d/nginx restart

  • 在Ubuntu中也可以输入 sudo service nginx start|stop|restart 来启动,停止,重启

我们平时就直接用restart启动了,restart可以在未启动的时候启动

如果我们使用nginx并且想让nginx与uWSGI的通信协议为uwsgi,那么需要在uwsgi.ini中的http改为socket

  • 改完之后需要重启uWSGI

socket启动uwsgi与http启动uwsgi的进程数是不一样的,http一共4个进程,socket一共3个进程

这个时候用浏览器直接访问 127.0.0.1/hello_world就可以看到我们的页面了

  • 不给端口浏览器默认访问80端口

在响应头中可以看到服务信息

5  常见错误

首先查看日志

在 /etc/nginx/nginx.conf 中有写nginx的两个日志的保存位置

  • 异常信息 /var/log/nginx/error.log
  • 正常访问信息 /var/log/nginx/access.log

uwsgi的日志我们之前提到过,是uwsgi.log

  • 访问127.0.0.1:80,响应502,表示nginx反向代理配置成功,但是uWSGI未启动
  • 访问127.0.0.1:80/url,响应404,nginx配置未禁止try_files或者路由不对
  • 只开uWSGI时就访问不到,检查uwsgi.ini是否用了http,如果仅用uWSGI使用socket是访问不了的
  • 开uWSGI前端显示400,检查setting.py中的ALLOWED_HOST是否有你当前的地址 uWSGI启动后,前端出现400 Bad Request_gymaisyl的博客-CSDN博客
  • nginx开后无法访问静态文件,总的来讲是nginx权限不够,检查 /etc/nginx/nginx.conf 的user是否为当前的用户 Django项目部署Nginx后静态文件报403状态码_陈大憨的博客-CSDN博客

6  其他

6.1  自定义错误码页面

  • 自定义错误码页面一定要将settings.py中的debug改为False

我们现在的404是这样的

感觉不是很好看,我们可以自己搞一个html,放在模板层中,然后将其命名为404.html

重新启动服务后发现已经换成了我们自定义的页面

除了404之外,400,403,500都可以定制,但我没试过

6.2  邮件告警

  • 需要将settings.py中的DEBUG改为False

设置一下django邮箱,不了解的可以看一下这个 30.django发送邮件_Suyuoa的博客-CSDN博客_django 发送邮件

之后加入AMDINS(给谁发),SERVER_EMAIL(email配置的邮箱)

  • ADMINS是一个列表,里面可以有多个元组,也就是可以给很多人发。元组的第一个元素是昵称,第二个是元素是邮箱

加入这些配置之后重新启动,之后在网站遇到问题后就自动给你发邮件了

6.2.1  屏蔽post信息

sensitive_post_parameters 是过滤post传参的装饰器

比如现在我有这样一个视图

由于有password / 0 所以肯定会报错,我们用postman发一下

邮件会告诉你详细的信息,包含POST提交了什么,现在我不想让邮件中包含username与password

那么我们就要使用到上面的装饰器 sensitive_post_parameters

重新启动服务后再次用postman发送,发现邮箱里的post中的username与password信息被屏蔽掉了

6.2.2  屏蔽其他变量

你可以加上 sensitive_variables 装饰器来屏蔽一些变量,如果该视图有多个装饰器,需要将 sensitive_variables放在最上面

  • 可以不给参数,不给参数就是屏蔽该视图中的所有局部变量

这个就是从数据库中拿出来的信息,这个我就先不做例子了,其实你如果想到不让收件人看直接加上就行了,完事儿你给你自己发一下看看,满意不满意就行了,后面我如果用到了会再补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

官方更新:基于VRA Tokenomics 社区常见问题解答

您好 Verasity 社区, 我们最近通过 Medium 发布了最新的代币经济学,您可以在此处阅读。 我们引入了一些新概念来促进我们作为产品的增长,例如我们的企业收购基金,我们还澄清了我们的流通和总供应量。 在我们的代币经济学文章发布…

SpringBoot概念、创建、运行、Spring Boot 配置文件

Spring Boot 就是 Spring 框架的脚⼿架,它就是为了快速开发 Spring 框架⽽诞⽣的。 1.Spring Boot 优点 快速集成框架,Spring Boot 提供了启动添加依赖的功能,⽤于秒级集成各种框架。内置运⾏容器,⽆需配置 Tomcat 等 Web 容器…

c++11 标准模板(STL)(std::deque)(五)

定义于头文件 <deque> std::deque 迭代器 返回指向容器第一个元素的迭代器 std::deque<T,Allocator>::begin, std::deque<T,Allocator>::cbegin iterator begin(); (C11 前) iterator begin() noexcept; (C11 起) const_iterator begin() const; (C11 前)…

Spring简介及IOC使用

Spring介绍 官网&#xff1a;https://spring.io/ Spring是一个对象的容器&#xff0c;负责管理对象的创建、销毁&#xff0c;以及对象的属性注入&#xff0c;对象的之间的依赖关系。 Spring可以整合其它框架&#xff0c;他基于IOC和AOP来构架多层JavaEE系统&#xff0c;以帮助分…

linux常用命令(六)- 文件属性查看

查看文件类型 - file file命令用于辨识文件类型。 语法 file [-bcvz] [文件或目录...]b&#xff1a;列出辨识结果时&#xff0c;不显示文件名称。c&#xff1a;详细显示指令执行过程&#xff0c;便于排错或分析程序执行的情形。v&#xff1a;显示版本信息。z&#xff1a;尝试…

基于麻雀搜索算法(SSA)优化长短期记忆神经网络参数SSA-LSTM冷、热、电负荷预测(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

第三十六讲:无线AP胖AP模式配置与管理

胖AP(Fat AP)配置一个开放式WLAN非常方便&#xff0c;需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置&#xff0c;保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN&#xff0c;广播SSID,启用VAP&#xff0c;若无其他DHCP服务器的话&#x…

万物皆有裂痕,那是光进来的地方|2022年个人总结

前两天朋友说要做个视频&#xff0c;记录下2022年的不平凡。突然想到今年是否要写年终总结呢&#xff1f;反复挣扎后&#xff0c;感觉还是应该写个总结&#xff0c;一则记录这一年的不平凡&#xff0c;二则检视这一年的生活与工作状态。- 1 - 工作的危与机2022年对所有的人来说…

Cocos Creator 常见错误排查方法

Cocos Creator 新手开发的时候经常会遇到一些错误不知道如何解决&#xff0c;今天把这些错误总结一下&#xff0c;下次遇到的时候&#xff0c;自己知道如何分析。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c;也有一些正在从…

【bp靶场portswigger-服务端2】身份认证漏洞-16个实验(全)

目录 一、身份验证定义 1、三个身份验证因素 2、身份验证和授权 3、身份验证漏洞的产生 4、实验的字典 二、基于密码的登录中的漏洞 1、强制策略 2、用户枚举 3、有缺陷的强力保护 实验1&#xff1a;通过不同响应的用户名枚举 实验4&#xff1a;通过细微不同的响应进…

【Web前端】一文带你吃透CSS(完结篇)

前端学习路线小总结&#xff1a; 基础入门&#xff1a;HTML CSS JavaScript 三大主流框架&#xff1a;VUE REACT Angular 深入学习&#xff1a;小程序 Node jQuery TypeScript 前端工程化 文章目录一.CSS布局-对齐1.水平对齐1.1元素居中对齐1.2文本居中对齐1.3图片居中对齐1.4使…

九章 - 2022年度文章大合集

今天&#xff0c;是九章成立的第639天&#xff0c;元旦节。九章全体员工在这里祝大家&#xff0c;2023年元旦快乐&#xff01;2022年&#xff0c;《九章智驾》这个账号里共发布了87篇原创深度内容&#xff0c;内容覆盖了自动驾驶的各个领域&#xff0c;有一直关注我们的读者的深…

怎么录屏?如何录制足球比赛直播视频?

等了多时&#xff0c;热血的足球赛事终于要来了。 不知道今年你看好哪支球队。皇马&#xff1f;曼联&#xff1f;拜仁&#xff1f; 虽然今年不用熬夜&#xff0c;但总是怕加班错过笔试。 今天给大家送一个安利神器&#xff0c;让你完美记录足球赛事精彩瞬间&#xff01; 如果您…

Eclipse JNI Demo --【Linux】

目录 1、建工程 2、建java类 3、生成头文件 4、CPP实现 5、配置及编译 6、验证 1、建工程 先创建一个android标准工程&#xff1a; 2、建java类 在com.phuket.tour.studio包下&#xff0c;建立一个Java文件Mp3Encoder.java&#xff0c;并且在文件中新增一个方法encode&…

MySQL数据库服务器的优化步骤

在数据库调优中&#xff0c;我们的目标就是响应时间更快&#xff0c; 吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式。 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xff1f; 这里把思考的流程整理成下面这张图。整个流…

Docker环境下配置Es自定义分词器(ik)

分词 一个 tokenizer&#xff08;分词器&#xff09;接收一个字符流&#xff0c;将之分割为独立的 tokens&#xff08;词元&#xff0c;通常是独立 的单词&#xff09;&#xff0c;然后输出 tokens 流。 例如&#xff0c;whitespace tokenizer 遇到空白字符时分割文本。它会将…

路由 OSPF简介、OSPF与其它路由的区别、OSPF区域概念、OSPF路由代名词IR、BR、ABR、ASBR概念简介。

4.2.0 路由 OSPF&#xff08;简介、OSPF与静态、OSPF区域概念、OSPF路由代名词&#xff09; 目录OSPF简介OSPF与其它路由的区别OSPF区域概念OSPF路由代名词概念OSPF简介 OSPF 开放式最短路径优先&#xff08;Open Shortest Path First&#xff09; OSPF动态路由协议属于内部网…

【C语言 数据结构】二叉树

文章目录二叉树一、二叉树的概念二、二叉树的基本形态三、二叉树的性质四、特殊的二叉树五、二叉树的存储结构5.1 顺序5.2 链表5.2.1 二叉链表5.2.1 三叉链表六、二叉树的遍历先序遍历&#xff08;T L R&#xff09;中序遍历&#xff08;L T R&#xff09;后序遍历&#xff08;…

#P05807. 等差数列

Description 小J学习了等差数列&#xff0c;于是他很开心的知道了 123.....1005050. 现在他想知道&#xff0c;对于某个公差为1的等差数列&#xff0c;如果总和为N的话。 有多少个等差数列满足这个条件 Format Input 一行给出整数N N<10^12 Output 一行给出你的结…

【学习】domain adaptation、BERT

文章目录一、domain adaptation领域适应domain shiftdomain adversarial training![在这里插入图片描述](https://img-blog.csdnimg.cn/26ef051b6a6148cbadb2dc6a9067fce2.png)domain generalization二、自监督学习多语言BERT的跨语言能力交叉学科能力用人工数据进行预训练一、…