编译安装Apache
[root@zzh /]# yum install gcc* openssl*
建立编译环境,Apache要用到安全连接https所以编译要用到OpenSSL
[root@zzh /]# tar -jxvf apache.tar.bz2
解压源码包,压缩包是gz的用参数-z解压
[root@zzh httpd-2.2.12]# ./configure --prefix=/usr/local/apache2 --with-ssl=/usr/lib --with-mpm=worker --enable-so --enable-ssl --enable-rewrite
编译选项
安装apachen分为动态、静态两种编译方式
动态编译只需要在以后的使用中在配置文件中调整配置文件就可以调整加载模块;静态则相反在编译中就决定了相应的模块。
名词解释:
moduel:Apache的模块,可以实现不同的功能,相当于windows下的dll文件
mod_so:Apache核心通过mod_so模块调用DSO模块,如果编译时包含任意动态模块,mod_so会自动编译到核心
编译选项说明 |
用./configure --help查看具体说明 |
--prefix |
指定安装目录,如果不指定会在默认路径安装 |
--with-ssl |
指定libssl.so文件的路径,RPM和源码安ssl路径不一样,一定要确定好了 |
--with-mpm |
指定mpm使用的什么模块 |
--enable-so |
核心能够装载DSO,不实际编译任何动态模块,如果1.3版本,应改为--enable-module=so |
--enable-ssl |
使用SSL模块功能 |
--enable-rewrite |
主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式 |
–enable-模块 |
编译并包含模块 |
–enable-模块–shared |
将这个模块编译成动态的 |
–enable-mods-shared=most |
动态的编译进来大多数的模块 |
–enable-mods-shared=all |
动态的编译所有的模块,注意:把-shared去掉就是静态编译了 |
[root@zzh httpd-2.2.12]# make && make install
编译并安装
编译PHP
[root@zzh Server]# rpm -ivh libxml2-devel-2.6.26-2.1.2.1.i386.rpm
安装少的RPM包,解析XML文档的函数库
[root@zzh php-5.2.4]# ./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql --with-mysql-sock=/usr/local/mysql/mysql.sock --with-xml --with-dom --with-openssl --enable-ftp
编译配置选项
编译选项说明 |
用./configure --help查看具体说明 |
--with-apxs2 |
在安装时修改Apache配置文件,加入PHP模块,并把模块复制到Apache的模块目录 |
--with-mysql |
对MySQL数据的存取支持,指定MySQL的安装目录 |
--with-mysql-sock |
这里指点MySQL编译选项写的sock位置,注意:一定要检查好了 |
--with-exec-dir=DIR |
有时为了系统的安全性考虑,会指定PHP程序一定要在哪个目录执行 |
[root@zzh php-5.2.4]# make && make install
编译并安装
[root@zzh /]# cp /php-5.2.4/php.ini-dist /usr/local/php5/etc/php.ini
拷贝php解压目录下的php.ini-dist 文件到PHP安装目录
编辑Apache主配置文件
[root@zzh /]# vi /usr/local/apache2/conf/httpd.conf
Apache主配置文件(用rpm包安装的是/etc/httpd/conf/httpd.conf )
注意:配置文件中字母区分大小写
*******************************************************************************************************
ServerRoot "/usr/local/apache2"
Apache安装目录不用改
Listen 80
服务监听端口
ServerAdmin you@example.com
管理员邮件地址
#ServerName zzh.vf.com:80
主站点名称,改成自己主机名,#好去掉
DocumentRoot "/www"
网页存储位置 注意:这里指定的www目录一定要建了服务才能起来
<Directory "/www">
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
对上面主站的控制字段 注意默认没有引号,一定要把Deny(拒接所以)改为Allow
Directory |
对那个站点目录进行控制 |
Options |
目录使用下面哪种特性:FollowSymLinks、ExecGCI、Indexes |
FollowSymLinks |
允许文件系统使用符号连接 |
ExecGCI |
允许执行CGI脚本 |
Indexes |
如果用户找不到默认主页如index,则返回该目录下的文件列表给用户 |
Order |
控制deny和allow两个访问规则那个优先 |
PHP支持部分
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
默认访问文件字段,添加默认PHP默认访问字段
LoadModule php5_module modules/libphp5.so
在PHP编译安装完成后会自动写入这行,如果没有说明编译安装有问题
AddType application/x-httpd-php .php
添加一行用来把PHP为扩展名的文件用PHP程序解析
持久性连接设置
(注意:编译安装的没有下面4个字段,自己添加到配置文件前几行也行,mpm模块可以控制下面的字段,但mpm的设置要比全局的细致,测试用webbench软件)
Timeout 120
超时,发送或接受两个TCP包之间的间隔,及前一个包结束到在发送包之间的时间(这里的单位都是秒)
KeepAlive On
开启持久性连接功能。即当客户端连接到服务器,下载完数据后仍然保持连接状态
MaxKeepAliveRequests 100
一个连接服务的最多请求次数
KeepAliveTimeout 30
持续连接多长时间,该连接没有再请求数据,则断开该连接
用户认证配置
AccessFileName .kt
#注意:没有这个字段添加就行了,这个.kt就是要放到你要认证的目录下用来进行访问控制的,加个点是就成为隐藏文件了
[root@zzh /]# vim /www/rz/.kt |
编辑一个访问控制文件 |
AuthType Basic |
基本认证 |
AuthName "Restricted Files" |
采用文本认证 |
AuthUserFile /zzh/passwd |
指定之前创建的用户认证文件 |
Require user kangte |
只允许kangte用户访问 |
<Directory "/www/rz">
Options FollowSymLinks
AllowOverride AuthConfig
</Directory>
注意:这个标签中这里最重要的是AuthConfig,它表示开启了对"/www/rz"目录的用户认证,这样用户访问这个目录时就会查找目录下的.kt文件进行用户认证
[root@zzh /]# touch /root/passwd
先创建一个空文件
[root@zzh /]# /usr/local/apache2/bin/htpasswd -c /root/passwd kangte
创建用户认证文件passwd,这里创建的是kangte用户,进行密码认证就是用的这个文件
虚拟目录
<IfModule alias_module>
Alias /kt/ "/zzh/"
</IfModule>
#注意:别名kt指向/zzh/目录,这时就可以用本服务器IP/kt/的形式访问/zzh目录了,但要特别注意的是虚拟目录没有默认页,也就是说在/zzh目录下有index.html文件,也要用IP/kt/index.html的形式才能显示
<Directory "/zzh/">
Options Indexes
AllowOverride None
Order allow,deny
allow from all
</Directory>
#注意:这个标签是对上面的虚拟目录进行控制的,默认没有自己添加
虚拟主机
一、基于IP的虚拟主机
实现用192.168.1.10访问 /zzh目录,192.168.1.20访问/kt目录
<VirtualHost 192.168.1.10>
DocumentRoot /zzh #注意这个目录加引号“/zzh”和不加是一样的
ServerName zzh.com
</VirtualHost>
<VirtualHost 192.168.1.20>
DocumentRoot /kt
ServerName kt.com
</VirtualHost>
[root@zzh /]# ifconfig eth0:1 192.168.1.10/24
[root@zzh /]# ifconfig eth0:2 192.168.1.20/24
注意:根据上面的设置,配置对应的IP地址
二、基于IP和端口的虚拟主机
实现192.168.1.99:8080访问/zzh目录,192.168.1.20:8080访问/kt目录
Listen 192.168.1.99:80
Listen 192.168.1.99:8080
Listen 192.168.1.10:80
Listen 192.168.1.20:8080
注意:当指定IP端口是默认的80时,<VirtualHost>中指定的80优先级,要高于<Directory>标签
<VirtualHost 192.168.1.99:8080>
DocumentRoot /zzh
ServerName zzh.com
</VirtualHost>
<VirtualHost 192.168.1.20:8080>
DocumentRoot /kt
ServerName kt.com
</VirtualHost>
三、基于域名的虚拟主机
实现zzh.com访问/zzh目录,kt.com访问/kt目录
Listen 80
Listen 8080
NameVirtualHost 192.168.1.99:80
NameVirtualHost 192.168.1.10:8080
注意:NameVirtualHost如果只有一段,默认80端口可以不写,像上面有两条就必须要加上80端口了
<VirtualHost 192.168.1.99:80>
DocumentRoot /zzh
ServerName zzh.com
</VirtualHost>
<VirtualHost 192.168.1.10:8080>
DocumentRoot /kt
ServerName kt.com
</VirtualHost>
错误日志设置
ErrorLog "logs/error_log"
日志存放目录,注意这个路径是以Apache安装目录的相对路径
LogLevel warn
记录错误日志的级别
注意:
Include conf/extra/httpd-mpm.conf
这条字段的意思是调用别的文件中的内容插入到这里,所以配置mpm模块要到这个相对路径下的文件中修改
*******************************************************************************************************
编辑完文件退出
[root@zzh /]# mkdir /www
建立网页存放目录,对应上面Apache配置文件中的设置,一定要先建,要不服务找不到目录起不来
[root@zzh /]# vi /www/index.php
<?php
phpinfo();
?>
编辑一个index.php文件放到网站目录,用来测试PHP是否编译安装成功
[root@zzh /]# chmod -R 667 /www
依照网站要求给网页文件需要的权限,关键要给其他用户组执行权限
[root@zzh /]# /usr/local/apache2/bin/apachectl start
启动Apache
[root@zzh /]# ln -s /usr/local/apache2/bin/apachectl /etc/init.d/httpd
做个软连接就可以用service 命令管理Apache的启和动关闭了
PHP错误解决
[root@zzh /]# chcon -t textrel_shlib_t /usr/local/apache2/modules/libphp5.so
如果在启动Apache出现无法打开libphp5.so文件错误,给libphp5.so模块一个权限,或直接关闭SELinux
[root@zzh /]# setenforce 0
不重启临时关闭SELinux
SSL加密https连接
[root@zzh /]# mkdir /home/ssl
新建一ssl目录用来存放密钥和证书,可以不建只为管理方便
[root@zzh /]# rpm -ql openssl
查看OpenSSL所在目录,注意是可执行文件
创建RSA私钥
[root@zzh /]# /usr/bin/openssl genrsa -des3 -out /home/ssl/key.key 1024
用OpenSSL工具创建私钥key.key文件,保存到刚建的ssl目录,回车提示输入个密码,这个秘密下面会用到,1024代表生存位数
创建证书签署请求CSR文件
[root@zzh /]# /usr/bin/openssl req -new -key /home/ssl/key.key -out /home/ssl/csr.csr
创建证书签署请求csr.csr文件,回车提示输入密码,输入前面上面输的密码,并填写下面信息
创建自签署文件
[root@zzh /]# /usr/bin/openssl req -x509 -days 365 -key /home/ssl/key.key -in /home/ssl/csr.csr -out /home/ssl/crt.crt
创建crt.crt文件,回车提示密码,输入前面输的秘密
#Include conf/extra/httpd-ssl.conf
在Apache主配置文件httpd.conf中,把#号去掉打开SSL模块
注意:这时打开模块,还不能启动服务器,因为模块还没有配置
[root@zzh /]# vim /usr/local/apache2/conf/extra/httpd-ssl.conf
编辑SSL配置模块文件
DocumentRoot "/www/ssl"
添加SSL安全访问目录,注意:SSL目录一定要在网站主目录WWW下
SSLCertificateFile "/home/ssl/crt.crt"
SSLCertificateKeyFile "/home/ssl/key.key"
#修改上面创建的crt.crt和key,key文件的路径
[root@zzh /]# vim /www/ssl/index.html
编辑一个文件做测试
[root@zzh /]# netstat -tpan | grep 443
查看443端口是否启动
打开网页测试,注意:这里输入的网址是一个跟地址
模块优化
[root@zzh /]# /usr/local/apache2/bin/apachectl -l
列出Apache所有模块,注意:列出的是可以用的模块,不管是不是启用都列出来
多线路并发MPM模块种类:prefork、worker、perchild
注意:MPM必须在编译配置时进行选择,并静态编译到服务器中,必须有且仅有一个MPM被载入到服务器中,就是在编译时指定的,如果要换只能重新编译
区别
模块 |
进程 |
线程 |
内存 |
prefork |
多个子进程 |
每个子进程只有一个线程 |
内存占用大 |
worker |
多个子进程 |
每个子进程有多个线程 |
内存占用小 |
#Include conf/extra/httpd-mpm.conf
在Apache主配置文件httpd.conf中,把#号去掉打开MPM模块
[root@zzh /]# vim /usr/local/apache2/conf/extra/httpd-mpm.conf
注意:只能改编译时指定的模块,改别的也不会生效
一、prefork模块
描述:非线程型的、预派生的模块,效率高,但内存占用大,稳定性和兼容性都很好。注意:每个请求相互独立,一个请求出现问题不会影响其他请求。
工作方式:使用多个子进程,每个子进程只有一个线程
<IfModule mpm_prefork_module>
ServerLimit 256
线程数硬限制突破,注意:这个值最大是20000,如果需要更大就需要重新编译
StartServers 5
服务启动时建立子进程个数
MinSpareServers 5
最小空闲子进程数
MaxSpareServers 10
最大空闲子进程数
MaxClients 150
这个值比较重要,子进程程最大数,就是同时可以处理请求的最大数,注意:这个值最大是256,但远远不够,要突破这个值需要改ServerLimit的值
MaxRequestsPerChild 1000
一个独立的子进程将能处理的最大次数,到达设定值后子进程就会被父进程结束,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理,注意:零代表子进程永远不会结束,一定不要把这个值设为零
</IfModule>
二、worker模块
描述:混合的多线程、多进程的多路处理模块,更好的伸缩性,适合高流量服务器,占用内存小。注意:由于线程共享内存空间,如果一个线程崩溃,整个进程都会连同一起死掉。
工作方式:使用多个子进程,每个子进程有多个线程
<IfModule mpm_worker_module>
ServerLimit 25
子进程硬限制突破,注意:必须在上面,必须大于或等于MaxClients除以ThreadsPerChild的值
ThreadLimit 100
子进程建立线程数硬限制突破
StartServers 2
服务启动时建立子进程个数,要想突破应限制必须改上面的参数,注意:不是改成5个就会启动就建立5个进程,还要看MaxSpareThreads除以ThreadsPerChild的值
MaxClients 150
最大线程数,注意:一定是ServerLimit乘以ThreadsPerChild的值
MinSpareThreads 25
最小空闲线程数
MaxSpareThreads 75
最大空闲线程数
ThreadsPerChild 25
一个子进程建立的线程数
MaxRequestsPerChild 1000
一个独立的子进程将能处理的最大次数,到达设定值后子进程就会被父进程结束,这时候子进程占用的内存就会释放,如果再有访问请求,父进程会重新产生子进程进行处理,注意:零代表子进程永远不会结束,一定不要把这个值设为零
</IfModule>