每日分享
Victory is in having done your best. If you’ve done your best, you’ve won.
胜利就是尽力而为。 如果你做得最好,你就赢了。
小闫语录:
成功的意义不在终点的那一刻,而是这一路上的经历。尽你所能,无怨无悔,虽未到达终点,但是属于你自己的胜利之门却已打开。不求最好,因为没有绝对的最好,我们能做的就是尽力而为,多年以后的回想,尽是释然。
项目部署(一)
1.传统项目生命周期
调研阶段-->设计阶段-->开发阶段-->测试阶段-->运营阶段
关键点:阶段间有前后关系依赖;阶段间项目的推进是由文档来主导的;理想化的生命周期和开发模型。
1.1调研阶段
做市场调研,通过广告投放、数据挖掘数据清洗、爬虫等方式,找到市场上大众的兴趣点,做出迎合大众的项目方案。提供给领导一份可行的方案报告。
1.2设计阶段
将方案可视化,同各部门的负责人共同讨论,研究出产品的需求文档与项目里程表。
1.3开发阶段
基于产品需求文档的功能进行开发,运维团队搭建开发相关环境,后端开发人员进行开发,其他部门参与,保证阶段项目正常运行。
1.4测试阶段
为了保证项目功能完善,由测试团队为主,运维和开发人员为辅,共同完成测试。不断的找bug,由开发人员改bug,反反复复,直至项目功能符合要求。保证产品的阶段功能质量。
1.5运营阶段
为了完成项目部署和项目的运行维护,由运维团队为主,开发、产品团队为辅共同参与完成此阶段。当项目终止,功能迭代等时候,此阶段就结束了。在这一阶段分为前置部署和实际部署阶段。
2.新型项目周期
设计-->开发-->修改测试-->预生产运营阶段-->正式发布-->功能迭代-->运营监控-->设计-->开发......(一直循环)
最重要的就是团队直接的协作和沟通。
四个圈串在一起代表子功能的完整周期。
单个圈代表岗位的工作内容。
2.1关键点
2.1.1软件组织
一个产品被拆分成了非常多的子功能。每个子功能都在不断的进行上面的循环,一个子功能接一个子功能,保证整个团队所有阶段人员都在开发当中。使得项目的开发更加高效。
2.1.2团队组织
最重要的是高效的协作和沟通,每个阶段没有明确的界限,在出现问题,或需求不明的时候,随时与上一阶段的人员进行沟通。共同保证项目每个子功能以及项目整体有效的运作下去。
3项目部署
3.1部署方案设计
1.分析项目的产品需求文档,获取项目主旨,定好部署方案的方向。梳理网站的目标架构。
2.分析项目开发文档,按照功能边界,设计部署的节点。Nginx的静态服务器等、Nginx+Django共同的动态业务服务器、redis、MySQL、FastDFS这些每个步骤都是一个节点。根据部署节点,去互联网上根据业务需求梳理各种解决方案。
大公司的一些方案会给小公司提供很好的解决方法,我们可以去借鉴,站在巨人的肩膀上。
3.整合上面梳理的解决方案,结合步骤2确定的结点,确定初版部署方案 。但是此方案还是很粗糙。
4.根据实际的公司业务情况,对初版部署方案进行优化调整。
3.2部署环境
个人开发环境:在自己的电脑上开发被分配的项目功能子模块,因为我们团队中每个人的电脑无论是系统,或者编译器等环境都不同,所以我们只完成领导安排的具体内容即可。
公司开发环境:我们使用公司内部的服务器(环境与线上的服务器环境就完全一致了)进行项目子模块间的功能联调,完成项目阶段的开发和调试。
公司开发环境一定要和线上环境一致
项目测试开发环境:项目产品质量保证。
项目预发布环境:项目产品质量保证,是项目上线前的最后一次测试。
项目线上环境:部署加维护。
每个环境之间彼此隔离。
每个环境下的部署方案都是一样的。
注意:我们重点关注在于个人开发环境以及公司开发环境。
4.Nginx快速入门
重点在Nginx配置结构和访问原理。在此基础上进行相关的应用。
4.1简介
Nginx(发音同 engine x)是一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电 子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·赛 索耶夫)所开发,最初供俄国大型网站Rambler.ru及搜寻引擎Rambler使用
我们可以使用Nginx来做我们的web服务、反向代理服务器,这也是最常见的功能。他还可以做缓存服务器、邮件服务器。
4.2特点
Nginx的特点,最重要的就是高并发量,高效的处理相关业务。它相比于其他web来说,内存消耗较少。它还简单稳定,简单在于其配置简单,还能持续运行不出问题。它还有值得注意的一点,那就是模块化程度高,这也就回答了为什么内存消耗少和稳定。其他的一些特点就是低成本和支持多系统等。但是它并不是全是优点,其善于处理静态文件,对于动态页面相对于其他重量级的web软件能力就差了一些了。
4.3扩展内容-多路I/O转接服务器三种模型的简单对比
原贴见https://www.cnblogs.com/rainbow1122/p/7881561.html,文章有详细的代码及解释。
4.3.1select
select能监听的文件描述符个数是有限的,这是受到了FD_SETSIZE的限制,一般是1024。文件描述符是一个非负的整数,我们在打开本地的文件或者新建一个文件时,内核都会返回一个文件描述符。在读写文件的时候,用文件描述符来指定带待读写的文件。基于1024的限制,我们视情况进行选择。客户端少的时候,选用此模型;客户端链接过多的时候,select因为采用的是轮询的模型,这样会降低服务器的响应效率,我们就该考虑换一种模型了。
4.3.2poll
poll模型和select其实没有多大的区别。poll在管理多个描述符的时候采用的也是轮询,根据描述符的状态进行相关处理。它也并不是和select完全一致,它没有最大文件描述符数量的限制,你是不是想这样使用就放心了?但是根据测试,文件描述符数量过大时,它的性能也会下降。
poll和select有一个共同的缺点,那就是包含大量的文件描述符的数组在用户态和内核的地址空间之间来回的被复制,它不管这些文件描述符是否就绪,在文件描述符数量不断上升的时候,它的开销是呈现线性增长的。
4.3.3epoll
epoll是select和poll的增强版本。当程序在大量并发连接中,只有少量活跃的情况下,epoll可以有效的提高系统CPU的使用率。因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。目前epell是linux大规模并发网络程序中的热门首选模型。
epoll是将就绪的文件描述符放在了一个队列中。不用像poll一样整个遍历了。
epoll除了提供select/poll那种IO事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epollwait/epollepollwait/epoll_pwait的调用,提高应用程序效率。
4.4软件安装
sudo apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev apt-get install nginx -y
注意:如果软件安装过程中,由于远程仓库安全限制方面的原因导致无法安装成功,使用 --allow-unauthenticated 参数
4.5服务启动命令
systemctl start|stop|restart|reload nginx *** nginx -t 检查配置文件 *** nginx -s stop|reload 停止|重载 nginx 启动
4.6其他命令
查看服务的端口信息:
netstat -tnulp
4.7目录结构
前提:使用apt-get命令安装的Nginx,其他方式安装的不一定是下面的命令结构
家目录: /etc/nginx
执行文件: /usr/sbin/nginx
日志目录: /var/log/nginx
启动文件: /etc/init.d/nginx
web目录:
/var/www/html/,首页文件是index.nginx-debian.html。
/usr/share/nginx/html/ 首页文件是index.html 。
4.8配置文件
默认文件:/etc/nginx/nginx.conf
其他目录:/etc/nginx/conf.d
重点关注conf.d因为sites-available是新版本新加的。
文件结构:
全局配置段 http配置段 server配置段 # 项目或者应用的网站 location配置段 # 网站里面的文件url
4.8.1url格式
协议:// 网站地址:端口 (/)路径地址 ? 参数
4.8.2Nginx访问原理
浏览器拆分url地址获取相关的请求。分为地址、端口和路径关键字。其中每个请求的目的是根据地址找服务器,根据端口找服务器上面的应用,路径关键字用于location匹配。
4.9配置详解
4.9.1全局配置段
user
指的是worker_processes的用户。
worker_processes
进行增大并发连接数的处理,跟cpu保持一致,比如8核就是8个。默认值是auto。
pid
进程号
events
定义事件相关的属性。
worker_connections
一个进程允许处理的最大连接数,默认是768
use
定义使用的内核模型,比如select/poll/epoll
4.9.2http配置段
sendfile
文件传输模式
gzip
gzip压缩输出模式
tcp_nodelay
防止网络阻塞
tcp_nopush
防止网络阻塞
keepalive_timeout
长连接超时时间,单位是s
include
将相关的配置文件内容导入到当前文件中。
4.9.3server配置段
Nginx的配置文件中要以封号;结尾,而且括号在英文状态下输入。
配置详解:
格式: server { listen 端口; server name 主机名; root 项目代码目录; index 项目首页; return 指定状态码返回值; }
4.9.4location配置
location optional_modifier location_match { ... }
optional_modifier
是匹配条件
location_match
是匹配的样式
{}
是要执行的操作。
4.9.5匹配
下面的优先级为1
=/路径
精确匹配
下面的优先级为2
^~
优先匹配
下面的优先级为3
~
敏感,也可以使用 !~*
!~
不敏感,也可以使用 ~*
不敏感的情况下可以忽略大小写
下面的优先级为4
空/
通用匹配
匹配样式
针对的是url里面路径的部分。
4.9.6location 常见动作
http://Ethanyannote.com/other
$uri
指的是/other,服务器会先去找other文件,找不到的话将other当成目录,重定向到/other/,去该目录下找默认文件。
location实践1:
root@itcast:/etc/nginx/conf.d# cat test.conf server{ listen 99; location / { root /nihao/nibuhao; index index.html; try_files $uri $uri/ =404; } }
location实践2: 网站质量页面
root@itcast:/etc/nginx/conf.d# cat /data/backup/status.conf server{ listen 99; location /nginx-status { stub_status on; allow 192.168.8.15; deny all; } }
location实践3:上传服务器
root@itcast:/etc/nginx/conf.d# cat upload.conf server{ listen 99; location /upload { alias /var/www/upload; autoindex on; } }
root VS alias
root@itcast:/etc/nginx/conf.d# cat upload.conf server{ listen 99; location /upload { #alias /var/www/upload; root /var/www; autoindex on; } }
其中alias 相当于$uri 直接去alias指定的目录下请求就可以了,是绝对路径。而root 则是到root指定的目录下的$uri/ 去找,是相对路径。
5.Nginx进阶
5.1反向代理&反向代理
5.1.1代理
正向代理:代替公司内网的客户端去互联网上访问。(相亲的时候,自己的照片)
反向代理:代替公司内网的服务器向互联网提供服务。(相亲的时候,媒婆说的女方形象)
正向代理简单的来说,就是公司内部的客户端无法上网,借助一台服务器去访问互联网。而反向代理就是我们借助一个中间人服务器向外部提供服务。
5.1.2区别
从用途上来讲
正向代理-为局域网客户端向外访问Internet服务。可以使用缓冲特性减少网络使用率。
反向代理-为局域网服务器向外提供Internet服务。可以使用负载平衡提高客户访问量。还可以基于高级URL策略和管理技术对服务进行高质量管控。
从安全性来讲
正向代理-必须采取安全措施确保内网客户端通过它访问外部网站。隐藏客户端的身份。
反向代理-对外提供服务是透明的,客户端并不知道自己访问的是一个代理。隐藏服务端的身份 。
关键配置:
proxy_pass 代理后的地址;
反向代理示例:
root@itcast:/etc/nginx/conf.d# cat proxy.conf server{ listen 99; location / { proxy_pass http://192.168.8.15:999/nilaiya/; } } server { listen 999; location /nilaiya/ { root /ni/laiya; index index.html; try_files $uri $uri/ =404; } }
关键点:
proxy_pass 后面的地址结尾的"/" 很重要
配置示例:
location /html/ { 1 proxy_pass http://proxy.com; 2 proxy_pass http://proxy.com/; } # 请求地址: http://domain.com/html/test.js
结果:
如果是1,由于地址后面没有"/",所以$uri(/html/test.js)作为一个内容和我们的地址拼接在一起
http://proxy.com/html/test.js
如果是2,由于地址后面有"/",所以$uri(/html/test.js)中关键字之后的的内容(/test.js),和代理的地址拼接在一起
http://proxy.com/test.js