一、概念
HTML:超文本标记语言
HTTP:超文本传输协议
URL:统一资源定位符
动态页面:需要连接数据库的页面,不是放视频能动的页面。
进程和线程:做个简单的比喻:进程=火车,线程=车厢 链接:https://www.zhihu.com/question/25532384/answer/411179772
- 线程在进程下行进(单纯的车厢无法运行)
- 一个进程可以包含多个线程(一辆火车可以有多个车厢)
- 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
- 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
- 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
- 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
- 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
- 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥锁"
- 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”
二、Apache详解
1.概述
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的web服务器端以件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python/php等解释器编译到服务器中。Apache有多种产品,可以支持SSL技术,支持多个盡拟主机。Apache是以进程为基础的结构,进程要比线程消耗史多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点,而不是增加处理器。到目前为止Apache旧仍然是世界上用的最多的Web服务器,市场占有率达60%左右。
2.工作模式
(1)prefork:apache启动时fork一些进程(较多),每个进程只有1个线程,线程很安全,但是资源占用高,不适合高并发请求。
(2)worker:apache启动时fork一些进程(较少),每个进程有多个线程,线程不足够安全,资源占用相对少,高并发场景比prefork更优秀一些。
(3)event:类似worker模式,但是可以keep-alive,每个进程的所有线程中有1个专门的管理线程,可以很好地平衡keep-alive和高并发请求(关键在于设置keep-alive的timeout参数)。
[root@localhost lamp]# httpd -V | grep -i "server mpm" bash: httpd: command not found... [root@localhost lamp]# ln -s /usr/local/apache2/bin/* /usr/local/bin/ [root@localhost lamp]# httpd -V | grep -i "server mpm" Server MPM: worker
在编译时 --with-mpm=xxx 可以指定工作模式
3.文件位置
配置文件
源码包安装
PREFIX/etc/httpd.conf
PREFIX/etx/extra/*.conf
rpm包安装
/etc/httpd/conf/httpd.conf
网页文件
源码包安装
PREFIX/htdocs/
rpm包安装
/var/www/html/
日志文件
源码包安装
PREFIX/logs
rpm包安装
/var/log/httpd
4.配置文件详解
Apache配置文件注意区分字母大小写
4.1针对主机环境的基本配置参数
ServerRoot /usr/local/apache2 #apache的主目录
Listen :80 #监听端口(0.0.0.0:80加上)
LoadModule php7 #加载的相关模块
User
Group #用户和组
ServerAdmin #管理员邮箱
ServerName #服务器名(没有域名解析时,使用临时解析。默认不开启)
ErrorLog "logs/error_log" #服务器错误日志
CustomLog "logs/access_log" conmon #访问记录日志
DirectoryIndex index.htmlindex.php #默认网页文件名,优先级顺序
lnclude etc/extra/httpd-vhosts.conf #子配置文件中内容也会加载生效
4.2主页目录及权限
DocumentRoot "/usr/local/apache2/htdocs” #网页文件存放目录(默认)
<Directory /usr/local/apache2/htdocs"> #定义指定目录的权限过
Options lndexes FollowSymLinks
None #没有任何额外权限
AII #所有权限(除去MultiViews以外)
lndexes #浏览权限(当此目录下没有默认网页文件时,显示目录内容〕
FollowSymLinks #准许软连接到其他目录,
MultiViews #准许文件名泛匹配〔需要手动开启模块才有效negotiation)
AllowOverride None #定义是否允许目录下.htaccess文件中的权限生效
None #.htaccess权限不生效
AII #文件中所有权限都生效
AuthConfig #文件中,只有网页认证的权限生效
Require alI granted(denied) #访问控制列表
</Directory>
<IfModule dir_module> #此标签用来指定访问到指定目录时自动加载哪个页面文件.
Directory lndex index.php index.html #可以写多个,但是有优先级之分
</IfMOdule>
三、Apache实验
实验环境:搭建好的LAMP环境
3.1Apache目录别名
[root@localhost lamp]# vim /usr/local/apache2/etc/httpd.conf #开启子配置文件 Include etc/extra/httpd-autoindex.conf [root@localhost lamp]# vim /usr/local/apache2/etc/extra/httpd-autoindex.conf #修改自配置文件 Alias /test/ "/tmp/apache/test/" #别名目录在末尾不能缺少/ <Directory "/tmp/apache/test/"> Options Indexes MultiViews AllowOverride None Require all granted </Directory> [root@localhost lamp]# mkdir -p /tmp/apache/test #创建别名目录 [root@localhost lamp]# vim /tmp/apache/test/a.html #创建网页测试html文件 [root@localhost lamp]# /usr/local/apache2/bin/apachectl restart #重启Apache服务
3.2Apache用户认证
[root@localhost lamp]# mkdir /usr/local/apache2/htdocs/admin #创建网页主目录,所有需要认证的网页放进去 [root@localhost lamp]# vim /usr/local/apache2/htdocs/admin/index.html #创建网页
[root@localhost lamp]# vim /usr/local/apache2/etc/httpd.conf #修改主配置文件
<Directory "/usr/local/apache2/htdocs/admin/">
Options Indexes FollowSymLinks
AllowOverride All #隐藏文件.htaccess中的所有权限都生效
Require all granted
</Directory>
[root@localhost lamp]# vim /usr/local/apache2/htdocs/admin/.htaccess #创建隐藏文件.htaccess在主目录下 AuthName "welcome to us" AuthType basic AuthUserFile /usr/local/apache2/htdocs/admin/apache.passwd #指明认证文件apache.passwd require valid-user [root@localhost lamp]# vim /usr/local/apache2/htdocs/admin/.htaccess #创建认证文件apache.passwd在主目录下 [root@localhost lamp]# /usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/admin/apache.passwd test1 #htpasswd命令,第一个认证文件用-c指定 New password: 123456 Re-type new password: Adding password for user test1 [root@localhost lamp]# /usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/admin/apache.passwd test2 #非第一个认证文件用-m指定 New password: 654321 Re-type new password: Adding password for user test2 [root@localhost lamp]# /usr/local/apache2/bin/apachectl -t #检测Apache配置文件是否有误 Syntax OK [root@localhost lamp]# /usr/local/apache2/bin/apachectl stop [root@localhost lamp]# /usr/local/apache2/bin/apachectl start
3.3虚拟主机
(1)虚拟机:虚拟硬件,有独立操作系统。
(2)虚拟主机:网站空间,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。(一个虚拟主机就相当于一个网站)
虐拟主机的分类:
(1)基于IP的虚拟主机:一台服务器,多个ip,搭建多个网站
(2)基于端口的虚拟主机:一台服务器,一个ip,搭建多个网站,每个网绍使用不同端口访问
(3)基于域名的虚拟主机:一台服务器,一个ip,搭建多个网站.每个网站使用不同域名访问
1.域名解析:准备两个域名,也可以搭建DNS服务器
[root@localhost user1]# vim /etc/hosts #准备两个域名,域名解析用 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.150 www.sohu.com 10.0.0.150 www.sina.com
2.网站目录规划:在PREFIX/htdocs/网页文件的目录下,创建网站各自的家目录,并新建各自的index.html文件。
[root@localhost user1]# mkdir /usr/local/apache2/htdocs/sina #在/htdocs/目录下分别创建sina和sohu两个子目录 [root@localhost user1]# mkdir /usr/local/apache2/htdocs/souhu [root@localhost user1]# vim /usr/local/apache2/htdocs/sina/index.html #在子目录内创建index.html文件 www.sina.com [root@localhost user1]# vim /usr/local/apache2/htdocs/sohu/index.html www.sohu.com
3.修改主配置文件,调用子配置文件的vhosts文件
[root@localhost user1]# vim /usr/local/apache2/etc/httpd.conf #修改主配置文件,开启文件关联 #Virtual hosts Include etc/extra/httpd-vhosts.conf
4.修改子配置文件的vhosts文件,编辑虚拟主机标签
[root@localhost user1]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf #修改子配置文件,编写虚拟主机标签 #<Directory "/usr/local/apache2/htdocs/sohu"> #可以为sohu虚拟主机的家目录设置权限,也可以不写该标签就是默认权限 #Options Indexes FollowSymLinks #AllowOverride None #Require all granted #</Directory> <VirtualHost 10.0.0.150:80> #指定虚拟主机的标签(虚拟主机=网站),已知虚拟主机的IP和端口。 ServerAdmin webmaster@sina.com #管理员邮箱 DocumentRoot "/usr/local/apache2/htdocs/sina/" #指定虚拟主机(网站)的家目录 ServerName www.sina.com #指定虚拟主机(网站)的域名 ErrorLog "logs/www.sina.com-error_log" #错误日志 CustomLog "logs/www.sina.com-access_log" common #访问日志 </VirtualHost> <VirtualHost 10.0.0.150:80> ServerAdmin webmaster@sohu.com DocumentRoot "/usr/local/apache2/htdocs/sohu/" ServerName www.sohu.com ErrorLog "logs/www.sohu.com-error_log" CustomLog "logs/www.sohu.com-access_log" common </VirtualHost>
5.测试
[root@localhost user1]# elinks www.sohu.com #apachectl restart重启服务后,进行测试,验证不同域名的内容 [root@localhost user1]# curl www.sina.com
当客户端访问www.sohu.com时,Apache服务端提供sohu的网站页面;
当客户端访问www.sina.com时,Apache服务端提供sina的网站页面;
这样可知,Apache服务器可以部署多个虚拟主机,也就是多个网站。
3.4域名跳转
实验条件:虚拟主机能正常访问,已经建立起来了
状态码:301永久跳转,302临时跳转
1.修改主配置文件,开启rewrite模块进行重写
[root@localhost admin]# vim /usr/local/apache2/etc/httpd.conf LoadModule rewrite_module modules/mod_rewrite.so
2.修改子配置文件的vhosts文件,开启.htaccess规则配置
[root@localhost admin]# vim /usr/local/apache2/etc/extra/httpd-vhosts.conf <Directory "/usr/local/apache2/htdocs/sohu"> #对要被跳转的虚拟主机的家目录设置权限,开启规则配置文件 Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> <VirtualHost 10.0.0.150:80> #虚拟主机sina的标签 ServerAdmin webmaster@sina.com DocumentRoot "/usr/local/apache2/htdocs/sina/" ServerName www.sina.com #基于域名的虚拟主机 ErrorLog "logs/www.sina.com-error_log" CustomLog "logs/www.sina.com-access_log" common </VirtualHost> <VirtualHost 10.0.0.150:80> #虚拟主机sohu的标签 ServerAdmin webmaster@sohu.com DocumentRoot "/usr/local/apache2/htdocs/sohu/" ServerName www.sohu.com #基于域名的虚拟主机 ErrorLog "logs/www.sohu.com-error_log" CustomLog "logs/www.sohu.com-access_log" common </VirtualHost>
3.创建规则配置文件,要放在虚拟主机的家目录内
[root@localhost admin]# vim /usr/local/apache2/htdocs/sohu/.htaccess RewriteEngine on # 开启rewrite功能 RewriteCond %{HTTP_HOST} ^www.sohu.com # 把以www.sohu.com开头的内容赋值给HTTP_POST变量 RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L] # ^(.*)$表示客户端要访问的资源; $1把.*代指的内容赋值过去;
# R=permanent永久重定向=301; L表示这是最后一条生效的规则 [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# apachectl stop [root@localhost admin]# apachectl start
4.测试结果
[root@localhost admin]# curl www.sina.com #测试两个域名 www.sina.com [root@localhost admin]# curl www.sohu.com #跳转页面,可以看到href标签 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="http://www.sina.com/">here</a>.</p> </body></html> [root@localhost admin]# elinks www.sohu.com
3.5Apache+OpenSSL实现https传输
1.准备工作
[root@localhost admin]# vim /usr/local/apache2/etc/httpd.conf #开启Apache的SSL模块 LoadModule ssl_module modules/mod_ssl.so [root@localhost modules]# ls -l /usr/local/apache2/modules/ | grep ssl #检测模块是否安装 -rwxr-xr-x. 1 root root 895160 May 15 04:27 mod_ssl.so [root@localhost modules]# apachectl -M | grep ssl #检测模块是否开启 ssl_module (shared)
2.CA证书申请
[root@localhost apache2]# mkdir /usr/local/apache2/cert #创建证书保存目录 [root@localhost cert]# openssl genrsa -out ca.key 1024 #生成RSA私钥 [root@localhost cert]# openssl -req -new -key ca.key -out person.csr #生成公钥(证书) [root@localhost cert]# openssl x509 -req -days 365 -sha256 -in person.csr -signkey ca.key -out person.crt #对公钥(证书)进行签字颁发 [root@localhost cert]# ls -l /usr/local/apache2/cert/ total 12 -rw-r--r--. 1 root root 887 May 16 13:07 ca.key -rw-r--r--. 1 root root 757 May 16 13:10 person.crt -rw-r--r--. 1 root root 660 May 16 13:08 person.csr
3.配置文件修改
a.调用ssl模块、socache_shmcb模块;调用子配置文件的ssl文件
[root@localhost admin]# vim /usr/local/apache2/etc/httpd.conf #取消下面的注释 LoadModule ssl_module modules/mod_ssl.so Include etc/extra/httpd-ssl.conf LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
b.修改子配置文件的ssl文件,调用公钥/私钥文件
[root@localhost lamp]# vim /usr/local/apache2/etc/extra/httpd-ssl.conf SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM #修改加密套件 SSLHonorCipherOrder on SSLCertificateFile "/usr/local/apache2/cert/person.crt" #指定公钥位置 SSLCertificateKeyFile "/usr/local/apache2/cert/ca.key" #指定私钥位置
c.修改主配置文件,添加虚拟主机来监听https的443端口,默认只监听http的80端口
[root@localhost lamp]# vim /usr/local/apache2/etc/httpd.conf <VirtualHost _default_:443> #添加基于端口的虚拟主机,监听443端口 DocumentRoot "/usr/local/apache2/htdocs" #要和本文件内,默认的目录位置一致 ServerName localhost:443 SSLCertificateFile cert/person.crt SSLCertificateKeyFile cert/ca.key SSLCertificateChainFile cert/person.crt </VirtualHost>
到这一步,已经成功实现Apache+OpenSSL的加密传输,只不过客户端访问服务端时需要主动加上https://前缀,如果客户端忘记添加呢?所以我们可以强制http转为https。
4.修改主配置文件,强制http跳转https
[root@localhost cert]# vim /usr/local/apache2/etc/httpd.conf <Directory "/usr/local/apache2/htdocs"> RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L] </Directory> [root@localhost sina]# apachectl restart
5.测试
[root@localhost cert]# apachectl restart [root@localhost cert]# netstat -antp
3.6Apache日志切割
关闭https强制跳转、关闭虚拟主机、关闭OpenSSL
1.修改主配置文件,调用PREFIX/bin/rotatelogs工具进行日志切割
[root@localhost apache2]# vim /usr/local/apache2/etc/httpd.conf ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400" #管道符|将产生的日志交给rotatelogs这个工具,apache自带的切割日志工具 CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combinned #参数-l用于校准时区为UTC,也就是北京时间
#86400单位为秒,1天=86400秒,指的是每天切割一次日志
#combined为日志的格式,在httpd.conf中有定义;还有一种common格式 [root@localhost apache2]# apachectl -t Syntax OK [root@localhost apache2]# ls /usr/local/apache2/logs/ access_log httpd.pid www.sina.com-access_log www.sohu.com-access_log error_log ssl_request_log www.sina.com-error_log www.sohu.com-error_log
[root@localhost apache2]# apachectl restart [root@localhost apache2]# ls /usr/local/apache2/logs/ access_log error_log ssl_request_log www.sina.com-error_log www.sohu.com-error_log error_20200516.log httpd.pid www.sina.com-access_log www.sohu.com-access_log [root@localhost apache2]# curl 10.0.0.150 <html><body><h1>It works!</h1></body></html> [root@localhost apache2]# ls /usr/local/apache2/logs/ access_20200516.log error_20200516.log httpd.pid www.sina.com-access_log www.sohu.com-access_log access_log error_log ssl_request_log www.sina.com-error_log www.sohu.com-error_log
3.7不记录指定文件类型的日志
如果一个网站访问量特别大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有js、css等静态对象。而这些文件的访同往往是巨量的,而且即使记录这些日志也没有什么用,那么如何忽略不记录这些日志呢?
1.配置日志不记录图片访问
[root@localhost cert]# vim /usr/local/apache2/etc/httpd.conf <Directory "/usr/local/apache2/htdocs"> #在htdocs标签中添加内容 SetEnvIf Request_URI ".*\.gif$" imagine-request SetEnvIf Request_URI ".*\.jpg$" imagine-request SetEnvIf Request_URI ".*\.png$" imagine-request SetEnvIf Request_URI ".*\.swf$" imagine-request SetEnvIf Request_URI ".*\.bmp$" imagine-request #在原来的访问日志配置基础上,增加了一些image-request的定义,比如把gif、jpg、bmp等结尾进行标记,然后在配置文件后加一个标记env=!imagge-request,表示不记录这些标签所代表的访问日志。 SetEnvIf Request_URI ".*\.js$" imagine-request SetEnvIf Request_URI ".*\.css$" imagine-request </Directory> CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" common env=!image-request
[root@localhost libxml2-2.6.30]# tailf /usr/local/apache2/logs/access_20200516.log [root@localhost libxml2-2.6.30]# tail -f /usr/local/apache2/logs/access_20200516.log
3.8Apache配置静态缓存
所说的静态文件指的是图片、js、css等文件,用户访问一个站点,其实大多数元素都是图片、js、css等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。
方法一:
1.配置静态缓存,修改主配置文件,开启expires模块
[root@localhost cert]# vim /usr/local/apache2/etc/httpd.conf #在Directory下插入 LoadModule expires_module modules/mod_expires.so </Directory> <IfModule mod_expires.c> ExpiresActive on ExpiresByType image/png "access plus 1 days" ExpiresByType image/jpeg "access plus 12 hours" </IfModule> # # DirectoryIndex: sets the file that Apache will serve if a directory # is requested. # <IfModule dir_module>
2.重启服务验证,使用curl来验证缓存是否成功
[root@localhost cert]# apachectl -t Syntax OK [root@localhost cert]# apachectl restart [root@localhost cert]# curl -x10.0.0.150:80 'http://10.0.0.150/222.png' -I HTTP/1.1 200 OK Date: Sat, 16 May 2020 15:13:42 GMT Server: Apache/2.4.10 (Unix) OpenSSL/1.0.2k-fips PHP/7.3.18 Last-Modified: Sat, 16 May 2020 15:11:36 GMT ETag: "460f1-5a5c55887fa00" Accept-Ranges: bytes Content-Length: 286961 Cache-Control: max-age=86400 Expires: Sun, 17 May 2020 15:13:42 GMT Content-Type: image/png
方法二:
1.配置静态缓存,修改主配置文件,使用mod_headers模块(默认开启)
[root@localhost cert]# vim /usr/local/apache2/etc/httpd.conf #在Directory下插入 </Directory> <IfModule mod_headers.c> <filesmatch "\.(html|htm|txt)$"> header set cache-control "max-age=6000" </filesmatch> </IfModule> # # DirectoryIndex: sets the file that Apache will serve if a directory # is requested. # <IfModule dir_module>
2.重启服务验证,使用curl来验证缓存是否成功
[root@localhost cert]# vim /usr/local/apache2/htdocs/test1.html [root@localhost cert]# apachectl -t Syntax OK [root@localhost cert]# apachectl restart [root@localhost cert]# curl -x10.0.0.150:80 'http://10.0.0.150/test1.html' -I HTTP/1.1 200 OK Date: Sat, 16 May 2020 15:24:45 GMT Server: Apache/2.4.10 (Unix) OpenSSL/1.0.2k-fips PHP/7.3.18 Last-Modified: Sat, 16 May 2020 15:23:22 GMT ETag: "10-5a5c5829f80c5" Accept-Ranges: bytes Content-Length: 16 cache-control: max-age=6000 Content-Type: text/html
3.9Apache禁止解析PHP
某个目录下禁止解析PHP,这个很有作用,我们做网站安全的时候,这个用的很多,比如某目录可以上传文件,为了避免上传的文件有木马,所以我们禁让这个目录下面的访问解析。
1.修改主配置文件,关闭php_admin_flag
[root@localhost libxml2-2.6.30]# mkdir /usr/local/apache2/htdocs/data/ #创建一个虚拟主机(网站)的家目录 [root@localhost libxml2-2.6.30]# vim /usr/local/apache2/htdocs/data/x.php #创建一个php文件用来测试 <?php echo "hello"; [root@localhost libxml2-2.6.30]# apachectl -t Syntax OK [root@localhost libxml2-2.6.30]# apachectl restart [root@localhost libxml2-2.6.30]# curl 10.0.0.150/data/x.php -I #成功解析php文件 HTTP/1.1 200 OK Date: Sat, 16 May 2020 15:39:38 GMT Server: Apache/2.4.10 (Unix) OpenSSL/1.0.2k-fips PHP/7.3.18 X-Powered-By: PHP/7.3.18 Content-Type: text/html; charset=UTF-8 [root@localhost user1]# vim /usr/local/apache2/etc/httpd.conf #在配置文件最后面插入如下整个部分 <Directory /usr/local/apache2/htdocs/data> #指定该目录下不能解析php文件 php_admin_flag engine off <filesmatch "(.*)php"> Order deny,allow Deny from all </filesmatch> </Directory> [root@localhost apache2]# apachectl -t Syntax OK [root@localhost apache2]# apachectl restart [root@localhost libxml2-2.6.30]# curl 10.0.0.150/data/x.php -I #不能解析php文件 HTTP/1.1 403 Forbidden Date: Sat, 16 May 2020 15:38:37 GMT Server: Apache/2.4.10 (Unix) OpenSSL/1.0.2k-fips PHP/7.3.18 Content-Type: text/html; charset=iso-8859-1