LAMP


目录:

LAMP网站平台(适用于同一台服务器)

LNMP:适合小文件 Linux+nginx +mySQL+ Python/PHP

LAMP:适合大文件 Linux+Apache web server+ MySQL+PHP/Python

网站模板:http://www.cssmoban.com

Apache:(web服务器)

理论

httpd的配置文件分三大部分:

  1. Global Environment 全局配置环境
  2. 'Main' server configuration 主机服务配置
  3. Virtual Hosts 虚拟主机配置

http获取方式:[请求方式]

  • GET
  • PUT
  • POST
  • DELETE
  • HEAD

基本请求过程:

  • 建立链接[tcp]
  • 接收请求
  • 处理请求
  • 访问资源
  • 构建响应
  • 缓存日志

web的多处理模块化:

  • 针对高并发请求时,进行快速响应

多处理模块化:

  • prefork:一个进程对应一个请求[但是对应高并发任然存在瓶颈]
  • worker:一个进程生成多个线程,用多个线程去满足用户的请求
  • 线程:相当于较小资源的进程
  • event:worker的升级版

http的特性:

1、虚拟主机

Apache和PHP的结合方式:

1、Module:模块模式

必须要求Apache和PHP安装在同一台主机上[搭建LAMP平台时,必须安装在一起]

2、CGI:common gateway interface[公共网关接口]

  • 优点:实现了web从静态页面转换成动态页面
  • 缺点:对于高并发时,往往不通用【理由:每次请求都会生成一个进程,且每次结束都会销毁一个进程,这样会不断的进行fork;极大的消耗时间和资源】

3、fastCGI:专门为Apache好与PHP结合生成的一个程序接口

工作原理:在Apache和PHP之间,使用内存加载一个CGI的程序接口,使用fastCGI常驻内存中,进行循环执行。只要激活后不会都每次花时间去fork资源。支持分布式运算。将每一个运行的记过单独的交给后端的PHP

内存的工作模式:ROM[断电后丢失内容]

故此:Apache和PHP可以不安装在同一台主机上[此为工作模型]

php-fpm:fastcgi process manager[fastcgi的进程管理器]

必须是在php5.3版本之后才有,在此之前fpm仅仅是一个补丁包

php-fpm提供了更多的php进程管理方式,可以有效控制内存和进程、可以平滑重载php配置,比spawn-fcgi优点更多;

安装php时在./configure的时候带--enable-fpm参数即可开启php-fpm

总结:fastfpm监听的端口为9000

1、CGI模式:工作流程繁复,且每次client请求,都会经历client ->webserver -> CGI ->webserver -> client[资源消耗大]

2、module模式:php作为Apache的一个模块[php随Apache的启动而启动],此种结合方式比CGI运行php效率更高

3、fast-cgi模式:module和fastcgi都有进程池的概念,fast-cgi将服务器端动、静态请求更好的分离。[php进程出了问题不会将wed服务器宕机]

注意:

php-cgi是php程序的解释器[解析请求,返回结果不会管理进程],

php-fastCGI时php-cgi的升级[解析请求,返回结果、管理进程]

php-fpm的功能:调度php解析进程实现进程管理

apache所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好给apache一个单独的主机以免受到其他应用的干扰。

各个硬件指标中,对性能影响最大的是内存,对于静态内容(图片、javascript文件、css文件等),它决定了apache可以缓存多少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存可以极大提高静态站点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache的mpm模块会为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正比,因此增大内存对提高动态站点的负载和运行速度也极为有利 

其次是硬盘的速度,静态站点尤为突出,apache不断的在读取文件并发送给相应的请求,硬盘的读写是极其频繁的;动态站点也要不断的加载web程序(php等),一个请求甚至要读取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高apache的性能是有积极意义的。 

最后是cpu和网络,cpu影响的是web程序执行速度,网络影响流量大小。

Apache的三种工作模式详解

博客参考:

https://blog.51cto.com/balich/1743798

https://my.oschina.net/u/3803405/blog/1861707

https://blog.51cto.com/longlei/2109039

目前来说,它一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)。它们分别是 prefork、worker 和 event

Apache在configure配置编译参数的时候,可以使用--with-mpm=prefork|worker|event来指定编译为那一种MPM,当然也可以用编译为三种都支持:--enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM

查看Apache的工作模式

方法1:可查看Apache工作模式 ->这里使用的是prefork模式

/bin/apachectl -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  prefork.c  # prefork 模式

方法2:可查看Apache版本信息及工作模式 ->这里使用的是worker模式

/bin/apachectl -V
Server version: Apache/2.4.7 (Unix)
Server built:   Apr 17 2018 11:12:53
Server's Module Magic Number: 20120211:27
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     worker # worker 模式
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
prefork ->多进程,每个进程产生子进程

多进程,每个请求用一个进程响应,这个过程会用到select机制来通知

prefork 是一种非线程、与派生的工作模式,用的是进程去处理请求,所以比较容易消耗内存,但是稳定性好,某个进程出现问题不会影响到其他请求

Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景

在Unix系统中,父进程通常以root身份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。User和Group指令用于配置子进程的低特权用户。运行子进程的用户必须要对他所服务的内容有读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限

image-20230210171547194

优点:

成熟,兼容所有新老模块。进程之间完全独立,使得它非常稳定。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP的拓展不需要支持线程安全)

缺点:

一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理

如何配置在Apache的配置文件httpd.conf的配置方式:

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   1000
</IfModule>

参数解释:

  • StartServers

服务器启动时建立的子进程数量,prefork默认是5,

  • MinSpareServers

空闲子进程的最小数量,默认5;如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。

  • MaxSpareServers

空闲子进程的最大数量,默认10;如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程会杀死多余的子进程。次参数也不需要设置太大,如果你将其设置比MinSpareServers 小,Apache会自动将其修改为MinSpareServers +1的数量。

  • MaxRequestWorkers

限定服务器同一时间内客户端最大接入的请求数量,默认是256;任何超过了MaxRequestWorkers限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务,如果要增大这个数值,必须先增大ServerLimit。在Apache2.3.1版本之前这参数MaxRequestWorkers被称为MaxClients。

  • MaxConnectionsPerChild

每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。

这里建议设置为非零,主要原因:

1)能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。

2)给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)

Worker ->多进程+多线程

多线程,一个进程可以生成多个线程,每个线程响应一个请求,但通知机制还是select不过可以接受更多的请求

worker是2.0版中全新的支持多线程和多进程混合模型的MPM。它也预先fork了几个子进程(数量比较少),每个子进程能够生成一些服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。

Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。在Unix中,为了能够绑定80端口,父进程一般都是以root身份启动,随后,Apache以较低权限的用户建立子进程和线程。User和Group指令用于配置Apache子进程的权限。虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予他较少的特权。另外,除非使用了suexec ,否则,这些指令配置的权限将被CGI脚本所继承。

线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下,表现得比 prefork模式好。

有些人会觉得奇怪,那么这里为什么不直接使用多线程呢(即在一个进程内实现多线程),还要引入多进程?

原因主要是需要考虑稳定性,如果一个线程异常挂了,会导致父进程连同其他正常的子线程都挂了(它们都是同一个进程下的)。多进程+多线程模式中,各个进程之间都是独立的,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。其他进程仍然可以工作

image-20230210171725427

优点:占据更少的内存,高并发下表现更优秀。

缺点:

必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,也许中间几乎没有请求,这时就会发生阻塞,线程被挂起,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

Ps:http1.1的keep-alive的长连接方式,是为了让下一次的socket通信复用之前创建的连接,从而,减少连接的创建和销毁的系统开销。保持连接,会让某个进程或者线程一直处于等待状态,即使没有数据过来

如何配置在Apache的配置文件httpd.conf的配置方式:

<IfModule mpm_worker_module>
    StartServers             3
    ServerLimit            16
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   1000
</IfModule>

参数解释:

  • StartServers

服务器启动时建立的子进程数量,在workers模式下默认是3.

  • ServerLimit

系统配置的最大进程数量

  • MinSpareThreads

空闲子进程的最小数量,默认75

  • MaxSpareThreads

空闲子进程的最大数量,默认250

  • ThreadsPerChild

每个子进程产生的线程数量,默认是64

  • MaxRequestWorkers /MaxClients

限定服务器同一时间内客户端最大接入的请求数量.

  • MaxConnectionsPerChild

每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。

这里建议设置为非零,注意原因:

1)能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。

2)给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。

Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxRequestWorkers。

如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时 也需要显式声明ServerLimit(最大值是20000)。

需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值

event ->多进程+多线程+epoll

基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的

一个进程响应多个用户请求,利用callback机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。可以实现一个进程程响应多个用户请求。支持持海量并发连接数,消耗更少的资源

这个是 Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和 worker模式很像,最大的区别在于,它解决了 keep-alive 场景下 ,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂在那里等待,中间几乎没有请求过来,一直等到超时)

event MPM中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞。增强了在高并发场景下的请求处理

event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的

image-20230210172049134

注意一点,event MPM需要Linux系统(Linux 2.6+)对Epoll的支持,才能启用

如何配置在Apache的配置文件httpd.conf的配置方式:

<IfModule mpm_event_module>
    StartServers             3
    ServerLimit             16
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   1000
</IfModule>
  • StartServers             3    服务启动时初始的进程数,默认3

  • MinSpareThreads         75  最小的空闲子进程数,默认75

  • MaxSpareThreads        250  最大的空闲子进程数,默认250

  • ThreadsPerChild         25   每个子进程产生的线程数量,默认是25

  • MaxRequestWorkers      400 限定同一时间内客户端最大接入的请求数量,默认是400

  • MaxConnectionsPerChild   0 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。将该值设置为非0值,可以防止运行PHP导致的内存泄露

工作模式与web应用的选择

Apache能更好的为有特殊要求的站点定制。例如,要求 更高伸缩性的站点可以选择使用线程的 MPM,即 worker 或 event; 需要可靠性或者与旧软件兼容的站点可以使用 prefork。就使用PHP而言,fastCGI和php-fpm是更推荐的使用模式。

现在的最新浏览器,在单个域名下的连接数变得越来越多(通常都是使用keep-alive),主流浏览器是2-6个(还有继续增长趋势,为了加快页面的并发下载速度)。高并发场景,会越来越成为Web系统的一种常态。Apache很成熟,同时也背负了比较重的历史代码和模块,因此,在Web系统比较方面,Nginx在不少场景下,表现比起Apache更为出色

1)yum安装httpd、设置防火墙,并保存、重启httpd

yum install -y httpd
systemctl stop firewalld.service(7版本)
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
systemctl restart httpd.service  (7版本)

image-20230210173540402

重启会报一个提示错误,需要修改SeverName与Listen,然后在重启就不会报错

2)修改监听端口和ServiceName

修改之前备份配置文件:

# cp httpd.conf httpd.conf.back

image-20230210173601170

image-20230210173613616

3)访问ip,看网页是否能加载

image-20230210173622623

200 表示可以正常访问

3)修改主配置文件的各种情况:

网站的目录位置

image-20230210173631896

网站首页文件位置

image-20230210173639422

是否授权访问该网页

默认就是授权所有都可以访问

image-20230210173649102

是否加载隐藏文件(建议写成none)

image-20230210173704220

1)Index:表示不显示没有网页的文件

配置文件如下;并且必须删除网站根目录下的html文件:显目网站目录

image-20230210173732596

image-20230210173744433

配置文件如下;并且删除网站根目录下的html文件:禁止显目网站目录

image-20230210175634120

image-20230210175641947

image-20230210175653688

在根下面创建一个xx文件夹并写入一个index.html文件,然后把根下面的xx文件夹软连接到/var/www/html下面,软连接名字为yy

[root@www /]# mkdir xx
[root@www /]# cd xx
[root@www xx]# echo "abc" > index.html
[root@www xx]# ln -s /xx/ /var/www/html/yy
[root@www xx]# cd /var/www/html/
[root@www html]# ls
index.html  test  yy

image-20230210175733823

然后访问192.168.211.143/yy

image-20230210175754038

出现无法访问是selinux的问题,修改selinux,继续访问

[root@www html]# geten
getenforce  getent      
[root@www html]# getenforce 
Enforcing
[root@www html]# setenforce 0
[root@www html]# getenforce 
Permissive

image-20230210175817737

访问的结果

当访问yy是,实际上是访问的根下面的xx里面的index.html,这就是虚拟目录,如果删除配置文件的FollowSymLinks就无法访问软连接的内容。

image-20230210180203975

3)Allow与Deny冲突的情况下

image-20230210180223966

访问的结果

image-20230210180230670

如下设置是只能服务器自己访问自己

image-20230210180247393

4)如下设置只能自己访问目录yy

image-20230210180256555

5)如何创建一个家目录并且访问用户的家目录

image-20230210180304975

[root@www ~]# su - pengxiong
[pengxiong@www ~]$ pwd
/home/pengxiong
[pengxiong@www ~]$ mkdir public_html
[pengxiong@www ~]$ ls
public_html
[pengxiong@www ~]$ cd public_html/
[pengxiong@www public_html]$ ls
[pengxiong@www public_html]$ echo "如何访问家目录" > /home/pengxiong/public_html/index.html
[pengxiong@www public_html]$ ls
index.html

无法访问的原因:

image-20230210180423748

更改过后就可以访问:

image-20230210180430964

6)把用户软连接出来就可以直接访问:原理是配置文件有一个虚拟目录
[root@www ~]# cd /var/www/html/
[root@www html]# ls
index.html  test  yy
[root@www html]# ln -s ~pengxiong/public_html/ pengxiong
[root@www html]# ls
index.html  pengxiong  test  yy
[root@www html]#

image-20230210180500464

image-20230210180509268

7)访问yy目录的时候需要验证:输入用户名和密码

先进入yy,创建隐藏文件.htaccess,然后写入截图里面的内容,因为密码是放在html里面的,所有回到html里面创建密码文件

[root@web html]# cd yy/
[root@web yy]# vim .htaccess
[root@web yy]# cd ..
[root@web html]# ls -a
.  ..  .htaccess  index.html  xx 
[root@www yy]# cd ..
[root@www html]# ls
index.html  pengxiong  test  yy
[root@web html]# htpasswd -cm .htpasswd pengxiong     (c表示原来没有这个文件;m表
New password:                                           示用的md5加密的)
Re-type new password: 
Adding password for user pengxiong
[root@web html]# ls -a
.  ..  .htpasswd  index.html  pengxiong  test  yy
[root@web html]#

image-20230210180546868

.htaccess里面的内容

image-20230210180558337

image-20230210180614563

配置文件修改:

image-20230210180621238

image-20230210180628052

image-20230210180636029

8)连接到web的脚本:

image-20230210180646509

这个aline就是访问根下面aa这个目录里面的index.html

image-20230210180658372

mkdir /aa 
echo “aaaaaaa” > /aa/index.html

4)虚拟主机(2.4):意思就一台httpd服务有多个网站(3种情况)

官方文档:http://httpd.apache.org/docs/2.4/vhosts/

基于ip的虚拟主机

1、至少需要2个IP地址

image-20230210180744104

2、修改配置文件

去掉这个两个注释

# vim /etc/httpd/httpd.conf

image-20230210180806031

然后,在最后面加入下面几行(经验证,不写这几句依然没有问题):

<Directory "/var/www">                      #网页的根目录
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

修改虚拟主机配置文件:

# vim httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin 198admin@198.com            #管理员邮箱
    DocumentRoot "/usr/local/httpd/htdocs/"     #网页根路径
    ServerName 192.168.2.198                    #虚拟主机IP地址或者域名
    ServerAlias www.198.com                 #域名别名
    ErrorLog "logs/error_log"                   #错误日志路径
    CustomLog "logs/access_log" common      #访问日志路径
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin 199admin@199.com
    DocumentRoot "/usr/local/httpd/htdocs/ip199/"
    ServerName 192.168.2.199
    ServerAlias www.199.com
    ErrorLog "logs/199-error_log"
    CustomLog "logs/199-access_log" common
</VirtualHost>

3、结果呈现:

image-20230210180916541

image-20230210180935470

基于端口虚拟主机

1、只需要1个IP地址

image-20230210181100788

2、修改配置文件

1、去掉这个两个注释

# vim /etc/httpd/httpd.conf

image-20230210181219582

2、添加监听端口

image-20230210181230331

3、修改虚拟主机

# vim /etc/httpd/extra/httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin 198admin@198.com
    DocumentRoot "/usr/local/httpd/htdocs/"
    ServerName 192.168.2.198:80
    ServerAlias www.198.com
    ErrorLog "logs/error_log"
    CustomLog "logs/access_log" common
</VirtualHost>
<VirtualHost *:8080>
    ServerAdmin 199admin@199.com
    DocumentRoot "/usr/local/httpd/htdocs/ip199/"
    ServerName 192.168.2.198:8080
    ServerAlias www.199.com
    ErrorLog "logs/199-error_log"
    CustomLog "logs/199-access_log" common
</VirtualHost>

image-20230210181521294

image-20230210181304230

4、重启服务、查看端口

# apachectl graceful

image-20230210181334110

5、结果呈现:

image-20230210181355745

image-20230210181404673

基于主机名虚拟主机

1、修改虚拟主机配置文件

<VirtualHost *:80>
    ServerAdmin 198admin@198.com
    DocumentRoot "/usr/local/httpd/htdocs/"
    ServerName www.198.com
    ServerAlias 198.com
    ErrorLog "logs/error_log"
    CustomLog "logs/access_log" common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin 199admin@199.com
    DocumentRoot "/usr/local/httpd/htdocs/ip199/"
    ServerName www.199.com
    ServerAlias 199.com
    ErrorLog "logs/199-error_log"
    CustomLog "logs/199-access_log" common
</VirtualHost>

image-20230210181556477

说明:这里不做别名,是无法用别名进行访问

2、这里由于没有配置DNS服务,无法解析域名,以此我们修改本地的hosts文件,然后进行本地解析。(如果想在Windows访问,同样需要修改Windows里的hosts文件)

# vim /etc/hosts

image-20230210181646738

3、重启服务、查看端口

# apachectl graceful

image-20230210181711974

4、结果呈现:

别名访问:

image-20230210181719681

image-20230210181730269

全名访问:

image-20230210181740757

image-20230210181748224

Windows访问:

修改Windows里hosts文件:

image-20230210181758865

访问结果:

image-20230210181816141

用别名访问时,自动填写成www.198.com

配置httpd.conf文件(2.2):

image-20230210181839878

image-20230210181851696

新增网站以及把原来的网站加载到虚拟主机里面,如果不把原来的网站加载到虚拟主机里面,是无法访问原来那个网页的

image-20230210181900624

然后在根下面创建出百度这个目录

[root@web ~]# mkdir /baidu
[root@web ~]# ls /
baidu  boot  etc   lib    lost+found  mnt  pengxiong  root  selinux  sys  usr  xx
bin    dev   home  lib64  media       opt  proc       sbin  srv      tmp  var
[root@web ~]# echo "eeeee" > /baidu/index.html
[root@web ~]# ls /baidu/index.html 
/baidu/index.html
[root@web ~]# cat /baidu/index.html 
eeeee
[root@web ~]#

image-20230210181942393

改变新加网页的上下文:

[root@web ~]# ls -ldZ /baidu/ /var/www/html/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /baidu/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
[root@web ~]# chcon -R --reference=/var/www/html/ /baidu/
# ls -ldZ /baidu/ /var/www/html/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /baidu/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

image-20230210182006265

重启服务并访问:

基于ip地址的虚拟主机:

新加2个ip,修改NDS,新增的2个ip分别给bb,cc做DNS,然后重启网络

重点:如果是基于ip的虚拟主机必须注释点下图的NameVirtualHost *:80

image-20230210182017909

*不能用这个代替VirtualHost,必须用对应的ip

image-20230210182027284

重启httpd服务,然后用ip地址访问。

基于端口的时候需要关,其他都开启

搭建一个DNS服务器(基于域名时,需要用):
[root@web ~]# yum install bind bind-chroot –y
[root@web ~]# cd /etc/
[root@web etc]# cp -a named* /var/named/chroot/etc/
[root@web etc]# cd /var/named/
[root@web named]# ls
chroot  data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@web named]# cp -a data/ dynamic/ named.* slaves/  chroot/var/named/
[root@web named]# cd chroot/etc/
[root@web etc]# ls
localtime  named  named.conf  named.iscdlv.key  named.rfc1912.zones  named.root.key  pki
[root@web etc]# vim named.conf 

image-20230210182115928

[root@web chroot]# cd var/named/
[root@web named]# ls
data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@web named]# cp -p named.localhost aa.zone
[root@web named]# vim aa.zone

image-20230210182137998

[root@web named]# cp -p aa.zone bb.zone
[root@web named]# vim bb.zone

image-20230210182158081

[root@web named]# cp -p aa.zone cc.zone
[root@web named]# vim cc.zone

image-20230210182216600

启动服务:但是生成了一个这个文件,需要这样处理一下

image-20230210182223727

[root@web named]# rndc-confgen -r /dev/urandom -a
wrote key file "/etc/rndc.key"
[root@web named]# service named restart
停止 named:.                                              [确定]
启动 named:                                               [确定]

如何实现认证、授权与访问控制

背景:为了更好的控制网站资源,有些目录和文件不能任意授权进行访问,必要进行访问控制

1、基于客户机地址限制

2、基于用户授权限制

注意:以上两种配置方法。均都在<Directory>......</Directory>中实现

认证、授权

依赖的模块:

mod_auth_basic (默认开启的)

mod_auth_digest

# /usr/local/httpd/modules          (安装时,在模块目录查看需要的模块)

说明:2.4版本安装时已经自动安装了这两个模块,如果没有那就需要再次编译安装;2.2版本时没有安装的,以此在装服务之前,可以考虑安装这两个模块

1、basic

# vim /etc/httpd/httpd.conf         (配置文件里查看)
# 因为现在使用的是虚拟主机,因此就在虚拟主机配置文件中进行配置
# vim /etc/httpd/extra/httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin 198admin@198.com
    DocumentRoot "/usr/local/httpd/htdocs/"
    ServerName www.198.com
    ServerAlias 198.com
    ErrorLog "logs/error_log"
    CustomLog "logs/access_log" common
    <Directory "/usr/local/httpd/htdocs/">      #网页根目录
        Options FollowSymLinks                  #允许使用符号链接
        AllowOverride AuthConfig                #访问设置的权限
        AuthType Basic                          #验证类型
        AuthName "This is test"                 #验证名称
        AuthUserFile "/etc/httpd/.htpasswd"     #密码文件
        Require valid-user                      #所有有效用户访问都必须验证
    </Directory>
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin 199admin@199.com
    DocumentRoot "/usr/local/httpd/htdocs/ip199/"
    ServerName 199.com
    ServerAlias www.199.com
    ErrorLog "logs/199-error_log"
    CustomLog "logs/199-access_log" common
</VirtualHost>

说明:为了做对比,这里只验证www.198.com

如果不是虚拟主机,那么就在/etc/httpd/httpd.conf配置文件中单独添加这几行内容就ok。

image-20230210182414081

生成隐藏文件:

htpasswd

htpasswd建立和更新存储用户名、密码的文本文件, 用于对HTTP用户的basic认证。
参数:
-c 创建passwdfile.如果passwdfile 已经存在,那么它会重新写入并删去原有内容.
-n 不更新passwordfile,直接显示密码
-m 使用MD5加密(默认)
-d 使用CRYPT加密(默认)
-p 使用普通文本格式的密码
-s 使用SHA加密
-b 命令行中一并输入用户名和密码而不是根据提示输入密码,可以看见明文,不需要交互
-D 删除指定的用户

例1

# htpasswd -bc .access username password  #在当前目录生成.access文件,用户名username,密码:password,默认采用MD5加密方式。 
# htpasswd -b .access test 123456   #在原有密码文件中增加下一个用户
# htpasswd -nb test 123456  #不更新.access文件,只在屏幕上输出用户名和经过加密后的密码。 
# htpasswd -D .access test  #利用htpasswd命令删除用户名和密码

-----------------------------------
# htpasswd -c -m /etc/httpd/.htpasswd admin         #(admin是登陆时的用户名)
New password:               #输入密码
Re-type new password:       #再次输入密码
Adding password for user admin
# ll -a
-rw-r--r--.  1 root root    44 3月  11 19:46 .htpasswd   

重启服务:

#apachectl graceful

在谷歌浏览器上验证结果(访问www.198.com):

image-20230210182533136

image-20230210182538311

在火狐浏览器访问时,会显示AuthName内容):

image-20230210182549062

上面配置文件中,只做了www.198.com的认证,以此访问www.199.com时,还是不会输入验证信息

image-20230210182559792

2、digest

# vim /etc/httpd/httpd.conf

image-20230213101418490

确认要有mod_auth_digest.so,这个没有就要重新编译apache了,添加这个模块

<Directory "/usr/local/httpd-2.4/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<Directory "/usr/local/httpd-2.4/htdocs">               # 网页路径
     AuthType Digest
     AuthName "Nagios Access"
     AuthDigestDomain /usr/local/httpd-2.4/htdocs
     AuthDigestProvider file
     AuthUserFile /etc/httpd/nagios.users
     Require valid-user
</Directory>

创建密码文件 

htdigest -c /etc/httpd/nagios.users "Nagios Access" admin 

这句命令里面有几个要注意的,我测试了好长时间才发现。  Nagios Access -> 这个解释为域  实现上是要和认证配置里面的 AuthName保持一致,不然认证失败

访问结果:

image-20230213101621352

第二种写法:alias别名的方式

Alias /nagios "/usr/local/httpd-2.4/htdocs"
<Directory "/usr/local/httpd-2.4/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<Location /nagios/>
     AuthType Digest
     AuthName "Nagios Access"
     AuthDigestDomain /nagios/ http://192.168.2.185/nagios/
     AuthDigestProvider file
     AuthUserFile /etc/httpd/nagios.users
     Require valid-user
</Location>

但是访问时,必须这样写: http://192.168.2.185/nagios/

image-20230213101700747

访问控制

Require all denied #拒绝所有人访问

image-20230213101725978

image-20230213101733210

Require all granted #允许所有人访问

image-20230213101750621

Require local #仅允许本地访问

image-20230213101801947

# links 192.168.2.185

image-20230213101809860

Require [not] ip <ip地址或者网段>:允许或拒绝指定IP地址网络访问

允许特定IP或IP段,多个IP或IP段间使用空格分隔

eg:Require ip 192.168.2.200 #(允许该IP地址访问)

image-20230213101858366

image-20230213101905677

注意:定义限制策略时,多个不带"not"的require配置语句之间是"或"的关系,即任意一条require配置语句满足条件均可访问

<RequireAll>
  Require all granted
  Require not ip 192.168.2.200
</RequireAll>

image-20230213101947930

image-20230213101956910

Require [not] host <主机名或域名列表>:允许或拒绝指定主机或域名访问

连接保持:[避免http协议的无状态化]

背景:http是应用层的面向对象协议,且基于TCP协议栈进行传输,在此过程中,必然会TCP的三次握手和4次分手。由于http不会对之前发生过的请求和响应进行管理,所有建立与关闭连接对于http而言会消耗更多的内存与cpu资源。而且还可以限制多个ip发出多少个tcp连接。

编译安装配置文件的路径:/etc/httpd/extra/httpd-default.conf

yum安装的位置就是在httpd.conf

# Timeout: The number of seconds before receives and sends time out.
#
Timeout 60          超时时间

# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On                    #是否开启KeepAlive长连接

建议:在高并发时,打开连接保持,低并发时进行关闭

# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100    #长连接最多接受多少个请求。请求数量大于改值则自动断开。
#用于设置在一次长连接中可以传输的最大请求数量,超过此最大请求数量就会断开连接,最大值的设置决定于网站中网页的内容,一般设置数量会多于网站中所有的元素

# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5      #长连接多久算是超时,超时之后自动断开长连接
#表示一次连接多次请求之间的最大间隔时间,即两次请求之间超过该时间连接就会自动断开,从而避免客户端占用连接资源

1)KeepAlive On/Off

KeepAlive指的是保持连接活跃,换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。一般情况下,图片较多的网站应该把KeepAlive设为On

2)KeepAliveTimeOut number

如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。它的设置一般考虑图片或者JS等文件两次请求间隔,一般设置为3-5秒。

3)MaxKeepAliveRequests 100

一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。

4)HostnameLookups on|off|double

如果是使用on,那么只有进行一次反查,如果用double,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合才行,而off就是不进行域名验证。

如果为了安全,建议使用double;为了加快访问速度,建议使用off。

域名查找开启这个会增加apache的负担, 减慢访问速度建议关闭

5)timeout 5

推荐5 这个是 apache接受请求或者发出相应的时间超过这个时间 断开

注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-default.conf设置并在httpd.conf文件中通过include选项引用

MPM这个比较关键是影响并发效率的主要因素

1)StartServers        10

设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所以一般没有必要调整这个参数

2)MinSpareServers     10

设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意

3)MaxSpareThreads     75

设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1″。

4)ServerLimit       2000

服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和MaxClients一样。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。

5)MaxClients/ MaxRequestWorkers         256

用于客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是256,如果要提高这个值必须同时提高ServerLimit的值。建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。

6)MaxRequestsPerChild / MaxConnectionsPerChild  0

设置的是每个子进程可处理的请求数。每个子进程在处理了"MaxRequestsPerChild"个请求后将自动销毁。0意味着无限,即子进程永不销毁。内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、50、100。所以一般情况下,如果你发现服务器的内存直线上升,建议修改该参数试试。

注:以上配置项可在/usr/local/http-2.4.23/conf/extra/httpd-mpm.conf设置并在httpd.conf文件中通过include选项引用

切割日志

为什么要分割日志??????

随着网站的访问越来越大,WebServer产生的日志文件也会越来越大,如果不对日志进行分割,那么只能一次将大的日志(如Apache的日 志)整个删除,这样也丢失了很多对网站比较宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等,因此管理好这些海量的日志对网站的意义是很大的。 

1、先改日志文件名,然后重启apache (建议不要用)

[root@elk-node-1 logs]# date -d "-1 day" +%F
2019-03-11
[root@elk-node-1 logs]# mv access_log access_log_$(date +%F)
[root@elk-node-1 logs]# apachectl graceful   #重启apache
[root@elk-node-1 logs]# ls
access_log            
access_log_2019-03-12

2、rotatelogs

(apache自带的工具) 每隔一天记录一个日志

# which rotatelogs          (先查这个命令的绝对路径)
/usr/local/httpd/bin/rotatelogs

# vim /etc/httpd/httpd.conf     (这是没有做虚拟主机的情况下;如果做了虚拟主机,则关闭虚拟主机哦)   
CustomLog "|/usr/local/httpd/bin/rotatelogs /usr/local/httpd/logs/access_log-%Y%m%d.log 86400" combined

image-20230213102947467

重启服务:# apachectl graceful
# vim /etc/httpd/extra/httpd-vhosts.conf        (在虚拟主机上的情况)

image-20230213103054102

注:

  • 其中86400为轮转的时间单位为秒
  • 竖杠表示绝对路径

由于apache自带的日志轮询工具rotatelogs,据说在进行日志切割时容易丢日志,因此我们通常使用cronolog进行日志轮询。

3、cronlog(在虚拟主机上操作的)

上传cronlog安装包、解压并源码安装:

tar xf cronolog-1.6.2.tar.gz 
cd cronolog-1.6.2
./configure 
make && make install

查看绝对路径:

# which cronolog 
/usr/local/sbin/cronolog

添加下面这一行(这里不用写时间):

CustomLog "|/usr/local/sbin/cronolog /usr/local/httpd/logs/access_log-%Y%m%d.log" combined

然后重启:

重启服务:# apachectl graceful

如果Apache中有多个虚拟主机,最好每个虚拟主机中放置一个这样的代码,并将日志文件名改成不同的名字。

扩展:

这个保证了每天一个文件夹 文件夹下 每个小时产生一个log
CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined
按天轮询(生产环境常见用法,推荐使用):
CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined
按小时轮询(生产环境较常见用法):
CustomLog "|/usr/local/sbin/cronolog logs /access_www_ %Y%m%d%H.log" combined

注意:

这两个管道日志文件程序还有一点不同之处是使用 cronolog 时如果日志是放在某个不存在的路径则会自动创建目录,而使用 rotatelogs 时不能自动创建,这一点要特别注意

基础优化

压缩:使用mod_deflate模块

--enable-deflate: 提供对内容的压缩传输编码支持,一般是html、js、css等内容的站点。使用此参数会大大提高传输速度,提升访问者访问的体验。在生产环境中,这是apache调优的一个重要选项之一

优点:可以压缩页面,优化传输速度,节省带宽。

缺点:会额外消耗CPU,同时可能有些较老的浏览器不支持压缩。

NOTE:

适用于适合压缩的资源,例如文本文件。

如果要开启deflate的话,一定要打开下面二个模块

LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so

设置压缩比率,取值范围在 1(最低) 到 9(最高)之间,不建议设置太高,虽然有很高的压缩率,但是占用更多的CPU资源.

vim /etc/httpd/httpd.conf

开启模块:

image-20230213103643099

image-20230213103650731

然后在最后面添加如下内容:

LoadFile /usr/lib64/libz.so         #libz.so为deflate压缩模块所需要的库文件
<Ifmodule mod_deflate.c>
    DeflateCompressionLevel 9   
    SetOutputFilter DEFLATE
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio    AddOutputFilterByType    DEFLATE    text/html    text/plain    text/xml    text/css    text/javascript 
</Ifmodule>

image-20230213103720221

设定压缩比例,数值越高,压缩比例越大,耗时越慢

DeflateCompressionLevel 9 ###压缩等级(1-9),等级越大效率越高,但同时消耗的CPU也高,根据具体情况调优,也可以设置为6来平衡CPU及压缩质量 
AddOutputFilterByType  ##仅压缩限制特定的MIME类型文件
缓存:使用mod_expires

这个非常有用的优化,mod_expires可以减少20-30%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。但要注意更新快的文件不要这么做。

这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。

mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。

--enable-expires: 激活彧通过配置文件控制HTTP的"Expires:"和"Cache-Control:"头内容,即对网站图片、js、css等内容,提供客户端浏览器缓存的设置。这个是apache调优的一个重要选项之一

当然如果我们是租用虚拟主机的话,"httpd.conf"设定档我们一般用户是接触不到的,而在网站根目录里写个".htaccess"设定档, 我想在运用上相对是较灵活的."mod_expires"的设定资料除了可以写在Apache的"httpd.conf"设定档中,也可以写 在".htaccess"设定档里.

我们知道在使用浏览器浏览网页时,浏览器会把网页资料快取(Cache)下来储存在本机端,用以加快下回浏览相同网页时不必再重新由网站上下载,进 而有加速的效果.使用mod_expires模组来加速网页浏览,这里所谓的"加速",其实是利用"mod_expires"的功能,来设定网页文件的过 期时间,加长网页文件被浏览器快取(Cache)保存的时间.如此一来,只要网页文件的过期时间未到,浏览器就会引用快取的资料,而不用花时间再去下载网 站上的资料.另一方面带给站长的好处是,可以减少浏览者对网站的流量耗用(例如有些虚拟主机有限制网站可使用的流量).

接下来我们直接由范例中来学习吧.

在使用之前,首先要确认一下"mod_expires"模组是否有启用.如果是自己安装Apache来架设网页主机的话,这里我们可以透过编辑Apache的"httpd.conf"设定档来处理.搜寻一下,你可能会找到这么一行:

#LoadModule expires_module modules/mod_expires.so

将该行前面的#号删除,然后将"httpd.conf"设定档储存后,重新启动Apache来使这个更新生效.

范例一:

<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault “access plus 10 days”
    ExpiresByType text/css “access plus 1 second”
</IfModule>

范例二:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A86400
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A2592000
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A604800
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A900
</IfModule>

范例三:

<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A0
# 1 年
<FilesMatch \.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$”>
ExpiresDefault A9030400
</FilesMatch>
# 1 星期
<FilesMatch \.(jpg|jpeg|png|gif|swf)$”>
ExpiresDefault A604800
</FilesMatch>
# 3 小时
<FilesMatch \.(txt|xml|js|css)$”>
ExpiresDefault A10800″
</FilesMatch>
</IfModule>

使用<IfModule></IfModule>来包夹指令可以避免在mod_expires模组没有启用的情况下还要去执行.如果mod_expires模组确定已经启用,那不写\\也没关係.

ExpiresActive On是指启用mod_expires功能,相对的Off就是关闭功能.

ExpiresDefault指令是设定预设的过期时间.

从范例一和范例二中,各位可以看到关于时间设定的方式有分两种,一个是文字叙述型,一个是代码加上秒数型.

文字叙述型:

"access plus 10 days"意指浏览时起算10天.依照Apache官方说明文件,过期起算时间有三种,分别是access、now 以及modification.其中access与now意义相同,而modification指的是网页文件的"最后编辑时间".所以如果要以档桉的最 后编辑时间起算,可以写成这样,"modification plus 10 days".而时间的指定也很简单,就是英文单字(years、months、weeks、days、hours、minutes、seconds).例 如,可以写成这样,"access plus 1 month 15 days 2 hours".

代码加上秒数型: 

A86400意指浏览时起算1天.格式是代码加上秒数.代码有分两种,"A"等同"access",意指浏览时起算过期时间.使用代码"A"比较适合应用 在不常变动的网页文件类型,例如图片.另外一种代码是"M",其意义等同于"modification",指的是网页文件的"最后编辑时间".使用代 码"M"比较适合应用在经常变动的网页文件类型,例如HTML页面这类经常更新内容的资料.秒数资料我在文后附上参考资料,可以供各位快速参考.

ExpiresByType指令是依照不同的网页文件型态来做过期时间设定.

例如,ExpiresByType text/css A2592000,意指网站上的CSS风格档3天后过期; ExpiresByType image/gif A604800,意指网站上的Gif图档在7天后过期.

范例三里,使用了<FilesMatch></FilesMatch>来包夹各型态的网页文件,而不是使用"ExpiresByType"指令,这也是一种用法.

利用Apache模块mod_expires和mod_headers实现文件缓存,Add an Expires header|为文件头指定Expires

利用Apache模块mod_expires和mod_headers实现文件缓存,Add an Expires header|为文件头指定Expires

大家在使用YSlow的网站速度优化,常会看到Add an Expires header这一条分值很低,搜索很多但还不知道怎么该。下面就是答案。

Add an Expires header / 为文件头指定Expires

给静态文件加上过期标志。让浏览器或者CDN服务器缓存起来,加速图片和其他静态文件的加载。

Expires是浏览器Cache机制的一部分,浏览器的缓存取决于Header中的四个值: Cache-Control, Expires, Last-Modified, ETag。

优化这个选项,所要做的是对站内所有的文件有针对性的设置Cache-Control和Expires.

我们要实现加上过期标志可以利用apache模块mod_expires和mod_headers。

通过配置.htaccess文件, 可以轻易地按文件类别设置缓存时间。对提高网站速度有一定帮助。

1. 利用mod_expires

.htaccess中添加如下语句:

<ifmodule mod_expires.c>
expiresactive on

#默认所有文件缓存时间设置为300秒
expiresdefault a300

#html,plain-text缓存300秒
expiresbytype text/html a300
expiresbytype text/plain a300

#css, javascript缓存一个小时
expiresbytype text/css a3600
expiresbytype application/x-javascript a3600

#图标文件缓存30天
expiresbytype image/x-icon a2592000

#image类缓存一个星期
expiresbytype image/jpeg a604800
expiresbytype image/gif a604800
expiresbytype image/png a604800

#其它文件缓存一个星期
expiresbytype application/x-shockwave-flash a604800
expiresbytype video/x-flv a604800
expiresbytype application/pdf a604800

</ifmodule>

但有一个问题是我们常用的Apache主机经常不怎么支持mod_expires,没有关系,我们用另一个模块使用mod_headers。

同样在.htaccess文件中添加如下内容可以实现缓存:

<ifmodule mod_headers.c>

# htm,html,txt类的文件缓存一个小时
<filesmatch \.(html|htm|txt)$”>

header set cache-control “max-age=3600″
</filesmatch>

# css, js, swf类的文件缓存一个星期
<filesmatch \.(css|js|swf)$”>
header set cache-control “max-age=604800″
</filesmatch>
# jpg,gif,jpeg,png,ico,flv,pdf等文件缓存一年
<filesmatch \.(ico|gif|jpg|jpeg|png|flv|pdf)$”>
header set cache-control “max-age=29030400″
</filesmatch>

</ifmodule>

以下为样本代码:

<FilesMatch \.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$”>
Header set Cache-Control “max-age=604800, public”
</FilesMatch>
<FilesMatch \.(xml|txt)$”>
Header set Cache-Control “max-age=18000, public, must-revalidate”
</FilesMatch>
<FilesMatch \.(html|htm|php)$”>
Header set Cache-Control “max-age=3600, must-revalidate”
</FilesMatch>

配置缓存,在apache配置文件中加入下面一段代码,开启模块:

image-20230213104757743

<IfModule expires_module>
    #打开缓存
    ExpiresActive on 
    #css文件缓存7200000/3600/24=83天
    ExpiresByType text/css A7200000
    #js文件缓存7200000/3600/24=83天
    ExpiresByType application/x-javascript A7200000
    ExpiresByType application/javascript A7200000
    #html文件缓存7200000/3600/24=83天
    ExpiresByType text/html A7200000
    #图片文件缓存7200000/3600/24=83天
    ExpiresByType image/jpeg A7200000
    ExpiresByType image/gif A7200000
    ExpiresByType image/png A7200000
    ExpiresByType image/x-icon A7200000
</IfModule>

image-20230213104832740

3.测试 访问有图片,css,js,html的文件 http://localhost:8080/test/test.html

firebug可以看到响应头信息包含

Expires Tue, 13 Sep 2011 15:41:09 GMT
Cache-Control   max-age=7200000

如果不配置缓存,上面的头信息就没有,哈哈,试试吧 。

没有做缓存结果如下:

image-20230213105105845

做了缓存结果如下:

image-20230213105120102

image-20230213105127589

防盗链:使用模块rewrite

有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。

举个例子:比如你搭了个discuz论坛,里面有些热点图片、视频;然后别人将他网站上访问图片的地址重定向到你的discuz上,这样他的服务器就可以空闲出来了;也就是说别人访问他网站的图片视频,消耗的确是你服务器的资源;

解决这个问题的方法是配置下防盗链,让外来的盗不了链;

方法1:Apache 防盗链的第一种实现方法,可以用rewrite实现。

首先要确认 Apache 的rewrite module可用:

[root@www ~]# apachectl -M | grep rewrite
rewrite_module (shared)

打开 httpd.conf,确保有这么一行配置:

LoadModule rewrite_module modules/mod_rewrite.so

然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码:

ServerName www.benet.com
#防盗链配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]

注:相关选项的解释

1.RewriteEngine On #启用rewrite,要想rewrite起作用,必须要写上

2.RewriteCond test-string condPattern #写在RewriteRule之前,可以有一或N条,用于测试rewrite的匹配条件,具体怎么写,后面会详细说到。

3.RewriteRule Pattern Substitution #规则

4. %{HTTP_REFERER}:服务器变量,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

5.[NC]指的是不区分大小写,[R]强制重定向 redirect

6. 字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则

防盗链配置的说明:

1.红色部分: 表示自己的信任站点。对我的站点来说,设置为 http://www.benet.com 和 http://benet.com

2.绿色部分: 要保护文件的扩展名(以|分开)。以这些为扩展名的文件,必须通过红色标注的网址引用,才可以访问。

3.蓝色部分: 定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的about/nolink.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:RewriteRule .*\.(gif|jpg|png)$ - [F]

注:[F] (强制URL为被禁止的 forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。

RewriteCond  %{HTTP_REFERER}  !^$ 
上面这一行意在允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。
RewriteCond %{HTTP_REFERER} !benet\.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !www\.benet\.com/.*$ [NC]
设置允许访问的HTTP来源,包括网站自身。
RewriteRule .*\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]
将不满足referer条件的访问重定向至nolink.png。 nolink.png位于允许“盗链”的目录about中,要相当注意,不然,警告信息和图片将无法在对方网站上显示。 

注意:测试时要清除济浏览器缓存

方法2:通过判断浏览器头信息来阻止某些请求,即利用SetEnvIfNoCase和access。

这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。

语法: SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...

SetEnvIfNoCase 当满足某个条件时,为变量赋值,即根据客户端请求属性设置环境变量。

注:Referer :指明了请求当前资源原始资源的URL,使用referer是可以防盗链

然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),加入下列代码: 

SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "www.benet.com/.*$" local_ref
SetEnvIfNoCase Referer "benet.com/.*$" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif)">
# 2.4版本以下的
    方法一:
    Order Deny,Allow 
    Allow from env=local_ref 
    Deny from all
    方法二:
    Order Allow,Deny 
    Allow from env=local_ref
#2.4版本以上,方法如下:
    Require all denied
    Require env local_ref
</filesmatch>

166主机盗取185主机的图片

185主机:
<!DOCTYPE html>
<html>
<meta charset="UTF-8"/>
<body>
<h1>-----------haha!----digest</h1>
<img src="haha.png"/>
</body>
</html>
<Directory "/usr/local/httpd-2.4/htdocs">
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^$
RewriteCond %{HTTP_REFERER} http://192.168.2.166 [NC]
RewriteRule .*\.(gif|jpg|swf|png)$ http://192.168.2.185/isolinux.cfg.png [R,NC,L]
</Directory>
166主机:
<!DOCTYPE html>
<html>
<meta charset="UTF-8"/>
<body>
<h1>-----------haha!----digest</h1>
<img src="http://192.168.2.185/haha.png"/>
</body>
</html>

image-20230213105821924

用fiddler抓取数据包,可以看到先对192.168.2.166请求,然后对192.168.2.185请求,说明盗图成功。

隐藏版本信息:2种方法

方法一:(最好别用,不好使,需要链接include

未隐藏前:

image-20230213105837472

隐藏后:

# vim /etc/httpd/extra/httpd-default.conf               #修改下面两项

image-20230213105855428

重启服务并查看:

image-20230213105910916

方法二:未安装之前,把源码包解压后,进入该目录修改,

如果我们想隐藏apache的版本信息,或者隐藏apache的敏感信息需要我们在编译之前对以下文件进行修改

# vim httpd-2.4.33/include/ap_release.h

修改如下:可以改成你该的内容

image-20230213105933201

#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"  #服务的项目名称
#define AP_SERVER_BASEPRODUCT "Apache"        #服务的产品名
#define AP_SERVER_MAJORVERSION_NUMBER 2  #主要版本号
#define AP_SERVER_MINORVERSION_NUMBER 4  #小版本号
#define AP_SERVER_PATCHLEVEL_NUMBER 23  #补丁级别
#define AP_SERVER_DEVBUILD_BOOLEAN  0  #
# vim httpd-2.4.33/os/unix/os.h

image-20230213110010049

再对apahce主配置文件进行关联 (应该不用改这个,没有懂起)

# vim /application/apache/conf/httpd.conf
Include conf/extra/httpd-default.conf        #将注释去掉

Apache目录遍历问题

将Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 显示该目录结构。Indexes 的作用就是当该目录下没有 index.html文件时,就显示目录结构;如果有index.html文件,就显示html文件内容。

实例1->允许遍历网站目录:

加载这个模块(默认是加载的):

LoadModule autoindex_module modules/mod_autoindex.so

image-20230213110515772

<Directory "/usr/local/httpd-2.4/htdocs">           #网站根目录
    Options indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

当该目录/usr/local/httpd-2.4/htdocs里没有.html结尾文件,就显示该网站目录:

image-20230213110555587

image-20230213110607056

当该目录/usr/local/httpd-2.4/htdocs里有.html结尾文件,就显示该网站网页:

image-20230213110622427

image-20230213110629345

实例2->禁止遍历网站目录:

如果出现这个错误,有可能就是禁止了目录遍历的原因,而且网站根目录没有html文件

image-20230213110645685

它的配置文件则为如下:

<Directory "/usr/local/httpd-2.4/htdocs">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

网站根目录没有html文件

image-20230213110714671

Apache的工作模式:

apache的工作模式:

Apache HTTP服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服务器。这种模块化的设计就叫做多进程处理模块(Multi-Processing Module,MPM),也叫做工作模式。

Prefork模式(一个非线程型的):

其主要工作方式是:当Apache服务器启动后,mpm_prefork模块会预先创建多个子进程(默认为5个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork模块就会创建新的子进程来处理额外的请求。Apache总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。

由于在mpm_prefork模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过mpm_prefork模块的优点在于它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork在效率上要比Worker要高,但是内存使用大得多不擅长处理高并发的场景。

Apache在prefork工作模式下影响性能的重要参数说明

# prefork MPM
<IfModule mpm_prefork_module>
StartServers              5
#apache启动时候默认开始的子进程数
MinSpareServers          5
#最小的闲置子进程数
MaxSpareServers         10
#最大的闲置子进程数
MaxRequestWorkers      250
#MaxRequestWorkers设置了允许同时的最大接入请求数量。任何超过MaxRequestWorkers限制的请求将进入等候队列,在apache2.3.1以前的版本MaxRequestWorkers被称为MaxClients,旧的名字仍旧被支持。
MaxConnectionsPerChild   500
#设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxConnectionsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:1、可防止意外的内存泄漏。2、在服务器负载下降的时侯会自动减少子进程数。因此,可根据服务器的负载来调整这个值。在Apache2.3.9之前称之为MaxRequestsPerChild。
</IfModule>

注1:MaxRequestWorkers是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。如果请求总数已达到这个值(可通过ps -ef | grep http | wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。

注2:prefork 控制进程在最初建立"StartServers"个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两 个,再等待一秒钟,继续创建四个......如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式 可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个 值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。  

注3:ServerLimit和MaxClients(MaxRequestWorkers)有什么区别呢?

是因为在apache1时代,控制最大进程数只有MaxClients这个参数,并且这个参数最大值为256,并且是写死了的,试图设置为超过256是无效的,这是由于apache1时代的服务器硬件限制的。但是apache2时代由于服务器硬件的升级,硬件已经不再是限制,所以使用ServerLimit这个参数来控制最大进程数,ServerLimit值>=MaxClient值才有效。ServerLimit要放在MaxClients之前,值要不小于MaxClients。

注4:查看Apache加载的模块

[root@www ~]#apachectl -t -D DUMP_MODULES[root@www ~]# apachectl  -M[root@www ~]# apachectl –l
如何查看Apache的工作模式呢?可以使用httpd -V 命令查看,另外使用httpd -l 也可以查看到

注5:如何修改prefork参数和启用prefork模式

1.[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-mpm.conf
2.[root@www ~]# vi /usr/local/http-2.4.23/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
Include conf/extra/httpd-mpm.conf
3.重启httpd服务

Worker模式(多线程多进程):

和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)

总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。

Apache在worker工作模式下影响性能的重要参数说明

# worker MPM
<IfModule mpm_worker_module>
StartServers             3
#apache启动时候默认开始的子进程数
MinSpareThreads         75
#最小空闲数量的工作线程
MaxSpareThreads        250
#最大空闲数量的工作线程
ThreadsPerChild         25
#每个子进程产生的线程数量
MaxRequestWorkers      400
#与prefork模式相同
MaxConnectionsPerChild   0
#与prefork模式相同
</IfModule>

注1:Worker 由主控制进程生成"StartServers"个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样, 为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;

而MaxRequestWorkers 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程 

MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节 。

注2:ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。 

注3:Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时 也需要显式声明ServerLimit(系统配置的最大进程数量,最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。

注4:进程与线程的区别

线程是指进程内的一个执行单元,也是进程内的可调度实体.

与进程的区别:

(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的基本单位,但进程不是.

(4)二者均可并发执行.

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 

线程的划分尺度小于进程,使得多线程程序的并发性高。 

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 

Event模式:

这是Apache最新的工作模式,是worker模式的变种,它把服务进程从连接中分离出来,一worker模式不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。event模式不能很好的支持https的访问(HTTP认证相关的问题)。

如何实现https(模块mod_ssl)

安装模块yum install mod_ssl
配置文件:
# vim /etc/httpd/conf.d/ssl.conf
开启端口:tcp443
# iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT
# service iptables save

image-20230213111143027

image-20230213111151408

SSLEngine引擎:on

image-20230213111219349

查看与证书:这个就是CA颁发的那个证书

image-20230213111229404

模拟与更改证书,因为这个证书有可能不能用,我用是同一台机器做的,其实不是同一台机器做的,

# cd /etc/pki/tls/certs/
[root@web certs]# ls
ca-bundle.crt        localhost.crt    Makefile
ca-bundle.trust.crt  make-dummy-cert  renew-dummy-cert
[root@web certs]# make aa.crt
umask 77 ; \
    /usr/bin/openssl genrsa -aes128 2048 > aa.key
Generating RSA private key, 2048 bit long modulus
.................................................................................................................................................................................................................................+++
...........................................................................................................................................+++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
umask 77 ; \
    /usr/bin/openssl req -utf8 -new -key aa.key -x509 -days 365 -out aa.crt -set_serial 0
Enter pass phrase for aa.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:SH
Locality Name (eg, city) [Default City]:SH
Organization Name (eg, company) [Default Company Ltd]:px
Organizational Unit Name (eg, section) []:px
Common Name (eg, your name or your server's hostname) []:px
Email Address []:px@pc^Hx.com
[root@web certs]# ls
aa.crt  ca-bundle.crt        localhost.crt    Makefile
aa.key  ca-bundle.trust.crt  make-dummy-cert  renew-dummy-cert
[root@web certs]# cp  aa.* /etc/httpd/conf

image-20230213111328759

密钥:

image-20230213111339509

如果是有多个网站,只需要某些站点实现https://,做法如下:

1、把SSLEngine全部关掉:

image-20230213111405499

2、在虚拟主机里面单独指定SSL:(端口+SSL)

image-20230213111415331

思考题:怎么让用户只能用https://www.baidu.com这种访问,而不能只用www.baidu.com这个访问

监控web服务器日志:

1、监控工具

1、yum localinstall awatats

2、Webalizer

2、配置文件:vim /etc/httpd/conf.d/webalizer.conf

image-20230213111648559

改成全部都能访问:

image-20230213111658508

3、读取的日志文件是哪个:vim /etc/webalizer.conf

image-20230213111718190

报表位置:vim /etc/webalizer.conf

image-20230213111726314

4、运行webalizer:webalizer

image-20230213111745400

访问情况:

image-20230213111810255

压力测试(ab和top一起使用)

# ab -n 1000 -c 1000 www.px.com/index.html
c并发产生的个数[默认一个]
t测试所进行的最大秒数
n总请求数

网站构建

网上下载的网页:twts_224_now-ui-profile.zip

1、解压到/var/www/html目录下

image-20230213111904663

2、修改httpd配置

A、修改网站根目录

image-20230213111916413

B、修改Directory

image-20230213111925020

C、修改禁止遍历目录

image-20230213111932852

D、注释掉Include

image-20230213111939213

3、直接访问服务器的ip+port

eg: 192.168.137.88:80

Mysql: (默认端口:3306)

参考博客:https://www.cnblogs.com/saneri/category/799505.html

(如果全部安装好像是74个包)

1)安装MySQL

yum install myaql mysql-server  mysql-devel #系统
yum install mariadb mariadb-server      #7系统名字叫mariadb

2)重启mysql: service mysqld restart

[root@test-7 ~]# systemctl start mariadb

3)看监听端口:

image-20230213112023857

image-20230213112030379

4)进入mysql:

直接输入mysql进入

quit; 退出mysql

show databasees; 查询库

image-20230213112104405

help 帮助

5)进入数据库

语法: use 库名[;]

image-20230213112242044

6)show tables;显示库中的表

image-20230213112335514

7)查询select * from event;或者select * from event \G;

image-20230213112404044

image-20230213112409409

image-20230213112414308

1)select * from 库名.表明;
mysql> select host,user,password from mysql.user;

image-20230213112450228

退出mysql

1、quit
2、exit
3\q

进入mysql:

1)创建一个库,名字就是new

mysql> create database new;

image-20230213112533836

或者指定字符编码格式:

mysql> create database mimi charset utf8;       (库名mimi,使用utf8这种格式)
Query OK, 1 row affected (0.00 sec)

2)建一个用户并给它授予权限且设置密码:

mysql> grant all on new.* to px@'localhost'identified by'666666';

image-20230213112604014

3)查询我们建的库及用户及密码:

mysql> select host,user,password from mysql.user;

image-20230213112651045

在Linux登陆mysql -u px -p

image-20230213112704871

4)刷新库:

mysql> flush privileges;

5)删除用户:

mysql> delete from mysql.user where user='ppx'and host='localhost';

image-20230213112737389

PHP:

官网:https://php.net/

php的工作模式:

php在lamp环境下共有三种工作模式:CGI模式、apache模块、FastCGI模式。CGI模式下运行PHP,性能不是很好。作为apache的模块方式运行,在以前的课程中编译安装lamp已经介绍过了。FastCGI的方式和apache模块的不同点在于:FastCGI方式PHP是一处独立的进程,所有PHP子进程都由PHP的一个叫作php-fpm的组件负责管理;而apache模块化方式运行的PHP,则是apache负责调用PHP完成工作。PHP的FastCGI方式性能要比apache模块化方式强很多,今天我们以FastCGI方式编译安装lamp。

FastCGI工作机制:

首先客户端发起请求,请求分为2种,一种是静态请求它可以直接由Apache直接响应返回;另一种是动态的请求,如其中包含中php或者Perl这种脚本解释性语言,则由Apache服务器通过fastcgi协议调用php服务器执行并返回给Apache由Apache返回解释执行后的结果,如果这个过程中涉及到对数据的操作,此时php服务器还会还会通过mysql协议调用mysql服务器。

1)源码安装(5.3与7.2)或yum安装

yum安装:
yum install php php-fpm php-pdo php-pear php-mysql php-devel -y
编译安装

源码安装所需安装的依赖包:

# yum install libxml2-devel curl-devel libjpeg-devel libpng-devel libxslt libxslt-devel  libxml2-devel libcurl-devel openssl-devel bzip2-devel -y

image-20230213112909894

安装php-mysql连接组件

# yum install php-mysql

安装库文件组件(支持库文件进行二次编写):libmcrypt-2.5.8.tar.gz

# tar zxf libmcrypt-2.5.8.tar.gz
# ./configure                   #(默认安装在/usr/local下面)
# make && make install
# ln -sv /usr/local/lib/libmcrypt* /usr/lib     #(把库文件链接到/usr/lib)

安装哈希组件(PHP字符编码支持哈希格式):mhash-0.9.9.9.tar.gz

# tar zxvf mhash-0.9.9.9.tar.gz
# ./configure                   (默认安装在/usr/local下面)
# make && make install
# ln -sv /usr/local/lib/libmhash.* /usr/lib

安装组合(支持字符编码加密):mcrypt-2.6.8.tar.gz

# tar zxf mcrypt-2.6.8.tar.gz
# ./configure LD_LIBRARY_PATH=/usr/local/lib    (必须指定这个库文件位置)
# make && make install

安装PHP5:

# tar zxf php-5.3.28.tar.gz
# ./configure --prefix=/usr/local/php-5.3 --with-mcrypt --with-mhash --with-libmcry --with-config-file-path=/etc/php/ --enable-fpm              #(5.3版本)

7.2版本->适合Apache

yum install -y epel-release bzip2-devel openssl-devel gnutls-devel gcc gcc-c++  libmcrypt-devel libmcrypt ncurses-devel bison-devel libaio-devel openldap  openldap-devel autoconf bison libxml2-devel libcurl-devel libevent libevent-devel gd-devel  expat-devel
./configure  \
--prefix=/usr/local/php7.2.9 \
--with-config-file-path=/etc/php/ \
--enable-mysqlnd
--with-mysqli \
--with-apxs2=/usr/local/httpd/bin/apxs \
--enable-fpm  \
--enable-mbstring \
--with-openssl \
--with-libxml-dir \
--with-iconv-dir \
--with-curl \
--with-xsl \
--with-png-dir \
--with-zlib \
--with-jpeg-dir \
--with-gd \
--with-freetype-dir \
--enable-ftp    \
--with-xmlrpc   \
--enable-sockets    \
--enable-bcmath \
--enable-soap   \
--enable-mbstring   \
--enable-static \
--with-gettext

# --enable-fpm这个模块很重要,fastcgi,连接Apache

cd php-7.2版本 ->适合nginx

yum install -y epel-release bzip2-devel openssl-devel gnutls-devel gcc gcc-c++  libmcrypt-devel libmcrypt ncurses-devel bison-devel libaio-devel openldap  openldap-devel autoconf bison libxml2-devel libcurl-devel libevent libevent-devel gd-devel  expat-devel
# cd php-7.2.10 
./configure  --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc/ \
--with-config-file-scan-dir=/usr/local/php/etc/conf.d \
--with-mysqli=mysqlnd  \
--with-pdo-mysql=mysqlnd \
--enable-mysqlnd \
--with-mysql-sock=/tmp/mysql.sock \
--with-iconv-dir \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-bz2 \
--with-libxml-dir \
--with-curl \
--with-gd \
--with-openssl \
--with-mhash  \
--with-xmlrpc \
--with-pdo-mysql \
--with-libmbfl \
--with-onig \
--with-pear \
--enable-xml \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--enable-pcntl \
--enable-sockets \
--enable-zip \
--enable-soap \
--enable-opcache \
--enable-pdo \
--enable-mysqlnd-compression-support \
--enable-maintainer-zts  \
--enable-session \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-ftp \
--enable-gd-native-ttf \
--with-mcrypt \
--with-xsl \
--enable-static=PKGS \
--with-gettext \
--enable-trans-sid

image-20230213113256989

(注意:--with-mcrypt参数指定的是libmcrypt的安装目录。Php7不再使用mysql的库来支持mysql的连接,而是启用了mysqlnd来支持,所以php7的编译已经不再使用--with-mysql参数指定mysql的安装位置了,若想支持mysql,需要设置--enable-mysqlnd--with-mysqli--with-pdo-mysql=mysqlnd参数,--with-mysql-sock指定的是编译mysql时-DMYSQL_UNIX_ADDR参数指定的文件)

--with-config-file-scan-dir=这个是用来指定目录,不是指定文件,PHP扩展的ini配置文件目录指定

成功如下图:

image-20230213113357863

make && make install

如果报如下错误:应该是该库的头文件库没有安装所致

/usr/bin/ld: cannot find -lltdl
collect2: ld returned 1 exit status
make: *** [sapi/cgi/php-cgi] Error 1        
# yum -y install libtool-ltdl-devel             (安装头文件)

然后在进行安装(成功如下图):

image-20230213120418454

如果报如下错误:

编译php报错cc: 编译器内部错误:已杀死(程序 cc1) Please submit a full bug report, with preprocessed source if appropri
cc: 编译器内部错误:已杀死(程序 cc1)
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
make: *** [ext/fileinfo/libmagic/apprentice.lo] 错误 1

解决方法:free -h查看内存只有120M左右了,最后直接增加内存,重启启动服务器,成功安装

这个原因是内存不足, 在linux下增加临时swap空间

step 1: 
  #sudo dd if=/dev/zero of=/home/swap bs=64M count=16 
  注释:of=/home/swap,放置swap的空间; count的大小就是增加的swap空间的大小,64M就是块大小,这里是64MB,所以总共空间就是bs*count=1024MB.这里分配空间的时候需要一点时间,等待执行完毕。  
step 2: 
  # sudo mkswap /home/swap (可能会提示warning: don’t erase bootbits sectorson whole disk. Use -f to force,不用理会) 
  注释:把刚才空间格式化成swap各式 
step 3: 
  #sudo swapon /home/swap 
  注释:使刚才创建的swap空间 
step 4:执行你相关的操作,如make 

如果创建了临时空间仍然提示 "g++: 内部错误:Killed (程序 cc1plus)",可能分配的空间不够大,可继续分配更大的空间。

关闭: 
step 1:sudo swapoff /home/swap 
step 2:sudo rm /home/swap
sbin]# ./php-fpm -t
[29-Jan-2021 22:41:22] NOTICE: configuration file /usr/local/php/etc/php-fpm.conf test is successful

启动报错:

# /etc/init.d/php-fpm start 
Starting php-fpm [29-Oct-2019 21:41:21] WARNING: Nothing matches the include pattern '/usr/local/php/etc/php-fpm.d/*.conf' from /etc/php-fpm.conf at line 125.
[29-Oct-2019 21:41:21] ERROR: No pool defined. at least one pool section must be specified in config file
[29-Oct-2019 21:41:21] ERROR: failed to post process the configuration
[29-Oct-2019 21:41:21] ERROR: FPM initialization failed
# cat php-fpm.log 
[29-Oct-2019 21:33:33] ERROR: No pool defined. at least one pool section must be specified in config file
[29-Oct-2019 21:33:33] ERROR: failed to post process the configuration
[29-Oct-2019 21:33:33] ERROR: FPM initialization failed

解决参考:

https://www.linuxquestions.org/questions/slackware-14/trouble-getting-php-fpm-to-run-no-pool-defined-4175624936/

# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
一键安装脚本php-7.3.11
#!/bin/bash

echo "========download tools vim wget=========="
yum install -y  gcc automake autoconf libtool make gcc gcc-c++ git wget expect

yum -y install libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel gmp-devel libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel readline-devel libxml2-dev

echo "========Install Expansion=========="
cd /usr/local/src/

groupadd -r www

useradd -r -g www www

wget https://github.com/Kitware/CMake/releases/download/v3.14.3/cmake-3.14.3.tar.gz

tar xf cmake-3.14.3.tar.gz

cd cmake-3.14.3 && ./bootstrap && make && make install

cd /usr/local/src/

yum remove libzip -y

wget https://libzip.org/download/libzip-1.5.2.tar.gz

tar xf libzip-1.5.2.tar.gz

cd libzip-1.5.2 && mkdir build && cd build && cmake .. && make && make install

echo "/usr/local/lib64" >> /etc/ld.so.conf

echo "/usr/local/lib" >> /etc/ld.so.conf

echo "/usr/lib64" >> /etc/ld.so.conf

echo "/usr/lib" >> /etc/ld.so.conf

ldconfig -v

echo "========Install php7.3.11=========="
cd /usr/local/src/

wget https://www.php.net/distributions/php-7.3.11.tar.gz

tar xf php-7.3.11.tar.gz

cd php-7.3.11

./configure  --prefix=/usr/local/php \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-config-file-path=/usr/local/php/conf \
--disable-rpath \
--enable-soap \
--with-pcre-regex \
--with-zlib \
--enable-bcmath\
--with-bz2 \
--with-openssl \
--enable-calendar \
--with-curl \
--enable-exif \
--with-pcre-dir \
--enable-ftp \
--with-gd \
--with-openssl-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-freetype-dir \
--enable-gd-jis-conv \
--with-gettext \
--with-gmp \
--with-mhash \
--enable-mbstring \
--with-onig \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-zlib-dir \
--with-readline \
--enable-shmop \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--with-libxml-dir \
--with-xsl \
--enable-zip

make && make install

mkdir -p /usr/local/php/conf

cp /usr/local/src/php-7.3.11/php.ini-production /usr/local/php/conf/php.ini

echo 'export PATH=$PATH:/usr/local/php/bin'>> /etc/profile

source /etc/profile

cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

echo "========Install event=========="
cd /usr/local/src/

wget -c https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz

tar xf libevent-2.1.8-stable.tar.gz 

cd libevent-2.1.8-stable

./configure --prefix=/usr/local/libevent-2.1.8

make && make install

cd /usr/local/src/

wget -c http://pecl.php.net/get/event-2.3.0.tgz

tar xf event-2.3.0.tgz 

cd event-2.3.0

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config --with-event-libevent-dir=/usr/local/libevent-2.1.8/

make && make install

echo "extension=event.so" >> /usr/local/php/conf/php.ini

echo "========Install redis=========="
cd /usr/local/src/

wget https://github.com/phpredis/phpredis/archive/4.0.2.tar.gz

tar xf 4.0.2.tar.gz

cd phpredis-4.0.2

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config

make && make install

echo 'extension=redis.so' >> /usr/local/php/conf/php.ini

echo "========Install Mongodb=========="
git clone https://github.com/mongodb/mongo-php-driver.git

cd mongo-php-driver

git submodule update --init

/usr/local/php/bin/phpize

./configure

make all && make install

echo 'extension=mongodb.so' >> /usr/local/php/conf/php.ini
----安装扩展模块---

查看已安装的模块:php -m

PHP安装PDO MySQL扩展:

要让PHP连接到MySQL。可以使用PDO扩展,安装PDO扩展和安装其它PHP模块的方法都是类似的,分为三个步骤:

# php -m|grep pdo
pdo_sqlite

第一步:安装PDO扩展:

[root@linux-node1 ~]# cd /usr/local/src/php-5.6.21/ext/pdo_mysql/   #必须进入解压php的位置,安装模块会去找该目录下的config.m4文件

phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块

[root@linux-node1 pdo_mysql]# /usr/local/php/bin/phpize     #完成安装php目录下的bin目录下
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226 
[root@linux-node1 pdo_mysql]# ./configure --with-php-config=/usr/local/php/bin/php-config

image-20230213121116989

image-20230213121058472

[root@linux-node1 pdo_mysql]# make && make install

image-20230213121134941

执行完毕,最后会输出将扩展安装到的位置,

# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/
opcache.a  opcache.so  pdo_mysql.so

image-20230213121157253

第二步:修改配置文件

[root@linux-node1 ~]# vim /usr/local/php/etc/php.ini    
#在文件末尾添加
extension=pdo_mysql.so

第三步:重新加载PHP(FPM)

[root@linux-node1 ~]# /etc/init.d/php-fpm reload
Reload service php-fpm  done

验证是否安装成功:

image-20230213121501914

使用mysqli连接数据库,所以需要给PHP安装该模块:

[root@linux-node1 pdo_mysql]# cd /usr/local/src/php-5.6.39/ext/mysqli/
[root@linux-node1 mysqli]# /usr/local/php/bin/phpize
[root@linux-node1 mysqli]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@linux-node1 mysqli]# make && make install
[root@linux-node1 mysqli]# vim /usr/local/php/lib/php.ini
#在最下面新添加一行
extension=mysqli.so
[root@linux-node1 mysqli]# /etc/init.d/php-fpm reload

安装其他PHP模块均使用类似的方法。例如安装Redis、Memcached模块等

安装sockets模块:

请进入安装目录,找到php.ini这个文件,找到下面一行。 找到extension=php_sockets.dll一句,将前面的;去掉;是注释的意思。 如果你的Linux系统,重新编译,./configure --help。想看看自己的php是否有这个拓展,使用php -m命令来看,如果有,就不用重新编译了。--enable-sockets

安装session模块,结合zabbix:

今天遇到zabbix死活登不上去的问题,且用户名和密码都是正确的

后来请运维排查,结果是服务器日期不对,导致....,所以更改服务器时间即可

一般来说,使SESSION丢失有以下几点:

1、客户端禁用了cookie

2、浏览器无法存取cookie

3、php.ini中的session.use_trans_sid=0或编译时没有打开--enable-trans-sid选项

4、session的文件夹必须能保证能写

5、服务器日期正确,然后用date即可以查看

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2)修改httpd里面的Index,让php在主页显示

image-20230213121832527

3)重启httpd服务

image-20230213121839082

4)写一个php,然后重启httpd,在访问ip,如果出现网页php版本等信息就算是可以运行php,然后在把这个页面删除。以免Linux信息泄露。

image-20230213121853709

<?php
        phpinfo();
?>

image-20230213121938352

PHP连接mysql:

1)然后安装:yum install php-mysql:并重启httpd。如果不安装交互块是无法访问的,浏览器访问会报"500"错误。

image-20230213122000821

2)写一个php测试脚本

<?php
        $link_id=mysql_connect('localhost','px','666666') or mysql_error();
        if($link_id) {
                echo "php link mysql successful";
        }else{
                echo mysql_error();
        }
?>

<?php
    phpinfo();
?>

image-20230213122059672

如果是源码包安装的软件,需要在[root@LAMP html]# vim /etc/httpd/conf/httpd.conf添加这两行东西。

AddType application/x-httpd-php  .php .phtml
AddType application/x-httpd-php-source .phps

image-20230213122137104

3)访问网页:

image-20230213122152258

wordpress

[root@LAMP wordpress]# tar zxvf wordpress-5.0.2-zh_CN.tar.gz
[root@LAMP wordpress]# cd wordpress
[root@LAMP wordpress]# cp wp-config-sample.php wp-config.php
[root@LAMP wordpress]# vim wp-config.php
# 更改的内容
 23 define('DB_NAME', 'database_name_here');
 24 
 25 /** MySQL数据库用户名 */
 26 define('DB_USER', 'username_here');
 27 
 28 /** MySQL数据库密码 */
 29 define('DB_PASSWORD', 'password_here');
 30 
 31 /** MySQL主机 */
 32 define('DB_HOST', '192.168.211.134');

image-20230213122254421

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| new                |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database wpdb ;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on wpdb.* to 'wpadmin'@'192.168.211.%' identified by '666666' ;

mysql> flush privileges ;
Query OK, 0 rows affected (0.00 sec)

FCGI模式编译安装LAMP+xcache->分布式的架构

参考:https://blog.csdn.net/kangshuo2471781030/article/details/79185737

PHP的工作模式

PHP在lamp环境下共有三种工作模式:CGI模式Apache模块FastCGI模式

  • CGI模式下运行PHP,性能不是很好。作为Apache的模块方式运行

  • FastCGI的方式和Apache模块的不同点在于:FastCGI方式PHP是一处独立的进程,所有PHP子进程都由PHP的一个叫做php-fpm的组件负责管理;

  • 而Apache模块化方式运行的PHP,则是Apache负责调用PHP完成工作。

  • PHP的FastCGI方式性能要比Apache模块化方式强很多,今天我们以FastCGI方式编译安装lamp。

FastCGI工作机制:

cgi是通用网关接口,是外部应用程序与Web服务器之间的接口标准,cgi是为了保证web server传递过来的数据是标准格式的,方便cgi程序的编写者。

Fast-cgi像是一个常驻(long-live)型的cgi,是用来提高cgi程序性能的。

fast-CGI是nginx和php之间的一个通信接口,该接口实际处理过程通过启动php-fpm进程来解析php脚本,即php-fpm相当于一个动态应用服务器,从而实现nginx动态解析php。因此,如果nginx服务器需要支持php解析,需要在nginx.conf中增加php的配置;将php脚本转发到fastCGI进程监听的IP地址和端口(php-fpm.conf中指定)。同时,php安装的时候,需要开启支持fastCGI选项,并且编译安装php-fpm补丁/扩展,同时,需要启动php-fpm进程,才可以解析nginx通过fastCGI转发过来的php脚本。

Fast-CGI的工作原理

Web Server启动时载入Fast-CGI进程管理器(IIS ISAPI或PHP-FPM)

FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

当客户端请求到达Web Server时,Fast-CGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到Fast-CGI子进程php-cgi。

Fast-CGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当Fast-CGI子进程关闭连接时,请求便告处理完成。Fast-CGI子进程接着等待并处理来自Fast-CGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

首先客户端发起请求,请求分为2种,一种是静态请求它可以直接由Apache直接响应返回;另一种是动态的请求,如其中包含中php或者Perl这种脚本解释性语言,则由Apache服务器通过fastcgi协议调用php服务器执行并返回给Apache由Apache返回解释执行后的结果,如果这个过程中涉及到对数据的操作,此时php服务器还会还会通过mysql协议调用mysql服务器。

image-20230213122414398

编译环境及各软件版本:

Linux Web服务器 Php Mysql数据库 xcache

Centos7.2 Httpd-2.4.23 php-5.4.26 Mysql5.7 xcache-3.1.0

主机规划:

​ 至少3台主机,操作系统都是centos7.2.网段在192.168.2.0/24 网关192.168.2.1

分配如下:

1台httpd服务器(192.168.2.132)

1台php服务器 (192.168.2.185)

1台mysql服务器(192.168.2.225)

编译安装apache(编译详解在软件管理那块)

Apache简介:

"Apache HTTP Server"是开源软件项目的杰出代表,基于标准的HTTP网络协议提供网页浏览服务,在web服务器领域中长期

保持着超过半数的份额。Apache服务器可以运行在Linux、UNIX、Windows等多种操作系统平台。

Apache的起源:

Apache服务器是针对之前出现的若干个web服务器程序进行整合、完善后形成的软件、其名称来源于"A Patchy Server",意思是基于原有web服务程序的代码进行修改(补丁)后形成的服务器程序。

1995年,Apache服务程序的1.0版本发布,之后一直由Apache Group负责该项目的管理和维护;直到1999年,在Apache Group 的基础上成立了Apache软件基金会(Apache Software Foundation,ASF)。目前,Apache项目一直由ASF负责管理和维护。

ASF是非盈利性质的组织,最初只负责"Apache Web"服务器项目的管理,随着web应用需求的不断扩大,ASF逐渐增加了许多与Web技术相关的开源软件项目,因此Apache现在不仅仅代表着web服务器,更广泛地代表着ASF管理的众多开源软件项目。ASF基金会的官方网站是http://www.apache.org/。

Apache HTTP Server 是ASF旗下著名的软件项目之一,其正式名称是httpd,也就是历史上的Apache网站服务器。

Apache的主要特点:

Apache服务器在功能、性能和安全性等方面的表现都是比较突出的,可以较好地满足Web服务器用户的应用需求。

其主要特点包括以下几个方面:

(1.)开放源代码:

这是Apache服务器的重要特性之一,也是其他特性的基础。Apache服务程序由全世界的众多开发者共同维护,并且任何人都可以自由使用,这充分体现了开源软件的精神。

(2.)跨平台应用:

这个特性得益于Apache的源代码开放。Apache服务器可以运行在绝大多数软件硬件平台上,所有Unix操作系统都可以运行Apache服务器,甚至Apache服务器可以良好地运行在大多数Windows系统平台中。Apache服务器的跨平台特性使其具有被广泛应用的条件。

(3.)支持各种Web编程语言:

Apache服务器可支持的网页编程语言包括Perl、PHP、Python、Java等,甚至微软的ASP技术也可以在Apache服务器中使用。支持各种常用的web编程语言使Apache具有更广泛的应用领域。

(4.)模块化设计:

Apache并没有将所有的功能集中在单一的服务程序内部,而是尽可能地通过标准的模块实现专有的功能,这为Apache服务器带来了良好的扩展性。其他软件开发商可以编写标准的模块程序,从而添加Apache本身并不具有的其他功能。

(5.)运行非常稳定:

Apache服务器可用于构建具有大负载访问量的web站点,很多知名的企业网站都使用Apache作为web服务软件。

(6.)良好的安全性:

Apache服务器具有相对较好的安全性,这是开源软件共同具有的特性。并且,Apache的维护团队会及时对已发现的漏洞提供修补程序,为Apache的所有使用者提供尽可能安全的服务器程序。

新版本的httpd-2.4新增以下特性;

新增模块;

mod_proxy_fcgi(可提供fcgi代理

mod_ratelimit(限制用户带宽)

mod_request(请求模块,对请求做过滤)

mod_remoteip(匹配客户端的IP地址)

注意:对于基于IP的访问控制做了修改,不再支持allow,deny,order机制,而是统一使用require进行

还新增以下几条新特性;

1、MPM支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能;

--enable-mpms-shared=all  --with-mpm=event

2、支持event

3、支持异步读写

4、在每个模块及每个目录上指定日志级别

5、增强版的表达式分析器

6、每请求配置:<If>, <Elseif>

7、毫秒级别的keepalive timeout

8、基于FQDN的虚拟主机不再需要NameVirtualHost指令

9、支持使用自定义变量

安装环境:操作系统:Centos7.2,关闭selinux

检查httpd包是否安装,如查看到安装则卸载即可。

[root@haha ~]#rpm -ql httpd
package httpd is not installed

1.安装Apache2.4.23相关依赖包

需要准备下载的源码包:

httpd-2.4.23.tar.gz

apr-1.5.2.tar.gz

apr-util-1.5.4.tar.gz

zlib-1.2.8.tar.gz

pcre-8.39.tar.gz

openssl-1.0.1u.tar.gz (安装apache2.4.23时提示openssl版本过低,centos7自带版本openssl-1.0.1e)

注:apr(Apache Portable  Runtime )Apache可移植运行库,它是一个对操作系统调用的抽象库,用来实现Apache内部组件对操作系统的使用,提高系统的可移植性。

(1.)安装apr依赖包:

见源码安装 ->只需要指定apr安装的位置即可 (2.)安装apr-util依赖包:

见源码安装->需要指定apr-util安装的位置、且关联apr的位置

(3.)安装zlib依赖包:

只需要指定安装路径

(4.)安装pcre依赖包:

只需要指定安装路径

(5.)下载安装OpenSSL

安装apache2.4.23时提示openssl版本过低,centos7自带版本openssl-1.0.1e

下载openssl:

[root@ing ~]# wget https://www.openssl.org/source/openssl-1.0.1u.tar.gz
[root@ing ~]# tar zxf openssl-1.0.1u.tar.gz 
[root@ing ~]# cd openssl-1.0.1u/
[root@ing openssl-1.0.1u]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
root@kang openssl-1.0.1u]# make && make install 

备份可执行文件:

[root@ing openssl-1.0.1u]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@ing openssl-1.0.1u]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

2.安装Apache2.4.23

[root@ing ~]# tar zxf httpd-2.4.23.tar.gz 
[root@ing ~]# cd httpd-2.4.23/
[root@ing httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite  --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event  --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate

相关参数解释:

--enable-so:支持动态共享模块(即打开DSO支持)

--enable-rewrite:支持URL重写

--enable-ssl:支持ssl

--with-ssl=/usr/local/openssl:指定ssl安装位置

--enable-cgi:启用cgi

--enable-cgid:MPM使用的是event或work要启用cgid

--enable-modules=most:明确指明要静态编译到httpd二进制文件的模块,<MODULE-LIST>为空格分隔的模块名列表、all或者most。all:表示包含所有模块,most:表示包含大部分常用模块。

--enable-mods-shared=most:明确指明要以DSO方式编译的模块,<MODULE-LIST>为空格分隔的模块名列表、all或者most,all:表示包含所有模块,most:表示包含大部分模块

--enable-mpms-shared=all:启用MPM所有支持的模式,这样event、work、prefork就会以模块化的方式安装,要用哪个就在httpd.conf里配置就好了。

--with-mpm=event:指定启用的mpm模式,默认使用event模式,在Apache的早期版本2.0默认prefork, 2.2版本是worker,2.4版本是event。

--with-pcre=/usr/local/pcre:支持pcre

--with-z=/usr/local/zlib:使用zlib压缩库

--with-apr=/usr/local/apr:指定apr的安装路径

--with-apr-util=/usr/local/apr-util:指定apr-util的安装路径

--enable-expires:激活或通过配置文件控制HTTP的"Expires:"和"Cache-Control:"头内容,即对网站图片、js、css等内容,提供客户端浏览器缓存的设置。这个是Apache调优的一个重要选项之一。

--enable-deflate:提供对内容的压缩传输编码支持,一般是html、js、css等内容的站点。使用此参数会大大提高传输速度,提升访问者的体验。在生产环境中,这是Apache调优的一个重要选项之一。

3、优化http程序->见源码安装

4、到客户端去测试访问Apache服务(注意:防火墙)

配置防火墙规则:

[root@ing ~]# firewall-cmd --permanent  --add-port=80/tcp
success
[root@ing ~]# firewall-cmd --reload 
success

编译安装mysql

请参考mysql安装

FastCGI方式安装php(5.6)

1、解决依赖关系

[root@haha ~]# yum -y install libxml2-devel libcurl-devel openssl-devel bzip2-devel libjpeg-devel libpng-devel

1、安装libmcrypt(epel源里面有该包)

可以到官网wget下载libmcrypt:

libmcrypt下载:ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz

[root@haha ~]# tar zxf libmcrypt-2.5.7.tar.gz 
[root@haha ~]# cd libmcrypt-2.5.7/
[root@haha libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install

2、编译安装php

[root@haha ~]# tar zxf php-5.6.27.tar.gz
[root@haha ~]# cd php-5.6.27/
[root@haha php-5.6.27]# 
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d \
--with-mysql=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-openssl \
--enable-fpm \
--enable-sockets \
--enable-sysvshm \
--enable-mbstring \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--with-mhash \
--with-mcrypt=/usr/local/libmcrypt \
--with-bz2 \
--enable-maintainer-zts 


[root@kang php-5.6.27]# ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2--enable-maintainer-zts

[root@haha php-5.6.27]# make && make install

相关选项的解释:

--prefix=/usr/local/php5.6     //安装位置

--with-mysql=mysqlnd   //支持mysql

--with-pdo-mysql=mysqlnd  //支持pdo模块

--with-mysqli=mysqlnd   //支持mysqli模块

mysqli是MySQL团队提供的MySQL驱动,具有很多实用的功能和典型特征。不过他不是MySQL于PHP平台最好的选择,PDO被证实,是一个简易、高并发性,而且易于创建和回收的标准接口。不过PDO也经历了5.3以前的内存溢出的问题,在5.3以后,在读取Oracle的LOB资源时,若不对内存进行限制,仍会内存溢出

注:上面的三选项的作用:数据库与php不在一个服务器上,指定此种方式,安装数据库连接驱动

--with-openssl  //支持openssl模块

--enable-fpm  //支持fpm模式;开启php-fpm组件用于管理PHP

--enable-sockets  //启用socket支持

--enable-sysvshm  //启用系统共享内存支持

--enable-mbstring  //多字节字串、像我们的中文就是多字节字串

--with-freetype-dir  //支持freetype、就要装freetype-devel、跟字体相关的、字体解析工具

--with-jpeg-dir

--with-png-dir

注:上面的二选项的作用:处理jpeg、png图片的、php可以动态生成jpeg图片 

--with-zlib //是个压缩库、在互联网传输时用来压缩传输的

--with-libxml-dir=/usr //这个libxml是用来解析xml的、指定/usr下

--enable-xml   //支持xml的

--with-mhash      //支持mhash

--with-mcrypt=/usr/local/libmcrypt    //libmcrypt-devel这个程序包所指定的

--with-config-file-path=/etc    //指定配置文件的存放路径的;php --ini用该命令可查看,可以在编译的时候使用--with-config-file-path参数来修改php.ini的存放位置。例如:你可以使用--with-config-file-path=/etc把php.ini存放到/etc下面,然后可以从源码包中拷贝php.ini-production到/etc/php.ini

--with-config-file-scan-dir=/etc/php.d  //配置文件扫描路径

image-20230214101621220

--with-bz2    //支持BZip2

为了支持apache的worker或event这两个MPM,编译时使用了--enable-maintainer-zts选项

如果使用PHP5.3以上版本,为了链接MySQL数据库,可以指定mysqlnd,这样在本机就不需要先安装MySQL或MySQL开发包了。mysqlnd从php 5.3开始可用,可以编译时绑定到它(而不用和具体的MySQL客户端库绑定形成依赖),但从PHP 5.4开始它就是默认设置了。

3、提供php配置文件

[root@haha php-5.6.27]# cp php.ini-production /etc/php.ini  #在解压目录里copy
cp: overwrite ‘/etc/php.ini’? y

4、为php-fpm提供脚本

[root@haha php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm  #在解压目录里copy
[root@haha php-5.6.27]# chmod +x /etc/init.d/php-fpm 
[root@haha php-5.6.27]# chkconfig --add php-fpm
[root@haha php-5.6.27]# chkconfig php-fpm on

5、提供php-fpm配置文件并编辑:

[root@haha ~]# cp /usr/local/php5.6/etc/php-fpm.conf.default /etc/php-fpm.conf
[root@haha ~]# vi /etc/php-fpm.conf
#修改内容如下:
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
user = apache
group = apache
listen = 192.168.31.141:9000
pm = static
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

sbin]# ./php-fpm -t     #检查配置文件是否正确
[29-Jan-2021 22:41:22] NOTICE: configuration file /usr/local/php/etc/php-fpm.conf test is successful

启动php-fpm服务:

[root@haha ~]# service  php-fpm start
Starting php-fpm  done
[root@haha ~]# netstat -anpt | grep php-fpm
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN      25456/php-fpm: mast 
[root@haha ~]# firewall-cmd --permanent --add-port=9000/tcp
success
[root@haha ~]# firewall-cmd --reload
Success

在该主机上新建虚拟主机目录用于存放网页文件

[root@haha ~]# mkdir -p /var/www/benet

至此php安装配置完毕,下面配置apache通过fastcgi协议调用php

6、配置apache(切换到apache主机上操作)

在Apache2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充,因此这两个模块都要加载

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
[root@www ~]# apachectl -M | grep proxy
 proxy_module (shared)
 proxy_fcgi_module (shared)

建立一个目录作为虚拟主机的家目录

[root@www ~]# mkdir -p /var/www/benet

编辑主配置文件httpd.conf,开启虚拟主机

启用:Include conf/extra/httpd-vhosts.conf

同时定位 AddType;添加下面两行:让apache能识别php格式的页面

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

并且定位至DirectoryIndex :支持php格式的主页

DirectoryIndex index.php index.html #添加index.php(添加在最前面最先解析)

配置虚拟主机支持使用fcgi

[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin webmaster@benet.com
    DocumentRoot "/var/www/benet"
    ServerName www.benet.com
    ServerAlias benet.com
    ErrorLog "logs/benet.com-error_log"
    CustomLog "logs/benet.com-access_log" common
    ProxyRequests Off
    ProxyPassMatch  ^/(.*\.php(/.*)?)$  fcgi://192.168.31.141:9000/var/www/benet/$1
    #<LocationMatch "^(.*\.php(/.*)?)$">
    #  ProxyPass fcgi://192.168.31.141:9000/var/www/benet
    #</LocationMatch>
    <Directory "/var/www/benet">
       Options  FollowSymLinks
       AllowOverride None
       Require all granted
    </Directory>
</VirtualHost>

相关参数解释:

192.168.31.141:9000:PHP服务器的IP地址

ProxyRequests off :关闭正向代理

ProxyPassMatch:把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://192.168.31.141:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。

特别注意的是,红色字体部分需要与<VirtualHost > 中的 DocumentRoot 后的路径一致

ProxyPassMatch

只有满足特定正则模式的内容才会匹配并执行此规则,这里的模式是,^/(.*\.php(/.*)?)$

从网站(虚拟主机 <VirtualHost > 的根目录开始,匹配任何以.php结尾,或者在.php之后紧跟一个/再跟别的内容的路径。

^ (caret)$ (dollar)标志要匹配的路径的开始和结束

( )括号里的内容可以用$1来表示,以方便后面引用它。

fcgi:// 192.168.31.141:9000通过 mod_proxy_fcgi 来转发的代理,使用 fastCGI 协议,转到 PHP-FPM 监听的端口。

/path/to/your/documentroot/

非常重要!必须与虚拟主机的路径匹配,且必须是对应 php 文件在操作系统中的绝对路径。否则会找不到文件。

$1可以从原始请求扩展成整个请求路径的变量,这里指代前面( )里面匹配的那个路径(uri)

补充:Apache httpd 2.4以前的版本中,要么把PHP作为Apache的模块运行,要么添加一个第三方模块支持PHP-FPM实现。

测试LAMP环境:

在mysql主机上创建用于php服务器连接的mysql账户

mysql> grant all on *.* to testuser@'%' identified by '123456;

注意防火墙要允许mysql连接。

在php服务器上的/var/www/benet目录下创建.php的测试页:

[root@haha ~]# cat /var/www/benet/index.php 
<?php
phpinfo();
?>

[root@haha ~]# cat /var/www/benet/test1.php 
<?php
$link=mysql_connect('192.168.31.225','testuser','123456');
if ($link)echo "connection success......";
mysql_close();
?>

测试->访问PHP服务与MySQL服务的测试页(Apache主机的IP地址):

image-20230214103531278

image-20230214103539290

看到上面两个测试页说明apache、php、mysql之间可以协同工作了。

WEB压力测试工具ab

网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。

性能测试工具目前最常见的有以下几种:abhttp_loadwebbenchsiege。今天我们专门来介绍ab。

ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

下面我们开始介绍有关ab命令的使用:

1.ab的原理

2.ab的安装

3.ab参数说明

4.ab性能指标

5.ab实际使用

6.测试nginx性能

1)ab的原理

ab是apachebench命令的缩写。

ab的原理:

ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。

ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。

2)ab的安装

ab的安装非常简单,如果是源码安装apache的话,那就更简单了。apache安装完毕后ab命令存放在apache安装目录的bin目录下。如下:

/usr/local/http2.4.23/bin/ab

如果apache 是通过yum的RPM包方式安装的话,ab命令默认存放在/usr/bin目录下。如下:

which ab

注意:如果不想安装apache但是又想使用ab命令的话,我们可以直接安装apache的工具包httpd-tools。如下:

yum -y install httpd-tools

查看ab是否安装成功,可以切换到上述目录下,使用ab -V命令进行检测。如下:

[root@www ~]# /usr/local/http-2.4.23/bin/ab -V
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

3)ab参数说明

有关ab命令的使用,我们可以通过帮助命令进行查看。如下:

[root@cent05 ~]# ab --help
下面我们对这些参数,进行相关说明。如下:
-n:在测试会话中所执行的请求个数(即总请求数)。
-c:一次产生的请求个数(即并发用户数)。

下面我们对这些参数,进行相关说明。如下:

-n:在测试会话中所执行的请求个数(即总请求数)。

-c:一次产生的请求个数(即并发用户数)。

[root@www ~]# ab -c 500 -n 10000 http://192.168.31.83/index.html
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.31.83 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache
Server Hostname:        192.168.31.83
Server Port:            80

Document Path:          /index.html    #请求的资源
Document Length:        312 bytes   #HTTP响应数据的正文长度

Concurrency Level:      500   #并发个数(并发用户数)      -c
Time taken for tests:   1.452 seconds   #所有这些请求处理完成所花费的时间 
Complete requests:      10000    #完成请求数     -n
Failed requests:        0          #失败的请求数
Non-2xx responses:      10000
Total transferred:      4760000 bytes  #表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。注意这里不包括HTTP请求数据的长度,仅仅为web服务器流向用户PC的应用层数据总长度。 
HTML transferred:       3120000 bytes   # 表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度。
Requests per second:    7530.93 [#/sec] (mean)    #吞吐量-每秒请求数。计算公式:Complete requests/Time taken for tests
Time per request:       66.393 [ms] (mean) #用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)。
Time per request:       0.133 [ms] (mean, across all concurrent requests)  #服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests。
Transfer rate:          3500.71 [Kbytes/sec] received #表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。(即平均每秒网络上的流量)

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       10   27   7.3     27      48
Processing:     4   37  36.5     32     439
Waiting:        2   27  37.0     21     435
Total:         30   64  37.6     60     470

Percentage of the requests served within a certain time (ms)
  50%     60
  66%     63
  75%     64
  80%     66
  90%     71
  95%     76
  98%     89
  99%    261
 100%    470 (longest request) #这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80%的请求处理时间都不超过66ms,这个处理时间是指前面的Time per request,即对于单个用户而言,平均每个请求的处理时间。

继续压力测试

我们再来进行一次压力测试,此时并发用户数为1000,其他条件不变,查看两次测试结果的吞吐量差别

4)ab性能指标

在进行性能测试过程中有几个指标比较重要:

1、吞吐率(Requests per second)

服务器并发处理能力的量化描述,单位是reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。

记住:吞吐率是基于并发用户数的。这句话代表了两个含义:

a、吞吐率和并发用户数相关

b、不同的并发用户数下,吞吐率一般是不同的

计算公式:总请求数/处理完成这些请求数所花费的时间,即

Request per second=Complete requests/Time taken for tests

必须要说明的是,这个数值表示当前机器的整体性能,值越大越好

2、并发连接数(The number of concurrent connections)

并发连接数指的是某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。

3、并发用户数(Concurrency Level)

要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。

4、用户平均请求等待时间(Time per request)

计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数),即:

Time per request=Time taken for tests/(Complete requests/Concurrency Level)

5、服务器平均请求等待时间(Time per request:across all concurrent requests)

计算公式:处理完成所有请求数所花费的时间/总请求数,即:

Time taken for/testsComplete requests

可以看到,它是吞吐率的倒数。同时,它也等于用户平均请求等待时间/并发用户数,即

Time per request/Concurrency Level

WEB压力测试工具siege

介绍:

Siege是一个http/https负载测试和基准测试工具。它旨在让WEB开发人员了解自己代码在压力测试中的执行性能。

Siege支持基本身份验证、Coockie、HTTP、HTTPS和FTP协议。用户也可以通过配置来模拟访问服务器的并发用户数,是一款非常方便的压力测试工具。

官方网址:http://www.joedog.org/

下载网址:http://www.joedog.org/pub/siege/

安装配置

安装版本:Siege-4.0.2

操作系统:Centos7.x

安装:

[root@Docker ~]# yum install siege -y

使用介绍

[root@Docker ~]# siege -V
New configuration template added to /root/.siege
Run siege -C to view the current settings in that file
SIEGE 4.0.2

Copyright (C) 2016 by Jeffrey Fulmer, et al.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.
[root@Docker ~]# siege --help
SIEGE 4.0.2
Usage: siege [options]
       siege [options] URL
       siege -g URL
-C, --config :查看siege当前的配置信息
-V, --version:版权说明信息
-c, --concurrent=NUM:并行启动(访问)用户数,默认是10
-t, --time=NUMm:压力测试时间,比如-t5表示持续时间是5分钟
-b, --benchmark:基准测试,请求之间没有延迟。
-g, --get get方式请求
-d, --delay=NUM 时间延迟,每个请求之间的延迟时间
-i, --internet 模拟用户,随机点击的URL。
-r, --reps=NUM:每个连接发出的请求数量,这个与t有些类似,所以设置了这个值就不需要设置t了,反之亦然。
-f, --file=FILE:对应一个文件,这个文件里每一行为一个URL链接,格式如:
-m, --mark="text"  在日志里标记的字符串标识
-H, --header="text" 在Header里增加的字符串标识
-A, --user-agent="text" 在user-agent里增加的字符串标识

举个例子

10个并发,每个连接10个请求,间隔1秒请求压测。

[root@Docker ~]# siege  -d1 -r10 -c 10 www.baidu.com
# 结果:
** SIEGE 4.0.2
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.05 secs:  143913 bytes ==> GET  /static/superman/js/lib/jquery-1-cc52697ab1.10.2.js
HTTP/1.1 200     0.04 secs:   15629 bytes ==> GET  /5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css
HTTP/1.1 200     0.05 secs:  163321 bytes ==> GET  /
HTTP/1.1 200     0.02 secs:   93750 bytes ==> GET  /r/www/cache/static/jquery/jquery-1.10.2.min_65682a2.js
HTTP/1.1 200     0.05 secs:    6511 bytes ==> GET  /img/baidu_resultlogo@2.png
HTTP/1.1 200     0.02 secs:    1131 bytes ==> GET  /baidu.html?from=noscript
HTTP/1.1 200     0.01 secs:     705 bytes ==> GET  /img/baidu_jgylogo3.gif
HTTP/1.1 200     0.04 secs:    6511 bytes ==> GET  /img/baidu_resultlogo@2.png
HTTP/1.1 200     0.01 secs:     705 bytes ==> GET  /img/baidu_jgylogo3.gif
HTTP/1.1 200     0.04 secs:    7877 bytes ==> GET  /img/bd_logo1.png?qua=high
HTTP/1.1 200     0.01 secs:    7877 bytes ==> GET  /img/bd_logo1.png?qua=high
HTTP/1.1 200     0.02 secs:    7877 bytes ==> GET  /img/bd_logo1.png
HTTP/1.1 200     0.04 secs:    7877 bytes ==> GET  /img/bd_logo1.png
HTTP/1.1 200     0.10 secs:      91 bytes ==> GET  /img/gs.gif
HTTP/1.1 200     0.03 secs:   15629 bytes ==> GET  /5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css
HTTP/1.1 200     0.06 secs:   93750 bytes ==> GET  /r/www/cache/static/jquery/jquery-1.10.2.min_65682a2.js
HTTP/1.1 200     0.01 secs:    6511 bytes ==> GET  /img/baidu_resultlogo@2.png
HTTP/1.1 200     0.01 secs:     705 bytes ==> GET  /img/baidu_jgylogo3.gif
HTTP/1.1 200     0.05 secs:    7877 bytes ==> GET  /img/bd_logo1.png?qua=high
HTTP/1.1 200     0.01 secs:    7877 bytes ==> GET  /img/bd_logo1.png
HTTP/1.1 200     0.02 secs:  163294 bytes ==> GET  /
HTTP/1.1 200     0.04 secs:    1131 bytes ==> GET  /baidu.html?from=noscript
HTTP/1.1 200     0.01 secs:      91 bytes ==> GET  /img/gs.gif
HTTP/1.1 200     0.03 secs:   15629 bytes ==> GET  /5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css
HTTP/1.1 200     0.06 secs:   93750 bytes ==> GET  /r/www/cache/static/jquery/jquery-1.10.2.min_65682a2.js
HTTP/1.1 200     0.02 secs:    6511 bytes ==> GET  /img/baidu_resultlogo@2.png
HTTP/1.1 200     0.01 secs:     705 bytes ==> GET  /img/baidu_jgylogo3.gif
HTTP/1.1 200     0.05 secs:    7877 bytes ==> GET  /img/bd_logo1.png?qua=high
HTTP/1.1 200     0.00 secs:    7877 bytes ==> GET  /img/bd_logo1.png

Transactions:            1017 hits  // 总处理数量
Availability:          100.00 %    // 成功请求百分百
Elapsed time:           10.06 secs //总耗时
Data transferred:         35.65 MB //总传输数据量
Response time:            0.03 secs  // 响应时间
Transaction rate:        101.09 trans/sec // 每秒处理请求数
Throughput:            3.54 MB/sec     // 吞吐量
Concurrency:            3.38           // 并发数
Successful transactions:        1017   //成功处理次数
Failed transactions:             0    //请求失败数
Longest transaction:          0.33   // 请求最长耗时
Shortest transaction:          0.00  //请求最短耗时

GET方式压测

[root@Docker ~]# siege -g www.baidu.com
HEAD / HTTP/1.0
Host: www.baidu.com
Accept: */*
User-Agent: Mozilla/5.0 (redhat-x86_64-linux-gnu) Siege/4.0.2
Connection: close


HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Length: 277
Content-Type: text/html
Date: Sun, 01 Mar 2020 14:51:31 GMT
Etag: "575e1f6f-115"
Last-Modified: Mon, 13 Jun 2016 02:50:23 GMT
Pragma: no-cache
Server: bfe/1.0.8.18



Transactions:                      1 hits
Availability:                 100.00 %
Elapsed time:                   6.38 secs
Data transferred:               0.00 MB
Response time:                  6.00 secs
Transaction rate:               0.16 trans/sec
Throughput:                     0.00 MB/sec
Concurrency:                    0.94
Successful transactions:           1
Failed transactions:               0
Longest transaction:            6.00
Shortest transaction:           6.00

CentOS7.2下安装php加速软件Xcache(在php主机上完成下面的操作)

说明:

php安装目录:/usr/local/php5.6

php.ini配置文件路径:/etc/php.ini

php网页根目录:/var/www/benet

1)安装xcache

[root@haha ~]# wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz #下载
[root@haha ~]# tar zxf xcache-3.2.0.tar.gz    #解压
[root@haha ~]# cd xcache-3.2.0/    #进入安装目录
[root@haha xcache-3.2.0]# /usr/local/php5.6/bin/phpize #用phpize生成configure配置文件
[root@haha xcache-3.2.0]# ./configure --enable-xcache --enable-xcache-coverager --enable-xcache-optimizer --with-php-config=/usr/local/php5.6/bin/php-config  #配置
[root@haha xcache-3.2.0]# make && make install  #编译、安装

Installing shared extensions:     /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/
#安装完成之后,出现下面的界面,记住以下路径,后面会用到
/usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/

2)创建xcache缓存文件

[root@haha xcache-3.2.0]# touch /tmp/xcache
[root@haha xcache-3.2.0]# chmod 777 /tmp/xcache

3)拷贝xcache后台管理程序到网站根目录

[root@haha xcache-3.2.0]# cp -r htdocs/ /var/www/benet/xcache

4)配置php支持xcache

[root@haha xcache-3.2.0]# vi /etc/php.ini #编辑配置文件,在最后一行添加以下内容
[xcache-common]
extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so
[xcache.admin]
xcache.admin.enable_auth = Off
[xcache]
xcache.shm_scheme ="mmap"
xcache.size=60M
xcache.count =1
xcache.slots =8K
xcache.ttl=0
xcache.gc_interval =0
xcache.var_size=64M
xcache.var_count =1
xcache.var_slots =8K
xcache.var_ttl=0
xcache.var_maxttl=0
xcache.var_gc_interval =300
xcache.test =Off
xcache.readonly_protection = Off
xcache.mmap_path ="/tmp/xcache"
xcache.coredump_directory =""
xcache.cacher =On
xcache.stat=On
xcache.optimizer =Off
[xcache.coverager]
xcache.coverager =On
xcache.coveragedump_directory =""

将xcache目录拷贝到apache主机的网页文档目录下

[root@haha ~]# scp -r /var/www/benet/xcache/ root@192.168.31.83:/var/www/benet/

6)测试

service php-fpm restart #重启php-fpm

浏览器打开网站根目录下面的xcache

http://192.168.31.83/xcache  可以看到如下页面:

image-20230214105212259

至此,Linux下安装php加速软件Xcache教程完成

执行ab压力测试:执行第一次压力测试:

[root@www ~]# ab -c 100 -n 1000 http://192.168.31.83/index.php
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.31.83 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache
Server Hostname:        192.168.31.83
Server Port:            80

Document Path:          /index.php
Document Length:        85006 bytes

Concurrency Level:      100
Time taken for tests:   1.773 seconds
Complete requests:      1000
Failed requests:        368
   (Connect: 0, Receive: 0, Length: 368, Exceptions: 0)
Total transferred:      85259504 bytes
HTML transferred:       85013504 bytes
Requests per second:    563.88 [#/sec] (mean)
Time per request:       177.344 [ms] (mean)
Time per request:       1.773 [ms] (mean, across all concurrent requests)
Transfer rate:          46948.95 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   2.7      0      16
Processing:    31  167  73.7    140     406
Waiting:       23  162  73.1    136     401
Total:         40  168  73.0    141     406

Percentage of the requests served within a certain time (ms)
  50%    141
  66%    152
  75%    176
  80%    188
  90%    294
  95%    389
  98%    396
  99%    400
 100%    406 (longest request)

执行第二次压力测试

[root@www ~]# ab -c 100 -n 1000 http://192.168.31.83/index.php
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.31.83 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache
Server Hostname:        192.168.31.83
Server Port:            80

Document Path:          /index.php
Document Length:        85006 bytes

Concurrency Level:      100
Time taken for tests:   1.264 seconds
Complete requests:      1000
Failed requests:        316
   (Connect: 0, Receive: 0, Length: 316, Exceptions: 0)
Total transferred:      85257983 bytes
HTML transferred:       85011983 bytes
Requests per second:    790.93 [#/sec] (mean)
Time per request:       126.434 [ms] (mean)
Time per request:       1.264 [ms] (mean, across all concurrent requests)
Transfer rate:          65852.24 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   2.7      0      11
Processing:    33  120  20.6    120     180
Waiting:       28  115  20.0    115     179
Total:         44  121  19.2    121     180

Percentage of the requests served within a certain time (ms)
  50%    121
  66%    124
  75%    127
  80%    128
  90%    147
  95%    159
  98%    166
  99%    169
 100%    180 (longest request)

查看xcache的命中率:

image-20230214105529341

部署bbs论坛

Discuz的程序文件解压,并且将upload中所有文件放置到网站目录(php服务器的操作)

# unzip Discuz_7.0.0_FULL_SC_UTF8.zip  -d  discus
# mv discuz/upload/  /var/www/benet/bbs

设置php-fpm的服务用户为下面文件的属主或者对其设置写权限,否则安装时会报错

# cd /var/www/benet/bbs
# chown -R nobody config.inc.php p_w_uploads/ forumdata/ uc_client/data/cache/ templates/
# chmod -R 777 uc_server/data/

修改php.ini文件:添加下面的命令

short_open_tag = On

重启fpm服务:

# service php-fpm restart

web服务器也需要有静态文件(apache服务器上操作)

# unzip Discuz_7.0.0_FULL_SC_UTF8.zip  -d  discus
# mv Discuz/upload/  /var/www/benet/bbs

设置httpd的服务用户对指定文件也需要有写权限

# unzip Discuz_7.0.0_FULL_SC_UTF8.zip  -d  discus
# mv Discuz/upload/  /var/www/benet/bbs

在数据库服务器上创建bbs数据库及授权帐户

mysql> create database bbsdb;
Query OK, 1 row affected (0.01 sec)
mysql> grant all on bbsdb.* to runbbs@'%' identified by 'pwd@123';
Query OK, 0 rows affected, 1 warning (0.03 sec)

完成之后,输入http://192.168.31.83/bbs/install即可安装

image-20230214105808966

填写数据库的相关信息,添加数据库服务器的地址和MariaDB创建的数据库和用户密码,而后在设置bbs的管理员帐号密码就可以继续安装了。

剩下的根据提示安装即可。

image-20230214105840818

注意:出现上面这种情况是由于php服务器安装了discuz之后导致程序发生变化从而导致动态服务器和静态服务器的程序不一致,只需要手动把bbs服务器的文件和web服务器进行一次同步即可,如果想实现自动同步,需要使用其他服务,如initory+rsync、sersync等工具。

同步数据操作:

# scp -r /var/www/benet/bbs/* root@192.168.31.83:/var/www/benet/bbs/

动态服务器和静态服务器同步文件之后,再次访问bbs的网址就正常了。

image-20230214105934988

总结:

(1.)PHP在lamp环境下的三种工作模式:cgi模式、Apache模块、fscgi模式(PHP工作机制)

(2.)搭建lamp(安装相关依赖包、源码编译安装)

(3.)利用Apache自带的压力测试工具ab,进行网站的压力测试

(4.)搭建xcache工具,专门给PHP进行加速,提高PHP的性能以及运行上的效率。

(5.)搭建bbs论坛,基于lamp平台之上运行(Apache与PHP两台服务器上同时创建自己的网站虚拟根目录用于存放网页)

nginx与httpd两者优劣势比较

1、作为 Web 服务器:

相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一,能够支持高达 50000 个并发连接数的响应, 感谢Nginx 为我们选择了 epoll and kqueue 作为开发模型。

Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务。Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。

2、擅长领域分别

nginx的优势是处理静态请求,cpu内存使用率低,是非常好的图片、文件服务器。把所有的静态资源的放到nginx上,还可以使应用动静分离,性能更好

apache适合处理动态请求,所以现在一般前端用nginx作为反向代理抗住压力,apache作为后端处理动态请求

3、最核心的区别在于:

apache是同步多进程模型,一个连接对应一个进程

nginx是异步的,多个连接(万级别)可以对应一个进程

4、Nginx 配置简洁, Apache 复杂:

Nginx 启动特别容易, 并且几乎可以做到7 * 24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级。

Nginx 静态处理性能比 Apache 高 3倍以上,Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端来使用 ,Apache 的组件比 Nginx 多。

免责声明: 本文部分内容转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。