https://blog.jingxiyuan.cn 涛声依旧 天下事有难易乎?为之,则难者亦易矣 https://blog.jingxiyuan.cn/images/favicon.ico Hito Li 2022-11-08T02:05:00.000Z https://blog.jingxiyuan.cn/2022/11/08/Nginx%E9%85%8D%E7%BD%AE-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/ Nginx配置-反向代理 <h4 id="引言"><a class="anchor" href="#引言">#</a> 引言</h4> <ul> <li>所有配置方法和介绍均来至于网络搜索汇总,主要用于方便后期巩固学习。</li> </ul> <h4 id="何为反向代理"><a class="anchor" href="#何为反向代理">#</a> 何为反向代理</h4> <ul> <li>在介绍反向代理之前,先来了解一下正向代理。</li> </ul> <p>__正向代理:__如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,下面是正向代理的原理图。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/11/08/991a203be1ec82b36e1f326376617d40.png" alt="991a203be1ec82b36e1f326376617d40.png" /><br /> __反向代理:__看下面原理图,就一目了然。其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/11/08/1c87e386a0ce624a3949bda443cf346d.png" alt="1c87e386a0ce624a3949bda443cf346d.png" /></p> <blockquote> <p>正向代理和反向代理的区别,一句话就是:如果我们客户端自己用,就是正向代理。如果是在服务器用,用户无感知,就是反向代理。</p> </blockquote> <h4 id="nginx配置文件"><a class="anchor" href="#nginx配置文件">#</a> Nginx 配置文件</h4> <ul> <li> <p>在学习 Nginx 之前,要熟知它的配置文件,毕竟,下面需要做的所有配置(反向代理、负载均衡、动静分离等),都是基于它的配置文件。</p> </li> <li> <p>Nginx 默认的配置文件是在安装目录下的 conf 目录下,后续对 Nginx 的使用基本上都是对此配置文件进行相应的修改。完整的配置文件,可以看一下文章最后。修改过 nginx.conf 配置文件,记得要重启 Nginx 服务(☆☆☆☆☆)</p> </li> <li> <p>配置文件中有很多 #号,该符号表示注释内容,去掉所有以 #开头的段落,精简之后的配置文件内容如下(PS:其实注释掉的地方,都是一些功能的使用代码,需要用到的时候,取消注释即可):</p> </li> </ul> <pre><code class="language-yaml"># 主进程叫master,负责管理子进程,子进程叫worker # worker_processes配置项表示开启几个业务进程,一般和cpu核数有关 worker_processes 1; events &#123; worker_connections 1024; &#125; http &#123; # include表示可以引入其他文件,此处表示引入http mime类型 include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 虚拟主机,可以配置多个 server &#123; listen 80; server_name localhost; location / &#123; # 路径匹配之后,哪个目录下去匹配相应的网页,html是相对路径 root html; index index.html index.htm; &#125; error_page 500 502 503 504 /50x.html; location = /50x.html &#123; root html; &#125; &#125; &#125; </code></pre> <p>去掉注释信息后,可以将 nginx.conf 配置文件分为三部分:</p> <ol> <li>全局块</li> </ol> <pre><code class="language-yaml">worker_processes 1; </code></pre> <p>从配置文件开始到 events 块之间的内容,主要会设置一些影响 Nginx 服务器整体运行的配置指令,主要包括:配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。</p> <p>上面这行 worker_processes 配置,是 Nginx 服务器并发处理服务的关键配置,该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的约束。</p> <ol start="2"> <li>events 块</li> </ol> <pre><code class="language-yaml">events &#123; worker_connections 1024; &#125; </code></pre> <p>events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括:是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等</p> <p>上述例子就表示每个 work process 支持的最大连接数为 1024。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。</p> <ol start="3"> <li>http 块</li> </ol> <pre><code class="language-yaml">http &#123; include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server &#123; listen 80; server_name localhost; location / &#123; root html; index index.html index.htm; &#125; error_page 500 502 503 504 /50x.html; location = /50x.html &#123; root html; &#125; &#125; </code></pre> <p>这部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。下面的反向代理、动静分离、负载均衡都是在这部分中配置</p> <p>__http 全局块:__http 全局块配置的指令包括:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。</p> <p>__server 块:__这块和虚拟主机有密切关系,从用户角度看,虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。</p> <p>__location 块:__这块的主要作用是:基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。</p> <p>每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。(☆☆☆☆☆)</p> <h4 id="反向代理配置"><a class="anchor" href="#反向代理配置">#</a> 反向代理配置</h4> <ol> <li>location 配置规则</li> </ol> <pre><code class="language-yaml">location [ = | ~ | ~* | ^~ | @ ] /uri &#123; &#125; =   :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。 ~ :用于表示 uri 包含正则表达式,并且区分大小写。 ~* :用于表示 uri 包含正则表达式,并且不区分大小写。 ^~ :用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的location后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。 @ : &quot;@&quot; 定义一个命名的 location,使用在内部定向时,例如 error_page /uri :不带任何修饰符,也表示前缀匹配,但是在正则匹配之后,如果没有正则命中,命中最长的规则 / :通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default ☆☆☆☆☆ uri没有“/”结尾时,location /abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi等。而有“/”结尾时,location /abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求 </code></pre> <ol start="2"> <li>proxy_pass 配置规则</li> </ol> <pre><code class="language-yaml">url结尾加上了/,相当于是绝对路径,则Nginx不会把location中匹配的路径部分加入代理uri。 url结尾不加/,Nginx则会把匹配的路径部分加入代理uri。 情景1: proxy_pass后有/ 访问地址:http://localhost:8081/WCP.Service/wcp/modeladapter/download/asc.shtml 最终代理:http://10.194.171.7:13082/modeladapter/download/asc.shtml location /WCP.Service/wcp/modeladapter/download/ &#123; proxy_pass http://10.194.171.7:13082/modeladapter/download/; &#125; 访问地址:http://localhost:8081/model/asc.shtml 最终代理:http://127.0.0.1:8082/model/asc.shtml location /model/ &#123; proxy_pass http://127.0.0.1:8082/model/; &#125; 情景2: proxy_pass后有/ 访问地址:http://localhost:8081/model/asc.shtml 最终代理:http://127.0.0.1:8082/asc.shtml location /model/ &#123; proxy_pass http://127.0.0.1:8082/; &#125; 情景3: proxy_pass后没有/ 访问地址:http://localhost:8081/model/asc.shtml 最终代理:http://127.0.0.1:8082/model/asc.shtml location /model/ &#123; proxy_pass http://127.0.0.1:8082; &#125; 情景4 proxy_pass后没有/ 访问地址:http://localhost:8081/model/asc.shtml 最终代理:http://127.0.0.1:8082/AAAmodel/asc.shtml location /model/ &#123; proxy_pass http://127.0.0.1:8082/AAA; &#125; 情景5 proxy_pass后有/ 访问地址:http://localhost:8081/model/asc.shtml 最终代理:http://127.0.0.1:8082/asc.shtml location /model &#123; proxy_pass http://127.0.0.1:8082/; &#125; 情景6 proxy_pass后有/ 访问地址:http://localhost:8081/modelBBB/asc.shtml 最终代理:http://127.0.0.1:8082/asc.shtml location /model &#123; proxy_pass http://127.0.0.1:8082/; &#125; </code></pre> <h4 id="nginx完整配置文件"><a class="anchor" href="#nginx完整配置文件">#</a> Nginx 完整配置文件</h4> <pre><code class="language-yaml">#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events &#123; worker_connections 1024; &#125; http &#123; include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] &quot;$request&quot; ' # '$status $body_bytes_sent &quot;$http_referer&quot; ' # '&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server &#123; listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / &#123; root html; index index.html index.htm; &#125; #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html &#123; root html; &#125; # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ &#123; # proxy_pass http://127.0.0.1; #&#125; # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ &#123; # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #&#125; # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht &#123; # deny all; #&#125; &#125; # another virtual host using mix of IP-, name-, and port-based configuration # #server &#123; # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / &#123; # root html; # index index.html index.htm; # &#125; #&#125; # HTTPS server # #server &#123; # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / &#123; # root html; # index index.html index.htm; # &#125; #&#125; &#125; </code></pre> 2022-11-08T02:05:00.000Z https://blog.jingxiyuan.cn/2022/11/04/%E8%AE%B0%E4%B8%80%E6%AC%A1Vue%E9%A1%B9%E7%9B%AE%E7%9A%84%E9%83%A8%E7%BD%B2/ 记一次Vue项目的部署 <h4 id="描述"><a class="anchor" href="#描述">#</a> 描述</h4> <ul> <li>今天需要把一个 web 项目部署到 ubuntu 服务器上,结果直接使用 apt install nodejs 安装的 nodejs 版本过低,导致编译失败。最后通过查看官网文档获取到了 ubuntu 最新 nodejs 的安装命令。</li> </ul> <h4 id="过程"><a class="anchor" href="#过程">#</a> 过程</h4> <ul> <li>卸载旧的 nodejs(此命令会卸载掉相关依赖包)</li> </ul> <pre><code class="language-bash">sudo apt autoremove --purge nodejs </code></pre> <ul> <li>安装 NodeJS</li> </ul> <pre><code class="language-bash">curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - &amp;&amp; sudo apt-get install -y nodejs </code></pre> <ul> <li>安装 yarn</li> </ul> <pre><code class="language-bash">curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg &gt;/dev/null echo &quot;deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main&quot; | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt-get update &amp;&amp; sudo apt-get install yarn </code></pre> <ul> <li>初始化 (到项目根目录执行)</li> </ul> <pre><code class="language-bash">yarn install </code></pre> <ul> <li>编译(到项目根目录执行,完成后会生成 dist 目录)</li> </ul> <pre><code class="language-bash">yarn build </code></pre> <ul> <li>安装 nginx</li> </ul> <pre><code class="language-bash">apt install nginx </code></pre> <ul> <li>配置 nginx (编译 /etc/nginx/sites-available/default)</li> </ul> <pre><code class="language-yaml">server &#123; 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 /api &#123; proxy_pass http://localhost:8080; &#125; location / &#123; # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. #try_files $uri $uri/ =404; alias /opt/codes/dayu-tools-arbitrage-web/dist/; try_files $uri $uri/ @router; index index.html index.htm; &#125; location @router &#123; rewrite ^.*$ /index.html last;        &#125; } </code></pre> <h4 id="其它"><a class="anchor" href="#其它">#</a> 其它</h4> <ul> <li>重新编译前需要先删除 dist 目录</li> </ul> <pre><code class="language-bash">rm dist -fr yarn build </code></pre> 2022-11-04T07:21:00.000Z https://blog.jingxiyuan.cn/2022/11/03/%E4%B8%8A%E7%8F%AD%E4%BA%86/ 上班了 <ul> <li>终于又上班了。O (∩_∩) O~</li> </ul> 2022-11-03T03:25:00.000Z https://blog.jingxiyuan.cn/2022/11/02/2-dev-null%E5%92%8C-dev-null-2-1%E5%92%8C2-1-dev-null%E7%9A%84%E5%8C%BA%E5%88%AB/ 2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的区别 <h4 id="区别"><a class="anchor" href="#区别">#</a> 区别:</h4> <pre><code class="language-bash">2&gt;/dev/null </code></pre> <p>意思就是把错误输出到 “黑洞”</p> <pre><code class="language-bash">&gt;/dev/null 2&gt;&amp;1 </code></pre> <p>默认情况是 1,也就是等同于 1&gt;/dev/null 2&gt;&amp;1。意思就是把标准输出重定向到 “黑洞”,还把错误输出 2 重定向到标准输出 1,也就是标准输出和错误输出都进了 “黑洞”</p> <pre><code class="language-bash">2&gt;&amp;1 &gt;/dev/null </code></pre> <p>意思就是把错误输出 2 重定向到标准出书 1,也就是屏幕,标准输出进了 “黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕</p> <h4 id="解释"><a class="anchor" href="#解释">#</a> 解释:</h4> <ol> <li> <p>文件描述符<br /> Linux 系统预留三个文件描述符:0、1 和 2,他们的意义如下所示:<br /> 0—— 标准输入(stdin)<br /> 略...<br /> 1—— 标准输出(stdout)<br /> 在当前目录下,有且只有一个文件名称为 a.txt 的文件,这时我们运行这个命令【ls a.txt】, 就会获得一个标准输出 stdout 的输出结果:a.txt<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen629761046.jpg" alt="" /><br /> 2—— 标准错误(stderr)<br /> 在当前目录下,有且只有一个文件名称为 a.txt 的文件,我们运行命令【ls b.txt】,我们就会获得一个标准错误 stderr 的输出结果 “ls:无法访问 b.txt:没有这样的文件或目录”。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen629793578.jpg" alt="" /></p> </li> <li> <p>重定向<br /> 重定向的符号有两个:&gt; 或 &gt;&gt;,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。举例如下:</p> </li> </ol> <ul> <li> <p>重定向标准输出 stdout<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen630033531.jpg" alt="" /><br /> 如上图所示,对比没有添加重定向的操作,这条命令在使用之后并没有将 a.txt 打印到屏幕。在紧接的 cat 操作后,可以发现本来应该被输出的内容被记录到 stdout.txt 中。</p> </li> <li> <p>重定向标准错误 stderr<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen630256640.jpg" alt="" /><br /> 如上图所示,文件描述符 2,标准错误的重定向也是同样的原理被记录在了文件 stderr.txt 这个文件里面了。</p> </li> <li> <p>可以将 stderr 单独定向到一个文件,stdout 重定向到另一个文件</p> </li> </ul> <pre><code class="language-bash">ls b.txt 2&gt; stderr.txt 1&gt;stdout.txt </code></pre> <ul> <li>也可以将 stderr 和 stdout 重定向到同一个文件</li> </ul> <pre><code class="language-bash">ls b.txt &gt; output.txt 2&gt;&amp;1 </code></pre> <ul> <li>或采用下面的方法,可以少写几个字,能达到同样的效果</li> </ul> <pre><code class="language-bash">ls b.txt &amp;&gt; output.txt ls b.txt &gt;&amp; output.txt #两个表达式效果一样的 </code></pre> <ol start="3"> <li>Linux 特殊文件<br /> /dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null 这个设备通常也被称为位桶(bit bucket)或黑洞。<br /> 所以,2&gt;/dev/null 的意思就是将标准错误 stderr 删掉。</li> </ol> 2022-11-02T08:29:00.000Z https://blog.jingxiyuan.cn/2022/11/01/360%E7%8B%AC%E7%AB%8B%E7%89%88%E5%B0%8F%E5%B7%A5%E5%85%B7/ 360独立版小工具 <h4 id="360独立版小工具"><a class="anchor" href="#360独立版小工具">#</a> 360 独立版小工具</h4> <p><img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen623936500.jpg" alt="" /><br /> 360 全家桶众说纷纭但工具箱还是挺实用的,这波小工具可以单独下载使用,有需要的朋友赶紧下载吧!</p> <p><span class="exturl" data-url="aHR0cHM6Ly9wYW4uamluZ3hpeXVhbi5jbi8lRTglQkQlQUYlRTQlQkIlQjYvJUU3JUIzJUJCJUU3JUJCJTlGLzM2MCVFNSVCMCU4RiVFNSVCNyVBNSVFNSU4NSVCNw==">下载地址</span></p> <h4 id="部分工具截图"><a class="anchor" href="#部分工具截图">#</a> 部分工具截图</h4> <p><img data-src="https://file.jingxiyuan.cn/images/2022/11/01/1a2e50f738d4a8c1.png" alt="" /><br /> <img data-src="https://file.jingxiyuan.cn/images/2022/11/01/21d1ee247aa7c69f.png" alt="" /><br /> <img data-src="https://file.jingxiyuan.cn/images/2022/11/01/newscreen624392843.jpg" alt="" /></p> 2022-11-01T07:20:00.000Z https://blog.jingxiyuan.cn/2022/10/31/%E4%B8%80%E9%94%AE%E5%85%B3%E9%97%ADWindows10-11%E7%B3%BB%E7%BB%9F%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0/ 一键关闭Windows10/11系统自动更新 <h4 id="介绍"><a class="anchor" href="#介绍">#</a> 介绍</h4> <ul> <li>当你经常需要在家远程到公司进行办公,或者开启了很多临时文件、文档、软件需要等到第二天继续之前的工作时,结果系统自行更新并重启了。是不是会让你非常郁闷。关闭系统自行更新就可以轻松解决此类问题。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/31/afc55608b4c1b512.png" alt="" /></li> </ul> <h4 id="下载"><a class="anchor" href="#下载">#</a> 下载</h4> <p><span class="exturl" data-url="aHR0cHM6Ly9tZXRhLmJveC5sZW5vdm8uY29tL2xpbmsvdmlldy8yNjdjOGU3Mzc5MTY0OWJmYmNlMmVkODQ0NGMxNjBjNg==">win10</span> / <span class="exturl" data-url="aHR0cHM6Ly9tZXRhLmJveC5sZW5vdm8uY29tL3YvbGluay92aWV3LzQwZGIwNTQ1ZThmNDQ4ZDc5OTBkZDE2YjU5NDgzNjhh">win11</span> / <span class="exturl" data-url="aHR0cHM6Ly9wYW4uamluZ3hpeXVhbi5jbi8lRTglQkQlQUYlRTQlQkIlQjYvJUU3JUIzJUJCJUU3JUJCJTlGL1dpbmRvd3MlRTglODclQUElRTUlOEElQTglRTYlOUIlQjQlRTYlOTYlQjA=">本地</span></p> 2022-10-31T07:30:00.000Z https://blog.jingxiyuan.cn/2022/10/27/%E6%9E%81%E7%A9%BA%E9%97%B4web%E7%AB%AFhttps%E7%9B%B4%E8%BF%9Enginx%E9%85%8D%E7%BD%AE/ 极空间web端https直连nginx配置 <h4 id="介绍"><a class="anchor" href="#介绍">#</a> 介绍</h4> <ul> <li>ip 直连一般都映射了 5055, 但是直接访问 5055 极空间只提供了 http 协议,如果希望使用 https 协议则必须使用其它端口进行访问。以下方案采用 nginx 反向代理实现,端口使用 10000 举例。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/27/2022-10-27-14-39-25.jpg" alt="" /></li> </ul> <h4 id="配置"><a class="anchor" href="#配置">#</a> 配置</h4> <ol> <li>需要先把 10000 端口在路由器上做好映射。</li> <li>证书生成好并放置到 nginx 上。(证书生成方法不做介绍请自行百度)</li> <li>http 跳转 https 配置</li> </ol> <pre><code class="language-yaml">server &#123; if ($scheme = http) &#123; rewrite ^(.*)$ https://$host$1 permanent; &#125; &#125; </code></pre> <ol start="4"> <li>web 端口监听配置</li> </ol> <pre><code class="language-yaml">#极空间-web server &#123; listen 10000 ssl http2; #ipv4 listen [::]:10000 ssl http2; #ipv6 server_name xxx.xxx.com; #填写自己的域名,主域名或者子域名 #include /etc/nginx/conf.d/ssl/ssl_common.conf; ssl_certificate_key /etc/nginx/conf.d/ssl/xxx.key; #加密证书 ssl_certificate /etc/nginx/conf.d/ssl/xxx.pem; #加密证书 ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; #开启OCSP stapling ssl_stapling on; ssl_stapling_verify on; client_max_body_size 128M; add_header Strict-Transport-Security &quot;max-age=31536000; includeSubdomains; preload&quot;; proxy_send_timeout 180s; #设置发送超时时间 proxy_read_timeout 180s; #设置读取超时时间 # Prevent Information leaks proxy_hide_header X-Powered-By; proxy_hide_header Server; proxy_hide_header X-AspNetMvc-Version; proxy_hide_header X-AspNet-Version; # http security headers add_header X-Content-Type-Options nosniff; add_header Pragma no-cache; add_header Cache-Control no-store; add_header X-XSS-Protection &quot;1; mode=block&quot;; add_header Referrer-Policy origin-when-cross-origin; add_header X-Permitted-Cross-Domain-Policies none; add_header X-Frame-Options SAMEORIGIN; #允许同域嵌套 # Add Security cookie flags proxy_cookie_path ~(.*) &quot;$1; SameSite=strict; secure; httponly&quot;; # Path to the root of your installation location / &#123; proxy_intercept_errors on; proxy_max_temp_file_size 0; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://极空间内网ip:5055; #这里设置你自己要跳转的局域网应用; proxy_redirect http://域名:5055/home https://域名:10000/home; #极空间在登陆后会跳转到http协议的5055端口,所以要在此替换为https协议的10000端口 &#125; error_page 500 502 503 504 /500.html; error_page 400 404 /500.html; location = /500.html &#123; root /usr/share/nginx/html/; #错误html &#125; &#125; </code></pre> <h4 id="问题"><a class="anchor" href="#问题">#</a> 问题</h4> <ul> <li>需要开启允许嵌套否则登陆后所有应用都是拒绝访问</li> <li>需要配置 proxy_redirect 替换响应 url,否则会跳转到默认 http 协议的 5055 端口</li> <li>如果配置 proxy_redirect 后无效可能需要清除浏览器缓存(F12 - 网络 - 右键点击 url 区域 - 清除浏览器缓存)</li> </ul> 2022-10-27T05:34:00.000Z https://blog.jingxiyuan.cn/2022/10/22/%E6%9E%81%E7%A9%BA%E9%97%B4Docker%E7%89%88%E9%9D%92%E9%BE%99%E9%9D%A2%E6%9D%BF%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/ 极空间Docker版青龙面板安装与配置 <h4 id="介绍"><a class="anchor" href="#介绍">#</a> 介绍</h4> <ul> <li>青龙面板是一个支持 python3、javascript、shell、typescript 的定时任务管理面板。它支持在线管理脚本、环境变量、配置文件,支持在线查看日志及支持多种方式的消息通知。</li> </ul> <h4 id="安装"><a class="anchor" href="#安装">#</a> 安装</h4> <ul> <li>本文使用的是<span class="exturl" data-url="aHR0cHM6Ly9odWIuZG9ja2VyLmNvbS9yL3doeW91ci9xaW5nbG9uZw=="> whyour/qinglong</span> 的镜像。</li> <li>路径映射(由于青龙面板有 nodejs 环境,所以我把 hexo 博客的编译也放置在上面,再把 nginx 的 html 映射过来,这样就可以直接编译发布了。)<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/24/2022-10-24-19-29-06.jpg" alt="" /></li> </ul> <pre><code class="language-yaml">#青龙面板装载路径 /ql/data #博客装载路径(如果你不部署hexo博客可以不用配置) /root/.ssh  #ssh证书文件(如果你不用把hexo推送到git上可以不用配置) /blog     #hexo博客编译目录 /blog/nginx_blog #nginx上放置博客的目录(例如:/Docker/nginx/html/blog) </code></pre> <ul> <li>端口<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/22/2022-10-22-11-02-195ea093b249c53244.jpg" alt="" /><br /> <code>4000端口是hexo-admin使用的,如果你不用可以不配置</code></li> <li>环境<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/22/2022-10-22-11-02-19a0822966d88a012e.jpg" alt="" /></li> <li>登录<br /> 地址:<span class="exturl" data-url="aHR0cDovL3huLS1JUC1odThkeTcwZTRtNWE6NTcwMA==">http:// 极空间 IP:5700</span><br /> 默认账号:admin<br /> 默认密码:admin</li> </ul> <h4 id="配置"><a class="anchor" href="#配置">#</a> 配置</h4> <ul> <li>我主要用青龙面板跑京东的脚本,所以也只介绍相关的配置方法</li> <li>定时任务 (我使用的是 KingRan/KR 的集合库,以下是拉取命令)<br /> <code>ql repo https://github.com/KingRan/KR.git &quot;jd_|jx_|jdCookie&quot; &quot;activity|backUp|wskey&quot; &quot;^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR&quot;</code></li> <li>定时规则(我是每 3 小时拉取一次,不要拉取太频繁否则可能被封)<br /> <code>0 */3 * * *</code></li> <li>环境变量</li> </ul> <pre><code class="language-yaml">名称:JD_COOKIE 值:web京东登陆后按F12在网络tab页中的请求内查找cookie,然后复制pt_key=到pt_pin=等 </code></pre> <ul> <li>配置文件 (主要修改和添加以下配置)</li> </ul> <pre><code class="language-yaml">repo命令拉取脚本时需要拉取的文件后缀,直接写文件后缀名即可 RepoFileExtensions=&quot;js py ts&quot; 钉钉(消息推送) export DD_BOT_TOKEN= export DD_BOT_SECRET= ##开卡 export guaopencard_All=&quot;true&quot; export guaopencard_addSku_All=&quot;true&quot; export guaopencardRun_All=&quot;true&quot; export guaopencard_draw=&quot;true&quot; export JD_TRY=&quot;true&quot; export exjxbeans=&quot;true&quot; export DY_OPENALL=&quot;true&quot; #抽奖 export opencard_draw=3 #开启脚本依赖文件缺失修复 export ec_fix_dep=&quot;true&quot; #开启脚本依赖文件更新 export ec_re_dep=&quot;true&quot; #清空购物车 export JD_CART_REMOVE=&quot;true&quot; export JD_CART=&quot;true&quot; #去掉多余的双十一红包脚本 export FLCODE='' #加购物车抽奖 export RUN_CAR=true #停用小额免密支付 export JD_PAY_CONTRACT=true </code></pre> <ul> <li>依赖管理</li> </ul> <pre><code class="language-yaml">#nodejs依赖 crypto-js prettytable dotenv jsdom date-fns tough-cookie tslib ws@7.4.3 ts-md5 jsdom -g jieba fs form-data json5 global-agent png-js @types/node require typescript js-base64 axios #pythone依赖 requests canvas ping3 jieba aiohttp PyExecJS #Linux依赖 bizCode bizMsg lxml </code></pre> <h4 id="其它"><a class="anchor" href="#其它">#</a> 其它</h4> <pre><code class="language-bash">#配置国内源 pip config --global set global.index-url https://mirrors.aliyun.com/pypi/simple/ pip config --global set install.trusted-host https://mirrors.aliyun.com #升级pip pip install --upgrade pip #更新青龙 ql update #已知要安装的依赖(不安装部分脚本任务会失败) pnpm install ds #一键安装所有依赖(基于Faker一键脚本安装的青龙 可通过执行/ql/data/scripts下的QLDependency.sh脚本安装,如脚本已经更新则通过下面命令执行 curl -fsSL https://git.metauniverse-cn.com/https://raw.githubusercontent.com/shufflewzc/QLDependency/main/Shell/QLOneKeyDependency.sh | sh #一般出现这种错误:(缺依赖) Error: Cannot find module 'xx' 执行pnpm install xxx #一般出现这种错误:(缺文件) Error: Cannot find module './xx' 那就是拉库命令不完整,请检查或复制完整的拉库命 #Python3依赖安装失败修复(基于Faker一键脚本安装的青龙) curl -sS https://bootstrap.pypa.io/get-pip.py | python3 </code></pre> 2022-10-22T02:44:00.000Z https://blog.jingxiyuan.cn/2022/10/21/Hexo-Theme-Shoka-Valine%E8%AF%84%E8%AE%BA%E9%85%8D%E7%BD%AE/ Hexo + Theme.Shoka + Valine评论配置 <ul> <li>valine 评论需要 LeanCloud 支持</li> </ul> <h4 id="leancloud注册"><a class="anchor" href="#leancloud注册">#</a> LeanCloud 注册</h4> <ol> <li>到<span class="exturl" data-url="aHR0cHM6Ly93d3cubGVhbmNsb3VkLmNu"> LeanCloud</span> 网站完成注册。</li> <li>创建应用。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-32.jpg" alt="" /></li> <li>名称随便取,方案看自己选择。开发版免费但是有限制,商业版收费无限制。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-32516c410640de936a.jpg" alt="" /></li> <li>点击配置按钮进行配置。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-32267554cf6f62d3eb.jpg" alt="" /></li> <li>点击设置 - 应用凭证可获取 App ID 和 App Key<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-328c330a6fdd48d2c3.jpg" alt="" /></li> <li>点击设置 - 安全中心根据自己的需求配置<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-11-54-32204f14d87e95b59e.jpg" alt="" /></li> </ol> <h4 id="修改themeshoka配置"><a class="anchor" href="#修改themeshoka配置">#</a> 修改 Theme.Shoka 配置</h4> <pre><code class="language-yaml">valine:  appId: 粘贴5中获取的App ID #Your_appId appKey: 粘贴5中获取的App Key #Your_appkey placeholder: ヽ(○´∀`)ノ♪欢迎畅所欲言 # Comment box placeholder avatar: mp #默认头像设置 Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro pageSize: 10 # Pagination size lang: zh-CN visitor: true # Article reading statistic 这个要设置为false,以免与 leancloud_visitors 突冲 NoRecordIP: false # Whether to record the commenter IP serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in) powerMode: true tagMeta: visitor: 新朋友 master: 博主 friend: 小伙伴 investor: 金主粑粑 tagColor: master: &quot;var(--color-orange)&quot; friend: &quot;var(--color-aqua)&quot; investor: &quot;var(--color-pink)&quot; tagMember: master: # - hash of master@email.com # - hash of master2@email.com friend: # - hash of friend@email.com # - hash of friend2@email.com investor: # - hash of investor1@email.com </code></pre> 2022-10-21T03:48:00.000Z https://blog.jingxiyuan.cn/2022/10/21/%E6%9E%81%E7%A9%BA%E9%97%B4Docker%E7%89%88mariadb%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/ 极空间Docker版mariadb安装与配置 <h4 id="介绍"><a class="anchor" href="#介绍">#</a> 介绍</h4> <ul> <li>mariadb 属于 mysql 的一个分支,完全兼容 mysql,使用方式和 mysql 无区别。</li> </ul> <h4 id="安装"><a class="anchor" href="#安装">#</a> 安装</h4> <ul> <li>本文介绍安装的镜像为 linuxserver_mariadb 的 10.5.13-r0-ls45,原则上使用最新版即可</li> <li>配置文件映射<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-09-20-56.jpg" alt="" /></li> <li>端口<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-09-21-49.jpg" alt="" /></li> <li>环境(MYSQL_ROOT_PASSWORD 为数据库 root 用户密码)<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/21/2022-10-21-09-22-43.jpg" alt="" /></li> <li>到此已经可以在内网使用了,连接方法同 mysql 一致</li> </ul> <h4 id="配置"><a class="anchor" href="#配置">#</a> 配置</h4> <ul> <li>此处配置为 nginx 反向代理,配置完成后可在外网连接访问</li> </ul> <pre><code class="language-yaml">stream &#123; #极空间-docker-mariadb upstream mariadb &#123; hash $remote_addr consistent; server mariadb的ip:端口; &#125; server &#123; listen 监听端口; proxy_connect_timeout 30s; proxy_timeout 300s; proxy_pass mariadb; &#125; &#125; </code></pre> 2022-10-21T01:06:00.000Z https://blog.jingxiyuan.cn/2022/10/20/%E6%9E%81%E7%A9%BA%E9%97%B4Docker%E7%89%88Wordpress%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/ 极空间Docker版Wordpress安装与配置 <h4 id="安装"><a class="anchor" href="#安装">#</a> 安装</h4> <ul> <li>下载最新版 wordpress 镜像,如极空间无法下载,可到<span class="exturl" data-url="aHR0cHM6Ly9wdWxsaW1hZ2UucGFzc2VybWEuY29tLw=="> passerma 网站</span>下载。</li> <li>需要先在 mysql 中创建给 wordpress 使用的库。</li> <li>文件路径映射(目前极空间不能映射到高速盘,否则无法启动)。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/20/2022-10-20-08-58-31.png" alt="" /></li> <li>端口映射。<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/20/2022-10-20-08-58-56.png" alt="" /></li> <li>通过映射的端口访问安装界面(一定要通过最终访问的页面进行安装,否则修改配置比较麻烦。如最终是域名访问,就先把域名解析代理等先配置好,再通过域名访问安装)。</li> </ul> <h4 id="配置"><a class="anchor" href="#配置">#</a> 配置</h4> <ul> <li>如需使用 https 访问,需要在 wp-config.php 中加入以下代码,否则资源文件无法访问。</li> </ul> <pre><code class="language-php">if((!empty( $_SERVER['HTTP_X_FORWARDED_HOST'])) || (!empty( $_SERVER['HTTP_X_FORWARDED_FOR'])) ) &#123; $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST']; $_SERVER['HTTPS'] = 'on'; &#125; </code></pre> <ul> <li>后台安装插件时如果跳转到 ftp 配置,则需要在 wp-config.php 中加入以下代码,并到 wp-content 目录下创建 tmp 目录,最后还需要给 tmp 目录赋予读写权限。</li> </ul> <pre><code class="language-php">define('WP_TEMP_DIR', ABSPATH.'wp-content/tmp'); define('FS_METHOD', 'direct'); define('FS_CHMOD_DIR', 0777); define('FS_CHMOD_FILE', 0777); </code></pre> <ul> <li>目录和文件所有者、组会自动变为 root,目前我是通过访问页面时通过命令修正。暂时未发现问题,如果不行则只能通过定时任务来定时修正了。需要在 wp-config.php 中加入以下代码。</li> </ul> <pre><code class="language-php">chown('/var/www/html', 'www-data'); chgrp('/var/www/html', 'www-data'); chmod('/var/www/html/wp-content/plugins', 0777); chmod('/var/www/html/wp-content/themes', 0777); chmod('/var/www/html/wp-content/tmp', 0777); </code></pre> <ul> <li>隐藏后台访问需要在 wp-login.php 中加入以下代码,key、value 和 https://www.xxx.com/ 需要修改为自己的。修改后只能通过 https://www.xxx.com/wp-login.php?key=value 访问,其它访问需要登录的页面都会跳转到配置的 https://www.xxx.com/ 地址。</li> </ul> <pre><code class="language-php">if($_GET['key'] != 'value') &#123; header('Location: https://www.xxx.com/'); &#125; </code></pre> 2022-10-20T00:56:00.000Z https://blog.jingxiyuan.cn/2022/10/19/%E9%95%BF%E4%BA%86%E4%B8%80%E5%B2%81/ 又长了一岁 <p>一年一次的总结时间又到了,这一年前半年平平无奇,后半年惊涛骇浪。中年危机如期而遇,人身的低谷终究还是来了。很沮丧也很无助,但还是要坚强面对。人生起起伏伏,时好时坏,终归还是会好起来的。加油!加油!加油<br /> !</p> 2022-10-19T00:51:00.000Z https://blog.jingxiyuan.cn/2022/10/18/%E6%90%AD%E5%BB%BAnagios%E7%9B%91%E6%8E%A7/ 搭建nagios监控 <h4 id="监控端服务安装与配置"><a class="anchor" href="#监控端服务安装与配置">#</a> 监控端服务安装与配置</h4> <ol> <li>nagios 需要安装主程序 core 和 nrpe(nagios 和各被监控主机都必须安装)。如需使用自研前端可通过安装 ndoutils (用于把 nagios 监控信息写入数据库) 和 mysql 实现。具体安装见<span class="exturl" data-url="aHR0cHM6Ly9zdXBwb3J0Lm5hZ2lvcy5jb20va2Iv">官网</span></li> <li>nagios 默认监控命令脚本放置在 libexec 中,自定义脚本也放到此处</li> <li>etc/objects/commands.cfg 用于保存 nagios 默认监控命令</li> <li>etc/nrpe.cfg 文件中需要添加用于被监控执行命令项(各被监控主机中都需要添加)<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/18/image.png" alt="" /></li> <li>etc/objects/hosts 目录下配置需要被监控的主机信息<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/18/image2.png" alt="" /></li> <li>etc/objects/servers 目录下配置需要在被监控主机上执行的监控命令(第 4 项中的命令)<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/18/image3.png" alt="" /></li> </ol> <h4 id="被监控端服务安装与配置"><a class="anchor" href="#被监控端服务安装与配置">#</a> 被监控端服务安装与配置</h4> <ol> <li>被监控端需要安装 nrpe</li> <li>被监控端需要把监控端的命令写入到 nrpe 的配置文件中</li> <li>被监控端需要把命令执行脚本放入 libexec 目录中</li> <li>被监控端自动安装脚本(可借鉴)</li> </ol> <pre><code class="language-bash">1、请先修改脚本中的服务端IP。 2、如被监控端不支持let计算命令请执行sudo dpkg-reconfigure dash命令,弹出选择窗口后选择no。 3、需要在脚本同目录下创建CentOS、Ubuntu、sh和conf目录,目录下分别放置nrpe的tar安装包、监控脚本和nrpe配置文件。 #!/bin/bash #服务端ip SERVER_IP=10.10.10.121 #安装目录 INSTALL_HOME=`pwd` #安装ubuntu版本 INSTALL_UBUNTU() &#123; sudo apt-get update sudo apt-get install -y autoconf automake gcc libc6 libmcrypt-dev make libssl-dev wget openssl cd /tmp #wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-4.0.3.tar.gz cp $INSTALL_HOME/Ubuntu/nrpe.tar.gz ./ tar xzf nrpe.tar.gz cd /tmp/nrpe-nrpe-4.0.3/ sudo ./configure --enable-command-args --with-ssl-lib=/usr/lib/x86_64-linux-gnu/ sudo make all sudo make install-groups-users sudo make install sudo make install-config sudo sh -c &quot;echo &gt;&gt; /etc/services&quot; sudo sh -c &quot;sudo echo '# Nagios services' &gt;&gt; /etc/services&quot; sudo sh -c &quot;sudo echo 'nrpe 5666/tcp' &gt;&gt; /etc/services&quot; #判断系统是高版本还是低版本 VERSION=`lsb_release -r --short` IS_LOW_VERSION=`echo &quot;$VERSION &lt; 15&quot; | bc` if [ $IS_LOW_VERSION = 1 ]; then #低版本 sudo make install-init else #高版本 sudo make install-init sudo systemctl enable nrpe.service fi sudo mkdir -p /etc/ufw/applications.d sudo sh -c &quot;echo '[NRPE]' &gt; /etc/ufw/applications.d/nagios&quot; sudo sh -c &quot;echo 'title=Nagios Remote Plugin Executor' &gt;&gt; /etc/ufw/applications.d/nagios&quot; sudo sh -c &quot;echo 'description=Allows remote execution of Nagios plugins' &gt;&gt; /etc/ufw/applications.d/nagios&quot; sudo sh -c &quot;echo 'ports=5666/tcp' &gt;&gt; /etc/ufw/applications.d/nagios&quot; sudo ufw allow NRPE sudo ufw reload sudo sh -c &quot;sed -i '/^allowed_hosts=/s/$/,$SERVER_IP/' /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;sed -i 's/^dont_blame_nrpe=.*/dont_blame_nrpe=1/g' /usr/local/nagios/etc/nrpe.cfg&quot; cd $INSTALL_HOME sudo cp ./sh/* /usr/local/nagios/libexec/ sudo chmod +xr /usr/local/nagios/libexec/* sudo sh -c &quot;echo 'command[check_ping]=/usr/local/nagios/libexec/check_ping -H 127.0.0.1 -w 3000.0,80% -c 5000.0,100% -p 5' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_cpu]=/usr/local/nagios/libexec/check_cpu.sh' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_mem]=/usr/local/nagios/libexec/check_mem.sh' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_disk]=/usr/local/nagios/libexec/check_disk.sh' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_my_service]=/usr/local/nagios/libexec/check_my_service.sh \$ARG1\$' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_system_info]=/usr/local/nagios/libexec/check_system_info.sh' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; NETWORK_INDEX=1 for NETWORK_NAME in `cat /proc/net/dev | awk '&#123;i++; if(i&gt;2)&#123;print $1&#125;&#125;' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'`;do if [ $NETWORK_NAME != 'lo' ]; then sudo sh -c &quot;echo 'command[check_network$NETWORK_INDEX]=/usr/local/nagios/libexec/check_network.sh $NETWORK_NAME' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; NETWORK_INDEX=`expr $NETWORK_INDEX + 1 ` fi done if [ $IS_LOW_VERSION = 1 ]; then #低版本 sudo start nrpe else #高版本 sudo systemctl start nrpe.service fi &#125; #安装centos版本 INSTALL_CENTOS() &#123; yum install -y gcc glibc glibc-common openssl openssl-devel perl wget cd /tmp #wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-4.0.3.tar.gz cp $INSTALL_HOME/CentOS/nrpe.tar.gz ./ tar xzf nrpe.tar.gz cd /tmp/nrpe-nrpe-4.0.3/ ./configure --enable-command-args make all make install-groups-users make install make install-config echo &gt;&gt; /etc/services echo '# Nagios services' &gt;&gt; /etc/services echo 'nrpe 5666/tcp' &gt;&gt; /etc/services #判断系统是高版本还是低版本 VERSION=`rpm -q centos-release|cut -d- -f3` #安装bc命令 yum -y install bc IS_LOW_VERSION=`echo &quot;$VERSION &lt; 7&quot; | bc` if [ $IS_LOW_VERSION = 1 ]; then #低版本 make install-init iptables -I INPUT -p tcp --destination-port 5666 -j ACCEPT service iptables save ip6tables -I INPUT -p tcp --destination-port 5666 -j ACCEPT service ip6tables save else #高版本 make install-init systemctl enable nrpe.service firewall-cmd --zone=public --add-port=5666/tcp firewall-cmd --zone=public --add-port=5666/tcp --permanent fi sudo sh -c &quot;sed -i '/^allowed_hosts=/s/$/,$SERVER_IP/' /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;sed -i 's/^dont_blame_nrpe=.*/dont_blame_nrpe=1/g' /usr/local/nagios/etc/nrpe.cfg&quot; cd $INSTALL_HOME sudo cp ./sh/* /usr/local/nagios/libexec/ sudo chmod +xr /usr/local/nagios/libexec/* sudo sh -c &quot;echo 'command[check_ping]=/usr/local/nagios/libexec/check_ping -H 127.0.0.1 -w 3000.0,80% -c 5000.0,100% -p 5' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_cpu]=/usr/local/nagios/libexec/check_cpu.sh' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_mem]=/usr/local/nagios/libexec/check_mem.sh' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_disk]=/usr/local/nagios/libexec/check_disk.sh' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_my_service]=/usr/local/nagios/libexec/check_my_service.sh \$ARG1\$' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; sudo sh -c &quot;echo 'command[check_system_info]=/usr/local/nagios/libexec/check_system_info.sh' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; NETWORK_INDEX=1 for NETWORK_NAME in `cat /proc/net/dev | awk '&#123;i++; if(i&gt;2)&#123;print $1&#125;&#125;' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'`;do if [ $NETWORK_NAME != 'lo' ]; then sudo sh -c &quot;echo 'command[check_network$NETWORK_INDEX]=/usr/local/nagios/libexec/check_network.sh $NETWORK_NAME' &gt;&gt; /usr/local/nagios/etc/nrpe.cfg&quot; NETWORK_INDEX=`expr $NETWORK_INDEX + 1 ` fi done if [ $IS_LOW_VERSION = 1 ]; then #低版本 if [ $(echo &quot;$VERSION &lt; 6&quot; | bc) -eq 1 ]; then service nrpe start else start nrpe fi else #高版本 systemctl start nrpe.service fi &#125; #安装其它版本 INSTALL_OTHER() &#123; echo &quot;Not supported at the moment.&quot; &#125; #根据不同系统安装不同版本 INSTALL() &#123; if grep -Eqii &quot;CentOS&quot; /etc/issue || grep -Eq &quot;CentOS&quot; /etc/*-release; then DISTRO='CentOS' PM='yum' INSTALL_CENTOS elif grep -Eqi &quot;Red Hat Enterprise Linux Server&quot; /etc/issue || grep -Eq &quot;Red Hat Enterprise Linux Server&quot; /etc/*-release; then DISTRO='RHEL' PM='yum' INSTALL_OTHER elif grep -Eqi &quot;Aliyun&quot; /etc/issue || grep -Eq &quot;Aliyun&quot; /etc/*-release; then DISTRO='Aliyun' PM='yum' INSTALL_OTHER elif grep -Eqi &quot;Fedora&quot; /etc/issue || grep -Eq &quot;Fedora&quot; /etc/*-release; then DISTRO='Fedora' PM='yum' INSTALL_OTHER elif grep -Eqi &quot;Debian&quot; /etc/issue || grep -Eq &quot;Debian&quot; /etc/*-release; then DISTRO='Debian' PM='apt' INSTALL_OTHER elif grep -Eqi &quot;Ubuntu&quot; /etc/issue || grep -Eq &quot;Ubuntu&quot; /etc/*-release; then DISTRO='Ubuntu' PM='apt' INSTALL_UBUNTU elif grep -Eqi &quot;Raspbian&quot; /etc/issue || grep -Eq &quot;Raspbian&quot; /etc/*-release; then DISTRO='Raspbian' PM='apt' INSTALL_OTHER else echo &quot;unknow linux.&quot; exit 1 fi echo $DISTRO &#125; INSTALL exit 0 </code></pre> <h4 id="登录"><a class="anchor" href="#登录">#</a> 登录</h4> <p>地址:<span class="exturl" data-url="aHR0cDovL3huLS1JUC1mcjVjODZseDd6L25hZ2lvcw==">http:// 服务器 IP/nagios</span><br /> 用户名:nagiosadmin<br /> 密码:nagiosadmin</p> <h4 id="常见问题"><a class="anchor" href="#常见问题">#</a> 常见问题</h4> <ol> <li>监控日志未写入 mysql(可能是 ndoutils 服务不正常导致)。采用以下脚本命令解决</li> </ol> <pre><code class="language-bash">#!/bin/bash sudo rm -f /usr/local/nagios/var/ndo2db.pid sudo rm -f /usr/local/nagios/var/ndo.sock sudo systemctl restart ndo2db.service sudo systemctl status ndo2db.service </code></pre> 2022-10-18T01:39:00.000Z https://blog.jingxiyuan.cn/2022/10/17/redis%E4%B8%BB%E4%BB%8E%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE%E8%AE%B0%E5%BD%95/ redis主从基础配置 <h4 id="主服务"><a class="anchor" href="#主服务">#</a> 主服务</h4> <ol> <li>基础配置</li> </ol> <pre><code class="language-yaml">port 6379 requirepass 123456(密码,建议不设置) vm-enabled no (虚拟内存,内存够的情况下可以不使用) maxmemory 1GB(告诉Redis当使用了多少物理内存后就开始拒绝后续的写入) bind 127.0.0.1 (注释掉,否则不能外部连接) rdbchecksum no(持久化数据检查) list-max-ziplist-size 1024(ziplist的最大容量,正数为自己指定的大小。负数-1到-5为对应的值4到64Kb) list-compress-depth 20(quicklist的两端多少个node不压缩,0为全部不压缩) </code></pre> <pre><code class="language-bash">sysctl vm.overcommit_memory=1 (立即生效) 修改/etc/sysctl.conf添加vm.overcommit_memory=1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何。Redis的RDB持久化实现是folk一个子进程,然后让子进程将内存镜像dump到RDB文件中。理论上来说是需要跟父进程一样的内存空间,但是由于linux很早就支持的copy-on-write技术,所以实际上并不需要这么多的物理内存的。) </code></pre> <ol start="2"> <li>禁用透明大页(影响性能)</li> </ol> <pre><code class="language-bash">需要sudo su 切换到root身份(sudo 没用) echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled 修改/etc/init.d/redis-server,加入/bin/echo never &gt; /sys/kernel/mm/transparent_hugepage/enabled </code></pre> <ol start="3"> <li>修复 TCP 警告</li> </ol> <pre><code class="language-bash">sysctl net.core.somaxconn=1024(立即生效) 修改/etc/sysctl.conf添加net.core.somaxconn=1024 </code></pre> <ol start="4"> <li>客户端缓冲区限制</li> </ol> <pre><code class="language-yaml">客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。 可以三种不同客户端的方式进行设置: normal -&gt; 正常客户端 slave -&gt; slave 和 MONITOR 客户端 pubsub -&gt; 至少订阅了一个 pubsub channel 或 pattern 的客户端 语法 : client-output-buffer-limit &lt;class&gt;&lt;hard limit&gt; &lt;soft limit&gt; &lt;soft seconds&gt; 一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。 例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开。如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据, 只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。 把硬限制和软限制都设置为 0 来禁用该特性 client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 5gb 512mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 </code></pre> <ol start="5"> <li>持久化配置</li> </ol> <pre><code class="language-yaml">---关闭RDB持久化--- save &quot;&quot; 默认配置如下: save 900 1 #900秒内有1次更新就持久化 save 300 10 #300秒内有10次更新就持久化 save 60 10000 #60秒内有10000次更新就持久化 ---关闭RDB持久化--- 主从同步支持两种策略,即disk和socket方式。 新的slave端和重连的salve端不允许去继续同步进程,这被称之为“完全同步”。 一个RDB文件从master端传到slave端,分为两种情况: 1、支持disk:master端将RDB file写到disk,稍后再传送到slave端; 2、无磁盘diskless:master端直接将RDB file传到slave socket,不需要与disk进行交互。无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境。 repl-diskless-sync no 默认不使用diskless同步方式 repl-diskless-sync-delay 30 无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒 repl-ping-slave-period 60 slave端向server端发送pings的时间区间设置,默认为10秒 repl-timeout 3600 设置超时时间 repl-disable-tcp-nodelay no 是否启用TCP_NODELAY,如果启用则会使用少量的TCP包和带宽去进行数据传输到slave端,当然速度会比较慢;如果不启用则传输速度比较快,但是会占用比较多的带宽。 repl-backlog-size 1mb 设置backlog的大小,backlog是一个缓冲区,在slave端失连时存放要同步到slave的数据,因此当一个slave要重连时,经常是不需要完全同步的,执行局部同步就足够了。 backlog设置的越大,slave可以失连的时间就越长。 repl-backlog-ttl 3600 如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。 slave-priority 100 slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。 min-slaves-to-write 3 min-slaves-max-lag 10 设置当一个master端的可用slave少于N个,延迟时间大于M秒时,不接收写操作。 </code></pre> <h4 id="从服务"><a class="anchor" href="#从服务">#</a> 从服务</h4> <pre><code class="language-yaml">基本配置同主服务一致 slaveof 127.0.0.1 6379(主redis的ip和端口) masterauth 123456 (主redis的密码) 可以通过slaveof no one命令将Slaver升级为Maste bgsave (持久化命令,在redis-cli中执行,默认创建dump.rdb文件,路径为 /var/lib/redis/dump.rdb。可通过find / -name dump.rd查找) </code></pre> <h4 id="相关命令"><a class="anchor" href="#相关命令">#</a> 相关命令</h4> <pre><code class="language-bash">看状态 sudo /etc/init.d/redis-server status 看端口 netstat -nlt|grep 6379 外部连接 sudo vim /etc/redis/redis.conf把protected-mode改为no,把bind ip注释掉 重启 sudo server redis-server restart 查看内存 free -m 批量删除指定key redis-cli -n 6 scan 0 match *2020-06-12 count 10000| xargs redis-cli -n 6 del 大量删除key后快速释放被占用的内存 memory purge </code></pre> <h4 id="问题解决"><a class="anchor" href="#问题解决">#</a> 问题解决</h4> <pre><code class="language-bash">写入问题 redis-cli config set stop-writes-on-bgsave-error no sudo vim /etc/redis/redis.conf把stop-writes-on-bgsave-error改为no 修改系统 sudo vim /etc/sysctl.conf加入vm.overcommit_memory=1 sudo sysctl vm.overcommit_memory=1 </code></pre> 2022-10-17T06:07:00.000Z https://blog.jingxiyuan.cn/2022/10/14/nginx%E5%85%81%E8%AE%B8%E8%B7%A8%E5%9F%9F%E8%8E%B7%E5%8F%96cookies%E6%96%B9%E6%B3%95/ nginx允许跨域获取cookie的方法 <h4 id="使用场景"><a class="anchor" href="#使用场景">#</a> 使用场景</h4> <p>  在 A 域名的页面向 B 域名提交数据时需要代入 B 域名的 cookie,否则 B 域名会跳转到登陆页面。解决方式需要使用到 nginx 反向代理,配置如下:</p> <pre><code class="language-yaml">server &#123; listen port ssl http2; server_name xxx.com; ssl_certificate_key /xxx.key; ssl_certificate /xxx.pem; proxy_cookie_path ~(.*) &quot;$1; SameSite=None; secure; httponly&quot;; location / &#123; #允许镶套的方式(可以同域镶套、指定域名镶套或者所有域名镶套) add_header X-Frame-Options ALLOWALL; #允许被所有域名镶套 proxy_pass http://xxx; &#125; &#125; </code></pre> 2022-10-14T09:13:00.000Z https://blog.jingxiyuan.cn/2022/10/12/%E4%BD%BF%E7%94%A8picgo%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87%E5%88%B0chevereto/ 使用PicGo上传图片到chevereto <h1 id="简介"><a class="anchor" href="#简介">#</a> 简介</h1> <p>PicGo 是一款开源的图床管理工具,十分流行。</p> <p>PicGo 官方指南:<span class="exturl" data-url="aHR0cHM6Ly9waWNnby5naXRodWIuaW8vUGljR28tRG9jL3poL2d1aWRlLw==">PicGo | PicGo</span></p> <h1 id="配置"><a class="anchor" href="#配置">#</a> 配置</h1> <ol> <li> <p>安装插件(需要先安装 NodeJS)<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/12/2022-10-12-13-24-09.png" alt="" /></p> </li> <li> <p>图床配置  <br /> url 后缀必须用红线圈中的部分,key 在 chevereto 登陆后 api 配置中查找<br /> <img data-src="https://file.jingxiyuan.cn/images/2022/10/12/2022-10-12-13-24-51.png" alt="" /></p> </li> </ol> 2022-10-12T06:40:00.000Z https://blog.jingxiyuan.cn/2022/10/11/svn%E5%BA%93%E8%BD%ACgit%E5%BA%93/ svn库转git库 <h4 id="前期准备"><a class="anchor" href="#前期准备">#</a> 前期准备</h4> <p>  首先安装好 svn 和 git 工具。</p> <h4 id="svn转git"><a class="anchor" href="#svn转git">#</a> svn 转 git</h4> <p>1、 到 svn 项目目录右键选中 gitbash 打开窗口,执行获取用户并映射成 git 样式账号命令如下:<br /> <code>svn log -q | awk -F '|' '/^r/ &#123;sub(&quot;^ &quot;, &quot;&quot;, $2); sub(&quot; $&quot;, &quot;&quot;, $2); print $2&quot; = &quot;$2&quot; &lt;&quot;$2&quot;&gt;&quot;&#125;' | sort -u &gt; users.txt</code></p> <p>  然后会在目录下生成文件 users.txt 样式如:zhansan = 张三 <span class="exturl" data-url="bWFpbHRvOnpoYW5zYW5AeHh4LmNvbQ==">zhansan@xxx.com</span>。</p> <p>2、新建个文件夹,将生成的 users.txt 放入新建的文件夹,然后在新建的文件夹中右键选中 gitbash 弹出窗口后执行下面命令(https://svn_project_url/ 为 svn 库的 url),拉取 svn 代码到本地新建文件夹中。<br /> <code>git svn clone https://svn_project_url/ --no-metadata --no-minimize-url --authors-file=users.txt</code></p> <ul> <li>期间可能会弹出 svn 的账户密码验证窗口,正确输入即可。</li> </ul> <h4 id="推送项目到git库"><a class="anchor" href="#推送项目到git库">#</a> 推送项目到 git 库</h4> <p>1、在 gitbash 窗口 cd 到 git 项目文件夹中执行以下命令把 git 仓库地址加入到 remote 中(https://git_project_url/ 为 git 库的 url)。<br /> <code>git remote add origin https://git_project_url/</code></p> <p>2、push 项目到 git 库中。<br /> <code>git push origin master</code></p> 2022-10-11T02:40:00.000Z https://blog.jingxiyuan.cn/2022/10/06/Nginx%E9%85%8D%E7%BD%AEiframe%E8%AE%BF%E9%97%AE/ Nginx配置iframe访问 <h4 id="x-frame-options响应头配置详解"><a class="anchor" href="#x-frame-options响应头配置详解">#</a> X-Frame-Options 响应头配置详解</h4> <p>  X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在,或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。<br /> X-Frame-Options 三个参数:</p> <p>1、 DENY</p> <p>  表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。</p> <p>2、SAMEORIGIN</p> <p>  表示该页面可以在相同域名页面的 frame 中展示。</p> <p>3、ALLOW-FROM uri</p> <p>  表示该页面可以在指定来源的 frame 中展示。</p> <p>4、ALLOWALL</p> <p>  表示该页面可以在任何来源的 frame 中展示。</p> <p>  换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。正常情况下我们通常使用 SAMEORIGIN 参数。</p> <h4 id="apache配置"><a class="anchor" href="#apache配置">#</a> Apache 配置</h4> <p>  需要把下面这行添加到'site' 的配置中</p> <p>   <code>Header always append X-Frame-Options SAMEORIGIN</code></p> <h4 id="nginx配置"><a class="anchor" href="#nginx配置">#</a> Nginx 配置</h4> <p>  需要添加到 ‘http’, ‘server’ 或者 ‘location’ 的配置项中,个人来讲喜欢配置在‘server’ 中</p> <p>  正常情况下都是使用 SAMEORIGIN 参数,允许同域嵌套<br />    <code>add_header X-Frame-Options SAMEORIGIN;</code></p> <p>  允许单个域名 iframe 嵌套<br />    <code>add_header X-Frame-Options ALLOW-FROM http://xxx.com/;</code></p> <p>  允许多个域名 iframe 嵌套,注意这里是用逗号分隔<br />    <code>add_header X-Frame-Options &quot;ALLOW-FROM http://xxx.com/,https://xxx.com/&quot;;</code></p> <p>  允许任何域名 iframe 嵌套<br />    <code>add_header X-Frame-Options ALLOWALL;</code></p> <h4 id="tomcat配置"><a class="anchor" href="#tomcat配置">#</a> Tomcat 配置</h4> <p>  在‘conf/web.xml’填加以下配置</p> <figure class="highlight xml"><figcaption data-lang="XML"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>filter</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>filter-name</span><span class="token punctuation">></span></span>httpHeaderSecurity<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>filter-name</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>filter-class</span><span class="token punctuation">></span></span>org.apache.catalina.filters.HttpHeaderSecurityFilter<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>filter-class</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>init-param</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param-name</span><span class="token punctuation">></span></span>antiClickJackingOption<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>param-name</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param-value</span><span class="token punctuation">></span></span>SAMEORIGIN<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>param-value</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>init-param</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>async-supported</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>async-supported</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>filter</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>filter-mapping</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>filter-name</span><span class="token punctuation">></span></span>httpHeaderSecurity<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>filter-name</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>url-pattern</span><span class="token punctuation">></span></span>/*<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>url-pattern</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dispatcher</span><span class="token punctuation">></span></span>REQUEST<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dispatcher</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>dispatcher</span><span class="token punctuation">></span></span>FORWARD<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>dispatcher</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="15"></td><td><pre><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>filter-mapping</span><span class="token punctuation">></span></span></pre></td></tr></table></figure><h4 id="iis配置"><a class="anchor" href="#iis配置">#</a> IIS 配置</h4> <p>  添加下面的配置到 ‘Web.config’文件中</p> <figure class="highlight xml"><figcaption data-lang="XML"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>system.webServer</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>httpProtocol</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>customHeaders</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>add</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>X-Frame-Options<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>SAMEORIGIN<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>customHeaders</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>httpProtocol</span><span class="token punctuation">></span></span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>system.webServer</span><span class="token punctuation">></span></span></pre></td></tr></table></figure> 2022-10-06T15:46:00.000Z https://blog.jingxiyuan.cn/2022/09/28/%E6%B7%B1%E6%B7%B1%E7%9A%84%E6%8C%AB%E8%B4%A5%E5%92%8C%E6%97%A0%E5%8A%A9%E6%84%9F/ 深深的挫败和无助感 <p>  一个月都过去了,工作还没有着落!</p> 2022-09-28T08:02:00.000Z https://blog.jingxiyuan.cn/2022/09/27/nginx%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E9%85%8D%E7%BD%AE/ nginx负载均衡配置 <h2 id="nginx负载均衡配置"><a class="anchor" href="#nginx负载均衡配置">#</a> nginx 负载均衡配置</h2> <ol> <li>轮询(默认)</li> </ol> <p>  <em>每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。</em></p> <pre><code class="language-yaml">upstream my_server &#123; server 192.168.0.2:8080; server 192.168.0.3:8080; &#125; server &#123; listen 80; server_name 192.168.0.1; # Path to the root of your installation location / &#123; proxy_pass http://my_server; &#125; &#125; </code></pre> <ol start="2"> <li>weight 权重策略</li> </ol> <p>  <em>weight 代表权重,默认为 1,权重越高被分配的客户端越多,指定轮询几率。weight 和访问比率成正比,用于后端服务器性能不均的情况。</em></p> <pre><code class="language-yaml">upstream my_server &#123; server 192.168.0.2:8080 weight=1; server 192.168.0.3:8080 weight=2; &#125; server &#123; listen 80; server_name 192.168.0.1; # Path to the root of your installation location / &#123; proxy_pass http://my_server; &#125; &#125; </code></pre> <ol start="3"> <li>ip_hash</li> </ol> <p>  <em>每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。</em></p> <pre><code class="language-yaml">upstream my_server &#123; ip_hash; server 192.168.0.2:8080; server 192.168.0.3:8080; &#125; server &#123; listen 80; server_name 192.168.0.1; # Path to the root of your installation location / &#123; proxy_pass http://my_server; &#125; &#125; </code></pre> <ol start="4"> <li>fair (第三方)</li> </ol> <p>  <em>按后端服务器的响应时间来分配请求,响应时间短的优先分配。</em></p> <pre><code class="language-yaml">upstream my_server &#123; server 192.168.0.2:8080; server 192.168.0.3:8080; fair; &#125; server &#123; listen 80; server_name 192.168.0.1; # Path to the root of your installation location / &#123; proxy_pass http://my_server; &#125; &#125; </code></pre> <ol start="5"> <li>动静分离</li> </ol> <p>  <em>把静态的资源,比如图片,css,js 等先加载到 Nginx 的服务器里。</em></p> 2022-09-27T06:45:00.000Z