第十二周作业

 

1、描述一次完整的http请求处理过程

简介 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同样有标准的格式。无论是什么客户端或者是什么服务端,大家只要按照HTTP的协议标准来实现的话,那么它一定是通用的

1)客户端发起http请求阶段

客户端在与服务端TCP三次握手建立连接成功后,开始按照指定的格式开始向服务端发送HTTP请求。HTTP请求格式主要有四部分组成,分别是:请求行、请求头、空行、消息体,每部分内容占一行

111

请求行:请求行是请求消息的第一行,由三部分组成:分别是请求方法(GET/POST/DELETE/PUT/HEAD)、请求资源的URI路径、HTTP的版本号

请求头:请求头中的信息有和缓存相关的头(Cache-Control,If-Modified-Since)、客户端身份信息(User-Agent)等等。

消息体:请求体是客户端发给服务端的请求数据,这部分数据并不是每个请求必须的。

2)服务端接收客户端http请求阶段

服务端接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程

3)服务端处理客户端http请求阶段

对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;根据请求报文的头信息,来确定请求合适,编码等

4)服务端根据客户端http请求与访问自己本地资源

获取请求报文中请求的资源,根据请求,从应用->系统内核->驱动->资源存放媒介(硬盘、内存)获取客户端需要的信息

5)服务端构建http响应报文

服务器接收处理完请求后返回一个HTTP相应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。

112

状态行:状态行位于相应消息的第一行,有HTTP协议版本号,状态码和状态说明三部分构成。

响应头:响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。

响应体:响应体是服务端返回给客户端的HTML文本内容,或者其他格式的数据,比如:视频流、图片或者音频数据。

状态码:HTTP的响应状态码由5段组成:

  • 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急…
  • 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
  • 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
  • 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
  • 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。

6)服务端将http响应报文发送给客户端

就是在已建立的tcp链接之上将相应报文及客户请求的数据从应用层,传输层、传输层、链路层、物理层层层打包头依次传输到客户端的物理层、链路层、传输层、应用层层层解包,最后客户端获得自己http请求的数据。

7)服务器关闭tcp连接

 

 

2、httpd所支持的处理模型有哪些,他们分别使用于哪些环境

1)prefork:多进程模型,每个进程响应一个请求;一个主进程负责生成n个子进程,子进程也成为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
优点:成熟稳定,兼容所有新老模块。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,理论上不会超过1024个,在大并发场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

2)worker:多线程模型,每个线程响应一个请求;一个主进程生成多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求;如有m个进程,每个进程有n个线程,则可处理的请求个数为:m*n
优点:占据更少的内存,高并发下表现更优秀。
缺点:

(1)线程的管理要比进程复杂得多。线程之间很多资源是共享的,所以它没有prefork模型那种一个进程服务一个服务请求那么安全稳定;
(2)worker是一个线程服务一个请求,在请求没有完成之前,该线程是与它服务的请求绑定的。worker需要大量的创建进程生成线程,销毁线程,杀死进程的过程;
(3)由于linux不是真线程的操作系统,所以worker在linux上的表现与prefork相比并没有明显优势。
3)event:事件驱动模型,是基于信号驱动I/O 通知机制,每个线程响应n个请求;
优点:并发能力强,并且解决了worker模型下由于线程与请求绑定而导致的线程资源浪费的问题;
缺点:2.4之前的版本仅为测试用,只有2.4之后event才可在生产使用。

 

 

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

首先编译安装httpd

下载安装源码包 apr apr-util httpd

安装环境 [root@localhost ~]# yum -y groupinstall “Development Tools” “Server Platform Development”

yum -y install expat-devel zlib zlib-devel openssl openssl-devel gcc build-essential pcre-devel

然后编译安装apr

tar xf apr-1.6.3.tar.gz

cd apr-1.6.3

./configure –prefix=/usr/local/apr

make && make install

 

然后编译apr-util

tar xf apr-util-1.6.1.tar.gz

cd apr-util-1.6.1

./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr

make && make install

 

然后编译安装httpd

tar xf httpd-2.4.29.tar.gz

./configure –prefix=/usr/local/apache24 –enable-so –enable-ssl –enable-cgi –enable-rewrite –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 –libdir=/usr/lib64/

make && make install

 

设置环境变量

vim /etc/profile.d/httpd.sh

chmod +x /etc/profile.d/httpd.sh

exec /etc/profile.d/httpd.sh

 

防火墙设置

[root@localhost]# iptables -A INPUT -s 0/0 -d 192.168.208.129 -p tcp -j ACCEPT

[root@localhost]# iptables -A OUTPUT -d 0/0 -s 192.168.208.129 -p tcp -j ACCEPT

 

 

编译安装mariadb

yum -y install ncurses-devel

yum -y install cmake

tar xf mariadb-5.5.57.tar.gz

ln -sv mariadb-5.5.57 mysql

cd mysql/

groupadd -r -g 300 mysql

cd mysql/

chown -R root:mysql ./*

mkdir -pv /mydata/data

useradd mysql -u 27 -g 300

chown mysql:mysql /mydata/data/ -R

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/mydata/data -DSYSCONFDIR=/etc -DWITHOUT_TOKUDB=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STPRAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWIYH_READLINE=1 -DWIYH_SSL=system -DVITH_ZLIB=system -DWITH_LOBWRAP=0 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

make && make install

./scripts/mysql_install_db –user=mysql –basedir=/usr/local/mysql/ –datadir=/mydata/data/ –skip-name-resolve

mv /etc/my.cnf{,.bak}

cp support-files/my-large.cnf /etc/my.cnf

cp support-files/mysql.server /etc/rc.d/init.d/mysqld

113

[root@localhost ~]# vim /etc/my.cnf

 

table_open_cache = 256

sort_buffer_size = 1M

read_buffer_size = 1M

read_rnd_buffer_size = 4M

myisam_sort_buffer_size = 64M

thread_cache_size = 8

query_cache_size= 16M

# Try number of CPU’s*2 for thread_concurrency

thread_concurrency = 8

datadir = /mydata/data

basedir = /usr/local/mysql

skip_name_resolve = ON

innodb_file_per_table = ON

 

cd /etc/rc.d/init.d/

chmod +x mysqld

service mysql start

chkconfig –list mysqld

vim /etc/profile.d/mysql.sh

export PATH=/usr/local/mysql/bin:$PATH

chmod +x /etc/profile.d/mysql.sh

exec /etc/profile.d/mysql.sh

 

编译安装php

tar xf php-5.6.32.tar.gz

yum -y install bzip2-devel libmcrypt-devel libxml2-devel php-mysql

libmcrypt-devel这个组件默认光盘里没有,要用有epel源rpm安装

vim /etc/yum.repos.d/epel.repo

[epel]

name=Fedora EPEL

baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/

gpgcheck=0

 

cd php-5.6.32

./configure –prefix=/usr/local/php –with-mysql=/usr/local/mysql/ –with-openssl –with-mysqli=/usr/local/mysql/bin/mysql_config –enable-mbstring –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib –with-libxml-dir=/usr/ –enable-xml –enable-sockets –with-apxs2=/usr/local/apache24/bin/apxs –with-mcrypt –with-config-file-path=/etc/ –with-config-file-scan-dir=/etc/php.d –with-bz2 –enable-maintainer-zts

make && make install

 

修改httpd.conf文件

添加AddType application/x-httpd-php .php

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

修改 DirectoryIndex index.html index.php

测试:cd /usr/local/apache24/htdocs/

vim index.php

<?php

phpinfo();

?>

114

安装wordpress

wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN.zip

[root@localhost wordpress]# unzip wordpress-4.8.1-zh_CN.zip

cp wp-config-sample.php wp-config.php

vim wp-config.php

MariaDB [mysql]> CREATE DATABASE wpdb;

MariaDB [mysql]> GRANT ALL ON wpdb.* TO wpuser@’192.168.%.%’ IDENTIFIED BY ‘wppass’;

MariaDB [mysql]> flush priviliges;

115

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);

 

mkdir -pv /web/vhosts/{www1,www2}

vim /web/vhosts/www1/index.html

vim /web/vhosts/www2/index.html

然后编辑httpd.conf

去掉#  启用虚拟主机

Include conf/extra/httpd-vhosts.conf

然后在最后添加

<Directory “/web/vhosts/www1”>

options none

allowoverride none

Require all granted

</Directory>

 

<Directory “/web/vhosts/www2”>

options none

allowoverride none

Require all granted

</Directory>

 

vim /usr/local/apache24/conf/extra/httpd-vhosts.conf

mkdir /var/log/httpd/

 

<VirtualHost *:80>

ServerAdmin webmaster@dummy-host.example.com

DocumentRoot “/web/vhosts/www1/”

ServerName www1.stux.com

ServerAlias www.dummy-host.example.com

ErrorLog “/var/log/httpd/www1.err”

CustomLog “/var/log/httpd/www1.access” common

</VirtualHost>

 

<VirtualHost *:80>

ServerAdmin webmaster@dummy-host2.example.com

DocumentRoot “/web/vhosts/www2/”

ServerName www2.stux/com

ErrorLog “/var/log/httpd/www2.err”

CustomLog “/var/log/httpd/www2.access” common

</VirtualHost>

在C:\Windows\System32\drivers\etc中找到host文件,然后添加

192.168.208.129 www1.stux.com

192.168.208.129 www2.stux.com

116

117

编辑httpd-vhosts.conf文件

<VirtualHost *:80>

DocumentRoot “/web/vhosts/www1/”

ServerName www1.stux.com

ServerAlias www.dummy-host.example.com

ErrorLog “/var/log/httpd/www1.err”

CustomLog “/var/log/httpd/www1.access” common

<Location “/server-status”>

SetHandler server-status

Options None

AllowOverride None

AuthType Basic

AuthName “Admin”

AuthUserfile “/usr/local/apache24/.htpasswd”

Require user status

</Location>

</VirtualHost>

118

 

5、为第四题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;

1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);

2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com

 

第一步:CA服务器生成私钥

[root@centos ~]# cd /etc/pki/CA/

[root@centos CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)

Generating RSA private key, 2048 bit long modulus

……………….+++

……………………………………………………………………..+++

e is 65537 (0x10001)

[root@centos CA]#

 

第二步:CA服务器生成自签证书

[root@centos CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365

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

 

第三步:为CA提供所需的目录及文件

[root@centos CA]# touch serial index.txt

[root@centos CA]# echo 01 > serial

 

第四步:web服务器生成私钥

[root@localhost ~]# cd /usr/local/apache24/

[root@localhost apache24]# mkdir ssl

[root@localhost apache24]# cd ssl/

[root@localhost ssl]# (umask 077;openssl genrsa -out httpd.key 1024)

Generating RSA private key, 1024 bit long modulus

………………………………………………….++++++

………………………++++++

e is 65537 (0x10001)

 

第五步:web服务器生成证书签署请求

[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365

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 []:

 

第六步:web服务器将请求发给CA服务器

[root@localhost ssl]# scp httpd.csr root@192.168.208.128:/tmp

 

第七步:CA服务器签署证书

[root@centos CA]# openssl ca -in /tmp/httpd.csr -out 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: 1 (0x1)

Validity

Not Before: Nov 11 01:15:00 2017 GMT

Not After : Nov 11 01:15:00 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:

22:C3:53:3A:22:1A:BA:00:47:0E:9E:93:26:58:D9:E6:7D:5D:27:E4

X509v3 Authority Key Identifier:

keyid:AB:86:4B:09:28:03:65:A8:F9:63:02:A9:35:36:3F:3C:BB:03:E4:0B

 

Certificate is to be certified until Nov 11 01:15:00 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

 

第八步:CA服务器将证书发送到web服务器

[root@centos CA]# scp certs//httpd.crt 192.168.208.129:/usr/local/apache24/ssl/

 

第九步:配置httpd支持ssl

[root@localhost ssl]# yum -y install mod_ssl

启用ssl模块

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

LoadModule ssl_module modules/mod_ssl.so

Include conf/extra/httpd-ssl.conf

[root@localhost extra]# vim httpd-ssl.con

<Directory “/web/vhosts/www2/”>

Options None

AllowOverride None

Require all granted

</Directory>

修改SSLCertificateFile “/usr/local/apache24/ssl/httpd.crt”

SSLCertificateKeyFile “/usr/local/apache24/ssl/httpd.key”

 

第十步:将caert.pem导入受信任机构

将httpd.crt导入

打开https站点

119

6、在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程

[root@localhost]# yum -y install httpd php-fpm mariadb-server php-mysql

[root@localhost]# vim /etc/php-fpm.d/www.conf

修改listen = 0.0.0.0:9000

[root@localhost ~]# vim /etc/php-fpm.d/www.conf

#设置默认主页

DirectoryIndex index.php

#是否开启正向代理

ProxyRequests off

#.php后缀的URL请求转发给后端,$1表示小括号内的内容

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1

 

[root@localhost ~]# vim /var/www/html/index.php

<?php

phpinfo();

?>

[root@localhost ~]# systemctl start php-fpm

[root@localhost ~]# systemctl start httpd

 

120

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88316

(1)
上一篇 2017-11-12 11:23
下一篇 2017-11-12 14:18

相关推荐

  • linux文本编辑器,vim编辑器

    定义:文本(纯文本信息,必须是不加任何修饰的文本信息)编辑器 文本编辑器种类:                 行文本编辑器 :sed       &…

    Linux干货 2016-08-10
  • 第四周小练习

    复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限 cp -r /etc/skel /home/tuser1 chmod -R go= /home/tuser1 编辑/etc/group文件,添加组hadoop echo&…

    Linux干货 2016-11-29
  • linux 路由配置及其网络组配置实例

    linux 路由配置及其网络组配置实例   §·路由配置 网络简单拓扑图如下:   ※·实例要求:主机A可以ping同主机B即可。 ※·实验步骤及其要点: 1.主机A设置IP地址与默认网关; 2.配置路由器1两接口的IP地址,并开启主机的路由功能,添加172.14.16.0路由条目; 3.配置路由器1两接口的IP地址,并开启主机的路由功能…

    Linux干货 2016-09-06
  • rpm和yum常用命令选项总结

    =======rpm命令的使用总结====== 安装:  rpm {-i|–install} [install-options] PACKAGE_FILE …     -v: verbose     -vv: more verbose &nbsp…

    Linux干货 2015-12-15
  • 马哥教育网络班21期+第4周课程练习

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 # cp -a /etc/skel /home/tuser1 # chmod -R g-rwx,o-rwx /home/tuser1/ 2、编辑…

    Linux干货 2016-07-16
  • 马哥教育21期网络班—第9周课程+练习—-成长进行时–不退步

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash  declare -i other=0 declare -i nologin=0   &nbs…

    Linux干货 2016-09-05

评论列表(1条)

  • 马哥教育
    马哥教育 2017-11-15 15:03

    作业写的不错,赞。