首页
留言
友情链接
壁纸
更多
关于
Search
1
dockerfile怎么执行shell脚本(利用tail -f /dev/null命令防止container启动后退出)
4,942 阅读
2
channel常见的异常总结
4,259 阅读
3
支付宝支付配置开发流程
1,403 阅读
4
HTTP 协议中的Content-Encoding
1,251 阅读
5
Laravel底层原理(二) —— 契约(Contracts)
939 阅读
PHP
composer
laravel
swoole
Docker
Linux
Go
随笔
mysql
nginx
Search
标签搜索
gopher
Docker
PHP
dockerfile
通道
go
defer
alipay
支付
git
phpstorm
IDEA
web安全
漏洞
socket
Royal
累计撰写
35
篇文章
累计收到
0
条评论
首页
栏目
PHP
composer
laravel
swoole
Docker
Linux
Go
随笔
mysql
nginx
页面
留言
友情链接
壁纸
关于
搜索到
4
篇与
Linux
的结果
2022-10-11
SSH通过免密登录实现程序远程批量部署
需求最近在部署程序的时候发现,一共三个语言,6台设备,每台设备3个模块,每个模块3种语言,总共6台设备下来要部署54个程序,工作重复繁琐不说,很容易出现漏部署或者错误,想到了使用一键脚本部署程序的方式,把程序的tar包和shell脚本分别通过统一入口放置,在入口处执行脚本,分别把tar包和执行脚本远程发送到对应的机器和对应的模块上去执行,这样就不用一个一个模块上传程序,再操作,因此想到了一种方式ssh免密登录的方式,通过一台机器去连接到其他所有要部署的机器上,把程序传输过去,前提是这些机器必须是在同一网段内,如果是在一个交换机下面,必须是在同一vlan下面。好了废话不多说,接下去第一步实现免密登录。实现免密登录免密登录很简单,网上一搜很容易就能知道怎么做,我们看下过程:客户端生成公私钥此客户端就是我们要统一放置程序的地方,需要部署的机器我们称之为服务端,本地客户端生成公私钥:(一路回车默认即可)ssh-keygen上面这个命令会在用户目录.ssh文件夹下创建公私钥cd ~/.ssh ls上传公钥到服务端我们随机选择一台机器作为服务端,然后把第一步生成的公钥复制一份传到服务端,然后把公钥内容写入到authorized_keys文件内cat id_rsa.pub >authorized_keys可以看到客户端写入到服务器的 id_rsa.pub (公钥)内容。测试下免密登录ssh root@10.21.4.155第一次需要输入yes才能访问!可以看到我们的免密登录功能做好了,剩下的就是怎么把我们的程序,脚本发送过去,批量执行的问题了。实现一键部署我们做了一个ci.sh的一键部署脚本,所有的程序tar包和部署脚本放在了deploy目录,执行ci.sh就可以了#!/bin/bash set -e ####################################################################### # #4、#5、#6的相应模块的调试口ip left2="10.21.4.121" left2_2="10.21.4.122" right2="10.21.4.124" schedule2="10.21.4.123" executor2_5="10.21.4.125" executor2_6="10.21.4.126" executor2_7="10.21.4.127" left3="10.21.4.131" left3_2="10.21.4.132" right3="10.21.4.134" schedule3="10.21.4.133" executor3_5="10.21.4.135" executor3_6="10.21.4.136" executor3_7="10.21.4.137" # 部署的时候指定执行体被复制到板卡的哪个目录 function help_info() { echo "help" } ####################################################################### script_dir=$(cd "$(dirname "$0")"; pwd) script_name=$(basename $0) script_path=$script_dir/$script_name real_script_path=$(readlink -f `which $script_path`) real_script_dir=$(dirname $real_script_path) image_dir=$real_script_dir/deploy wip="30.30.30.23" bip="192.168.1.46" machine_num=0 ip="0.0.0.0" isw=0 isb=0 isdeploy=0 com=0 lange=0 short_opts="b:w:n:i:dc:l:h" ARGS=`getopt -o ${short_opts} -n 'switch.sh' -- "$@"` if [[ $? != 0 ]]; then echo "Terminating..." exit 1 fi #将规范化后的命令行参数分配至位置参数($1,$2,...) eval set -- "${ARGS}" while true do case "$1" in -w) isw=1 wip=$2 shift 2 ;; -b) isb=1 bip=$2 shift 2 ;; -n) machine_num=$2 shift 2 ;; -d) isdeploy=1 shift 1 ;; -c) com=$2 #echo $com shift 2 ;; -l) lange=$2 #echo $lange shift 2 ;; -h) help_info shift 1 ;; --) module=$2 shift 2 break ;; *) echo "Internal error!" exit 1 ;; esac done ############################################################ #处理剩余的无法识别的参数 unknown_arg=$@ for arg in $unknown_arg do echo "unknown argument $arg" done if [[ ${#unknown_arg} -ne 0 ]];then exit 127 fi ############################################################ function deploy() { #将命令行指定的密码机号和模块号映射成具体的模块ip,存放在executor变量中 local executor=$(eval echo \$executor$1_$2) local language=$3 #echo $executor if [[ $language = "java" ]];then ssh -t root@$executor "systemctl stop scheduleClient" if [[ $2 -eq 5 ]];then scp -r $image_dir/java/deploy-java-com$2.sh root@$executor:/home/ scp -r $image_dir/java/de_ht_nt.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-java-com$2.sh && ./deploy-java-com$2.sh" elif [[ $2 -eq 6 ]];then scp -r $image_dir/java/deploy-java-com$2.sh root@$executor:/home/ scp -r $image_dir/java/ub_ng_nt.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-java-com$2.sh && ./deploy-java-com$2.sh" elif [[ $2 -eq 7 ]];then scp -r $image_dir/java/deploy-java-com$2.sh root@$executor:/home/ scp -r $image_dir/java/ce_ht_nt.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-java-com$2.sh && ./deploy-java-com$2.sh" fi ssh -t root@$executor "systemctl start scheduleClient" elif [[ $language = "php" ]];then ssh -t root@$executor "systemctl stop scheduleClient" if [[ $2 -eq 5 ]];then scp -r $image_dir/php/deploy-php-com$2.sh root@$executor:/home/ scp -r $image_dir/php/centos_apache_ci.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-php-com$2.sh && ./deploy-php-com$2.sh" elif [[ $2 -eq 6 ]];then scp -r $image_dir/php/deploy-php-com$2.sh root@$executor:/home/ scp -r $image_dir/php/debian_nginx_ci.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-php-com$2.sh && ./deploy-php-com$2.sh" elif [[ $2 -eq 7 ]];then scp -r $image_dir/php/deploy-php-com$2.sh root@$executor:/home/ scp -r $image_dir/php/ubuntu_apache_ci.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-php-com$2.sh && ./deploy-php-com$2.sh" fi ssh -t root@$executor "systemctl start scheduleClient" elif [[ $language == "python" ]];then ssh -t root@$executor "systemctl stop scheduleClient" if [[ $2 -eq 5 ]];then scp -r $image_dir/python/deploy-python-com$2.sh root@$executor:/home/ scp -r $image_dir/python/cm_un_env_v1.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-python-com$2.sh && ./deploy-python-com$2.sh" elif [[ $2 -eq 6 ]];then scp -r $image_dir/python/deploy-python-com$2.sh root@$executor:/home/ scp -r $image_dir/python/cm_ca_env_v1.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-python-com$2.sh && ./deploy-python-com$2.sh" elif [[ $2 -eq 7 ]];then scp -r $image_dir/python/deploy-python-com$2.sh root@$executor:/home/ scp -r $image_dir/python/cm_dn_env_v1.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-python-com$2.sh && ./deploy-python-com$2.sh" fi ssh -t root@$executor "systemctl start scheduleClient" elif [[ $language -eq 0 ]];then ssh -t root@$executor "systemctl stop scheduleClient" #部署php if [[ $2 -eq 5 ]];then scp -r $image_dir/php/deploy-php-com$2.sh root@$executor:/home/ scp -r $image_dir/php/centos_apache_ci.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-php-com$2.sh && ./deploy-php-com$2.sh" elif [[ $2 -eq 6 ]];then scp -r $image_dir/php/deploy-php-com$2.sh root@$executor:/home/ scp -r $image_dir/php/debian_nginx_ci.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-php-com$2.sh && ./deploy-php-com$2.sh" elif [[ $2 -eq 7 ]];then scp -r $image_dir/php/deploy-php-com$2.sh root@$executor:/home/ scp -r $image_dir/php/ubuntu_apache_ci.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-php-com$2.sh && ./deploy-php-com$2.sh" fi #部署python if [[ $2 -eq 5 ]];then scp -r $image_dir/python/deploy-python-com$2.sh root@$executor:/home/ scp -r $image_dir/python/cm_un_env_v1.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-python-com$2.sh && ./deploy-python-com$2.sh" elif [[ $2 -eq 6 ]];then scp -r $image_dir/python/deploy-python-com$2.sh root@$executor:/home/ scp -r $image_dir/python/cm_ca_env_v1.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-python-com$2.sh && ./deploy-python-com$2.sh" elif [[ $2 -eq 7 ]];then scp -r $image_dir/python/deploy-python-com$2.sh root@$executor:/home/ scp -r $image_dir/python/cm_dn_env_v1.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-python-com$2.sh && ./deploy-python-com$2.sh" fi #部署java if [[ $2 -eq 5 ]];then scp -r $image_dir/java/deploy-java-com$2.sh root@$executor:/home/ scp -r $image_dir/java/de_ht_nt.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-java-com$2.sh && ./deploy-java-com$2.sh" elif [[ $2 -eq 6 ]];then scp -r $image_dir/java/deploy-java-com$2.sh root@$executor:/home/ scp -r $image_dir/java/ub_ng_nt.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-java-com$2.sh && ./deploy-java-com$2.sh" elif [[ $2 -eq 7 ]];then scp -r $image_dir/java/deploy-java-com$2.sh root@$executor:/home/ scp -r $image_dir/java/ce_ht_nt.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod u+x deploy-java-com$2.sh && ./deploy-java-com$2.sh" fi ssh -t root@$executor "systemctl start scheduleClient" fi } #machine_num、com、lange function exe() { local mchi_num=$1 local com_num=$2 local lang=$3 local all_mchi_num="2 3" local mchi_isexist=`expr index "$all_mchi_num" $mchi_num` #isexit为0,不存在,非0存在 local all_com_num="5 6 7" local com_isexist=`expr index "$all_com_num" "$com_num"` if [[ $mchi_num == "all" ]];then for i in $all_mchi_num do for((j=5;j<=7;j++)) do deploy $i $j 0 #echo $i $j done done elif [[ $mchi_isexist -ne 0 && $com_isexist -ne 0 ]];then deploy $mchi_num $com_num $lange #echo $mchi_num $com_num $lange elif [[ $mchi_isexist -ne 0 && $com_num -eq 0 ]];then #echo $mchi_num $com_num $lange deploy $mchi_num 5 $lange deploy $mchi_num 6 $lange deploy $mchi_num 7 $lange fi } function left() { echo "function left" } function sche() { echo "function sche" } function cmn() { local mchi_num=$1 local com_num=$2 local executor=$(eval echo \$executor$1_$2) local left=$(eval echo \$left$1) local left2=$(eval echo \$left$1_2) local schedule=$(eval echo \$schedule$1) local right=$(eval echo \$right$1) local all_mchi_num="2 3" local mchi_num_isexist=`expr index "$all_mchi_num" $mchi_num` #isexit为0,不存在,非0存在 if [[ $mchi_num_isexist -eq 0 ]];then echo "nothing done!!!" exit 127 fi if [[ $com_num -eq 1 ]];then scp -r $image_dir/cmnmod/web_left.tar root@$left:/home/ scp -r $image_dir/cmnmod/web_left.sh root@$left:/home/ ssh -t root@$left "cd /home/ && chmod a+x web_left.sh && ./web_left.sh" elif [[ $com_num -eq 2 ]];then scp -r $image_dir/cmnmod/csm_left.tar root@$left2:/home/ scp -r $image_dir/cmnmod/csm_left.sh root@$left2:/home/ ssh -t root@$left2 "cd /home/ && chmod a+x csm_left.sh && ./csm_left.sh" elif [[ $com_num -eq 3 ]];then scp -r $image_dir/cmnmod/dispatch.tar root@$schedule:/home/ scp -r $image_dir/cmnmod/dispatch.sh root@$schedule:/home/ ssh -t root@$schedule "cd /home/ && chmod a+x dispatch.sh && ./dispatch.sh" elif [[ $com_num -eq 4 ]];then scp -r $image_dir/cmnmod/right.tar root@$right:/home/ scp -r $image_dir/cmnmod/right.sh root@$right:/home/ ssh -t root@$right "cd /home/ && chmod a+x right.sh && ./right.sh" elif [[ $com_num -eq 5 ]];then scp -r $image_dir/cmnmod/executor1.sh root@$executor:/home/ scp -r $image_dir/cmnmod/executor1.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod a+x executor1.sh && ./executor1.sh" elif [[ $com_num -eq 6 ]];then scp -r $image_dir/cmnmod/executor2.sh root@$executor:/home/ scp -r $image_dir/cmnmod/executor2.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod a+x executor2.sh && ./executor2.sh" elif [[ $com_num -eq 7 ]];then scp -r $image_dir/cmnmod/executor3.sh root@$executor:/home/ scp -r $image_dir/cmnmod/executor3.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod a+x executor3.sh && ./executor3.sh" elif [[ $com -eq 0 ]];then scp -r $image_dir/cmnmod/web_left.tar root@$left:/home/ scp -r $image_dir/cmnmod/web_left.sh root@$left:/home/ ssh -t root@$left "cd /home/ && chmod a+x web_left.sh && ./web_left.sh" scp -r $image_dir/cmnmod/csm_left.tar root@$left2:/home/ scp -r $image_dir/cmnmod/csm_left.sh root@$left2:/home/ ssh -t root@$left2 "cd /home/ && chmod a+x csm_left.sh && ./csm_left.sh" scp -r $image_dir/cmnmod/dispatch.tar root@$schedule:/home/ scp -r $image_dir/cmnmod/dispatch.sh root@$schedule:/home/ ssh -t root@$schedule "cd /home/ && chmod a+x dispatch.sh && ./dispatch.sh" scp -r $image_dir/cmnmod/right.tar root@$right:/home/ scp -r $image_dir/cmnmod/right.sh root@$right:/home/ ssh -t root@$right "cd /home/ && chmod a+x right.sh && ./right.sh" executor=$(eval echo \$executor$1_5) scp -r $image_dir/cmnmod/executor1.sh root@$executor:/home/ scp -r $image_dir/cmnmod/executor1.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod a+x executor1.sh && ./executor1.sh" executor=$(eval echo \$executor$1_6) scp -r $image_dir/cmnmod/executor2.sh root@$executor:/home/ scp -r $image_dir/cmnmod/executor2.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod a+x executor2.sh && ./executor2.sh" executor=$(eval echo \$executor$1_7) scp -r $image_dir/cmnmod/executor3.sh root@$executor:/home/ scp -r $image_dir/cmnmod/executor3.tar root@$executor:/home/ ssh -t root@$executor "cd /home/ && chmod a+x executor3.sh && ./executor3.sh" fi } if [[ $module == "left" ]];then echo "function left" elif [[ $module == "right" ]];then echo "right" elif [[ $module == "cmn" ]];then cmn $machine_num $com elif [[ $module == "sch" ]];then echo "sche" elif [[ $module == "exe" ]];then exe $machine_num $com $lange fi
2022年10月11日
196 阅读
0 评论
0 点赞
2022-09-15
记一次线上socket_read的坑
先来看下问题:测试的时候发现三个执行体只有php的执行体所在的板卡CPU占用率居高不下,java和python的则正常,由于服务正在被多人测试,导致登录界面加载很慢,验证码刷新不出等问题。排查:通过排查发现,左括号输出日志,报了8080超时,8080端口为php的服务,而此时拟态大屏在频繁发送数据请求,而右括号服务没有正常响应,导致执行体的客户端一直在等待接收数据,因为执行体作为TCP客户端跟右括号建立通信时需要接收指定的长度才会断开连接,但是使用了socket_set_nonblock非阻塞模式设置,所以如果没有接收到数据就会跳出外层for循环,一直持续4分钟的时间,这样就会导致cpu资源被for循环全部占用。我们先来看下有问题的代码:我们知道socket_read,socket_recv,socket_accept均为默认的阻塞模式,什么是阻塞模式,就是当程序运行到此函数时,会一直读取服务端发来的数据,直到接收满2048个字节的(最大设置65535)长度才会继续往下运行,否则就停留在此处,交由操作系统和底层网络接管程序,一直监听,直到超时为止,所以问题就来了,在这个代码中由于把read设置成了socket_set_nonblock($socket);非阻塞模式,也就是说当运行到这里时,由于右括号服务已经挂了所以不会发送数据,自然而然也不会读到数据,由于又没有超时设置,所以很快就往下继续运行了,跳出本次循环,继续下次循环,这个时间是很短暂的,也就是说当有括号不发数据时,执行体一直在运行for循环,自然而然cpu就飙上去了,直到手动设置的超时4分钟结束才中断连接,也就是这4分钟内其他服务都不能访问!!虽然CPU升高是由于右括号的服务异常,继而导致php执行体服务运行不正常最终导致的,但是我们还是要尽量避免由于别的模块或者服务不正常导致自己的服务出问题继而瘫痪整个系统的情况。要尽量把异常缩小在可控范围内。解决知道问题所在了,那么就很好解决了,可以通过以下方式进行修改:设置为非阻塞模式,并增加读取数据超时时间设置;socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>10, "usec"=>0 ) );记住:一定要注释掉非阻塞改为阻塞,不然即使加了阻塞超时设置也不会生效,因为本质是非阻塞,非阻塞就是死循环。增加多路复用阻塞:假如我一定要用非阻塞设置该怎么办呢?办法很多,那就是在read前面加多路复用阻塞:参数 描述read 指向一组等待可读性检查的套接字write 指向一组等待可写性检查的套接字except 指向一组等待错误检查的套接字tv_sec 用来设置select()的等待时间,秒tv_usec两者组成了 用来设置select()的等待时间,微妙这种方式也很好理解,就相当于在read非阻塞模式前加了阻塞判断,select来监听read的数据。当读取出来数据为空时会一直读,直到10s为止,可以理解为比sleep()更高级点,PHP的socket_select函数也是调用系统的select函数实现的。PHP中socket_select()函数传入的read和write数组是引用传入的,所以每次调用socket_select()后read和write或者except数组中会包含最新的可以使用的资源数组。传入的是要监视的,而调用socket_select后得到的是可以用的。多路是指多个客户端连接socket,复用就是指复用少数几个进程,多路复用本身依然隶属于同步通信方式,只是表现出的结果看起来像异步,这点值得注意.目前多路复用有三种常用的方案,依次是:select,最早的解决方案poll,算是select的升级版epoll,目前的最终解决版,解决c10k问题的功臣使用其他方式其实该问题的本质还是解决死循环过程中CPU过高的问题,只不过我们改为阻塞,就避免了程序死循环过程中被过多占用CPU资源的问题,我们其实可以直接暴利一点使用sleep(),判断当接收不到数据时 就sleep来释放资源,不过这种方式过于暴利,会影响性能,你要知道循环一次sleep1毫秒 循环10000次就是10s 不可想象!!总结 通过以上总结,我们在使用socket通信时,如果对并发量要求不高,尽量使用阻塞模式,由于我们使用了负载均衡,所以对单机并发量不是特别要求。阻塞的socket函数在调用send,recv,connect,accept等函数时,如果特定的条件不满足,就会阻塞其调用线程直至超时,非阻塞的socket恰恰相反。非阻塞模式一般用于需要支持高并发多QPS的场景(如服务器程序),但是正如前文所述,这种模式让程序的执行流和控制逻辑变得复杂;相反,阻塞模式逻辑简单,程序结构简单明了,常用于一些特殊场景中。应用场景一:某程序需要临时发送一个文件,文件分段发送,每发送一段,对端都会给予一个响应,该程序可以单独开一个任务线程,在这个任务线程函数里面,使用先send后recv再send再recv的模式,每次send和recv都是阻塞模式的。应用场景二:A端与B端之间的通信只有问答模式,即A端每发送给B端一个请求,B端比定会给A端一个响应,除此之外,B端不会向A端推送任何数据,此时A端就可以采用阻塞模式,在每次send完请求后,都可以直接使用阻塞式的recv函数接收应答包。
2022年09月15日
275 阅读
0 评论
1 点赞
2022-03-31
HTTP 协议中的Content-Encoding
最近在做拟态开发过程中,遇到lua脚本响应PHP返回接口的数据乱码问题,通过postman调试发现响应头部Content-Encoding算法为gzip,而其他接口如python则没有这个设置。首先来了解下什么是Content-Encoding?Accept-Encoding 和Content-Encoding是HTTP中用来对采用哪种编码格式传输正文进行协定的一对头部字段。工作原理如下:首先浏览器(也就是客户端)发送请求时,通过Accept-Encoding带上自己支持的内容编码格式列表;服务端在接收到请求后,从中挑选出一种用来对响应信息进行编码,并通过Content-Encoding来说明服务端选定的编码信息浏览器在拿到响应正文后,依据Content-Encoding进行解压。服务端也可以返回未压缩的正文,但这种情况不允许返回Content-Encoding内容编码的目的是优化传输内容的大小,通俗的讲就是尽心压缩。一般经过gzip压缩过的文本响应,只有原始大小的1/4(这个数据我现在还不确定)。对于文本类响应是否开启了内容压缩,是我们做性能优化时首先要检查的重要项目;而对于JPG/PNG这类本身已经高度压缩过的二进制文件,不推介开启内容压缩,效果几乎微乎其微,还浪费cpu内容的编码针对的只是传输正文。在HTTP/1中,头部始终是以ASCII文本传输,没有经过任何压缩。不过这个问题在HTTP/2中已经解决,详见HTTP/2 头部压缩技术介绍内容编码使用特别广泛,理解起来也特别简单,但是要注意的是不要把它与HTPP中的另外一个概念:传输编码Transfer-Encoding搞混即可。内容编码格式gzip 和deflate开始之前,先来介绍三种数据压缩格式:DEFLATE,是一种使用 Lempel-Ziv 压缩算法(LZ77)和哈夫曼编码的数据压缩格式。定义于 RFC 1951 : DEFLATE Compressed Data Format Specification;ZLIB,是一种使用 DEFLATE 的数据压缩格式。定义于 RFC 1950 : ZLIB Compressed Data Format Specification;GZIP,是一种使用 DEFLATE 的文件格式。定义于 RFC 1952 : GZIP file format specification;这三个名词有太多的含义,很容易让人晕菜。所以本文有如下约定:DEFLATE、ZLIB、GZIP 这种大写字符,表示数据压缩格式;deflate、gzip 这种小写字符,表示 HTTP 中 Content-Encoding 的取值;Gzip 特指 GUN zip 文件压缩程序,Zlib 特指 Zlib 库;在 HTTP/1.1 的初始规范 RFC 2616 的「3.5 Content Codings」这一节中,这样定义了 Content-Encoding 中的 gzip 和 deflate:gzip,一种由文件压缩程序「Gzip,GUN zip」产生的编码格式,描述于 RFC 1952。这种编码格式是一种具有 32 位 CRC 的 Lempel-Ziv 编码(LZ77);deflate,由定义于 RFC 1950 的「ZLIB」编码格式与 RFC 1951 中描述的「DEFLATE」压缩机制组合而成的产物;nginx中如何设置gzip在nginx.conf文件中 找到gzip 默认是on开启状态,改为off表示关闭然后重启nginx服务/usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx发现Content-Encoding没有返回,OK,这样不同接口之间就是原样输出,方便lua脚本输出内容!
2022年03月31日
1,251 阅读
0 评论
1 点赞
2022-02-08
虚拟机LINUX的root密码忘记如何重置
重启虚拟机进入到该页面之后,选中第一个(高亮显示即为选中)选项,然后按下键盘的“E”键进入到初始化脚本编辑页面,该脚本有两页,用下键向下拉,直到最后两行光标拉到最后两行需要加入一些文字后面加入下面这一行文字LANG=\zh_CN.UTF-8(我安装的是中文版的,也有可能你的是\en_US.utf-8)后面加下面这一行文字 init=/bin/sh5.加好之后按ctrl+x退出6.进入到这个页面之后(一开始只有上面那一行),表示初始化成功,然后依次输入mount -o remount,rw / #注意在rw后有空格passwd root输入两次新的密码(密码不会直接显示出来)touch /.autorelabelexec /sbin/init7.最后重启重新登录就可以了exec /sbin/reboot
2022年02月08日
491 阅读
0 评论
0 点赞