1、请描述一次完整的http请求处理过程;
1)客户端和服务器端建立连接。服务器接收或者拒绝请求。 2)服务器端接收客户端请求。接收来自于网络的请求报文中对某资源的一次请求。对请求的处理响应,可分为单进程(启动一个进程处理请求,一次只处理一个)和多进程(并行启动多个进程,每个进程处理一个请求)。 3)服务器端处理客户端请求。对请求报文进行解析,并获取请求的资源和请求方法等相关信息。 4)服务器访问资源。web服务器负责向请求者提供对方请求的静态资源,或动态运行后生成的资源。 5)服务器构建响应报文。 6)服务器发送响应报文 7)服务器端记录日志
2、httpd所支持的处理模型有哪些,他们的分别使用于哪些环境。
prefork:多进程模型,每个进程响应一个请求。 一个主进程,生成n个子进程,每个子进程处理一个用户进程。没有用户请求时,也会预先生成多个空闲进程,随时等待请求到达。进程最大不会超过1024个。 使用于对系统要求稳定请求不是很多的环境。 worker:一个主进程,生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求。会预生成n个空闲线程。 event:事件驱动模型,每个线程响应n个请求。一个主进程,生成m个子进程,每个进程处理n个请求。
3、源码编译安装LAMP环境(基于wordpress程序),并写出详细的安装、配置、测试过程。
首先安装开发环境: yum groupinstall "Development Tools" "Server Platform Development" -y 1. 编译安装Apache 解决依赖关系 (1) 编译安装apr tar xf apr-1.5.0.tar.bz2 cd apr-1.5.0 ./configure --prefix=/usr/local/apr make && make install (2) 编译安装apr-util tar xf apr-util-1.5.3.tar.bz2 cd apr-util-1.5.3 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr make && make install (3)httpd-2.4.9编译过程也要依赖于pcre-devel软件包,需要事先安装。 yum install -y pcre-devel 编译安装httpd-2.4.9 tar xf httpd-2.4.9.tar.bz2 cd httpd-2.4.9 ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --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 make && make install 提供SysV服务脚本/etc/rc.d/init.d/httpd,内容如下: #!/bin/bash # # httpdStartup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve \ #HTML files and CGI. # processname: httpd # config: /etc/httpd/conf/httpd.conf # config: /etc/sysconfig/httpd # pidfile: /var/run/httpd.pid # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"} # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=$? echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else killproc -p ${pidfile} $httpd -HUP RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL 由于脚本中涉及到pid的设置,在/etc/httpd24/httpd.conf主配置文件中添加 PidFile "/var/run/httpd.pid" 给脚本执行权限 chmod +x /etc/rc.d/init.d/httpd 添加服务到开机启动里 chkconfig --add httpd chkconfig httpd on 完成操作后就可以使用service httpd start/stop 等命令来起停服务。 2.编译安装MySQL 添加mysql用户 groupadd –r mysql useradd –g mysql –r –s /sbin/nologin –M –d /mydata/data mysql 创建数据存放目录 /mydata/data mkdir –pv /mydata/data 修改目录所属主及所属组 chown –R mysql:mysql /mydata/data (1) 安装并初始化mysql-5.5.33 tar xf mysql-5.5.33-linux2.6-x86_64-C /usr/local cd /usr/local/ ln -sv mysql-5.5.33-linux2.6-x86_64 mysql cd mysql chown -R root.mysql . (2)执行mysql初始化: /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data --user=mysql 为mysql提供主配置文件 mkdir /etc/mysql cd /usr/local/mysql cp support-files/my-large.cnf /etc/mysq/my.cnf 并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行: thread_concurrency = 2 另外还需要添加如下行指定mysql数据文件的存放位置: datadir = /mydata/data 添加 innodb_file_per_table = on skip_name_resolve = on (2) 为mysql提供sysv服务脚本 cd /usr/local/mysql cp support-files/mysql.server /etc/rc.d/init.d/mysqld chmod +x /etc/rc.d/init.d/mysqld 添加至服务列表: chkconfig --add mysqld chkconfig mysqld on 3. 编译安装php-5.4.26 解决依赖关系 yum -y install bzip2-devel libmcrypt-devel libxml2-devel (1) 编译安装php-5.4.26 tar xf php-5.4.26.tar.bz2 cd php-5.4.26 ./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/apache/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 为php提供配置文件: cp php.ini-production /etc/php.ini (2) 编辑apache配置文件/etc/httpd24/httpd.conf,以使apache支持php 1、添加如下二行 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 2、定位至DirectoryIndex index.html 修改为: DirectoryIndex index.php index.html 测试页面:在/usr/local/apache/htdoc/下添加index.php页面 <?php phpinfo(); ?> 4.wordpress程序的安装 解压WordPress到/usr/local/apache/htdoc/wordpress unzip wordpress-3.3.1-zh_CN.zip –d /usr/local/apache/htdoc/wordpress 启动msyql服务,进入mysql 新建数据库wordpress create database wordpress; 修改root用户的密码 进入mysql数据库,use mysql; 修改root密码,update user set password=PASSWORD('magedu') where User='root'; 重启msqld服务 在浏览器中输入http://192.168.194.129/wordpress 根据提示填写数据库名称,用户名,密码。完成后根据提示创建wp-config.php文件。设置admin的密码等。完成WordPress的安装。
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);
配置文件位置 首先要在主配置文件中找到Include /etc/httpd24/extra/httpd-vhosts.conf,去掉其前面的注释,或者复制一行,使得配置文件能读取到vhosts.conf文件。 访问控制命令: htpasswd –c –m /etc/httpd24/extra/.htpasswd status /etc/httpd24/extra/httpd-vhosts.conf <VirtualHost *:80> DocumentRoot "/web/vhosts/www1" ServerName www1.stuX.com ErrorLog "/var/log/httpd/www1.err" CustomLog "/var/log/httpd/www1.access" common <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 192.168.194 Options None AllowOverride None AuthType Basic AuthName "Warring~~~~~~~~~~~" AuthUserFile "/etc/httpd24/extra/.htpasswd" Require user status </Location> </VirtualHost> <VirtualHost *:80> DocumentRoot "/web/vhosts/www2" ServerName www2.stuX.com ErrorLog "/var/log/httpd/www2.err" CustomLog "/var/log/httpd/www2.access" common </VirtualHost>
5、为第4题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com;
在主配置文件/etc/httpd24/httpd.conf中找到Include /etc/httpd24/extra/httpd-ssl.conf,取消注释或者复制一行。 相关的模块LoadModule ssl_module modules/mod_ssl.so取消注释 配置文件/etc/httpd24/extra/httpd-ssl.conf 修改配置文件 DocumentRoot "/web/vhosts/www2" ServerName www2.stuX.com:443 SSLCertificateKeyFile "/etc/httpd24/ssl/httpd.key" SSLCertificateFile "/etc/httpd24/ssl/www2.httpd.crt" 在/etc/httpd24/ 创建目录ssl mkdir /etc/httpd24/ssl 生成证书请求 umask 077; openssl genrsa -out /etc/httpd24/ssl/httpd.key 2048 openssl req -new -key /etc/httpd24/ssl/httpd.key -days 365 -out /etc/httpd24/ssl/httpd.csr openssl req -new -key /etc/httpd24/ssl/httpd.key -days 365 -out /etc/httpd24/ssl/httpd.csr 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]:MagEdu 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 []: 将请求文件发送给CA,在CA服务器上生成www2.httpd.crt,并把证书发还回来
6、在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程。
题3LAMP架构中,php是以模块形式编译的。 php以fpm方式工作的LAMP架构,编译过程如下: 首先安装开发环境: yum groupinstall "Development Tools" "Server Platform Development" -y 1. 编译安装Apache (1) 编译安装apr,apr-util tar xf apr-1.5.0.tar.bz2 cd apr-1.5.0 ./configure --prefix=/usr/local/apr make && make install tar xf apr-util-1.5.3.tar.bz2 cd apr-util-1.5.3 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr make && make install (2) 编译安装Apache tar xf httpd-2.4.9.tar.bz2 cd httpd-2.4.9 ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --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 # make && make install (3) 提供SysV服务脚本/etc/rc.d/init.d/httpd #!/bin/bash # # httpdStartup script for the Apache HTTP Server # # chkconfig: - 85 15 # description: Apache is a World Wide Web server. It is used to serve \ #HTML files and CGI. # processname: httpd # config: /etc/httpd/conf/httpd.conf # config: /etc/sysconfig/httpd # pidfile: /var/run/httpd.pid # Source function library. . /etc/rc.d/init.d/functions if [ -f /etc/sysconfig/httpd ]; then . /etc/sysconfig/httpd fi # Start httpd in the C locale by default. HTTPD_LANG=${HTTPD_LANG-"C"} # This will prevent initlog from swallowing up a pass-phrase prompt if # mod_ssl needs a pass-phrase from the user. INITLOG_ARGS="" # Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server # with the thread-based "worker" MPM; BE WARNED that some modules may not # work correctly with a thread-based MPM; notably PHP will refuse to start. # Path to the apachectl script, server binary, and short-form for messages. apachectl=/usr/local/apache/bin/apachectl httpd=${HTTPD-/usr/local/apache/bin/httpd} prog=httpd pidfile=${PIDFILE-/var/run/httpd.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd} RETVAL=0 start() { echo -n $"Starting $prog: " LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS RETVAL=$? echo [ $RETVAL = 0 ] && touch ${lockfile} return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d 10 $httpd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then RETVAL=$? echo $"not reloading due to configuration syntax error" failure $"not reloading $httpd due to configuration syntax error" else killproc -p ${pidfile} $httpd -HUP RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;; condrestart) if [ -f ${pidfile} ] ; then stop start fi ;; reload) reload ;; graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" exit 1 esac exit $RETVAL 给脚本执行权限 chmod +x /etc/rc.d/init.d/httpd 将服务加入运行级别 chkconfig --add httpd 修改httpd的主配置文件,设置其Pid文件的路径 编辑/etc/httpd24/httpd.conf,添加如下行即可: PidFile "/var/run/httpd.pid" 2. 编译安装mysql 添加mysql用户 groupadd –r mysql useradd –g mysql –r –s /sbin/nologin –M –d /mydata/data mysql 创建数据存放目录 /mydata/data mkdir –pv /mydata/data 修改目录所属主及所属组 chown –R mysql:mysql /mydata/data (3) 安装并初始化mysql-5.5.33 tar xf mysql-5.5.33-linux2.6-x86_64-C /usr/local cd /usr/local/ ln -sv mysql-5.5.33-linux2.6-x86_64 mysql cd mysql chown -R root.mysql . (2)执行mysql初始化: /usr/local/mysql/scripts/mysql_install_db --datadir=/mydata/data --user=mysql 为mysql提供主配置文件 mkdir /etc/mysql cd /usr/local/mysql cp support-files/my-large.cnf /etc/mysq/my.cnf 并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行: thread_concurrency = 2 另外还需要添加如下行指定mysql数据文件的存放位置: datadir = /mydata/data 添加 innodb_file_per_table = on skip_name_resolve = on (4) 为mysql提供sysv服务脚本 cd /usr/local/mysql cp support-files/mysql.server /etc/rc.d/init.d/mysqld chmod +x /etc/rc.d/init.d/mysqld 添加至服务列表: chkconfig --add mysqld chkconfig mysqld on 3. 编译安装fpm方式工作的php tar xf php-5.4.26.tar.bz2 cd php-5.4.26 ./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 --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 其中—enable-fpm 选项指定php为使用fpm工作方式 make make intall (1)配置php-fpm 为php-fpm提供SysV init脚本,并将其添加至服务列表: cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm 给脚本执行权限 chmod +x /etc/rc.d/init.d/php-fpm 将脚本加入运行级别并设置为开机启动 chkconfig --add php-fpm chkconfig php-fpm on 为php-fpm提供配置文件: cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf 编辑php-fpm的配置文件: vim /usr/local/php/etc/php-fpm.conf 配置fpm的相关选项为你所需要的值,并启用pid文件(如下最后一行): pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 8 pid = /usr/local/php/var/run/php-fpm.pid 接下来就可以启动php-fpm了: service php-fpm start 默认情况下,fpm监听在127.0.0.1的9000端口 netstat -nltp | grep php-fpm tcp0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 10720/php-fpm (2)配置httpd-2.4.9 启用httpd的相关模块 在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 编辑apache配置文件httpd.conf,让apache能识别php格式的页面,并支持php格式的主页 # vim /etc/httpd/httpd.conf 1、添加如下二行 AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps 2、定位至DirectoryIndex index.html 修改为: DirectoryIndex index.php index.html 3、添加php页面重定向,使得php页面的请求都转到php-fpm服务 ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1 在/usr/local/apache/htdocs/index.php里添加测试代码,测试php <?php phpinfo(); ?>
原创文章,作者:oranix,如若转载,请注明出处:http://www.178linux.com/76611