发表于: 2018-01-20 22:17:48
1 594
今天要做的事情:任务三总结及深度思考,准备小课堂
1.nginx服务器有什么作用?什么叫反向代理?为什么要使用反向代理?
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返 回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
nginx的特点及作用:
十分稳定,CPU使用率低,能够提高性能。
通过动静分离、负载均衡、加权轮询等功能可以减小、分摊服务器的负担,并且集群的特性也大大降低了服务完全中断的风险。
能很好的配合第三方API工作。
2.什么是ssh?如何在linux服务器上从网站下载文件?
SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台-包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
我用过两种:一种通过源(ppa)的方式下载,更新很方便 还有一种:通过wget+解压的方法
视情况不同可以选择不同的方式。
3.如何写shell脚本?尝试自己编写一个简单脚本。
利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:
#!/bin/sh
#comments
Your commands go here
首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。
编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:
chmod +x filename.sh
执行脚本的方法是:
./filename.sh
下面是一个经典的“hello world”例子
#!/bin/sh
#print hello world in the console window
a = "hello world"
echo $a
Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:
variable_name = variable_value
如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:
echo "Hi, $as"
就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:
echo "Hi, ${a}s"
单引号中的变量不会进行变量替换操作。
感觉这完全是另外一种语言了.....我借鉴网上自己写了一个,任务三种用到的,用来统计响应时间的:
#! /bin/sh
echo "task3"
echo "响应脚本测试"
echo "------------------"
echo "访问次数为:"
awk '{print $1}' /usr/local/nginx/logs/access.log|sort|uniq|wc -1
echo "响应时间大于20ms的次数为:"
awk '{print $29}' /usr/local/nginx/logs/access.log|awk '{if($1>0.020)print $1}'|wc -1
echo "响应时间小于20ms的次数为:"
awk '{print $29}' /usr/local/nginx/logs/access.log|awk '{if($1<0.020 && $1>0)print $1}'|wc -1
然后输出结果如下:
root@iZuf662vonj9oka6ex0zxsZ:~# ./task3
./task3: line 1: o: command not found
响应脚本测试
------------------
访问次数为:
111
响应时间大于20ms的次数为:
47
响应时间小于20ms的次数为:
64
这里有点迷的是,linux自动把我的第一行变成o "task3"了,不知道什么原因...
4.tomcat、jetty、resin各容器有什么区别?如何优化这些容器配置?
tomcat:Tomcat服务器是一个免费的开放源代码的Web应用服务器。Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。
jetty是一个开源的servlet容器,它为基于Java的web容器,Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行的Java应用提供网络和web连接。
resin,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发。
优化的办法:
(1)提高JVM栈内存。
到了resin3.1, 需要修改resin.conf,如下配置即可
<jvm-arg>-Xmx2048m</jvm-arg>
<jvm-arg>-Xms1024m</jvm-arg>
<jvm-arg>-Xss1m</jvm-arg>
<jvm-arg>-Xdebug</jvm-arg>
<jvm-arg>-Dcom.sun.management.jmxremote</jvm-arg>
如果线上部署的Resin是 4.0.15则在resin.xml中增加如下配置节点:
<server-default>
<jvm-arg>-Xms1024m</jvm-arg>
<jvm-arg>-Xmx1024m</jvm-arg>
<jvm-arg>-Xmn256m</jvm-arg>
<jvm-arg>-XX:PermSize=128m</jvm-arg>
<jvm-arg>-XX:MaxPermSize=256m</jvm-arg>
<thread-max>1024</thread-max>
<socket-timeout>30s</socket-timeout>
<keepalive-max>512</keepalive-max>
<keepalive-timeout>60s</keepalive-timeout>
</server-default>
(2)设置线程池。
线程池指定Web请求负载的数量,因此,为获得更好的性能这部分应小心处理。可以通过调整连接器属 性“maxThreads”完成设置。maxThreads的值应该根据流量的大小,如果值过低,将有没有足够的线程来处理所有的请求,请求将进入等待状态,只有当一个的处理线程释放后才被处理;如果设置的太大,容器的启动将花费更多时间。
<Connector port="xxxx"
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
maxThreads值设定为“250”,这指定可以由服务器处理的并发请求的最大数量。如果没有指定,这个属性的默认值为“200”。任何多出的并发请求将收到“拒绝连接”的错误提示,直到另一个处理请求进程被释放
maxSpareThreads Tomcat连接器的最大空闲 socket(套接字) 线程数
minSpareThreads Tomcat连接器的最小空闲 socket(套接字) 线程数
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
enableLookups
是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
可以由ip查到域名
compression
当文件的大小大于等于500bytes时才会压缩。如果当文件达到了大小但是却没有被压缩,那么设置属性compression="on"。否则默认设置是“off”。
compression 打开压缩功能
compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType 压缩类型
connectionTimeout 连接超时
connectionTimeout
网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads )
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
redirectPort 端口:配置好SSL之后可以用过https协议通信
disableUploadTimeout上传时是否使用超时机制
除了任务三下面的深度思考,还有上次任务二留下来的几个问题:
21.如果有多个WEB服务,都把WEB服务都配置在一个容器里,还是一个WEB配置一个容器,他们的差别是什么,你觉得哪种方式更好?
我觉得应该一个WEB配置一个容器比较好,这样子容易实现集群管理,减少不必要的资源消耗。
23.域名和端口号是怎么对应起来的?应该通过域名访问吗,从域名服务商到服务器的流程是怎么样的?
IP,(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给网络上使用IP协议的设备的数字标签。常见的IP地址分为IPv4与IPv6两大类。目前我们使用的都是IPv4的地址,IPv4地址由32位二进制数组成,常以XXX.XXX.XXX.XXX形式表现。(以上参考于维基百科)通俗点说就是IP地址是用于标识出网络上的每一台主机的编号。有这个编号,网络上的其他主机才能在互联网浩若繁星的主机中定位到唯一的一台主机。
域名和IP地址之间有区别也有联系,域名通常会和IP进行绑定,通过访问域名来访问网络上的主机的服务。IP地址通常指的是网络中的主机,而域名则通常表示一个网站,一个域名可以绑定到多个ip上,多个域名也可以绑定到一个ip上。
端口,(英语:port),主要分为物理端口和逻辑端口。我们一般说的都是逻辑端口,用于区分不同的服务。因为网络中一台主机只有一个IP,但是一个主机可以提供多个服务,端口号就用于区分一个主机上的不同服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口,标识是从0~65535.
端口号分为公认端口(0~1023)、注册端口(1024~49151)和动态端口(49152~65535)。我们自己的服务一般都绑定在注册端口上。
客户端输入域名,通过DNS将域名解析成为服务器ip,找到代理服务器,因为http协议服务所占用的端口默认为80端口,所以会访问服务器的80端口,然后再通过代理服务器将请求转发到不同的服务器以及端口中。
24.Nginx的作用是什么,在WEB服务前端配置Nginx的好处是什么,除了Nginx,还有别的反向代理服务器吗?
Nginx作用:见第一个问题。
其他反向代理服务器:Squid,lighttpd,我去仔细了解了一下,主要区别是nginx采用的是异步传输的方法,功能更好:
假设用户执行一个上传文件操作,因为用户网速又比较慢,因此需要花半个小时才能把文件传到服务器。squid的同步代理在用户开始上传后就和后台建立了连接,半小时后文件上传结束,由此可见,后台服务器连接保持了半个小时;而nginx异步代理就是先将此文件收到nginx上,因此仅仅是nginx和用户保持了半小时连接,后台服务器在这半小时内没有为这个请求开启连接,半小时后用户上传结束,nginx才将上传内容发到后台,nginx和后台之间的带宽是很充裕的,所以只花了一秒钟就将请求发送到了后台,由此可见,后台服务器连接保持了一秒。同步传输花了后台服务器半个小时,异步传输只花一秒,可见优化程度很大。
30.在Linux服务器上,有哪些工具是可以测试接口的,怎么用Wget或者是Curl分别发送Rest的四种请求?
cURL 是很方便的Rest客戶端,可以很方便的完成许多Rest API测试的需求,甚至,如果是需要先登入或认证的rest api,也可以進行测试,利用curl指令,可以送出HTTP GET, POST, PUT, DELETE, 也可以改變 HTTP header來滿足使用REST API需要的特定條件。
curl的参数很多,這邊僅列出目前测试REST时常用到的:
-X/--request [GET|POST|PUT|DELETE|…] 使用指定的http method發出 http request
-H/--header 設定request裡的header
-i/--include 顯示response的header
-d/--data 設定 http parameters
-v/--verbose 輸出比較多的訊息
-u/--user 使用者帳號、密碼
-b/--cookie cookie
GET/POST/PUT/DELETE使用方式
-X 后面加 http method,例如:
curl -X GET “http://www.rest.com/api/users”
curl -X POST “http://www.rest.com/api/users”
curl -X PUT “http://www.rest.com/api/users”
curl -X DELETE “http://www.rest.com/api/users”
url要加引号也可以,不加引号也可以,如果有非纯英文字或数字外的字元,不加引号可能会有问题,如果是网码过的url,也要加上引号。
嘛,只是了解了一下,做任务根本没有用到,用到再学吧。
31.内网IP和外网IP的区别是什么,在服务器上测试接口是否被防火墙屏蔽的时候,该用内网IP检测,还是该用外网IP检测?
内网IP和外网IP是相对的,举个例子,如果我用路由器,那么路由器下的IP比如192.168.1.101就是内网IP,而路由器分配的100.64.0.30这个IP是外网IP。外部只能访问到路由器,如果不用NAT技术(NAT中文名字叫网络地址翻译,简单讲就是数据经过路由器时,路由器充当内外网的翻译,通过修改数据包的源地址或目的地址使内外网能互通,其中,端口映射属于一种NAT实现方式)就访问不到192.168.1.101这个IP。
至于第二个问题,因为我用的服务器是阿里云的,有专门的阿里云安全组配置,我看他的设置都是针对外网IP的。
32.端口是什么含义,怎么判断一个端口是否被占用了,如何判断一个端口是否被防火墙拦截,怎么用Telnet判断端口号是否打开?
至于这个问题我是遇到过的,用lsof -i:xxxx(端口号)的方法可以查看端口号是否被占用,常用的端口有22(SSH),80(浏览器默认),resin等一些浏览器默认的端口是8080,mysql3306,这些配置好后可以关闭了 用不到。
至于后面两种,因为有专门的阿里云安全组配置,所以我在任务中没有遇到过这种问题,感觉也不太需要....
33.WEB服务器通常要配置哪几个端口,如果一台服务器上有多个不同的WEB服务,该怎么规划端口的使用,修真院的端口分配是怎么样的?
80端口肯定是需要配置的,因为这是浏览器的默认端口。如果有不同的WEB服务,比如resin就可以在resin.properties这个文件中添加端口数量。它默认自带有一个端口6600。这部分的知识点涉及到nginx反向代理中的加权轮询、均衡负载等知识点,还要用到共享session,我打算在以后的任务中继续深入。
明天要做的事情:继续准备小课堂,然后看看Spring实战中关于MVC的部分....感觉任务二做的还是太快了,基础掌握的没有任务一扎实。
今天遇到的问题:发现Spring Template很多细节都忘记了,需要重新复习。
今天的收获:学习了很多理论性知识。
评论