PHP 7.2

安装

安装依赖仓库

sudo yum install epel-release
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

安装 PHP

安装 PHP 及常用模块,包括 php-gd 以及 php-fpm。

$ sudo yum --enablerepo="remi-php72" install -y \
  php php-common php-opcache php-mcrypt php-cli php-gd php-curl php-mysqlnd php-fpm

检查版本

检查是否安装成功:

$ php -v

PHP 7.2.9 (cli) (built: Aug 15 2018 09:19:33) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.9, Copyright (c) 1999-2018, by Zend Technologies

修改安全配置:

PHP 在找不到完全匹配的 PHP 文件时,默认会尝试最接近的文件。该特性容易被利用,以向请求中插入恶意代码。

$ sudo vi /etc/php.ini

cgi.fix_pathinfo=0

配置 PHP 与 Apache 工作

直接重启 Apache 就可以直接使用了:

$ sudo systemctl restart httpd

配置 PHP 与 Nginx 工作

要提前把 Nginx 安装好,以便自动创建 nginx 用户,在下面的配置中会用到该用户。

修改 PHP 配置
$ sudo vi /etc/php-fpm.d/www.conf

...
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
启动 PHP FPM

修改之后,可以激活并启动 PHP FPM 守护进程了:

$ sudo systemctl enable php-fpm
$ sudo systemctl start php-fpm
修改 Nginx 配置

修改 Nginx 的虚拟服务器配置,以便 Nginx 有能力处理 PHP

$ sudo vi /etc/nginx/conf.d/default.conf
server {
    listen  80;
    server_name  server_domain_name_or_IP;

    root   /usr/share/nginx/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
测试 Nginx 配置文件的语法是否正确:
$ sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重新加载 Nginx 配置
$ sudo nginx -s reload
测试

在 Nginx 根目录创建一个 PHP 文件,然后访问配置的域名或地址。

$ sudo vi  /usr/share/nginx/html/index.php

<?php phpinfo(); ?>

Apache

找出访问量最大的 5 个 IP 地址

从 apache 的日志 access.log 中,统计访问量最多的 5 个 IP 地址。

$ cat /var/log/httpd/test-access.log \
| awk '{print $1}' \
| sort \
| uniq -c \
| sort -rn \
| head -5

限制 apache 每秒新建连接数为 1,峰值为 3

每秒新建连接数需要用 iptables 来控制:

$ sudo iptables -A INPUT -d 192.168.1.10 -p tcp --dport 80 -m limit --limit 1/second -j ACCEPT

峰值就是 apache 同时可以处理的最多连接数,需要修改 apache 的配置文件 /etc/httpd/conf/httpd.conf

MaxRequestWorkers 3

超过该限制之后,尝试建立的新连接,会进入等待队列,直到其它子进程被释放。

Nginx

安装

$ sudo yum install nginx

重新加载配置:

$ sudo nginx -s reload

手动添加 nginx 用户

$ sudo useradd --system -d /var/www/html --user-group -s /sbin/nologin nginx   

Nginx 作为反向代理时,如何在日志中保存访客的真实 IP 地址?

修改对应的 Nginx 配置文件:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
$ sudo nginx -s reload

FTP

解释 FTP 的主动模式和被动模式

主动还是被动是从 服务端的角度 来说的。主动模式中数据连接是由服务端发起的,而被动模式中则是由客户端发起的。

主动模式
  • 客户端从端口 C 连接到服务器端口 21,告知服务器自己的数据端口为 C+1;
  • 服务器从端口 21 返回应答消息,控制连接建立
  • 服务器从端口 20 连接到客户端端口 C+1;
  • 客户端返回应答消息,数据连接建立
被动模式
  • 客户端从端口 C 连接到服务器端口 21,告知服务端自己使用 被动模式
  • 服务端返回应答消息,并告知自己数据端口号 S,控制连接建立
  • 客户端从 C+1 端口连接到服务器 S 端口;
  • 服务端返回应答消息,数据连接建立

概念

LVS、Nginx、HAproxy 有什么区别?如何选择?

这三种软件均可以实现负载均衡。

LVS

Linux Virtual Server,负载均衡软件。

  • 基于四层的转发
  • 只能做端口的转发
  • 抗负载能力强,适于并发量大的场景
  • 工作稳定,自身有完整的双机热备方案
  • 应用范围比较广,可以对所有应用做负载均衡
  • 需要向 IDC 多申请一个 IP 来做 Virtual IP,因此需要一定的网络知识
Nginx

WEB 服务器,缓存服务器,反向代理服务器,多功能软件。

  • 基于七层的转发,可以做基于 URL 和目录的转发
  • 对网络的依赖比较小
  • 安装和配置比较简单
  • 可以承担较高的负载,可支撑超过 1 万次的并发
  • 不支持 session 的保持
HAproxy

专业的代理服务器。

  • 基于七层的转发
  • 可以做基于 URL 和目录的转发
  • 适于普通并发量的场景
  • 支持 session 的保持
选择

随着网站规模的提升根据不同的阶段来使用不同的技术:

第一阶段:

利用 Nginx 或者 HAProxy 进行单点的负载均衡,这一阶段服务器规模刚脱离开单服务器、单数据库的模式,需要一定的负载均衡,但是仍然规模较小,没有专业的维护团队来进行维护,也没有需要进行大规模的网站部署。

上手快,配置简单,在七层上利用 HTTP 协议就可以实现。

第二阶段:

随着网络服务进一步扩大,单点的 Nginx 已经无法满足,此时使用 LVS 或商用 F5 是选。Nginx 是作为 LVS 或 F5 的节点来使用。

第三阶段:

随着网络服务成为主流产品,公司知名度进一步扩展,相关人才的能力以及数量也随之提升,这时无论从开发适合自身产品的定制考虑,还是从降低成本考虑,开源的 LVS 为首选。

最终形成比较理想的状态为:F5/LVS <—> Haproxy <—> Squid/Varnish <—> AppServer

Squid、Varinsh 和 Nginx 有什么区别,如何选择?

Squid、Varinsh 和 Nginx 都是可以用来提供网站缓存服务。

Squid
  • 专业的缓存软件
  • 技术资料丰富
Varnish
  • 专业的缓存软件
  • 采用了可视化页面缓存技术,较高的技术优势
  • 内存缓存,速度一流
  • 因为是内存缓存,容量有限制
  • 有强大的管理端口,可以使用正则表达式快速、批量地清除部分缓存
Nginx
  • Nginx 是 WEB 服务器,使用第三方模块才可以提供缓存服务
  • 只能缓存静态文件
选择

优先选择专业的缓存服务 squid 或 varnish。