Date Archives

五月 2018

Nginx 反向代理实现负载均衡

正向代理&反向代理

所以是讲反向代理的使用,不过这里还是需要提一下这两种代理模式,有比较的情况下更容易理解

  • 正向代理(Forward proxy):

    • 正向代理的服务器角色位于客户端和服务器之间,客户端需要指定一台服务器作为自己上网的代理人,不论访问什么网站,都必须经过代理服务器,之后由代理服务器决定用什么方法和网络路线去访问网站,对于服务器而言只是代理服务器在访问自己。
    • 比如你使用远程连接到互联网上的某台计算机(图形化的远程那种),之后在通过这台远程计算机去上网,实际上这时候就可以讲“可以远程的计算机”理解成为代理服务器。
    • 常见的VPN 实际上也是这个道理,比如现在在中国都无法使用Google 服务,但是香港的某台服务器(或者某台可以远程连接的计算机)可以使用Google 服务,那么身在中国的我只要可以使用这台代理服务器(或者远程到这台电脑),就可以通过它区使用Google 服务了。
  • 反向代理(Reverse proxy):

实现负载均衡

这里也是使用反向代理的机制,比如讲现在有三台主机,其中一台安装Nginx 搭建反向代理服务器(主机1),另外两台安装Apache 做网站服务器(主机2和3)。

PS:三台都是Nginx 也可以

实现的效果,在访问Nginx 服务器之后,将请求代理到Apache 服务器来处理,因为两天Apache 的网页真实数据都是一样的,所以对于客服端来讲就并没有什么直观区别,而对于Apache 来讲,减轻了自己1/2 的请求负担,从而实现负载均衡,负载分担

Nginx 搭建步骤

使用CentOS 6.7 安装Nginx, 其他安装Apache

 主机1主机2主机3  
  角色  反向代理服务器常规网站服务器常规网站服务器  
  服务Nginx 1.14.0ApacheApache  
 地址 192.168.1.1       192.168.1.2    192.168.1.3  

Nginx 配置文件

upstream zhzy_server{ 
     server 192.168.1.2 weight=1; 
     server 192.168.1.3 weight=1; 
}  
server { 
listen 80; 
server_name localhost; 
charset utf-8; 

location / { 
root /usr/share/nginx/html/;
index index. html index.htm;
proxy_pass http://zhzy_server;  
} 
}

upstream zhzy_server #可以理解自定义一个组,这个组中有两个Nginx可以访问的网站

server 192.168.1.2 weight=1; #“weight”其中某台网站服务器其负载请求的比列,数字越大越高,相同则五五开

proxy_pass http://zhzy_server; #将所有访问Nginx本身的求情转发给这台主机(这样写就是上述的那个组)

使用 Aircrack-ng 破解WiFi密码

实验需求

先来看一下我的使用环境:

系统 工具 无线模块
 版本  Kali Linux 2017.2  aircrack-ng 1.2  支持monitor模式

操作步骤

需要最少两个终端来实现,以下分别称之为shell 1 和shell 2

  • Shell 1 通过aircrack-ng 工具,将网卡改为监听模式
  • Shell 1 确定目标WiFi 的信息,比如mac 地址和信道,连接数等等
  • Shell 2 模拟无线,抓取密码信息
  • Shell 1 确定目标用户,对其发动攻击
  • Shell 2 得到加密的无线信息并进行破解(通过密码字典)

步骤就是这样了,接下来我来破解下自己的WiFi

步骤演示

开启监听模式

root@kali:~$ airmon-ng start wlan0

这里要注意的,在开启监听模式之后,wlan0 这个网卡名称现在叫wlan0mon(偶尔也会不变,具体叫什么看上图的提示)

扫描目标WiFi

root@kali:~$ airodump-ng wlan0mon

注意现在的连个方框(红色和蓝色区域),现在我们要确认一些信息,及目标AP(就是WiFi,以下简称AP) 的MAC 地址,AP 的信道和加密方式,还有目标用户的MAC地址,我们稍微整理一下:

蓝色区域:目标AP的MAC地址(WiFi路由器的)
红色区域:目标用户的MAC地址(我的手机的)
CH(信道):1
加密方式:WPA2

我们只需要这些信息就足够了

模拟WiFi 信号

root@kali:~$ airodump-ng --ivs -w wifi-pass --bssid 1C:60:DE:77:B9:C0 -c 1 wlan0mon

–ivs :指定生成文件的格式,这里格式是ivs(比如:abc.ivs)
-w :指定文件的名称叫什么,这里叫wifi-pass
–bssid :目标AP的MAC地址,就是之前蓝色区域的
-c :指定我们模拟的WiFi的信道,这里是1

敲下回车后会看到这样的一段信息,这就说明我们模拟的WiFi 已经开始抓取指定文件了,不过要注意红色箭头的位置,如果想这样一直是空的就是没有抓到需要的信息,如果抓到了看下图,可以对比出来

攻击指定的用户

这里使用另一个空闲的终端,执行以下命令

root@kali:~$ aireplay-ng -0 20 -a 1C:60:DE:77:B9:C0 -c 18:E2:9F:B0:8B:37 wlan0mon

-0 :发送工具数据包的数量,这里是20个
-a :指定目标AP的MAC地址
-c :指定用户的MAC地址,(正在使用WiFi的我的手机)

 

攻击开始后就像这样~

得到密码文件并破解

注意红色箭头指向的位置,如果在发送攻击数据包之后出现了图片里的信息,那么就是密码信息抓取成功了,如果出现了这个的话就可以结束WiFi 模拟了,我们可以按Ctrl+C 然后查看当前目录会发现多了一个wifi-pass-01.ivs 文件,我们想要的密码就在这个文件里,不过是加密的,所有我们还需要通过密码字典把密码破解出来

指定密码本来破解此文件

root@kali:~$ aircrack-ng wifi-pass-01.ivs -w /root/pass-heji.txt

-w : 指定密码字典(比如我的在/root下,所有多了绝对路径)

这里看到红色箭头的位置就是密码了,到这里密码破解就完成了~

Lnmp 解决 nginx 502 bad gateway

前言描述

最近网站正常使用中经常遇到 502 的 HTTP 返回状态码的报错,

首先跑去百度了一下这个问题,搜到的信息量着实庞大,看来这个问题出现的屏率相当之多,百度到的解决办法(老实讲,百度出来的解决办法虽然多,但大多数都是在相互重复,所以我几乎把百度的方法都式完,然而并没有什么效果)无奈之下只好自己找原因并解决了,这里先来介绍下我的网站环境

“502 bad gateway”在这光秃秃的白色页面上就会显示出这样的信息,犹如遥远的的雪地上,闪起了一道亮光,这光就在那里闪耀~,仿佛看到儿时的我在夕阳下的奔跑,想远了~,^_^|||     ,身为网站管理者的我看到这个拙不是令我很头疼,然后当然要找方法来解决这个“502” ,不过奇怪的是只有刷新 php-fpm 服务就没问题了

 

我的网站运行环境

服务器 平台 系统 粘连语言  网站系统
类型 阿里云ECS基础型 LNMP CentOS PHP WordPress
版本 1核1G 1M带宽 nginx 1.10.2 6.8 5.6+ 4.9+

Nginx 502 bad gateway 错误原因搜集

先跑去看了一眼百度百科,(频率这么高的问题百度应该有伐~)还是百科到了,给的解释是这样:“NGINX 502 Bad Gateway错误出现的原因较多,对于后端连接PHP服务的场景下,常见的原因有php服务响应超时,php进程不足等引起的一类服务器错误。” 解释完虽然不太明确问题到底在哪里,不过大致可以确定问题处在 PHP 身上,因为在整体网站使用中,PHP 这个角色会在用户和 WEB 服务之间来建立链接,那么如果 PHP 出来问题(超时或者死掉)那么后端的 Nginx 服务报 “bad gateway” 也就大致明白怎么会是了,(报错内容大致说网关失败,找不到出去的路)

锁定问题在 PHP

在通过不断的排查于思考,大致确可能是因为这两个原因

  • PHP FastCGI进程数量不够~

即使你的 Nginx 支持10000个进程连接,然而 PHP 只开启50个连接的话,如果访问 html 的静态页面,10000个连接没问题,但是我们的 wordpress 肯定是 php 的,那么 php 的页面最多 50 个链接,再多就会各种花式报错,比如 502 bad gateway

  • PHP FastCGI内存大小不够~

据说一个php进程空闲时占1M 负载是占20-50M,通过我的观察发现我的 php 几乎没有闲过,所以通常一个进程占50M+,(我的内存只有1G,其他服务用完大约700-800M左右)当内存被占满占之后,就好比各位正在打游戏突然内存爆满,cpu温度99°C,然后,就没有然后了吧~

确定问题原因,内存不足,PHP服务僵死

在查阅了nginx,php-fpm,mysql,messages,kernel等等的服务日志之后,发现只要页面一弹 502 ,messages 的日志里有这样一段信息:

May  4 14:57:48 zhzy kernel: [11589]   498 11589    98683    21778   0       0             0 php-fpm
May  4 14:57:48 zhzy kernel: [11590]   498 11590    98683    21727   0       0             0 php-fpm
May  4 14:57:48 zhzy kernel: [11591]   498 11591    78228     1062   0       0             0 php-fpm
May  4 14:57:48 zhzy kernel: Out of memory: Kill process 11447 (php-fpm) score 94 or sacrifice child
May  4 14:57:48 zhzy kernel: Killed process 11447, UID 498, (php-fpm) total-vm:403468kB, anon-rss:94288kB, file-rss:1524kB

这里就看的很很很明白了,内存不足并溢出,内核要杀掉某些服务来腾出内存空间,于是选择杀死了php-fpm 这个服务,(这里如果用 service php-fpm status 看服务的状态,仍然是开启的,但日志既然出来,确实被kill掉了,所有称之为“僵死”),那么也明白了,php跪了,所以 Nginx 给我们亲切的 502 bad gateway 的报错~

而且我的 php 在建立连接后即使这个连接不再使用,也会很长很长时间后才会关掉一部分,这就造成只有在某个时间点访问量大,php连接越来越多,然后内存溢出,报错~,不过只要刷新 php-fpm 服务就可以清除掉不用的连接

各位看到这里应该已经很清楚问题处在哪里了吧~

解决因内存不足引发的报错

怎么解决?…升级服务器不就好了,内存调到 8G 总不会总不溢出了伐~ ,太贵,拒绝……

那身为半个程序员的我,当然记得那句话:“程序员最大的乐趣就是压榨机器的性能~” 某位古老的智者留下的话

  • 通过Shell脚本解决内存溢出

#!/bin/sh
PHPMEM=$(free -m | head -2 | tail -1 | awk '{print $4}')
if [ $PHPMEM -lt 400 ]
then
        echo /etc/init.d/php-fpm restart
else
        exit 0
fi

这个脚本我配合 crontab 计划任务,每分钟执行一遍,内容呢,就是讲如果内存小于400的话就刷新 php-fpm 服务,通俗的讲,如果内存块满了,就通过刷新服务来关掉不需要的进程,从而腾出足够的内存空间,从而保住 php-fpm 的性命,那在这之后 nginx 502 的报错就几乎没有出现过了~

  • 通过增加SWAP内存来防止内存溢出

看到这个标题以为我要升级服务器~,呵呵不可能的,Linux 毕竟还是很强大,这里条件可以的话(有足够的分区),你也可以通过扩大SWAP交换分区来扩展内存,从而防止溢出,最终目的都是一样的

如果是 PHP 进程不够

这种情况的话只需要修改 php-fpm 的配置文件就可以了,不过这里还是要说明一下,php的进程分为静态(static)和动态(dynamic)两种,我们直接看两个示例

  • 静态(static) PHP 进程配置

[root@zhzy ~]# vim /etc/php-fpm.d/www.conf
pm = static
pm.children = 70
pm.start_servers = 10
pm.min_spare_servers = 7
pm.max_spare_servers = 100
pm.max_requests = 100

pm = static     #使用静态的处理模式,及一个固定的连接数
pm.children = 100     #静态模下开启的连接进程数量,这里是70,如果跟我的阿里服务器类似推荐<=50即可
pm.start_servers = 10     #动态模式下初始开启的进程数量
pm.min_spare_servers = 7     #动态模式下最下的进程数量,比如空闲时~
pm.max_spare_servers = 100      #动态模式下最大的进程数量,服务器发疯时~
pm.max_requests = 100     #解释起来比较麻烦,看这里吧 http://www.jincon.com/archives/180/

  • 动态(dynamic) PHP 进程配置

[root@zhzy ~]# vim /etc/php-fpm.d/www.conf
pm = dynamic
pm.children = 70
pm.start_servers = 10
pm.min_spare_servers = 7
pm.max_spare_servers = 100
pm.max_requests = 100

pm = dynamic     #使用动态的处理模式,服务器自己判断所需的进程数量
pm.children = 100     #这行此时不会生效,因为模式是动态
pm.start_servers = 10     #动态模式下初始开启的进程数量
pm.min_spare_servers = 7     #动态模式下最下的进程数量,比如空闲时~
pm.max_spare_servers = 100      #动态模式下最大的进程数量,服务器发疯时~
pm.max_requests = 100     #看这里吧 http://www.jincon.com/archives/180/

到这里通过合理的调整,只要使服务器有足够的进程来供用户使用,也就不会出现 502 bad gateway 的问题了

这篇文章对您有帮助一定要留个言哇~