Web运维架构设计与实现之apache篇
Posted zhufuzhong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web运维架构设计与实现之apache篇相关的知识,希望对你有一定的参考价值。
系统环境:(关闭selinux)
Lamp架构之apache依赖安装及所需依赖包如下:
apr-1.4.5
apr-util-1.3.12
pcre-8.10.zip
libxml2-2.7.6
libmcrypt-2.5.8
zlib-1.2.3
libpng-1.2.31
jpegsrc.v6b.tar.gz
freetype-2.3.5
autoconf-2.68
libgd-2.1.1
httpd-2.4.18
mysql-boost-5.7.17.tar.gz
php-5.6.18
安装步骤如下:
yum -y install gcc gcc-c++ ncurses bison libgcrypt ncurses-devel cmake libtool expat-devel libjpeg-devel openssl perl make libXpm-devel autoconf
tar -xf apr-1.4.5.tar.gz
cd apr-1.4.5
./configure --prefix=/usr/local/apr
make & make install
如果报错:运行make clean再./configure --prefix=/usr/local/apr
make & make install
tar xf apr-util-1.3.12.tar.gz
cd apr-util-1.3.12
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-config
make && make install
tar xf pcre-8.10.tar.gz
cd pcre-8.10
./configure --prefix=/usr/local/pcre
make && make install
tar xf libxml2-2.7.6.tar.gz
cd libxml2-2.7.6
./configure --prefix=/usr/local/libxml2
(如编译错误提示:/bin/rm: cannot remove `libtoolT‘: No such file or directory
Done configuring)在configure里面把RM=‘$RM‘改为RM=‘$RM -f‘再执行上一步操作
make && make install
tar -xf libmcrypt-2.5.8.tar.bz2
cd libmcrypt-2.5.8
./configure --prefix=/usr/local/libmcrypt
make && make install
tar -xf zlib-1.2.3.tar.bz2
cd zlib-1.2.3
./configure
vi Makefile
把CFLAGS=-O3 -DUSE_MMAP修改成CFLAGS=-O3 -DUSE_MMAP -fPIC
make && make install
tar -xf libpng-1.2.31.tar
cd libpng-1.2.31
./configure --prefix=/usr/local/libpng
make && make install
安装jpeg6
这个软件包安装有些特殊,其它软件包安装时如果目录不存在,会自动创建,但这个软件包安装时需要手动创建
mkdir /usr/local/jpeg6
mkdir /usr/local/jpeg6/bin
mkdir /usr/local/jpeg6/lib
mkdir /usr/local/jpeg6/include
mkdir -p /usr/local/jpeg6/man/man1
tar xf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure --prefix=/usr/local/jpeg6/ --enable-shared--enable-static
make && make install
出错make: ./libtool: Command not found
wget:http://ftp.gnu.org/gnu/libtool/libtool-2.2.6a.tar.gz
./configure
make && make install
cd /usr/local/jpeg6/
cp /usr/share/libtool/config/config.sub .
cp /usr/share/libtool/config/config.guess .
然后再执行
tar xf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure --prefix=/usr/local/jpeg6/ --enable-shared--enable-static
make && make install
tar -xf freetype-2.3.5.tar.bz2
cd freetype-2.3.5/builds/unix
./configure --prefix=/usr/local/freetype --enable-shared
make && make install
tar xf autoconf-2.68.tar.gz
cd autoconf-2.68
./configure
make && make install
tar xf libgd-2.1.1.tar.gz
cd libgd-2.1.1
./configure --prefix=/usr/local/gd2 --enable-m4_pattern_allow --with-zlib=/usr/local/zlib --with-jpeg=/usr/local/jpeg6 --with-png=/usr/local/libpng --with-freetype=/usr/local/freetype
make && make install
如果报错回头重装freetype-2.3.5.tar.bz2
tar xf httpd-2.4.18.tar.gz
cd httpd-2.4.18
./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --enable-so --enable-proxy-ajp --enable-rewrite --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre
make && make install
ln -s /usr/local/apache2/bin/apachectl /sbin/httpd
vim /usr/local/apache2/conf/httpd.conf
打开注释,修改ServerName后面内容 localhost.com:80
httpd start
ps -ef | grep httpd
vim /etc/sysconfig/iptables 加上如下
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT(永久)
iptables -I INPUT -p tcp --dport 80 -j ACCEPT临时
service iptables restart
apache 作为linux启动就运行服务程序
cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd
vi /etc/rc.d/init.d/httpd
在#!/bin/sh 下面加上
#chkconfig: 2345 10 90
#description: Activates/Deactivates Apache Web Server
chkconfig --add httpd
chkconfig --list httpd
chkconfig httpd on
安装mysql之前先检查rpm -qa | grep -i mysql
有就用yum remove +包名 卸载
groupadd mysql
useradd -r -g mysql -s /bin/false -M mysql
tar zxvf mysql-boost-5.7.17.tar.gz
cd mysql-5.7.17/
mkdir -p /usr/local/mysql/{data,logs,pids}
chown -R mysql:mysql /usr/local/mysql
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_TCP_PORT=3306 -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
make -j 4
make install
vi /etc/profile
在文件最末尾添加export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
source /etc/profile
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
chkconfig --list | grep mysqld
vi /etc/my.cnf修改如下:
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/pids/mysqld.pid
symbolic-links=0
[client]
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
[mysql]
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
service mysqld start
touch /usr/local/mysql/logs/mysqld.log
touch /usr/local/mysql/pids/mysqld.pid
chown mysql.mysql -R /usr/local/mysql/
service mysqld start
service mysqld status
mysql
如出现出现:
mysqldump:unknown variable ‘sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES /etc/my.cnf 中,把
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 删掉或者注释掉,发现问题解决了
mysql
use mysql
update user set authentication_string=password(‘123456‘) where user=‘root‘;
service mysqld restart
mysql -p123456
tar -xf php-5.6.18.tar.gz
cd php-5.6.18
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=mysqlnd --with-libxml-dir=/usr/local/libxml2/ --with-png-dir=/usr/local/libpng/ --with-jpeg-dir=/usr/local/jpeg6/ --with-freetype-dir=/usr/local/freetype --with-gd=/usr/local/gd2/ --with-zlib-dir=/usr/local/zlib/ --with-mcrypt=/usr/local/libmcrypt/ --with-xpm-dir=/usr/lib64/ --enable-soap --enable-mbstring=all --enable-sockets --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-config-file-path=/usr/local/php/etc
make && make install
httpd.conf文件中检查有没有开启LoadModulephp5_module modules/libphp5.so
没有则添加
在<IfModule mime_module>里面
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
新增一个PHP模块: cd /root/php-5.6.18/ext/mbstring
(假设php安装在/usr/local/php目录下)
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
cd php-5.6.18
cp php.ini-production /usr/local/php/etc/php.ini
vim /usr/local/php/etc/php.ini
在; http://php.net/extension-dir下
加上:
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20131226"
extension = pdo_mysql.so
extension = ftp.so
cd /usr/local/apache2/htdocs/
vim info.php
加入:
<?php
phpinfo();
?>
service httpd restart
浏览器访问:ip/info.php
创建脚本 测试php连接数据库:
vim /usr/local/apache2/htdocs/mysql.php
<?php
$link=mysql_connect(‘localhost‘,‘root‘,‘123456‘);
if(!$link) echo "失败!";
else echo "成功!";
mysql_close();
?>
连接不成功修改思路:
进数据库mysql -p123456
输入命令: STATUS, 查找 UNIX socket 值(连接路径)
进入php.ini
vim /usr/local/php/etc/php.ini查看
pdo_mysql.default_socket= 写上连接路径
mysql.default_socket= 写上连接路径
mysqli.default_socket=写上连接路径
论坛部署
unzip Discuz_X3.1_SC_UTF8.zip
mkdir -p /usr/local/apache2/htdocs/bbs
cd /usr/local/apache2/htdocs/bbs/
mv upload/* /usr/local/apache2/htdocs/bbs/
vim /usr/local/apache2/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.html 后面加上index.php
</IfModule>
httpd restart
cd /usr/local/apache2/htdocs
chmod -R 777 bbs/
浏览器输入ip/bbs出现论坛安装界面
php.ini优化
PHP上传文件时需要关注如下几个参数:
post_max_size= 128M
upload_max_filesize= 128M
#这两个设置一样即可,可以更大但要注意超时
max_execution_time= 30
max_input_time= 600
memory_limit= 32M
禁用php危险函数
禁用方法如下:
打开/etc/php.ini文件,
查找到 disable_functions ,添加需禁用的函数名,如下:
phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen
eval禁用不了,需要借助:php Suhosin
tar xf suhosin-0.9.37.tgz
cd suhosin-0.9.37
/usr/local/php/bin/phpize
./configure -with-php-config=/usr/local/php/bin/php-config
make && make install
echo "extension = suhosin.so" >> /usr/local/php/etc/php.ini
httpd restart
apache的配置文件讲解:
/usr/local/apache2/conf/httpd.conf(apache主要配置文件)
/usr/local/apache2/bin/apachectl(apache启动/关闭程序)
/usr/local/apache2/bin/httpd(httpd是一个启动apache的二进制文件)
/usr/local/apache2/modules(编译的模块存放目录)
/usr/local/apache2/logs/access_log(apache访问日志)
/usr/local/apache2/logs/error_log(apache错误日志)
ServerRoot"/usr/local/apache2"(ServerRoot用于指定守护进程httpd的运行目录)
Listen 80(apache的监听端口)
LoadModulejk_modulemodules/mod_jk.so(加载mod_jk模块)
动态使用LoadModule来加载,然后再配置Userdaemon Group daemon
<ifmodule>.....</ifmodule>(静态的模块)
[email protected](指定的是网站管理员的邮件地址)
ServerNamewww.example.com:80(是指定系统的主机名)
<Directory />
AllowOverridenone
Require all denied
</Directory> #这里的“/”是相对路径,表示DocumentRoot指定的目录
通常利用Apache的rewrite模块对URL进行重写的时候,rewrite规则会写
在.htaccess文件里。但要使apache能够正常的读取.htaccess文件的内容,就必须对.htaccess所在目录进行配置。从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override
AllowOverride常用的选项有两个:All:表示可以读取.htaccess文件的内容,修改原来的访问权限。None:表示不读取.htaccess文件,权限统一控制
在AllowOverride设置为None时,.htaccess文件将被完全忽略。当此指令设置为All时,所有具有".htaccess"作用域的指令都允许出现在.htaccess文件中
Require all granted
表示允许所有请求访问资源
Require all denied
表示拒绝所有请求访问资源
DocumentRoot"/usr/local/apache2/htdocs"(放置网页的路径)
<Directory "/usr/local/apache2/htdocs">
Options IndexesFollowSymLinks
AllowOverrideNone
Require all granted
</Directory>
(DocumentRoot指定目录的权限设定)
Options表示在这个目录内能够执行的操作
Indexes:如果在DocumentRoot指定目录下找不到以index打头的文件时,就将此目录下所有文件列出来,很不安全,不建议使用这个参数
FollowSymLinks:表示在DocumentRoot指定目录下允许符号链接到其它目录
ExecCGI:表示允许在DocumentRoot指定的目录下执行cgi操作
DirectoryIndexindex.html index.htmindex.php(对apache打开网站默认首页的设定, 设置apache依次寻找能打开网站首页的顺序)
ErrorLoglogs/error_log 指定错误日志文件的位置
CustomLoglogs/access_logcommon指定apache访问日志文件的位置和记录日志的模式。
ScriptAlias/cgi-bin/ "/usr/local/apache2/cgi-bin/"是设置cgi脚本的执行权限而已,apache默认在/usr/local/apache2/cgi-bin目录下具有cgi脚本执行权AddTypeapplication/x-compress .Z
AddTypeapplication/x-compress .Z 指定httpd可解析的文件类型
AddTypeapplication/x-gzip.gz.tgz 指定httpd可解析的文件类型。
Addtypeapplication/x-httpd-php.php.phtml指定httpd可解析的文件类型。
静态解析功能
DocumentRoot"/usr/local/apache2/htdocs"ScriptAlias/cgi-bin/ "/usr/local/apache2/cgi-bin/"Alias /www/ "/var/www/html/www"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverrideNone
Options None
Orderallow,deny
Allow from all
</Directory>
虚拟主机功能
vim /usr/local/apache2/conf/httpd.conf
打开注释开启调用虚拟主机功能#Include conf/extra/httpd-vhosts.conf
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 修改如下
<VirtualHost *:80>
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/usr/local/apache2/web1"
ServerName www.web1.com
ServerAlias web1
ErrorLog "logs/web1-error_log"
CustomLog "logs/web1-access_log" common
<Directory "/usr/local/apache2/web1">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/usr/local/apache2"
ServerName www.web2.com
ErrorLog "logs/www.web2-error_log"
CustomLog "logs/web2-access_log" common
<Directory "/usr/local/apache2/web2">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
mkdir /usr/local/apache2/web1
mkdir /usr/local/apache2/web2
vim /usr/local/apache2/web1/index.html
写网页访问内容
vim /usr/local/apache2/web2/index.html
写网页访问内容
httpd restart
vim /etc/hosts
192.168.1.50 www.web1.com
192.168.1.50 www.web2.com
curl www.web1.com
curl www.web2.com
正向代理:客户端访问远端服务器(客户端要想访问国外网站,通过代理服务器去访问国外的网站服务器再返回代理服务器和客户端)
反向代理:客户端通过internet通过反向代理服务器访问内网的web服务器
apache的proxy功能由其proxy模块实现,实现方法如下:
<VirtualHost*:80>
ServerName www.a.org
Proxy Requests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass/ http://192.168.1.10:9000(另启一台装有apache的电脑并开启9000注意:
vim /etc/hosts)
ProxyPassReverse/ http://192.168.1.10:9000(另启一台装有apache的电脑并开启9000注意:vim /etc/hosts)
</VirtualHost>
vim /usr/local/apache2/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
service httpd restart
curl www.a.org
apache的两种应用模式:work、prefork
/usr/local/apache2/bin/httpd–l来确定当前apache运行在哪种模式
如果指定“--with-mpm=MPM”参数,那么apache默认运行在prefork模式下,如果指定的是“--with-mpm=worker”参数,那么默认运行在worker模式下。如果没有做任何模式指定,那么apache默认也运行在prefork模式下。
prefork采用预派生子进程方式,用单独的子进程来处理不同的请求,进程之间彼此独立
prefork模式配置
vim /usr/local/apache2/conf/extra/httpd-mpm.conf
下面这段是prefork模式下的配置参数:
<IfModulempm_prefork_module>
ServerLimit 20000设置更大的值
StartServers 5服务器启动时建立的子进程数量
MinSpareServers 5设置空闲子进程的最大数量
MaxSpareServers 10空闲子进程的最小数量,不要设的太大
MaxClients 256单个进程并发线程数
MaxRequestsPerChild 0每个子进程在其生存期内允许伺服的最大请求数量
</IfModule>
worker模式
worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求
<IfModulempm_worker_module>
StartServers 2服务器启动时建立的子进程数
MaxClients 150允许同时连接的最大接入请求数量(最大线程数量)
MinSpareThreads 25 最小空闲线程数
MaxSpareThreads 75设置最大空闲线程数
ThreadsPerChild 25每个子进程建立的常驻的执行线程数
MaxRequestsPerChild 0设置每个子进程在其生存期内允许服务的最大请求数量,置成非零值防止(偶然的)内存泄漏无限进行,从而耗尽内存
</IfModule>
默认为prefork模式,主要是考虑到稳定性的原因。
要切换到worker模式,则需要登录到linux上,进行如下操作:
进入/usr/sbin目录
cd /usr/sbin
将当前的prefork模式启动文件改名
mv httpd httpd.prefork
将worker模式的启动文件改名
mv httpd.worker httpd
修改配置文件vi /etc/httpd/conf/httpd.conf
Apache+tomcat整合模式:Apache+mod_jk模式
tar xzvf tomcat-connectors-1.2.40-src.tar.gz
cd tomcat-connectors-1.2.40-src/native
chmod 755 buildconf.sh
./buildconf.sh
./configure --with-apxs=/usr/local/apache2/bin/apxs
make && make install
mod_jk.so文件生成到/usr/local/apache2/modules目录下
增加workers.properties文件
vi /usr/local/apache2/conf/workers.properties
worker.list=tomcat1
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
worker.tomcat1.lbfactor=1
设置worker属性的格式为:
worker.worker名字.属性=
这里只说明ajp13协议支持的几个常用属性:
Host:监听ajp13请求的tomcat worker主机地址
Port:tomcat worker主机监听的端口。默认情况下tomcat在ajp13协议中使用的端口为8009
lbfactor:当tomcat用作负载均衡时,此属性被使用,表示此tomcatworker节点的负载均衡权值。映射文件
增加uriworkermap.properties文件
vi /usr/local/apache2/conf/uriworkermap.properties
/*=tomcat1
/admin*=tomcat1
!/*.jpg=tomcat1
!/*.gif=tomcat1
!/*.png=tomcat1
!/*.bmp=tomcat1
!/*.html=tomcat1
!/*.htm=tomcat1
!/*.swf=tomcat1
!/*.css= tomcat1
!/*.js= tomcat1
在上面的配置文件中,“/*=tomcat1”表示将所有的请求都交给tomcat1来处理,而这个
“tomcat1”就是我们在workers.properties文件中由worker.list指定的。这里的“/”是个相对路径,表示存放网页的根目录,这里是上面假定的/webdata/www目录。
“!/*.jpg=tomcat1”则表示在根目录下,以“*.jpg”结尾的文件都不由JK进行处理,其它设置含义类似,也就是让apache处理图片、js文件、css文件以及静态html网页文件。
特别注意,这里有个先后顺序的问题,JK模块在处理网页根目录文件的时候,会首先过滤掉不让自己处理的设定,剩下的设定自己全部处理。
配置apache
vim /usr/local/apache2/conf/httpd.conf
添加LoadModule jk_module modules/mod_jk.so
然后添加如下内容到httpd.conf最下面
JkWorkersFile /usr/local/apache2/conf/workers.properties
JkMountFile /usr/local/apache2/conf/uriworkermap.properties
JkLogFile /usr/local/apache2/logs/mod_jk.log
JkLogLevelinfo
JkLogStampformat"[%a %b %d %H:%M:%S %Y]"
service httpd restart
上面这5行是对JK连接器属性的设定
第一、二行指定Tomcat workers配置文件以及对网页的过滤规则,第三行指定JK模块的日志输出文件,第四行指定日志输出级别,最后一行指定日志输出格式。
tar -xf tomcat-connectors-1.2.43-src.tar.gz
cd apache-tomcat-8.5.32
mkdir /usr/local/tomcat236/
cp -rp * /usr/local/tomcat236/
启动Tomcat需要安装jdk如下
mkdir -p /app/lamt/
tar xf jdk-8u181-linux-x64.tar.gz -C /app/lamt/
cd /app/lamt/jdk1.8.0_181/
vim /etc/profile
export JAVA_HOME=/app/lamt/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile
java –version
cd /usr/local/tomcat236/bin
./startup.sh
cd /usr/local/tomcat236/conf/server.xml (tomcat主配置文件)
<Host name="localhost" appBase="webapps"(网页访问目录)
unpackWARs="true" autoDeploy="true">
unpackWARs="true" 自动解压
autoDeploy="true" 自动部署
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
默认开启8009端口
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
默认开启8080
vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
/etc/init.d/iptables restart
访问浏览器:ip:8080
浏览器访问:ip/index.jsp
cd /usr/local/tomcat236/webapps/ROOT/
cp * /usr/local/apache2/htdocs/
cd /usr/local/apache2/htdocs/
chmod 777 *
浏览器访问:ip/index.jsp
tail -f /usr/local/apache2/logs/access_log(查看访问日志)
以上是关于Web运维架构设计与实现之apache篇的主要内容,如果未能解决你的问题,请参考以下文章