神秘的40毫秒延迟与 TCP_NODELAY

神秘的40毫秒延迟与 TCP_NODELAY

最近的业余时间几乎全部献给 breeze 这个多年前挖 下的大坑—— 一个异步 HTTP Server。努力没有白费,项目已经逐渐成型了, 基本的框架已经有了,一个静态 文件模块也已经实现了。

写 HTTP Server,不可免俗地一定要用 ab 跑一下性能,结果一跑不打紧,出现了一个困扰了我好几天的问题:神秘的 40ms 延迟。

Table of Contents

  • 1 现象
  • 2 背后的原因
  • 3 为什么只有 Write-Write-Read 时才会出问题
  • 4 解决方案
    • 4.1 优化协议
    • 4.2 开启 TCP_NODELAY

1 现象

现象是这样的,首先看我用 ab 不加 -k 选项的结果:

[~/dev/personal/breeze]$ /usr/sbin/ab  -c 1 -n 10 http://127.0.0.1:8000/styles/shThemeRDark.css
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient).....done


Server Software:        breeze/0.1.0
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /styles/shThemeRDark.css
Document Length:        127 bytes

Concurrency Level:      1
Time taken for tests:   0.001 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      2700 bytes
HTML transferred:       1270 bytes
Requests per second:    9578.54 [#/sec] (mean)
Time per request:       0.104 [ms] (mean)
Time per request:       0.104 [ms] (mean, across all concurrent requests)
Transfer rate:          2525.59 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     0    0   0.0      0       0
Waiting:        0    0   0.0      0       0
Total:          0    0   0.1      0       0

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      0
  98%      0
  99%      0
 100%      0 (longest request)

很好,不超过 1ms 的响应时间。但一旦我加上了 -k 选项启用 HTTP Keep-Alive,结果就变成了这样:

[~/dev/personal/breeze]$ /usr/sbin/ab -k  -c 1 -n 10 http://127.0.0.1:8000/styles/shThemeRDark.css
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient).....done

Server Software:        breeze/0.1.0
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /styles/shThemeRDark.css
Document Length:        127 bytes

Concurrency Level:      1
Time taken for tests:   0.360 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Keep-Alive requests:    10
Total transferred:      2750 bytes
HTML transferred:       1270 bytes
Requests per second:    27.75 [#/sec] (mean)
Time per request:       36.041 [ms] (mean)
Time per request:       36.041 [ms] (mean, across all concurrent requests)
Transfer rate:          7.45 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     1   36  12.4     40      40
Waiting:        0    0   0.2      0       1
Total:          1   36  12.4     40      40

Percentage of the requests served within a certain time (ms)
  50%     40
  66%     40
  75%     40
  80%     40
  90%     40
  95%     40
  98%     40
  99%     40
 100%     40 (longest request)

40ms 啊!这可是访问本机上的 Server 啊,才 1 个连接啊!太奇怪了吧!祭出 神器 strace,看看到底是什么情况:

15:37:47.493170 epoll_wait(3, {}, 1024, 0) = 0
15:37:47.493210 readv(5, [{"GET /styles/shThemeRDark.css HTT"..., 10111}, {"GET /styles/shThemeRDark.css HTT"..., 129}], 2) = 129
15:37:47.493244 epoll_wait(3, {}, 1024, 0) = 0
15:37:47.493279 write(5, "HTTP/1.0 200 OK\r\nContent-Type: t"..., 148) = 148
15:37:47.493320 write(5, "Hello world</"..., 127) = 127
15:37:47.493347 epoll_wait(3, {}, 1024, 0) = 0
15:37:47.493370 readv(5, 0x7fff196a6740, 2) = -1 EAGAIN (Resource temporarily unavailable)
15:37:47.493394 epoll_ctl(3, EPOLL_CTL_MOD, 5, {...}) = 0
15:37:47.493417 epoll_wait(3, {?} 0x7fff196a67a0, 1024, 100) = 1
15:37:47.532898 readv(5, [{"GET /styles/shThemeRDark.css HTT"..., 9982}, {"GET /styles/shThemeRDark.css HTT"..., 258}], 2) = 129
15:37:47.533029 epoll_ctl(3, EPOLL_CTL_MOD, 5, {...}) = 0
15:37:47.533116 write(5, "HTTP/1.0 200 OK\r\nContent-Type: t"..., 148) = 148
15:37:47.533194 write(5, "<html><head><title>Hello world</"..., 127) = 127
</pre> 
      <p> 发现是读下一个请求之前的那个 <code style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;font-size:.9em;background:rgb(221,221,221);">epoll_wait</code> 花了 40ms 才返回。这意味着要 么是 client 等了 40ms 才给我发请求,要么是我上面 <code style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;font-size:.9em;background:rgb(221,221,221);">write</code> 写入的数据过 了 40ms 才到达 client。前者的可能性几乎没有,ab 作为一个压力测试工具, 是不可能这样做的,那么问题只有可能是之前写入的 response 过了 40ms 才到 达 client。</p> 
     </div> 
    </div> 
    <div id="outline-container-2" class="outline-3"> 
     <h3 id="sec-2" style="font-size:1.3em;"><span class="section-number-3">2</span> 背后的原因</h3> 
     <div id="text-2" class="outline-text-3"> 
      <p> 为什么延迟不高不低正好 40ms 呢?果断 Google 一下找到了答案。原来这是 TCP 协议中的 Nagle‘s Algorithm 和 TCP Delayed Acknoledgement 共同起作 用所造成的结果。</p> 
      <p> Nagle’s Algorithm 是为了提高带宽利用率设计的算法,其做法是合并小的TCP 包为一个,避免了过多的小报文的 TCP 头所浪费的带宽。如果开启了这个算法 (默认),则协议栈会累积数据直到以下两个条件之一满足的时候才真正发送出 去:</p> 
      <ol> 
       <li>积累的数据量到达最大的 TCP Segment Size</li> 
       <li>收到了一个 Ack</li> 
      </ol> 
      <p> TCP Delayed Acknoledgement 也是为了类似的目的被设计出来的,它的作用就 是延迟 Ack 包的发送,使得协议栈有机会合并多个 Ack,提高网络性能。</p> 
      <p> 如果一个 TCP 连接的一端启用了 Nagle‘s Algorithm,而另一端启用了 TCP Delayed Ack,而发送的数据包又比较小,则可能会出现这样的情况:发送端在等 待接收端对上一个packet 的 Ack 才发送当前的 packet,而接收端则正好延迟了 此 Ack 的发送,那么这个正要被发送的 packet 就会同样被延迟。当然 Delayed Ack 是有个超时机制的,而默认的超时正好就是 40ms。</p> 
      <p> 现代的 TCP/IP 协议栈实现,默认几乎都启用了这两个功能,你可能会想,按我 上面的说法,当协议报文很小的时候,岂不每次都会触发这个延迟问题?事实不 是那样的。仅当协议的交互是发送端连续发送两个 packet,然后立刻 read 的 时候才会出现问题。</p> 
     </div> 
    </div> 
    <div id="outline-container-3" class="outline-3"> 
     <h3 id="sec-3" style="font-size:1.3em;"><span class="section-number-3">3</span> 为什么只有 Write-Write-Read 时才会出问题</h3> 
     <div id="text-3" class="outline-text-3"> 
      <p> 维基百科上的有一段伪代码来介绍 Nagle’s Algorithm:</p> 
      <pre class="example" style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;line-height:1.5;background:rgb(221,221,221);">if there is new data to send
  if the window size >= MSS and available data is >= MSS
    send complete MSS segment now
  else
    if there is unconfirmed data still in the pipe
      enqueue data in the buffer until an acknowledge is received
    else
      send data immediately
    end if
  end if
end if
</pre> 
      <p> 可以看到,当待发送的数据比 MSS 小的时候(外层的 else 分支),还要再判断 时候还有未确认的数据。只有当管道里还有未确认数据的时候才会进入缓冲区, 等待 Ack。</p> 
      <p> 所以发送端发送的第一个 write 是不会被缓冲起来,而是立刻发送的(进入内层 的else 分支),这时接收端收到对应的数据,但它还期待更多数据才进行处理, 所以不会往回发送数据,因此也没机会把 Ack 给带回去,根据Delayed Ack 机制, 这个 Ack 会被 Hold 住。这时发送端发送第二个包,而队列里还有未确认的数据 包,所以进入了内层 if 的 then 分支,这个 packet 会被缓冲起来。此时,发 送端在等待接收端的 Ack;接收端则在 Delay 这个 Ack,所以都在等待,直到接 收端 Deplayed Ack 超时(40ms),此 Ack 被发送回去,发送端缓冲的这个 packet 才会被真正送到接收端,从而继续下去。</p> 
      <p> 再看我上面的 strace 记录也能发现端倪,因为设计的一些不足,我没能做到把 短小的 HTTP Body 连同 HTTP Headers 一起发送出去,而是分开成两次调用实 现的,之后进入 <code style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;font-size:.9em;background:rgb(221,221,221);">epoll_wait</code> 等待下一个 Request 被发送过来(相当于阻塞模 型里直接 read)。正好是 write-write-read 的模式。</p> 
      <p> 那么 write-read-write-read 会不会出问题呢?维基百科上的解释是不会:</p> 
      <blockquote style="border-left-width:5px;border-left-style:solid;border-left-color:rgb(204,204,204);background:rgb(221,221,221);"> 
       <p> “The user-level solution is to avoid write-write-read sequences on sockets. write-read-write-read is fine. write-write-write is fine. But write-write-read is a killer. So, if you can, buffer up your little writes to TCP and send them all at once. Using the standard UNIX I/O package and flushing write before each read usually works.”</p> 
      </blockquote> 
      <p> 我的理解是这样的:因为第一个 write 不会被缓冲,会立刻到达接收端,如果是 write-read-write-read 模式,此时接收端应该已经得到所有需要的数据以进行 下一步处理。接收端此时处理完后发送结果,同时也就可以把上一个packet 的 Ack 可以和数据一起发送回去,不需要 delay,从而不会导致任何问题。</p> 
      <p> 我做了一个简单的试验,注释掉了 HTTP Body 的发送,仅仅发送 Headers, Content-Length 指定为 0。这样就不会有第二个 write,变成了 write-read-write-read 模式。此时再用 ab 测试,果然没有 40ms 的延迟了。</p> 
      <p> 说完了问题,该说解决方案了。</p> 
     </div> 
    </div> 
    <div id="outline-container-4" class="outline-3"> 
     <h3 id="sec-4" style="font-size:1.3em;"><span class="section-number-3">4</span> 解决方案</h3> 
     <div id="outline-container-4-1" class="outline-4"> 
      <h4 id="sec-4-1"><span class="section-number-4">4.1</span> 优化协议</h4> 
      <div id="text-4-1" class="outline-text-4"> 
       <p> 连续 write 小数据包,然后 read 其实是一个不好的网络编程模式,这样的连 续 write 其实应该在应用层合并成一次 write。</p> 
       <p> 可惜的是,我的程序貌似不太好做这样的优化,需要打破一些设计,等我有时间 了再好好调整,至于现在嘛,就很屌丝地用下一个解决方法了。</p> 
      </div> 
     </div> 
     <div id="outline-container-4-2" class="outline-4"> 
      <h4 id="sec-4-2"><span class="section-number-4">4.2</span> 开启 <code style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;font-size:.9em;background:rgb(221,221,221);">TCP_NODELAY</code></h4> 
      <div id="text-4-2" class="outline-text-4"> 
       <p> 简单地说,这个选项的作用就是禁用 Nagle’s Algorithm,禁止后当然就不会有 它引起的一系列问题了。在 UNIX C 里使用<code style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;font-size:.9em;background:rgb(221,221,221);">setsockopt</code> 可以做到:</p> 
       <pre class="example" style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;line-height:1.5;background:rgb(221,221,221);">static void _set_tcp_nodelay(int fd) {
    int enable = 1;
    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&enable, sizeof(enable));
}
</pre> 
       <p> 在 Java 里就更简单了,Socket 对象上有一个 <code style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;font-size:.9em;background:rgb(221,221,221);">setTcpNoDelay</code> 的方法,直接设 置成 <code style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;font-size:.9em;background:rgb(221,221,221);">true</code> 即可。</p> 
       <p> 据我所知,Nginx 默认是开启了这个选项的,这也给了我一点安慰:既然 Nginx 都这么干了,我就先不忙为了这个问题打破设计了,也默认开启 <code style="border:1px solid rgb(204,204,204);font-family:Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace;font-size:.9em;background:rgb(221,221,221);">TCP_NODELAY</code> 吧……</p> 
      </div> 
     </div> 
    </div> 
   </div> 
  </div> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1177140917849632768"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(nginx,TCP_NODELAY,nginx)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1897946393901854720.htm"
                           title="阿里云服务器Linux(centos)系统安装nginx1.20.2" target="_blank">阿里云服务器Linux(centos)系统安装nginx1.20.2</a>
                        <span class="text-muted">DHLSP15</span>
<a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91/1.htm">阿里云</a>
                        <div>阿里云服务器Linux(centos)系统安装nginx1.20.21.安装依赖包一共要安装4种依赖(基于c语言)yum-yinstallgcczlibzlib-develpcre-developensslopenssl-devel2.下载nginx安装包并解压安装包nginx官网下载:http://nginx.org/en/download.html创建一个文件夹//先进入local目录下cd/</div>
                    </li>
                    <li><a href="/article/1897898211100651520.htm"
                           title="linux centos7 安装nginx" target="_blank">linux centos7 安装nginx</a>
                        <span class="text-muted">追逐路上的小人物</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>1、下载nginx安装包wget-chttp://nginx.org/download/nginx-1.24.0.tar.gz2、安装nginx所需要的依赖包yuminstall-ygcc-c++zlibzlib-developensslopenssl-develpcrepcre-devel3、解压安装包tar-zxvfnginx-1.24.0.tar.gz4、#执行配置脚本--prefix是指定</div>
                    </li>
                    <li><a href="/article/1897584079184916480.htm"
                           title="nginx用dockerfile封装带nginx-module-vts的镜像" target="_blank">nginx用dockerfile封装带nginx-module-vts的镜像</a>
                        <span class="text-muted">Eunyeon2__</span>
<a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a>
                        <div>准备初始化镜像nginx:1.27.2https://download.csdn.net/download/qq_37579157/90460903一、逻辑:1.载官方基础镜像,安装依赖和编译的工具2.下载nginx-module-vts,(需要和nginx的版本对应上,不然会报错),我这里直接用git拉取失败,所以手动从git上下载下来,再解压后复制进去3.下载nginx部署包,因为自带的镜像编</div>
                    </li>
                    <li><a href="/article/1897582189705490432.htm"
                           title="nginx 配置 301跳转" target="_blank">nginx 配置 301跳转</a>
                        <span class="text-muted">梦醒贰零壹柒</span>
<a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>HTTP跳转到HTTPS将所有HTTP请求(80端口)跳转到HTTPS(443端口):server{listen80;server_nameexample.com;#跳转到HTTPSreturn301https://$host$request_uri;}server{listen443ssl;server_nameexample.com;ssl_certificate/path/to/certif</div>
                    </li>
                    <li><a href="/article/1897521636605751296.htm"
                           title="Docker部署CRMEB开源版本实战" target="_blank">Docker部署CRMEB开源版本实战</a>
                        <span class="text-muted">HOOLOO</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90/1.htm">开源</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/CRMEB/1.htm">CRMEB</a>
                        <div>Crmeb商城系统开源版目前版本在5.4.0,本文以此版本为基础实现docker部署。crmeb开源版本对系统的要求如下:运行环境要求操作系统Linux/WindowsWEB服务Nginx/Apache/IISPHP版本PHP7.1~7.4数据库MySQL5.7~8.0(引擎:InnoDB)缓存Redis(可选,不安装则使用文件缓存)管理器Supervisor(用于管理消息队列)推荐工具宝塔面板(</div>
                    </li>
                    <li><a href="/article/1897490109381537792.htm"
                           title="504 Gateway Time-out nginx如何处理" target="_blank">504 Gateway Time-out nginx如何处理</a>
                        <span class="text-muted">web14786210723</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/gateway/1.htm">gateway</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>在遇到504GatewayTime-out错误时,通常表示后端服务器未能在规定时间内响应请求。以下是一些常见的原因和解决方法:一、原因分析后端服务超时:后端服务器处理请求耗时过长,超出了反向代理(如Nginx)的等待时间。网络连接问题:Nginx和后端服务器之间的网络延迟或断开。后端服务不可用:后端服务崩溃、未启动,或服务器资源耗尽(如CPU或内存)。Nginx配置问题:Nginx超时时间设置过短</div>
                    </li>
                    <li><a href="/article/1897467914680856576.htm"
                           title="Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制" target="_blank">Openresty最佳案例 | 第9篇:Openresty实现的网关权限控制</a>
                        <span class="text-muted">公众号:方志朋</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/jwt/1.htm">jwt</a><a class="tag" taget="_blank" href="/search/shiro/1.htm">shiro</a><a class="tag" taget="_blank" href="/search/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>简介采用openresty开发出的api网关有很多,比如比较流行的kong、orange等。这些API网关通过提供插件的形式,提供了非常多的功能。这些组件化的功能往往能够满足大部分的需求,如果要想达到特定场景的需求,可能需要二次开发,比如RBAC权限系统。本小节通过整合前面的知识点,来构建一个RBAC权限认证系统。技术栈本小节采用了以下的技术栈:Openresty(lua+nginx)mysqlr</div>
                    </li>
                    <li><a href="/article/1897463118972383232.htm"
                           title="如何在本地调试代码又能在公网访问api呢?答案就是 SSH 反向隧道+nginx反向代理(适合临时测试)" target="_blank">如何在本地调试代码又能在公网访问api呢?答案就是 SSH 反向隧道+nginx反向代理(适合临时测试)</a>
                        <span class="text-muted">陈钇谷</span>
<a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>需求在本地调试代码。然后能通过域名的方式访问api实现异地开发调试合作,以及开发微信相关内容时,需要域名配合的场景本地调试更方便debug需要准备好域名和服务器哦本次测试的api域名是ssh.iiar.cn代码在本地运行完整步骤如下:1、先在服务器上建站,配置好域名解析及证书2、在站点里设置反向代理(我用的是宝塔)3、在本地环境的命令行内输入:ssh-R88:localhost:6001root@</div>
                    </li>
                    <li><a href="/article/1897435886627385344.htm"
                           title="docker 常用容器启动 docker-compose.yml 配置文件详解" target="_blank">docker 常用容器启动 docker-compose.yml 配置文件详解</a>
                        <span class="text-muted">java阿杜</span>
<a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E9%83%A8%E7%BD%B2/1.htm">部署</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/compose/1.htm">compose</a>
                        <div>在平常的开发工作中,我们经常需要部署项目。项目开发完成后,部署测试环境、部署生产环境等。以前部署项目,在服务器上安装项目所需的软件,如nginx、redis等。可能在测试环境测试没有问题,由于环境配置等不同,部署到生产环境又会产生莫名奇怪的问题。随着docker容器的出现,我们可以用Dockerfile构建镜像,构建完成后运行,这样可以保证每个地方使用的镜像一致,然后启动使用docker-comp</div>
                    </li>
                    <li><a href="/article/1897409643903250432.htm"
                           title="Nginx 部署 Vue.js 项目指南:结合慈云数据服务器的实践" target="_blank">Nginx 部署 Vue.js 项目指南:结合慈云数据服务器的实践</a>
                        <span class="text-muted">慈云数据</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%9A%E5%AE%A2/1.htm">博客</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>一、部署Vue前端项目1.1Nginx的下载安装与SSL配置首先,检查服务器是否已安装Nginx:whereisnginx如果已安装,会显示Nginx的安装路径;否则,需要进行安装。安装必要环境:yuminstallgcc-c++yuminstall-ypcrepcre-develyuminstall-yzlibzlib-develyuminstall-yopensslopenssl-devel</div>
                    </li>
                    <li><a href="/article/1897388199857156096.htm"
                           title="【java后端学习路线4】SpringBoot+MyBatisPlus+Redis学习指南,985本海硕自学转码" target="_blank">【java后端学习路线4】SpringBoot+MyBatisPlus+Redis学习指南,985本海硕自学转码</a>
                        <span class="text-muted">程序员城南</span>
<a class="tag" taget="_blank" href="/search/java%E5%90%8E%E7%AB%AF%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">java后端学习路线</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a>
                        <div>JAVA后端学习路线路线总览javase->Mysql->计算机网络->JavaWeb->Maven(1)->Spring->SpringMVC->Mybatis->Maven(2)->Linux->Git->SpringBoot->MyBatisPlus->Redis->JVM->JUC->Nginx->Docker->RabbitMQ->SpringCloud->项目(谷粒商城/仿牛客网)方法</div>
                    </li>
                    <li><a href="/article/1897346213129285632.htm"
                           title="app上架vivo应用商店流程" target="_blank">app上架vivo应用商店流程</a>
                        <span class="text-muted">奔跑吧邓邓子</span>
<a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E8%BF%90%E8%90%A5/1.htm">企业运营</a>
                        <div>提示:“奔跑吧邓邓子”的高效运维专栏聚焦于各类运维场景中的实际操作与问题解决。内容涵盖服务器硬件(如IBMSystem3650M5)、云服务平台(如腾讯云、华为云)、服务器软件(如Nginx、Apache、GitLab、Redis、Elasticsearch、Kubernetes、Docker等)、开发工具(如Git、HBuilder)以及网络安全(如挖矿病毒排查、SSL证书配置)等多个方面。无论</div>
                    </li>
                    <li><a href="/article/1897271928759054336.htm"
                           title="「Python系列」Python uWSGI" target="_blank">「Python系列」Python uWSGI</a>
                        <span class="text-muted">·零落·</span>
<a class="tag" taget="_blank" href="/search/Python%E5%85%A5%E9%97%A8%E5%88%B0%E6%8E%8C%E6%8F%A1/1.htm">Python入门到掌握</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/uWSGI/1.htm">uWSGI</a>
                        <div>文章目录一、PythonuWSGI简介二、PythonuWSGI安装配置三、PythonuWSGI应用案例前提条件步骤1:创建Django项目步骤2:配置Django项目步骤3:创建uWSGI配置文件步骤4:启动uWSGI步骤5:配置Web服务器四、PythonuWSGI常见问题常见问题1:uWSGI无法找到应用模块常见问题2:uWSGI和Nginx通信问题常见问题3:uWSGI进程管理常见问题4</div>
                    </li>
                    <li><a href="/article/1897265376245379072.htm"
                           title="部署Django+nginx+uwsgi到ubuntu服务器" target="_blank">部署Django+nginx+uwsgi到ubuntu服务器</a>
                        <span class="text-muted">Mr番茄蛋</span>
<a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/1.htm">问题解决</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a>
                        <div>前提:Django程序可以正常运行,注意服务器python版本和本地版本可能不一致,有可能不能正常运行Django程序。安装过程更新ubuntu的python比如更新到3.6,先拉取新的仓库,再更新安装sudoadd-apt-repositoryppa:jonathonf/python-3.6sudoaptupdatesudoaptinstallpython3.6创建虚拟环境安装虚拟环境命令sud</div>
                    </li>
                    <li><a href="/article/1897248867892654080.htm"
                           title="Caddy 你的下一个web服务器" target="_blank">Caddy 你的下一个web服务器</a>
                        <span class="text-muted">码刀攻城</span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>企业级的Web服务器非常多,Nginx、Tomcat、Apache等。今天的主角是另一个开源的Web服务器,这款服务器具备自动HTTPS功能和高度可配置性,它的名字是:CaddyCaddy是一个Go编写的Web服务器,轻量简单,类似于Nginx,Caddy提供了更加强大的功能,随着v2版本发布,Caddy已经可以作为中小型站点Web服务器的另一个选择。相较于Nginx来说使用Caddy的优势如下:</div>
                    </li>
                    <li><a href="/article/1897182624619753472.htm"
                           title="AI生成的web框架 包含前后端 k8s管理等" target="_blank">AI生成的web框架 包含前后端 k8s管理等</a>
                        <span class="text-muted">LCY133</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a>
                        <div>好的,我现在需要根据用户提供的技术栈来设计一个Web平台的搭建方案。用户提到的技术包括前端、后端、算法,GitLab、Jenkins,阿里云ACK和ECS,MongoDB、Redis,Docker、K8s、Nginx。我需要综合考虑这些技术的整合,确保整个架构的高效、可靠和可扩展。首先,用户之前已经得到了一个架构方案,现在可能希望进一步细化或者调整。我需要回顾之前的方案,看看是否有遗漏或可以优化的</div>
                    </li>
                    <li><a href="/article/1896952966552809472.htm"
                           title="linux-运维进阶-28 LNMP动态网站架构" target="_blank">linux-运维进阶-28 LNMP动态网站架构</a>
                        <span class="text-muted">IT@feng</span>
<a class="tag" taget="_blank" href="/search/Linux-%E8%BF%90%E7%BB%B4%E8%BF%9B%E9%98%B6/1.htm">Linux-运维进阶</a><a class="tag" taget="_blank" href="/search/LNMP/1.htm">LNMP</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>linux-运维进阶-28LNMP动态网站架构LNMP动态网站架构LNMP动态网站部署架构是一套由Linux+Nginx+MySQL+PHP组成的动态网站系统解决方案。LNMP中的字母L是Linux系统的意思,不仅可以是RHEL、CentOS、Fedora,还可以是Debian、Ubuntu等系统开发环境的部署在使用源码包安装服务程序之前,首先要让安装主机具备编译程序源码的环境,他需要具备C语言、</div>
                    </li>
                    <li><a href="/article/1896943262195838976.htm"
                           title="centos7中LNMP架构部署" target="_blank">centos7中LNMP架构部署</a>
                        <span class="text-muted">m0_45318174</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>一.环境规划IP角色192.168.19.152PHP脚本程序解析192.168.19.20Web服务器192.168.19.153数据库节点系统采用:[root@nebulalinux~]#cat/etc/redhat-releaseCentOSLinuxrelease7.6.1810(Core)软件版本:nginx:nginx/1.15.0php:PHP7.4.8mysql:8.0.16处理防</div>
                    </li>
                    <li><a href="/article/1896882604901199872.htm"
                           title="阿里云k8s配置节点亲和性/Session会话保持" target="_blank">阿里云k8s配置节点亲和性/Session会话保持</a>
                        <span class="text-muted">吾乃南华老仙</span>
<a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91K8S/1.htm">阿里云K8S</a><a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91/1.htm">阿里云</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a>
                        <div>1.路由页面:配置路由的注解;2.配置:注解名称描述可选值nginx.ingress.kubernetes.io/affinity关联的类型,将此设置为cookie以启用会话关联cookienginx.ingress.kubernetes.io/session-cookie-name</div>
                    </li>
                    <li><a href="/article/1896864704882601984.htm"
                           title="JAVA单服务应用拆分成多个服务的实践(3)--前端的nginx转发" target="_blank">JAVA单服务应用拆分成多个服务的实践(3)--前端的nginx转发</a>
                        <span class="text-muted">秤秤biubiu</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%EF%BC%88%E5%BA%94%E7%94%A8%E8%BD%AF%E4%BB%B6/1.htm">开发(应用软件</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%AB%99%E7%9B%B8%E5%85%B3%EF%BC%89/1.htm">网站相关)</a><a class="tag" taget="_blank" href="/search/niginx/1.htm">niginx</a>
                        <div>上篇文章JAVA单服务应用拆分成多个服务的实践(2)--服务的dubbo化已经将部分模块微服务化了,但我们怎么测试?我们的目标是支持ALLInOne,又要支持多个微服务,但前端怎么处理,前端代码又只有一个版本,但又要怎么面向多个微服务呢。这样的话,我们只能引入伟大的nginx。前端只认一个,就使用nginx的转发,将特定的请求转发到微服务的接口里,让前端无感请求到到另一服务中。nginx的配置如下</div>
                    </li>
                    <li><a href="/article/1896848806088077312.htm"
                           title="遭遇黑客攻击?3步紧急止血 + 5个代码级防护方案" target="_blank">遭遇黑客攻击?3步紧急止血 + 5个代码级防护方案</a>
                        <span class="text-muted">群联云防护小杜</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB/1.htm">安全问题汇总</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>一、判定攻击存在的关键迹象当服务器出现以下异常时,很可能正在被攻击:流量突增:带宽使用率超过日常3倍#实时监控带宽(示例:每2秒刷新)ifstat-ieth0-T2资源耗尽:CPU/内存长期满载#快速查看资源消耗排名top-o%CPU-c|head-n20异常日志:大量重复错误请求#分析Nginx日志中的高频错误码(如499/500)awk'{print$9}'access.log|sort|un</div>
                    </li>
                    <li><a href="/article/1896807069873401856.htm"
                           title="Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_read_token - 详解(3)" target="_blank">Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_read_token - 详解(3)</a>
                        <span class="text-muted">若云止水</span>
<a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a>
                        <div>详解(3)if(last_space){start=b->pos-1;start_line=cf->conf_file->line;if(ch==''||ch=='\t'||ch==CR||ch==LF){continue;}switch(ch){case';':case'{':if(cf->args->nelts==0){ngx_conf_log_error(NGX_LOG_EMERG,cf,0</div>
                    </li>
                    <li><a href="/article/1896743639015550976.htm"
                           title="2025最新Nginx高频面试题" target="_blank">2025最新Nginx高频面试题</a>
                        <span class="text-muted">莫非技术栈</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>2025最新Nginx高频面试题摘要:本文整理了2025年企业高频Nginx面试题,覆盖核心原理、配置优化、安全防护及云原生场景实战,助你轻松应对技术面试!核心原理篇1.Nginx的Master-Worker架构优势是什么?答案:高并发处理:Worker进程独立处理请求,避免单线程阻塞。热升级:通过信号控制实现服务不中断升级(如kill-USR2)。资源隔离:Worker进程崩溃不影响整体服务。2</div>
                    </li>
                    <li><a href="/article/1896664344729546752.htm"
                           title="Linux离线安装nginx" target="_blank">Linux离线安装nginx</a>
                        <span class="text-muted">好丰富</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>1、查看nginx依赖环境需要环境:gcc、pcre、zlib、openssl2、安装环境若未安装yuminstall-ygcc-c++yuminstall-ypcrepcre-develyuminstall-yzlibzlib-develyuminstall-yopensslopenssl-devel若未安装成功,请离线下载所需要的依赖包参考链接:linux离线安装nginx-创客未来-博客园3</div>
                    </li>
                    <li><a href="/article/1896638489936588800.htm"
                           title="Ubuntu 下 nginx-1.24.0 源码分析 - ngx_modules" target="_blank">Ubuntu 下 nginx-1.24.0 源码分析 - ngx_modules</a>
                        <span class="text-muted">若云止水</span>
<a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>ngx_modules声明在src\core\ngx_module.hexternngx_module_t*ngx_modules[];定义在objs/ngx_modules.c#include#includeexternngx_module_tngx_core_module;externngx_module_tngx_errlog_module;externngx_module_tngx_con</div>
                    </li>
                    <li><a href="/article/1896609735730327552.htm"
                           title="Linux运维基础全景指南" target="_blank">Linux运维基础全景指南</a>
                        <span class="text-muted">向贤</span>
<a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>Linux运维基础全景指南——从入门到精通的系统化管理手册一、Linux系统架构核心认知1.文件系统层次结构(FHS)记忆口诀:根目录下一堆,bin存命令,etc存配置,home放用户,var放变量,tmp临时文件,dev设备挂。目录核心作用典型内容示例/bin基础命令ls,cp,mv,cat/etc系统配置文件nginx.conf,passwd/var动态数据logs,databases/dev</div>
                    </li>
                    <li><a href="/article/1896405066747801600.htm"
                           title="使用 Nginx 轻松处理跨域请求(CORS)" target="_blank">使用 Nginx 轻松处理跨域请求(CORS)</a>
                        <span class="text-muted">m0_74824025</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>使用Nginx轻松处理跨域请求(CORS)在现代Web开发中,跨域资源共享(CORS)是一种重要的机制,用于解决浏览器的同源策略限制。CORS允许服务器声明哪些来源可以访问其资源,从而确保安全性与可用性。本文将介绍如何在Nginx中配置跨域访问,并详细解析每个配置项的作用和用法。什么是CORS?CORS(Cross-OriginResourceSharing)是一种HTTP头部机制,允许服务器声明</div>
                    </li>
                    <li><a href="/article/1896401790459506688.htm"
                           title="一个比 Nginx 还简单的 Web 服务器" target="_blank">一个比 Nginx 还简单的 Web 服务器</a>
                        <span class="text-muted">vip1024p</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>企业级的Web服务器非常多,Nginx、Tomcat、Apache、IIS、FastAPI、Flask等。今天松哥再给大家介绍一个开源的Web服务器,这款服务器具备自动HTTPS功能和高度可配置性,它的名字是:Caddy。Caddy是一个Go编写的Web服务器,类似于Nginx,Caddy提供了更加强大的功能,随着v2版本发布,Caddy已经可以作为中小型站点Web服务器的另一个选择。相较于Ngi</div>
                    </li>
                    <li><a href="/article/1896370775187845120.htm"
                           title="在 Windows 上生成本地 SSL 证书并使用 HTTPS 访问本地 Nginx 服务器" target="_blank">在 Windows 上生成本地 SSL 证书并使用 HTTPS 访问本地 Nginx 服务器</a>
                        <span class="text-muted">m0_74824534</span>
<a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><a class="tag" taget="_blank" href="/search/https/1.htm">https</a>
                        <div>引言在开发和测试过程中,使用HTTPS进行本地开发可以模拟生产环境,确保应用程序在实际部署时的安全性。本文将介绍如何在Windows环境中生成本地SSL证书,并将其配置到Nginx服务器上,以便通过HTTPS访问本地服务器。安装必要工具安装OpenSSLOpenSSL是一个用于生成和管理SSL/TLS证书的工具。下载并安装OpenSSL:访问OpenSSL的Windows安装程序。下载适合你Win</div>
                    </li>
                    <li><a href="/article/1896337355502055424.htm"
                           title="部署Wordpress(LNMP)+ELK" target="_blank">部署Wordpress(LNMP)+ELK</a>
                        <span class="text-muted">多练项目</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/elk/1.htm">elk</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>LNMP+EFK主机软件服务版本主机名192.168.100.100Nginx-1.18、Filebeatnode100192.168.100.101PHP-5.6.27node101192.168.100.102MySQL5.7node102192.168.100.103Kafkakafka103192.168.100.104Kafkanode104192.168.100.105Kafkanod</div>
                    </li>
                                <li><a href="/article/2.htm"
                                       title="Java序列化进阶篇" target="_blank">Java序列化进阶篇</a>
                                    <span class="text-muted">g21121</span>
<a class="tag" taget="_blank" href="/search/java%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">java序列化</a>
                                    <div>        1.transient 
        类一旦实现了Serializable 接口即被声明为可序列化,然而某些情况下并不是所有的属性都需要序列化,想要人为的去阻止这些属性被序列化,就需要用到transient 关键字。 
</div>
                                </li>
                                <li><a href="/article/129.htm"
                                       title="escape()、encodeURI()、encodeURIComponent()区别详解 " target="_blank">escape()、encodeURI()、encodeURIComponent()区别详解 </a>
                                    <span class="text-muted">aigo</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a>
                                    <div>原文:http://blog.sina.com.cn/s/blog_4586764e0101khi0.html 
  
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:,decodeURI,decodeURIComponent 。 
下面简单介绍一下它们的区别 
1 escape()函</div>
                                </li>
                                <li><a href="/article/256.htm"
                                       title="ArcgisEngine实现对地图的放大、缩小和平移" target="_blank">ArcgisEngine实现对地图的放大、缩小和平移</a>
                                    <span class="text-muted">Cb123456</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%BB%E5%8A%A0%E7%9F%A2%E9%87%8F%E6%95%B0%E6%8D%AE/1.htm">添加矢量数据</a><a class="tag" taget="_blank" href="/search/%E5%AF%B9%E5%9C%B0%E5%9B%BE%E7%9A%84%E6%94%BE%E5%A4%A7%E3%80%81%E7%BC%A9%E5%B0%8F%E5%92%8C%E5%B9%B3%E7%A7%BB/1.htm">对地图的放大、缩小和平移</a><a class="tag" taget="_blank" href="/search/Engine/1.htm">Engine</a>
                                    <div>ArcgisEngine实现对地图的放大、缩小和平移: 
 个人觉得是平移,不过网上的都是漫游,通俗的说就是把一个地图对象从一边拉到另一边而已。就看人说话吧. 
 具体实现: 
一、引入命名空间 
   using ESRI.ArcGIS.Geometry; 
   using ESRI.ArcGIS.Controls; 
二、代码实现.</div>
                                </li>
                                <li><a href="/article/383.htm"
                                       title="Java集合框架概述" target="_blank">Java集合框架概述</a>
                                    <span class="text-muted">天子之骄</span>
<a class="tag" taget="_blank" href="/search/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E6%A6%82%E8%BF%B0/1.htm">Java集合框架概述</a>
                                    <div>   集合框架 
集合框架可以理解为一个容器,该容器主要指映射(map)、集合(set)、数组(array)和列表(list)等抽象数据结构。 
从本质上来说,Java集合框架的主要组成是用来操作对象的接口。不同接口描述不同的数据类型。 
  
简单介绍: 
  
Collection接口是最基本的接口,它定义了List和Set,List又定义了LinkLi</div>
                                </li>
                                <li><a href="/article/510.htm"
                                       title="旗正4.0页面跳转传值问题" target="_blank">旗正4.0页面跳转传值问题</a>
                                    <span class="text-muted">何必如此</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a>
                                    <div>跳转和成功提示 
a)        成功字段非空forward 
成功字段非空forward,不会弹出成功字段,为jsp转发,页面能超链接传值,传输变量时需要拼接。接拼接方式list.jsp?test="+strweightUnit+"或list.jsp?test="+weightUnit+&qu</div>
                                </li>
                                <li><a href="/article/637.htm"
                                       title="全网唯一:移动互联网服务器端开发课程" target="_blank">全网唯一:移动互联网服务器端开发课程</a>
                                    <span class="text-muted">cocos2d-x小菜</span>
<a class="tag" taget="_blank" href="/search/web%E5%BC%80%E5%8F%91/1.htm">web开发</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/1.htm">移动开发</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">移动端开发</a><a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94/1.htm">移动互联</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a>
                                    <div>    移动互联网时代来了!     App市场爆发式增长为Web开发程序员带来新一轮机遇,近两年新增创业者,几乎全部选择了移动互联网项目!传统互联网企业中超过98%的门户网站已经或者正在从单一的网站入口转向PC、手机、Pad、智能电视等多端全平台兼容体系。据统计,AppStore中超过85%的App项目都选择了PHP作为后端程</div>
                                </li>
                                <li><a href="/article/764.htm"
                                       title="Log4J通用配置|注意问题 笔记" target="_blank">Log4J通用配置|注意问题 笔记</a>
                                    <span class="text-muted">7454103</span>
<a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a>
                                    <div>关于日志的等级 那些去 百度就知道了! 
这几天 要搭个新框架  配置了 日志 记下来 !做个备忘! 
 

 #这里定义能显示到的最低级别,若定义到INFO级别,则看不到DEBUG级别的信息了~!
log4j.rootLogger=INFO,allLog

# DAO层 log记录到dao.log 控制台 和 总日志文件
log4j.logger.DAO=INFO,dao,C</div>
                                </li>
                                <li><a href="/article/891.htm"
                                       title="SQLServer TCP/IP 连接失败问题 ---SQL Server Configuration Manager" target="_blank">SQLServer TCP/IP 连接失败问题 ---SQL Server Configuration Manager</a>
                                    <span class="text-muted">darkranger</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a><a class="tag" taget="_blank" href="/search/XP/1.htm">XP</a>
                                    <div>当你安装完之后,连接数据库的时候可能会发现你的TCP/IP 没有启动.. 
发现需要启动客户端协议 : TCP/IP  
需要打开 SQL Server Configuration Manager... 
却发现无法打开 SQL Server Configuration Manager..?? 
 
解决方法:  C:\WINDOWS\system32目录搜索framedyn.</div>
                                </li>
                                <li><a href="/article/1018.htm"
                                       title="[置顶] 做有中国特色的程序员" target="_blank">[置顶] 做有中国特色的程序员</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a>
                                    <div>从出版业说起   网络作品排到靠前的,都不会太难看,一般人不爱看某部作品也是因为不喜欢这个类型,而此人也不会全不喜欢这些网络作品。究其原因,是因为网络作品都是让人先白看的,看的好了才出了头。而纸质作品就不一定了,排行榜靠前的,有好作品,也有垃圾。   许多大牛都是写了博客,后来出了书。这些书也都不次,可能有人让为不好,是因为技术书不像小说,小说在读故事,技术书是在学知识或温习知识,有些技术书读得可</div>
                                </li>
                                <li><a href="/article/1145.htm"
                                       title="document.domain 跨域问题" target="_blank">document.domain 跨域问题</a>
                                    <span class="text-muted">avords</span>
<a class="tag" taget="_blank" href="/search/document/1.htm">document</a>
                                    <div>document.domain用来得到当前网页的域名。比如在地址栏里输入:javascript:alert(document.domain); //www.315ta.com我们也可以给document.domain属性赋值,不过是有限制的,你只能赋成当前的域名或者基础域名。比如:javascript:alert(document.domain = "315ta.com"); </div>
                                </li>
                                <li><a href="/article/1272.htm"
                                       title="关于管理软件的一些思考" target="_blank">关于管理软件的一些思考</a>
                                    <span class="text-muted">houxinyou</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%A1%E7%90%86/1.htm">管理</a>
                                    <div>  
工作好多看年了,一直在做管理软件,不知道是我最开始做的时候产生了一些惯性的思维,还是现在接触的管理软件水平有所下降.换过好多年公司,越来越感觉现在的管理软件做的越来越乱. 
在我看来,管理软件不论是以前的结构化编程,还是现在的面向对象编程,不管是CS模式,还是BS模式.模块的划分是很重要的.当然,模块的划分有很多种方式.我只是以我自己的划分方式来说一下. 
做为管理软件,就像现在讲究MVC这</div>
                                </li>
                                <li><a href="/article/1399.htm"
                                       title="NoSQL数据库之Redis数据库管理(String类型和hash类型)" target="_blank">NoSQL数据库之Redis数据库管理(String类型和hash类型)</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a>
                                    <div>一.Redis的数据类型 
1.String类型及操作 
        String是最简单的类型,一个key对应一个value,string类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。 
        Set方法:设置key对应的值为string类型的value </div>
                                </li>
                                <li><a href="/article/1526.htm"
                                       title="Tomcat 一些技巧" target="_blank">Tomcat 一些技巧</a>
                                    <span class="text-muted">征客丶</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/dos/1.htm">dos</a>
                                    <div>以下操作都是在windows 环境下 
 
一、Tomcat 启动时配置 JAVA_HOME 
在 tomcat 安装目录,bin 文件夹下的 catalina.bat 或 setclasspath.bat 中添加 
 
set JAVA_HOME=JAVA 安装目录 
set JRE_HOME=JAVA 安装目录/jre 
 
即可; 
 
二、查看Tomcat 版本 
在 tomcat 安装目</div>
                                </li>
                                <li><a href="/article/1653.htm"
                                       title="【Spark七十二】Spark的日志配置" target="_blank">【Spark七十二】Spark的日志配置</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a>
                                    <div>在测试Spark Streaming时,大量的日志显示到控制台,影响了Spark Streaming程序代码的输出结果的查看(代码中通过println将输出打印到控制台上),可以通过修改Spark的日志配置的方式,不让Spark Streaming把它的日志显示在console 
  
在Spark的conf目录下,把log4j.properties.template修改为log4j.p</div>
                                </li>
                                <li><a href="/article/1780.htm"
                                       title="Haskell版冒泡排序" target="_blank">Haskell版冒泡排序</a>
                                    <span class="text-muted">bookjovi</span>
<a class="tag" taget="_blank" href="/search/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/1.htm">冒泡排序</a><a class="tag" taget="_blank" href="/search/haskell/1.htm">haskell</a>
                                    <div>面试的时候问的比较多的算法题要么是binary search,要么是冒泡排序,真的不想用写C写冒泡排序了,贴上个Haskell版的,思维简单,代码简单,下次谁要是再要我用C写冒泡排序,直接上个haskell版的,让他自己去理解吧。 
  
  
sort [] = []
sort [x] = [x]
sort (x:x1:xs)
    | x>x1 = x1:so</div>
                                </li>
                                <li><a href="/article/1907.htm"
                                       title="java 路径 配置文件读取" target="_blank">java 路径 配置文件读取</a>
                                    <span class="text-muted">bro_feng</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>这几天做一个项目,关于路径做如下笔记,有需要供参考。 
 
取工程内的文件,一般都要用相对路径,这个自然不用多说。 
 
在src统计目录建配置文件目录res,在res中放入配置文件。 
读取文件使用方式: 
1. MyTest.class.getResourceAsStream("/res/xx.properties") 
2. properties.load(MyTest.</div>
                                </li>
                                <li><a href="/article/2034.htm"
                                       title="读《研磨设计模式》-代码笔记-简单工厂模式" target="_blank">读《研磨设计模式》-代码笔记-简单工厂模式</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                    <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ 
 
 


package design.pattern;

/*
 * 个人理解:简单工厂模式就是IOC;
 * 客户端要用到某一对象,本来是由客户创建的,现在改成由工厂创建,客户直接取就好了
 */
interface IProduct {
	</div>
                                </li>
                                <li><a href="/article/2161.htm"
                                       title="SVN与JIRA的关联" target="_blank">SVN与JIRA的关联</a>
                                    <span class="text-muted">chenyu19891124</span>
<a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a>
                                    <div>SVN与JIRA的关联一直都没能装成功,今天凝聚心思花了一天时间整合好了。下面是自己整理的步骤: 
一、搭建好SVN环境,尤其是要把SVN的服务注册成系统服务 
二、装好JIRA,自己用是jira-4.3.4破解版 
三、下载SVN与JIRA的插件并解压,然后拷贝插件包下lib包里的三个jar,放到Atlassian\JIRA 4.3.4\atlassian-jira\WEB-INF\lib下,再</div>
                                </li>
                                <li><a href="/article/2288.htm"
                                       title="JWFDv0.96 最新设计思路" target="_blank">JWFDv0.96 最新设计思路</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E5%BA%94%E7%94%A8/1.htm">企业应用</a><a class="tag" taget="_blank" href="/search/%E5%85%AC%E5%91%8A/1.htm">公告</a>
                                    <div>                   
 
 
随着工作流技术的发展,工作流产品的应用范围也不断的在扩展,开始进入了像金融行业(我已经看到国有四大商业银行的工作流产品招标公告了),实时生产控制和其它比较重要的工程领域,而</div>
                                </li>
                                <li><a href="/article/2415.htm"
                                       title="vi 保存复制内容格式粘贴" target="_blank">vi 保存复制内容格式粘贴</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/vi/1.htm">vi</a><a class="tag" taget="_blank" href="/search/%E7%B2%98%E8%B4%B4/1.htm">粘贴</a><a class="tag" taget="_blank" href="/search/%E5%A4%8D%E5%88%B6/1.htm">复制</a><a class="tag" taget="_blank" href="/search/%E4%BF%9D%E5%AD%98%E5%8E%9F%E6%A0%BC%E5%BC%8F/1.htm">保存原格式</a><a class="tag" taget="_blank" href="/search/%E4%B8%8D%E5%8F%98%E5%BD%A2/1.htm">不变形</a>
                                    <div>    vi是linux中非常好用的文本编辑工具,功能强大无比,但对于复制带有缩进格式的内容时,粘贴的时候内容错位很严重,不会按照复制时的格式排版,vi能不能在粘贴时,按复制进的格式进行粘贴呢? 答案是肯定的,vi有一个很强大的命令可以实现此功能 。 
 
    在命令模式输入:set paste,则进入paste模式,这样再进行粘贴时</div>
                                </li>
                                <li><a href="/article/2542.htm"
                                       title="shell脚本运行时报错误:/bin/bash^M: bad interpreter 的解决办法" target="_blank">shell脚本运行时报错误:/bin/bash^M: bad interpreter 的解决办法</a>
                                    <span class="text-muted">dongwei_6688</span>
<a class="tag" taget="_blank" href="/search/shell%E8%84%9A%E6%9C%AC/1.htm">shell脚本</a>
                                    <div>出现原因:windows上写的脚本,直接拷贝到linux系统上运行由于格式不兼容导致 
解决办法: 
 1. 比如文件名为myshell.sh,vim myshell.sh 
 2. 执行vim中的命令 : set ff?查看文件格式,如果显示fileformat=dos,证明文件格式有问题 
 3. 执行vim中的命令 :set fileformat=unix 将文件格式改过来就可以了,然后:w</div>
                                </li>
                                <li><a href="/article/2669.htm"
                                       title="高一上学期难记忆单词" target="_blank">高一上学期难记忆单词</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/english/1.htm">english</a>
                                    <div>honest 诚实的;正直的 
argue 争论 
classical 古典的 
hammer 锤子 
share  分享;共有 
sorrow 悲哀;悲痛 
adventure 冒险 
error 错误;差错 
closet 壁橱;储藏室 
pronounce 发音;宣告 
repeat 重做;重复 
majority 大多数;大半 
  
native 本国的,本地的,本国</div>
                                </li>
                                <li><a href="/article/2923.htm"
                                       title="hibernate查询返回DTO对象,DTO封装了多个pojo对象的属性" target="_blank">hibernate查询返回DTO对象,DTO封装了多个pojo对象的属性</a>
                                    <span class="text-muted">frankco</span>
<a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/hibernate%E6%9F%A5%E8%AF%A2/1.htm">hibernate查询</a><a class="tag" taget="_blank" href="/search/DTO/1.htm">DTO</a>
                                    <div>      DTO-数据传输对象;pojo-最纯粹的java对象与数据库中的表一一对应。 
      简单讲:DTO起到业务数据的传递作用,pojo则与持久层数据库打交道。 
  
      有时候我们需要查询返回DTO对象,因为DTO</div>
                                </li>
                                <li><a href="/article/3050.htm"
                                       title="Partition List" target="_blank">Partition List</a>
                                    <span class="text-muted">hcx2013</span>
<a class="tag" taget="_blank" href="/search/partition/1.htm">partition</a>
                                    <div>Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. 
You should preserve the original relative order of th</div>
                                </li>
                                <li><a href="/article/3177.htm"
                                       title="Spring MVC测试框架详解——客户端测试" target="_blank">Spring MVC测试框架详解——客户端测试</a>
                                    <span class="text-muted">jinnianshilongnian</span>

                                    <div>上一篇《Spring MVC测试框架详解——服务端测试》已经介绍了服务端测试,接下来再看看如果测试Rest客户端,对于客户端测试以前经常使用的方法是启动一个内嵌的jetty/tomcat容器,然后发送真实的请求到相应的控制器;这种方式的缺点就是速度慢;自Spring 3.2开始提供了对RestTemplate的模拟服务器测试方式,也就是说使用RestTemplate测试时无须启动服务器,而是模拟一</div>
                                </li>
                                <li><a href="/article/3304.htm"
                                       title="关于推荐个人观点" target="_blank">关于推荐个人观点</a>
                                    <span class="text-muted">liyonghui160com</span>
<a class="tag" taget="_blank" href="/search/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/1.htm">推荐系统</a><a class="tag" taget="_blank" href="/search/%E5%85%B3%E4%BA%8E%E6%8E%A8%E8%8D%90%E4%B8%AA%E4%BA%BA%E8%A7%82%E7%82%B9/1.htm">关于推荐个人观点</a>
                                    <div>    回想起来,我也做推荐了3年多了,最近公司做了调整招聘了很多算法工程师,以为需要多么高大上的算法才能搭建起来的,从实践中走过来,我只想说【不是这样的】 
 
    第一次接触推荐系统是在四年前入职的时候,那时候,机器学习和大数据都是没有的概念,什么大数据处理开源软件根本不存在,我们用多台计算机web程序记录用户行为,用.net的w</div>
                                </li>
                                <li><a href="/article/3431.htm"
                                       title="不间断旋转的动画" target="_blank">不间断旋转的动画</a>
                                    <span class="text-muted">pangyulei</span>
<a class="tag" taget="_blank" href="/search/%E5%8A%A8%E7%94%BB/1.htm">动画</a>
                                    <div>
CABasicAnimation* rotationAnimation;
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    rotationAnimation.toValue = [NSNumber numberWithFloat: M</div>
                                </li>
                                <li><a href="/article/3558.htm"
                                       title="自定义annotation" target="_blank">自定义annotation</a>
                                    <span class="text-muted">sha1064616837</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a><a class="tag" taget="_blank" href="/search/annotation/1.htm">annotation</a><a class="tag" taget="_blank" href="/search/reflect/1.htm">reflect</a>
                                    <div>对象有的属性在页面上可编辑,有的属性在页面只可读,以前都是我们在页面上写死的,时间一久有时候会混乱,此处通过自定义annotation在类属性中定义。越来越发现Java的Annotation真心很强大,可以帮我们省去很多代码,让代码看上去简洁。 
下面这个例子 主要用到了 
1.自定义annotation:@interface,以及几个配合着自定义注解使用的几个注解 
2.简单的反射 
3.枚举 </div>
                                </li>
                                <li><a href="/article/3685.htm"
                                       title="Spring 源码" target="_blank">Spring 源码</a>
                                    <span class="text-muted">up2pu</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a>
                                    <div>1.Spring源代码 
https://github.com/SpringSource/spring-framework/branches/3.2.x 
注:兼容svn检出 
 
2.运行脚本 
import-into-eclipse.bat 
注:需要设置JAVA_HOME为jdk 1.7 
 
build.gradle 
 compileJava { 
 sourceCompatibilit</div>
                                </li>
                                <li><a href="/article/3812.htm"
                                       title="利用word分词来计算文本相似度" target="_blank">利用word分词来计算文本相似度</a>
                                    <span class="text-muted">yangshangchuan</span>
<a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/word%E5%88%86%E8%AF%8D/1.htm">word分词</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E6%9C%AC%E7%9B%B8%E4%BC%BC%E5%BA%A6/1.htm">文本相似度</a><a class="tag" taget="_blank" href="/search/%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6/1.htm">余弦相似度</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E5%8D%95%E5%85%B1%E6%9C%89%E8%AF%8D/1.htm">简单共有词</a>
                                    <div>word分词提供了多种文本相似度计算方式: 
方式一:余弦相似度,通过计算两个向量的夹角余弦值来评估他们的相似度 
实现类:org.apdplat.word.analysis.CosineTextSimilarity 
用法如下: 
String text1 = "我爱购物";
String text2 = "我爱读书";
String text3 = </div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>