LNMP下大量请求下报502错误的解决方法

最近正在着手于PHP网页的编写,由于服务器的配置较低,在平常的测压中,mysql服务总是因为内存不够而挂掉,本着学习的态度,使用了阿里的RDS mysql 第一次将网站服务器 与数据库分开,关键是,服务器在腾讯云,好家伙,直接公网连接数据库,本来wordpress 就优化不好,现在的TTFB(首字节时间直接干到500ms),再使用了静态缓存+MemCached,降到了200左右,有一说一,追求快速轻巧的话,还是建议使用其他博客系统吧。 言归正传,我用PHP写了一个API 接口,随机从数据库中取出一条句子,写好后,使用 Apache 的 JMeter 进行压力测试,开始先设置了200个线程。 再服务器查看 访问的日志 200 还行,基本上没有错误。 紧接着,将线程设置为300,心里觉得也没问题,结果一看日志;好家伙,502错误占据了我的屏幕。 排查一下系统的资源占用情况,内存占用 15 % ,cpu 15 % 负载 0.2 …… 见鬼了。。。 是不是 服务器带宽 达到了瓶颈了呢? 接着我又在压力,查了一下 502 错误一般都是由于 PHP FPM导致的 ,简而言之,就是后端挂了, top 命令 一看; 一切正常,测压关闭后,网站又可以正常访问,这说明PHP访问并没有关闭。其他版本PHP下的网站都可以打开,这又排除了服务器带宽的原因。 接着看FPM 的配置文件,各种 buffer ,加大buffer size ,无果。 查阅相关资料后得知 pm.max_children 这一项是最大的进程数,宝塔提示,每个fpm进程,要占用20m的内存,原本是80 ,我将他修改成200,测试 ,500个进程,没有发现502,只是测压时,网站的访问速度确实慢了一点 最长 TTFB 1s,不过这次确实 没有出现502错误了。

February 24, 2022 · 1 min · 晚晴

NGINX服务器 之反向代理与负载均衡

转载于 https://www.cnblogs.com/jalja/p/6117881.html 作者 : 小禾点点 反向代理 客户端要获取的资源就在服务器上,客户端请求的资源路径就是最终响应资源的服务器路径,这就是正向代理。正向代理的特点:就是我们明确知道要访问哪个网站地址。 反向代理: 客户端想获取服务器集群中(服务1,服务2,服务3 他们的资源相同)中的资源,但是客户端无法与该服务器集群建立连接,但我们可以与另一台服务器(代理服务器)建立连接且该服务器能获取服务器集群中的资源。这个时候客户端就可以通过请求代理服务器,获取想要的资源,但客户端并不知道给他资源的是哪个服务器。这种方式就是反向代理。 负载均衡 当一台服务器的单位时间内的访问量越大的时候,服务器的压力会越大。当一台服务器压力大得超过自身的承受能力的时候,服务器会崩溃。为了避免服务器崩溃,让用户有更好地体验,我们通常通过负载均衡的方式来分担服务器的压力。那么什么是负载均衡呢?我们通过建立很多个服务器,把这些服务器组成一个服务器集群,然后,当用户访问我们网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该选择的服务器。这样,用户的每次访问,都会保证服务器集群中的每个服务器的压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。负载均衡就是采用反向代理的思想。 Nginx中负载均衡的实现 创建fzjh.conf配置文件 在/usr/local/nginx/conf下创建fzjh.conf文件,文件内容如下: user nobody; worker_processes 2; events { worker_connections 1024; } http{ #=upstream设置负载均衡的待选服务器列表,在运行中如果有服务器崩溃那该服务器就会在该列表中移除 upstream mypro{ server 219.133.55.36;#中国万维网 server 115.239.210.27;#百度的ip } server{ listen 8080; #====== 对ngnix更目录做负载均衡=== location / { #==选择要代理的服务器要与upstream对应========== proxy_pass http://mypro; } } } 加载fzjh.conf配置文件 执行命令: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/fzjh.conf 测试是否成功 在这里我们的负载均衡待选服务器列表是百度和中国万维网,也就说我们访问我的主机名+8080 就可以进行测试,如果页面在百度与中国万维网中切换,就表示成功。 Upstream模块详解 Upstream模块:该模块是Nginx服务器的一个重要模块。Upstream模块实现在轮询和客户端ip之间实现后端的负载均衡。常用的指令有ip_hash指令、server指令和upstream指令等。该模块主要进行轮询算法。upstream指令主要是用于设置一组可以在proxy_pass和fastcgi_pass指令中使用额代理服务器,默认负载均衡方式为轮询。 ip_hash指令:在负载均衡系统中,假如用户在某台服务器上登录,那么如果该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的一个服务器,那么此时如果将已经登录服务器A的用户再定位到其他服务器,显然不妥。故而,我们可以采用ip_hash指令解决这个问题,如果客户端请求已经访问了服务器A并登录,那么第二次请求的时候,会将该请求通过哈希算法自动定位到该后端服务器中。简单说ip_hash指令可以实现当用户使用同一浏览器在A服务器登录后,那他后续的所有请求都在同一服务器中进行,Nginx代理服务器不会将他的请求分配到其他服务器上,以此规避用户登录信息在不同服务器间流转的问题,从而保证用户只需登录一次。 ip_hash的使用:在fzjh.conf配置文件中开启该功能 server指令: 主要用于指定服务器的名称和参数。 使用:在fzjh.conf配置文件中开启该功能 注意:在实际开发中weight不要与ip_hash同时使用 负载均衡不同实现方式的优缺点:假如使用硬件的方式实现负载均衡,那么中间的转发机构就是硬件,这个时候运行的效率非常高,但是对应的成本也非常高。如果我们采用软件的方式来实现负载均衡,那么中间的转发机构就是软件,这个时候,运行效率不如硬件,但是成本相对来说低得多。而使用Nginx服务器实现负载均衡,那么就是通过软件的方式来实现负载均衡,并且Nginx本身支持高并发等。故而使用Nginx服务器实现负载均衡,能大大节约企业的成本,并且由于Nginx是服务器软件,其执行效率也是非常高。 转载于 https://www.cnblogs.com/jalja/p/6117881.html

February 21, 2022 · 1 min · 晚晴