一、什么是LNMP?

LNMP指的是一个基于Centos/Debian编写的NGINX、PHP、MySQL、PHPmyadmin、eaccelerator集成的一键安装包。可以在VPS、独立的(云)主机上轻松地安装生产环境。

1、软件服务解释:

Linux:一套免费试用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。代表linux版本有:
NGINX:一个高性能的HTTP和反向代理服务器,也是一个IMAP/pop3/SMTP代理服务器。
PHP:一种在服务端执行的嵌入HTML文档的脚本语言。
MySQL:一个关系型数据库管理系统(RDBMS)。
PHPmyadmin:一个以PHP为基础和web-base方式架构在网站主机上的MySQL的数据库管理工具,能让管理者可用web接口管理MySQL数据库。
eaccelerator:一个自由开源的PHP加速器,优化和动态内容缓存,提高PHP脚本的缓存性能,使PHP脚本在编译的状态下,对服务器的开销几乎完全消除。能使PHP程序代码执效提高1-10倍。

2、LNMP工作原理

剖析LNMP架构_第1张图片

lnmp简化版原理:

  • 第一步、用户在浏览器输入域名或者IP访问网站
  • 第二步、用户在访问网站的时候,向web服务器发出http request请求,服务器响应并处理web请求,返回静态网页资源,如CSS、picture、video等,然后缓存在用户主机上。
  • 第三步、服务器调用动态资源,PHP脚本调用fastCGI传输给php-fpm,然后php-fpm调用PHP解释器进程解析PHP脚本。
  • 第四步、出现大流量高并发情况,PHP解析器也可以开启多进程处理高并发,将解析后的脚本返回给php-fpm,然后php-fpm再调给fast-cgi将脚本解析信息传送给nginx,服务器再通过http response传送给用户浏览器。
  • 第五步、浏览器再将服务器传送的信息进行解析与渲染,呈现给用户。

fastcgi工作原理:

  • 1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
  • 2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
  • 3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
  • 4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

php-fpm工作原理:

  • php-fpm支持三种运行模式,分别为static、ondemand、dynamic,默认为dynamic 。
  • static : 静态模式,启动时分配固定的worker进程。
  • ondemand: 按需分配,当收到用户请求时fork worker进程。
  • dynamic: 动态模式,启动时分配固定的进程。伴随着请求数增加,在设定的浮动范围调整worker进程。

php-fpm采用master/worker架构设计,由两个进程模块:master、worker

master进程工作流程:
剖析LNMP架构_第2张图片

  • cgi初始化阶段:分别调用fcgi_init()和 sapi_startup()函数,注册进程信号以及初始化sapi_globals全局变量。
  • php环境初始化阶段:由cgi_sapi_module.startup 触发。实际调用php_cgi_startup函数,而php_cgi_startup内部又调用php_module_startup执行。 php_module_startup主要功能:a).加载和解析php配置;b).加载php模块并记入函数符号表(function_table);c).加载zend扩展 ; d).设置禁用函数和类库配置;e).注册回收内存方法;
  • php-fpm初始化阶段:执行fpm_init()函数。负责解析php-fpm.conf文件配置,获取进程相关参数(允许进程打开的最大文件数等),初始化进程池及事件模型等操作。
  • php-fpm运行阶段:执行fpm_run() 函数,运行后主进程发生阻塞。该阶段分为两部分:fork子进程 和 循环事件。fork子进程部分交由fpm_children_create_initial函数处理( 注:ondemand模式在fpm_pctl_on_socket_accept函数创建)。循环事件部分通过fpm_event_loop函数处理,其内部是一个死循环,负责事件的收集工作。

worker进程:
剖析LNMP架构_第3张图片

    1. 接收客户端请求:执行fcgi_accept_request函数,其内部通过调用accept 函数获取客户端请求。
      //请求锁
      FCGI_LOCK(req->listen_socket);
      req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len); 
      //释放锁 
      FCGI_UNLOCK(req->listen_socket);
    1. 处理请求阶段:首先,分别调用fpm_request_info、php_request_startup获取请求内容及注册全局变量($_GET、$_POST、$_SERVER、$_ENV、$_FILES);然后根据请求信息调用php_fopen_primary_script访问脚本文件;最后交给php_execute_script执行。php_execute_script内部调用zend_execute_scripts方法将脚本交给zend引擎处理。
    1. 请求结束阶段:执行php_request_shutdown函数。此时 回调register_shutdown_function注册的函数及__destruct()方法,发送响应内容、释放内存等操作。

二、实战

1、lnmp工作流程

图1:lnmp调用流程:
剖析LNMP架构_第4张图片

2、lnmp安装方式

剖析LNMP架构_第5张图片

3、lnmp安装顺序

简化版的源码安装步骤:(省去PHP加速、nginx优化、linux内核优化等步骤)
MySQL源码包下载--》解压--》预编译--》编译安装--》MySQL服务进程用户创建--》添加环境变量--》初始化数据库--》设置MySQL密码--》PHP源码包下载--》解压--》预编译--》编译安装--》修改配置文件--》创建php-fpm服务守护用户--》启动php-fpm服务--》下载nginx源码包--》解压--》预编译--》编译安装--》添加环境变量--》检查nginx配置文件--》启动nginx服务--》网页访问服务器IP--》''welcome to nginx''

快速版源码安装步骤:(自动配置系统环境以及安装服务)
下载一键安装包--》解压--》执行./install.sh--》选择数据库版本--》设置数据库的root密码--》确认是否开启innoDB引擎--》选择PHP版本--》确认选择的定制软件版本--》按Enter--》等待约20~30分--》出现enjoy it字符串--》网页访问服务器IP--》''welcome to nginx''

4、lnmp架构图

剖析LNMP架构_第6张图片

5、web服务集群架构图

 **一般web小型集群简图:**
        流量不高,用于开发测试上线,两台主机做LNMP架构足够应付。同时可以使用nginx+keepalived模式,实现高可用,haproxy可以弥补nginx四层的大流量连接。

剖析LNMP架构_第7张图片

**中小型集群简图:**
    单独将两台LVS调度做为负载均衡调度器,保证7X24高可用负载对外服务。使用两台或多台VM作为Tomcat做web的调用,一台宕机,还有另一台做备份对外持续服务。数据库单独做双主模式,可以同读写,数据实时同步。

剖析LNMP架构_第8张图片

**中型web服务集群:**
        将站点目录单独提出,web集群的VM可以通过内网的方式访问共享目录并挂载在VM本地。增加从数据库做读操作,减少主数据库的压力。

剖析LNMP架构_第9张图片

大型web集群:
web的vm集群自动扩充主机,加入监控集群,目的在监控所有服务器的是否有异常,以图形化方式在网页上显示,实时监控,实现异常告警。站点目录服务器做自动扩容等等
剖析LNMP架构_第10张图片

从小型到大型集群,架构要支撑的流量也会逐渐增加,所以中小型的时候需要开始准备自动化扩容和扩充主机以支撑大流量高并发。


三、安全防护

1、服务器内置防火墙

iptables:

  • IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
  • IPTABLES是用来设置、维护和检查Linux内核的IP包过滤规则的。 也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

iptables规则表
剖析LNMP架构_第11张图片

优点:

  • iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains 等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。
  • 状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。INVALID 状态指出该信息包与任何已知的流或连接都不相关

例如:为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃.

/sbin/iptables -A INPUT -s 192.186.1.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
/sbin/iptables -A INPUT -s 192.186.1.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

2、WAF

iptables除了信息包过滤等之外,还有SQL注入,XSS、CSRF、DDoS等是无法防护的,所以防护也需要升级。

防护功能
1.1 网络层防护
1)DDOS×××
2)Syn Flood
3)Ack Flood
4)Http/HttpS Flood(CC×××)
5)慢速×××

1.2 应用层防护和功能
1)URL黑白名单
2)HTTP协议规范(包括特殊字符过滤、请求方式、内容传输方式,例如:multipart/form-data,text/xml,application/x-www-form-urlencoded)
3)注入×××(form和URL参数,post和get)

  • > SQL注入防御
  • > LDAP注入防御
  • > 命令注入防护(OS命令,webshell等)
  • > XPath注入
  • > Xml/Json注入

4)XSS×××(form和URL参数,post和get,现阶段分为三类×××:存储式(危害大,也是一种流行方式),反射式、基于Dom的XSS)
5)目录遍历(Path Traversal)
6) form表单数据验证和表单篡改和注入(表单验证银行卡、数据、日期等)
7)认证管理和会话劫持(cookie加密:防护会话劫持,包括cookie超时)。
8)内容过滤(这儿强调上传内容过滤post form和get 参数,主要应用论坛)
9)Web服务器漏洞探测(apache版本等隐藏,站点隐藏)
10)爬虫防护(基于SRC IP,周期判断访问数,爬虫白名单除外)
11)CSRF(Cross-site request forgery)(WAF采用token方式处理能够解决)
12)篡改(包括盗链)(WAF周期爬服务器网页,进行对比验证,如果篡改发现篡改,Client访问WAF网页)
13)Web服务器漏洞扫描(模拟×××,判断缺陷,自动配置对应规则)
14)cache加速(静态页面优化,PDF,图片等,需要周期映像)
16)错误码过滤(探测服务,及其目录结构)
17)站点转换(URL rewrite)
18)发现×××锁定(发现×××,锁定用户)
19)查杀毒
20)加密传输(http -> https转化,即client-waf之间通过https,waf与server之间http)。
21)URL ACL(URL匹配一些规则)。

1.3 防止Web信息泄露
1)银行卡(信用卡、借记卡)、社保卡、驾照等,采用覆盖和隐藏两种方式。
2)敏感词过滤、Web中关键词(政治敏感词、技术关键词等)。
3)防止文件泄露(word、pdf等扩展文件及其关键词),Web服务器上的文件。

1.4 nginx上能做的防护功能

  • 1.隐藏版本信息
  • 2.防数据库被盗取实战
  • 3.更改nginx服务的默认用户
  • 4.优化nginx进程个数的策略
  • 5.优化绑定不同的nginx进程在不同的CPU上
  • 6.nginx事件处理模型优化
  • 7.调整nginx单个进程允许的客户端最大连接数
  • 8.配置nginx worker进程最大打开文件数
  • 9.开启高效文件传输模式
  • 10.fastcgi相关参数调优
  • 11.配置nginx gzip压缩实现性能优化
  • 12.nginx expires功能
  • 13.nginx日志优化
  • 14.nginx站点目录及URL访问控制
  • 15.nginx图片防盗链解决方案
  • 16.nginx错误页面的优雅显示
  • 17.部署网站程序权限设置
  • 18..nginx防爬虫优化
  • 19.利用nginx限制HTTP的请求方法
  • 20.使用CDN做网站内容加速
  • 21.防止网站恶意×××
  • 22..控制nginx并发连接数量
  • 23.控制客户端请求nginx的速率
  • 24.nginx防CC×××

3、硬件防火墙

         把软件防火墙嵌入在硬件中,一般的软件安全厂商所提供的硬件防火墙便是在硬件服务器厂商定制硬件,然后再把linux系统与自己的软件系统嵌入。(Symantec的SGS便是DELL+Symantec的软件防火墙)这样做的好处是linux相对Windows的server相对安全。这样做的理由是由于ISA必须装在Windows操作系统下,微软的操作系统相对不安全,本身安全存在隐患的系统上部署安全策略相当于处在亚安全状态,是不可靠的。在兼容性方面也是硬件防火墙更胜一筹,其实软件防火墙与硬件防火墙的主要区别就在于硬件。

     防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些×××,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊×××。最后,它可以禁止来自特殊站点的访问,从而防止来自不明***者的所有通信。但是硬件防火墙一般用在内部网络上,
 对于公司网络安全来说,防火墙起的是关键性的作用,只有它,才可以防止来自互联网上永不停止的各种威胁。防火墙的选择对远程终端连接到中心系统获取必要资源或完成重要任务的影响也非常大。当选择基于硬件的防火墙时,以确保企业实现投资、安全性和生产力的最大化,应当考虑以下十个方面的因素:
  • 1.必须可以提供值得信赖的安全
  • 2.具有良好的易用性
  • 3.必须包含×××支持
  • 4.功能选择要符合实际需求
  • 5.应该拥有可靠的技术支持
  • 6.关注无线网络安全
  • 7.可以提供网关安全服务
  • 8.能够进行内容过滤
  • 9.可以提供专业的监测和报告
  • 10.了解是否具备故障转移功能

数据库防火墙
数据库防火墙是一款基于数据库协议分析与控制技术的数据库安全防护系统。基于主动防御机制,实现数据库的访问行为控制、危险操作阻断、可疑行为审计。
数据库防火墙通过SQL协议分析,根据预定义的禁止和许可策略让合法的SQL操作通过,阻断非法违规操作,形成数据库的外围防御圈,实现SQL危险操作的主动预防、实时审计。
数据库防火墙面对来自于外部的***行为,提供SQL注入禁止和数据库虚拟补丁包功能。


集群架构部署完整过程:https://blog.51cto.com/leoheng/2148772