服务器运维故障记录

警告
本文最后更新于 2024-05-27,文中内容可能已过时。

Mysql Errcode: 24 - Too many open files

https://blog.csdn.net/weixin_36343850/article/details/86293700

原因:打开文件数量太多,超出了open_files_limit这个参数的限制,在一个表中有多个分区的时候,这种情况更容易发生。
解决方法:

  • 查看 open_files_limit参数, 使用show variables like '%open%';就可以看到了
  • 修改 open_files_limit参数
    在网上找了很多资料,有的说直接在/etc/mysql/mysql.conf.d/mysqld.cnf文件中的[mysqld]部分添加open_files_limit参数,比如open_files_limit=10240,并且在/etc/security/limits.conf 添加mysql soft nofile 10240mysql hard nofile 10240这两个参数然后重启MySQL,但是发现不能生效。
  • 以下方法可用:
    • 在文件/etc/systemd/system/multi-user.target.wants/mysql.service(也有可能是/etc/systemd/system/mysql.service这个文件)最后添加LimitNOFILE=10240
  • 然后执行systemctl daemon-reload,接着再重启mysql服务sudo service mysql restart,可以看到已经修改成功了

禅道bug管理系统

  1. 这个部署遇到的一个坑就是php打死获取不到session的位置
    打开调试日志方式是将my.cnfdebug设置为true
    实际错误体现是 ERROR: 您访问的域名 xxx.xxx.xxx 没有对应的公司。
    我的解决方案是 代码目录整体权限设置为777,然后删除掉my.cnf进行重装,重装后在目录权限调整为正常权限即可.
  2. 安装完成后,首页出现无限循环重定向,手动将my.phpPATH_INFO修改为GET,或在nginx传入变量PATH_INFO$request_uri;

nginx 代理php产生的一些故障

记录一个nginx 代理 php 产生的问题,问题已经解决了,但是似乎还是没有找到根本原因,若有了解的,请一定解惑一二, 以下记录下处理过程 .

  • 问题产生过程:

    • A服务器代码迁移到B机器上,代码是rsync直接同步的,然后B运行的时候就出问题了,根据调试发现,无论访问什么(html/js/css)都会跳转到首页,实际应该是都会经过php解析(我发誓A和B的环境配置是一模一样的!A可以正常运行.), php框架为opencart .
  • 浏览器访问表现以下错误:

    • Resource interpreted as Stylesheet but transferred with MIME type text/html
    • ERR_CONNECTION_REFUSED
  • 处理过程 :

    • 问题实际上是头一天发生的,经过多方调试发现,实际上通过域名访问任何资源均会跳转到首页,访问php资源则会出现无法加载js/css等静态资源全部都是MIME类型问题,nginx强行给css/js等资源设置一个content-type前端也无法识别正确,另外也测试过网上提供的多方解决方案,仍然无法得到解决 .
    • 第二天, 保持原有nginx配置 , 我给对应站点首页的index.php代码中加入了echo 123; exit();进行测试,访问发现可正常断开,此时在访问根下的静态html测试文件,发现可以正常访问了,此时删除echo 123; exit();,重新访问index.php,发现(js/css)静态资源被升级为https访问,此时我给相关域名配置上证书,然后访问就正常了!!!
  • 原因分析:

    • 站点缓存(这个可能性最大),opencart框架实际上session是存储到数据库中的,估计很多的cache也是存于数据中的,而今天解决的时间也恰好距离我最后一次同步一天的样子.
    • nginx 配置域名过多,导致配置混乱. B服务器的nginx实际上已经配置了很多个域名,php解析的SCRIPT_FILENAME 我使用的是$document_root,最后一次修改我也将$document_root修改为了具体的路径,不知道会不会是这个原因产生的.

zabbix 自动发现异常错误

  • 具体错误表现
  1. Cannot create item: item with the same key "domain.status[{#DOMAIN_NAME},http_code]" already exists.
  2. Cannot accurately apply filter: no value received for macro "{#DOMAINNAME}".
  • 解决方案
    • 这个是特么的自动发现脚本返回值的key必须用{}括起来,不然你即使是json格式他也不会认, 网上那些这个抄那个的坑货就只知道变量要大写,还有个坑告诉我要使用宏,用了宏就是第二个问题,不用第一个,这我是记得很清楚,宏并不是必定要有的啊,我以前写也基本没有加过。 我特么也是蠢了,写了这么多的自动发现,居然没有注意要括起来。

nginx 伪静态无效问题

  • 具体错误体现 拿到apache.htaccess文件后,通过https://www.winginx.com/en/htaccess转换为了nginx可用的规则,但加入后访问跳转一直是404,经检查location是定位成功了的,但就是访问不了
  • 解决方案:
  1. 后续开发提供了另一个伪静态配置,所有rewrite是放在if指令中(!-e $request_filename),然后就可以了。我对比了下,两者的差异就是,一个是放在了location中,定位了每一个rewrite所在的位置。还有就是放在if中的rewrite的匹配规则是用引号括起来了的。具体原因暂时还是每搞清楚。后续出现需测试下引号是否有影响.

nginx 反向代理后端服务器,部分资源出现502错误

问题描述: 后端是dotnet应用,反向代理时候域名请求页面部分css/js资源返回502错误。直接请求报错的css/js又是正常的,前端绕过nginx直接访问dotnet所有返回又是正常的。只有经过nginx会出现该问题。 解决过程:

  • 网上搜索到很多的解决方案,这一个感觉有点用,但并没有解决我的问题,说的是header过大,超出了默认的1k,就会引发上述的upstream sent too big header,nginx把外部请求给后端处理,后端返回的header太大,nginx处理不过来就会导致502,这个问题提出的解决是,增大proxy_buffer_size/proxy_buffers/proxy_busy_buffers_size,不过还是记录下,毕竟不是每个问题原因都一样。
  • 这是我当时参考的第二个方案,根据官方文档https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive,调整了upstreamkeepalive,我原来设置的是2,现调整为16,并设置了Connection "Keep-Alive";(这个设置是为了保持http/1.0持久链接,官方不建议使用此参数,但我这边websokcethttp/1.0,单独设置一个并没有效果,所以两个都设置了)。这个方案当时解决了一部分的问题。但根本并未得到解决。
  • 然后最终的方案,重启应用服务器,问题完全解决!!!

原因分析:突然不知道怎么下笔了,反正就是系统tcp连接过多,最开始体现就是出现大量的CLOSE_WAIT,当时重启了对应占用的程序,清理一些连接,出现一定的好转,但也仅仅出现了好转,后面可能由于某些原因,导致重启应用也无法解决了,最后重启服务器,问题完全解决。 应该不是每个人都是这个原因,不过可以参考下。

nginx 反向代理 cdn回源(多层nginx)出现 502、503、504 等异常

在我的部署模式中,很多时候都是docker与实际应用环境混合部署(多环境,单节点),大多的结构是 docker运行程序环境,nginx反向代理到docker暴露的端口,从而实现应用的正常访问。我这次遇到的这个问题,最开始的时候我以为是cdn的问题,因为当时我没有通过cdn直达服务器的时候访问都是正常的,然后通过cdn后,页面大多数请求就都出现了502等状态,这个时候我联系了运营商,他们说回源链接被断开了,是不是服务器上有相关安全策略,仔细的想了下,服务器上除了开启了iptables外,并没有其他的安全设置,正没有头绪的时候,突然想到docker需要依赖iptables转发,是不是这个原因导致防火墙又有问题了(因为之前我调整iptables的时候,导致过docker容器无法连接网络😥),于是我把防火墙一关,然后cdn回源就正常了。 后续的处理,我关闭了服务器防火墙设置,重启了docker,重建了容器(防止容器网络出现问题,同时让docker重新创建自己的规则链)。对外的防火墙采用云防火墙现在公网流入流量。上面其他记录的故障中,估计也有这个原因导致的,但是不知道怎么调好了。(TODO:// 一个人运维好难,有点啥问题都不知道该找谁讨论下,全靠自己摸索)

nginx: [emerg] location “” cannot be inside the exact location “/favicon.ico” in xxxxxx

我这边遇到的此类问题多数为在location =/xxx {下继续includelocation ,清除后解决

IIS低版本未映射 WebResource.axd 文件,导致相关图片或js等无法正常加载 (多出现地版本服务器上,当前记录server 2008 r2)

  • 处理: 配置编辑器 –> system.web/httpHandlers/ –> 点击 Count 右侧的小点展开, 然后添加Path:WebResource.axdtype: System.Web.Handlers.AssemblyResourceLoader, validate: True , verb: GET ,完成后关闭
1
2
3
4
5
6
7
<configuration>
   <system.web>
       <httpHandlers>
           <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
       <tpHandlers>
   </system.web>
</configuration>

IIS 如何修改文件上传限制

要修改IIS中的文件上传限制,可以按照以下步骤操作:

  1. 打开IIS管理器(Internet Information Services Manager)。

  2. 在左侧导航栏中,展开服务器节点,并找到您要修改的站点。单击该站点。

  3. 在右侧窗口中,双击“配置编辑器”图标。

  4. 在“配置编辑器”窗口中,选择“system.webServer/Security/requestFiltering”节点。

  5. 在右侧窗口中,查找并编辑以下设置来修改文件上传限制:

    • maxAllowedContentLength:此设置用于限制请求内容的最大大小。以字节为单位。例如,如果要将上传文件大小限制为100MB,则将其设置为104857600(100MB * 1024KB * 1024B)。
    • maxRequestLength:此设置用于限制请求的最大大小。以KB为单位。例如,如果要将上传文件大小限制为100MB,则将其设置为102400(100MB * 1024KB)。

    注意:这两个设置需要同时更改,以确保文件上传限制的生效。

  6. 修改完上述设置后,点击“应用”按钮保存更改。

  7. 关闭“配置编辑器”窗口和IIS管理器。

现在,您已成功修改了IIS中的文件上传限制。请注意,这些设置可能会对整个站点或虚拟目录产生影响,因此请确保根据需要进行适当的调整。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <!-- 100M -->
                <requestLimits maxAllowedContentLength="100000000" /> 
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

IIS .net 项目 post 无法提交数据

  • .net 站点 curl post请求,模拟表单提交,后端收不到数据,解决方案是把程序池的集成模式改为经典模式

IIS .net 项目 ,同项目复制一份出来重新部署就无法正常使用了

大致问题体现是 [Exception: 未将对象引用设置到对象的实例。] FrontEndProcessor.VoiceUtils.TextToSpeech xxxx
产生原因: 同一服务器上面,直接复制了一份出来,被复制的站点是可以正常使用的,复制出来后的站点,相对于复制前的站点同一功能就无法正常使用了。 解决: 经多方对比,发现问题是由于程序池设置导致,复制后的站点,程序池未开启 加载用户配置文件。 总结: windows上应不会存在权限相关问题,因此此类问题应该优先考虑程序池

IIS .net项目下载文件出现访问被拒绝

  • 异常体现
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  对路径“xxxx.JPG”的访问被拒绝。
  说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

  异常详细信息: System.UnauthorizedAccessException: 对路径“xxxx.JPG”的访问被拒绝。

  ASP.NET 无权访问所请求的资源。请考虑对 ASP.NET 请求标识授予访问此资源的权限。ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常,在 IIS 5 上为 {MACHINE}\ASPNET,在 IIS 6  IIS 7 上为网络服务,在 IIS 7.5 上为配置的应用程序池标识)。如果应用程序正在通过 <identity impersonate="true"/> 模拟,则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。

  要将 ASP.NET 访问权限授予某个文件,请在文件资源管理器中右击该文件,选择“属性”,然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示 ASP.NET 帐户,选中所需访问权限对应的框。

  源错误:

  执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

  堆栈跟踪:

  [DirectoryNotFoundException: 未能找到路径“xxxxxx”的一部分。]
  System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +490
  System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) +833
  System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) +144
  System.IO.FileStream..ctor(String path, FileMode mode) +91
  HTYD.Merchant.Controllers.ExportController.DownloadFile(String fPath) in xxxx.cs:192
  System.Web.Mvc.<>c__DisplayClass1.<WrapVoidAction>b__0(ControllerBase controller, Object[] parameters) +15
  .....
  • 解决方案: 此项问题产生原因不知道,但解决方案是,为该目录添加 IIS_USER 用户权限,注意需要附加 修改 权限
0%