1. 杨乐多小站首页
  2. 技术栈
  3. Other

三 Linux服务及安全管理 作业9

1. 请描述一次完整的http请求处理过程。
三次握手:
主机A 通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我;
主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪佧序列号作为起始数据段来回应我;
主机A 收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段;我已收到回复,我现在要开始传输实际数据了。
这样TCP三次握手就完成了,主机A和主机B 就可以传输数据了。三次握手的特点:没有应用层的数据,SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
TCP建立连接要进行三次握手,而断开连接要进行四次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭。关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接。当一端收到一个FIN,它必须通知应用层TCP连接已终止了这个方向的数据传送,发送FIN通常是应用层进行关闭的结果。
四次断开:
当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求;
主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1;
由B 端再提出反方向的关闭请求,将FIN置1;
主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。

2. httpd所支持的处理模型有哪些,他们的分别使用于哪些环境。
httpd支持的模型有:prefork(2.2版本默认使用)、worker、event。
prefork模型
优点:一个进程服务一个用户请求。稳定可靠、执行效率高,任何一个进程的崩溃不会影响其它请求。
缺点:在大并发的时候对服务器资源消耗严重。
worker模型
一个进程生成多个线程,一个请求用一个线程响应。由于使用线程访问,多个线程共享同一个进程的资源,如果一个进程访问过某一个文件并且打开了,另一个线程访问就不用再次打开。
优点:在高并发的情况下,对服务器的资源消耗相对prefork模型要小很多。
缺点:执行效率、稳定性都不如prefork模型。
event模型
事件驱动模型,每个线程响应n个请求;一个主进程:生成m个子进程,每个进程直接响应n个请求;最大并发响应数是m*n。
优点:并发能力强,并且解决了worker模型下由于线程与请求绑定而导致的线程资源浪费的问题。
缺点:2.4之前的版本仅为测试用,只有2.4之后event才可在生产使用。

3. 源码编译安装LAMP环境(基于wordpress程序),并写出详细的安装、配置、测试过程。
(1)安装httpd(Apache)

apr-1.4+
./configure --prefix=/usr/local/apr
make && make install
apr-util-1.4+
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
httpd-2.4
./configure --prefix=/usr/local/httpd-2.4 --sysconfdir=/etc/httpd-2.4 --enable-so --enable-ssl --enable-cgi --enable-rewrite -enable-static-htpasswd --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
make && make install
# 启动服务
/usr/local/httpd-2.4/bin/apachectl start # 建议将apachectl 添加至系统服务

(2)安装PHP(事先需要安装一些依赖包,包括 libxml2 libxml2-devel 等等)

./configure --prefix=/usr/local/php-7.1.7 --with-apxs2=/usr/local/httpd-2.4/bin/apxs --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=/usr/local/mariadb --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-short-tags --enable-static --with-xsl --enable-ftp        #此处编译参数可多可少,视需要添加
make
make install

注意:上述过程如果报错,针对性解决即可,常见错误是缺少依赖包。
(3)安装MySQL(mariadb)
先安装依赖包:yum install -y ncurses-devel openssl-devel openssl gcc-c++ cmake,可能还有其他依赖包,后面缺什么就装什么。
进入MariaDB源码目录,执行cmake

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mariadb -DMYSQL_DATADIR=/usr/local/mariadb/data  -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
make
make install

# 如果上述过程报错,解决完错误后,需要执行下列命令,再重新执行编译操作。
make clean
rm -f CMakeCache.txt
rm -rf /etc/my.cnf
# 创建MySQL用户和组
groupadd mysql
useradd -r -g mysql mysql
# 指定mariadb的用户和组
chown -R mysql:mysql /usr/local/mariadb

修改相关配置
将编译目录下的配置文件my-small.cnf复制到安装目录:

cp my-small.cnf /usr/local/mariadb/my.cnf
# 编辑my.cnf,在mysqld标签下添加如下内容:
basedir=/usr/local/mariadb
datadir=/usr/local/mariadb/data

初始化数据库配置
进入安装目录下scripts目录,执行初始化配置脚本,创建系统自带的数据库和表

cd scripts
./mysql_install_db --basedir=/usr/local/mariadb --datadir=/usr/local/mariadb/data --user=mysql
# 设置启动脚本
# 将mariadb编译目录中support-files目录下的配置文件mysql.server复制到/etc/init.d/目录
cp mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --list mysqld
# 启动服务
service mysqld start

如果报错:env: /etc/init.d/mysqld: Permission denied,给予权限即可:chmod a+wrx /etc/init.d/mysqld,即可正常启动
设置环境变量

# 编辑 vim /etc/profile.d/mysql.sh,添加如下内容:
export PATH=/usr/local/mariadb/bin:$PATH
# 保存后,执行命令
source /etc/profile.d/mysql.sh

设置头文件

ln -sv /usr/local/mariadb/include/ /usr/local/include/mariadb
`/usr/local/include/mariadb' -> `/usr/local/mariadb/include/'

设置库文件

# 编辑 vim /etc/ld.so.conf.d/mysql.conf,添加以下内容
/usr/local/mariadb/lib
#保存
ldconfig -v #让动态链接库为系统所共享

使用mysql_secure_installation这个脚本来进行安全配置
进入/usr/local/mariadb/bin目录,执行

./mysql_secure_installation # 可以根据提示进行如下五种操作:
# 改变root用户的密码;
# 移除匿名用户;
# 禁止root用户远程登录;
# 不移除test数据库;
# 重载授权表生效;

# 登录MySQL数据库
mysql -u root -p
# 创建WordPress数据库
MariaDB [(none)]> create database wordpress default character set utf8 collate utf8_bin;

# 创建WordPress配置文件,并修改数据库连接信息
[root@centos111 wordpress]# cp wp-config-sample.php wp-config.php

浏览器信息如下:
三 Linux服务及安全管理 作业9
三 Linux服务及安全管理 作业9
4. 建立httpd服务器(基于编译的方式进行),要求:
提供两个基于名称的虚拟主机:
(a)www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access;
(b)www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2.err,访问日志为/var/log/httpd/www2.access;
(c)为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名;
(d)通过www1.stuX.com/server-status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status)。
(1)CentOS 6.8下 安装httpd(apr-1.4.2、apr-util-1.4.1、httpd-2.4.27及其他依赖包)

apr-1.4.2
./configure --prefix=/usr/local/apr
make && make install
apr-util-1.4.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
httpd-2.4.27
./configure --prefix=/usr/local/httpd-2.4 --sysconfdir=/etc/httpd-2.4 --enable-so --enable-ssl --enable-cgi --enable-rewrite -enable-static-htpasswd --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
make && make install

/usr/local/httpd-2.4/bin/apachectl start  # 启动,也可以将其添加至系统服务。

(2)新增修改相关配置文件或目录

# 步骤1:建立相关目录文件
[root@centos111 yangcheng]# mkdir -p /web/vhosts/{www1,www2}
[root@centos111 yangcheng]# echo www1.stuX.com >/web/vhosts/www1/index.html
[root@centos111 yangcheng]# echo www2.stuX.com >/web/vhosts/www2/index.html
[root@centos111 yangcheng]# touch /var/log/httpd/{www1.err,www2.err,www1.access,www2.access}
# 步骤2:将 /etc/httpd-2.4/httpd.conf 里面中心主机的DocumentRoot相关配置注释掉,编辑配置文件 /etc/httpd-2.4/extra/httpd-vhosts.conf(2.2的httpd可能需要自行创建extra目录及相关配置文件)
[root@centos111 conf]# vim /etc/httpd-2.4/extra/httpd-vhosts.conf   #新增如下内容
<VirtualHost *:80>
    ServerAdmin 463374504@qq.com
    DocumentRoot "/web/vhosts/www1"
    ServerName www1.stuX.com
    <Directory "/web/vhosts/www1">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    ErrorLog "/var/log/httpd/www1.err"
    CustomLog "/var/log/httpd/www1.access" common
   
    <Location /server-status>
        SetHandler server-status
        AuthType Basic
        AuthName "please enter your username and password!"
        AuthUserFile "/etc/httpd-2.4/extra/.htpasswd"
        Require user status
    </Location>
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin 463374504@qq.com
    DocumentRoot "/web/vhosts/www2"
    ServerName www2.stuX.com
    <Directory "/web/vhosts/www2">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    ErrorLog "/var/log/httpd/www2.err"
    CustomLog "/var/log/httpd/www2.access" common
</VirtualHost>
# 保存
/usr/local/httpd-2.4/bin/apachectl restart   # 重启httpd服务
# 步骤3:添加可访问server-status的账号status
htpasswd -c -m /etc/httpd-2.4/extra/.htpasswd status #(如果提示命令不存在,可以进入到httpd安装目录下执行该命令)
# 步骤4:修改系统hosts文件,新增域名映射关系,如下:
192.168.245.111 www1.stuX.com
192.168.245.111 www2.stuX.com

至此,所有操作均已完成,效果如下图:
三 Linux服务及安全管理 作业9
三 Linux服务及安全管理 作业9
三 Linux服务及安全管理 作业9
三 Linux服务及安全管理 作业9
5. 为第4题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点。
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu)。
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com。

# 步骤1:建立私有CA,创建私钥文件
[root@centos111 ~]# cd /etc/pki/CA
[root@centos111 CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
..+++
..+++
e is 65537 (0x10001)
# 步骤2:生成证书请求,自己为自己颁发证书
[root@centos111 CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
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) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www2.stuX.com
Email Address []:admin@stuX.com
# 步骤3:为httpd服务生成证书
[root@centos111 CA]# cd /etc/httpd-2.4/
[root@centos111 httpd-2.4]# mkdir ssl
[root@centos111 httpd-2.4]# cd ssl
[root@centos111 ssl]# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
.................................................................+++
............+++
e is 65537 (0x10001)
[root@centos111 ssl]# openssl req -new -key httpd.key -out httpd.csr -days 3655
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) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www2.stuX.com
Email Address []:admin@stuX.com

Please enter the following '
extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@centos111 ssl]# ls
httpd.csr  httpd.key
[root@centos111 ssl]# openssl ca -in /etc/httpd-2.4/ssl/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Jul 18 11:11:30 2017 GMT
            Not After : Jul 18 11:11:30 2018 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = HA
            organizationName          = MageEdu
            organizationalUnitName    = Ops
            commonName                = www2.stuX.com
            emailAddress              = admin@stuX.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                E4:62:B2:D4:F7:A4:14:20:1D:3B:BE:F3:69:F0:57:22:9B:9A:71:E2
            X509v3 Authority Key Identifier:
                keyid:C1:56:2B:0B:BB:3F:62:A5:22:C4:A8:A2:B0:5B:96:D4:A4:4A:DF:13

Certificate is to be certified until Jul 18 11:11:30 2018 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
# 步骤4:将上述生成的httpd.crt文件,复制到 httpd 服务 ssl 目录
[root@centos111 ssl]# cp /etc/pki/CA/certs/httpd.crt /etc/httpd-2.4/ssl/
[root@centos111 ssl]# ll
total 16
-rw-r--r--. 1 root root 4561 Jul 18 19:19 httpd.crt
-rw-r--r--. 1 root root 1033 Jul 18 19:04 httpd.csr
-rw-------. 1 root root 1679 Jul 18 19:01 httpd.key
# 步骤5:修改配置文件,提供 ssl 服务
# vim /etc/httpd-2.4/httpd.conf, 开启 LoadModule ssl_module modules/mod_ssl.so 和 Include /etc/httpd-2.4/extra/httpd-ssl.conf 模块
# vim /etc/httpd-2.4/extra/httpd-vhosts.conf  删除www2在配置信息
# vim /etc/httpd-2.4/extra/httpd-ssl.conf     屏蔽默认SSLCertificateFile和SSLCertificateKeyFile信息
<VirtualHost 192.168.245.111:443>
    ServerAdmin yc@qq.com
    DocumentRoot "/web/vhosts/www2"
    ServerName www2.stuX.com:443
    <Directory "/web/vhosts/www2">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    ErrorLog "/var/log/httpd/www2.err"
    CustomLog "/var/log/httpd/www2.access" common
    SSLCertificateFile "/etc/httpd-2.4/ssl/httpd.crt"
    SSLCertificateKeyFile "/etc/httpd-2.4/ssl/httpd.key"
</VirtualHost>
# 步骤6:重启httpd服务

重启时若报错:SSLSessionCache: ‘shmcb’ session cache not supported (known names: ).
开启 LoadModule socache_shmcb_module modules/mod_socache_shmcb.so 模块,重启服务即可
至此,https配置完成,如下图:
三 Linux服务及安全管理 作业9
6. 在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程。
(1)PHP编译成以httpd模块形式工作,在本次作业第3题里面已经采用。
关键点在于:
a. PHP编译时,需要加上参数 –with-apxs2=/usr/local/httpd-2.4/bin/apxs,指明httpd服务目录;(apxs2表示httpd-2.X版本)
b. 编辑httpd.conf配置文件,加上 AddType application/x-httpd-php .php,便于httpd识别PHP类型文件。
(2)PHP编译成以fpm形式工作
关键点在于:
a. 在执行configure脚本时需要使用fpm选项,而–with-apxs2这一项参数就不需要了;
b. 在Apache httpd 2.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

c. 配置虚拟主机支持使用fcgi

# 关闭正向代理
ProxyRequests Off
#把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://127.0.0.1:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1

原创文章,作者:iConan,如若转载,请注明出处:https://www.aspyc.com/archives/222.html

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据