LINUX搭建LAMP(APACHE+PHP+MYSQL环境)CENTOS7.2版

我们更多的网站服务器是选择了Linux系统,这里建议你选择centos,这也是阿里云ecs推荐的系统,在服务器上比较推荐centos,特别对于新手,首选CentOS,并不是centos比Debian和ubuntu好,而是centos是初学者安装vps的首选,它既稳定,占用资源又少此版本生命周期较长,而且网上有关centos的教程很多,方便学习,我们这里选择了Centos7.2,采用yum在线安装。

一、 检查系统环境

1、确认centos版本

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

2、检查是否安装过apache

rpm -qa | grep httpd

或者:

apachectl -v

或者:

httpd -v

3、检查是否安装过Mysql

service mysqld start

如果未被识别则没有安装
如果系统安装过,或者安装失败,清理一下系统

4、清理Mysql痕迹

yum remove mysql
rm -f /etc/my.cnf

5、卸载Apache包

rpm -qa|grep httpd

注意:如果是新的系统或者你从来没有尝试安装过,则以上步骤省略。

二、安装APACHE、PHP、MYSQL

1、安装apache

[root@localhost ~]# yum -y install httpd

直到返回

......
Installed:
  httpd.x86_64 0:2.4.6-40.el7.centos.4                                          

Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7                      apr-util.x86_64 0:1.5.2-6.el7   
  httpd-tools.x86_64 0:2.4.6-40.el7.centos.4    mailcap.noarch 0:2.1.41-2.el7   

Complete!

表示安装成功!

2、安装Php

[root@localhost ~]# yum -y install php

直到返回:

......
Installed:
  php.x86_64 0:5.4.16-36.3.el7_2                                                

Dependency Installed:
  libzip.x86_64 0:0.10.1-8.el7             php-cli.x86_64 0:5.4.16-36.3.el7_2   
  php-common.x86_64 0:5.4.16-36.3.el7_2   

Complete!

3、安装php-fpm

[root@localhost ~]# yum -y install php-fpm

直到返回:

Installed:
  php-fpm.x86_64 0:5.4.16-36.3.el7_2                                            

Complete!

4、安装Mysql

[root@localhost ~]# yum -y install mysql

直到返回:

Installed:
  mariadb.x86_64 1:5.5.50-1.el7_2                                               

Dependency Updated:
  mariadb-libs.x86_64 1:5.5.50-1.el7_2                                          

Complete!

7.2版本的Centos已经把mysql更名为mariadb,表示安装成功!

5、安装 mysql-server

[root@localhost ~]# yum -y install mysql-server
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirror.lzu.edu.cn
 * extras: mirrors.nwsuaf.edu.cn
 * updates: mirrors.tuna.tsinghua.edu.cn
No package mysql-server available.
Error: Nothing to do

返回错误!!!

分析解决方案

CentOS 7+ 版本将MySQL数据库软件从默认的程序列表中移除,用mariadb代替了,entos7配置教程上,大多都是安装mariadb,因为centos7默认将mariadb视作mysql。

因为mysql被oracle收购后,原作者担心mysql闭源,所以又写了一个mariadb,这个数据库可以理解为mysql的分支。如果需要安装mariadb,只需通过yum就可。

解决方案:

二是从官网下载mysql-server

wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm

yum install mysql-community-server

然后需要确定,输入y回车即可

Install  3 Packages (+8 Dependent packages)

Total download size: 82 M
Is this ok [y/d/N]:

一直选择输入 y ,有两次选择,直到返回:

Replaced:
  mariadb.x86_64 1:5.5.50-1.el7_2      mariadb-libs.x86_64 1:5.5.50-1.el7_2     

Complete!

安装成功!!!

6、安装 php-mysql

[root@localhost ~]# yum -y install php-mysql

直到返回:

Installed:
  php-mysql.x86_64 0:5.4.16-36.3.el7_2                                          

Dependency Installed:
  php-pdo.x86_64 0:5.4.16-36.3.el7_2                                            

Complete!

安装成功!!!

三、安装基本常用扩展包

1、安装Apache扩展包

yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql

返回

......
Installed:
  httpd-manual.noarch 0:2.4.6-40.el7.centos.4                                   
  mod_ssl.x86_64 1:2.4.6-40.el7.centos.4                                        

Complete!

安装成功!!!

2、安装PHP扩展包

yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc php-devel

返回:

......
Dependency Updated:
  pcre.x86_64 0:8.32-15.el7_2.1                                                 

Complete!

安装成功!!!

3、安装Mysql扩展包

yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql

返回:

......
Dependency Installed:
  libdbi.x86_64 0:0.8.4-6.el7         libdbi-drivers.x86_64 0:0.8.3-16.el7     
  unixODBC.x86_64 0:2.3.1-11.el7     

Complete!

安装成功!!!

四、配置APACHE、MYSQL开机启动

重启Apache、mysql服务(注意这里和centos6有区别,Cenots7+不能使用6的方式)

systemctl start httpd.service #启动apache
systemctl stop httpd.service #停止apache
systemctl restart httpd.service #重启apache
systemctl enable httpd.service #设置apache开机启动

启对应服务

service mysqld restart

service php-fpm start

service httpd restart

五、配置MYSQL

初次安装mysql是没有密码的,我们要设置密码,mysql的默认账户为root

设置 MySQL 数据 root 账户的密码:

[root@localhost ~]# mysql_secure_installation

当出现如下提示时候直接按回车:

Enter current password for root

出现如下再次回车:

Set root password? [Y/n]

出现如下提示输入你需要设置的密码,这里输入了root,输入密码是不显示的,回车后再输入一次确认:

New password:

接下来还会有四个确认,分别是:

Remove anonymous users? [Y/n]
Disallow root login remotely? [Y/n]
Remove test database and access to it? [Y/n]
Reload privilege tables now? [Y/n]

直接回车即可。

六、测试环境

1、我们在浏览器地址栏输入http://localhost/如下图,说明我们的apache测试成功

未分类

2、测试Php

进入apache的web根目录:/var/www/html 中写一个最简单的php测试页面

cd /var/www/html

touch phpinfo-test.php

vi phpinfo-test.php

进入到了控制模式之后按键盘字母 i 进入到编辑模式,将如下代码输入到文件中

<?php

echo "<title>Phpinfo Test.php</title>";

phpinfo()

?>

按 esc 退出编辑模式,回到控制模式,输入 :wq 然后回车,在浏览器中输入服地址http://localhost/phpinfo-test.php

出现下图则成功。

未分类

七、小结

1、我们采用了yum在线安装,版本都是默认的Php是5.4,apache的版本是Server version: Apache/2.4.6 (CentOS)

2、要想安装更高版本的php 阅读:centos7.2yum安装php70w.x86_64

3、以上教程亲测完成成功,极力推荐,如果你在调试过程中出现问题,留言讨论,如有错误,敬请指教。

隐藏apache信息

隐藏apache版本信息,为了更好的提高apache的安全我们在设置apache的时候讲apache的系统版本信息隐藏起来。

修改/etc/httpd/conf/httpd.conf文件中的两处

1)设置为Off

ServerSignature Off

2)设置为Prod

ServerTokens Prod

Linux下安装Apache httpd

httpd是Apache超文本传输协议(HTTP)服务器的主程序。它被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池对外提供服务。httpd支持基于 虚拟主机,以及基于HOST、IP、PORT实现虚拟主机,反向代理,负载均衡,路径别名,用户认证,basic,支持第三方模块等众多特性。本文主要描述了Linux下httpd的安装以及相关基本用法。

一、httpd的安装

演示环境及版本

# cat /etc/issue
CentOS release 6.5 (Final)
Kernel r on an m

# uname -r
2.6.32-431.el6.x86_64

查看httpd是否已安装

# rpm -qa httpd

使用yum列出相关httpd安装文件,此处为本地yum源

# yum list |grep httpd     
httpd.x86_64                 2.2.15-29.el6.centos        local_server 
httpd-devel.i686             2.2.15-29.el6.centos        local_server 
httpd-devel.x86_64           2.2.15-29.el6.centos        local_server 
httpd-manual.noarch          2.2.15-29.el6.centos        local_server 
httpd-tools.x86_64           2.2.15-29.el6.centos        local_server 

安装及验证httpd

# yum -y install httpd
# rpm -qa |grep httpd
httpd-tools-2.2.15-29.el6.centos.x86_64
httpd-2.2.15-29.el6.centos.x86_64

使用rpm方式寻找配置文件

# rpm -qc httpd  

常用的配置文件:

/etc/httpd/conf.d/*.conf        ###辅助配置文件
/etc/httpd/conf/httpd.conf      ###主配置文件
/etc/sysconfig/httpd            ###httpd工作模式配置文件

使用rpm方式查看安装位置及生成的二进制文件

# rpm -ql httpd  

主程序:

/usr/sbin/httpd  MPM模式默认
/usr/sbin/httpd.event
/usr/sbin/httpd.worker

使用rpm方式查看包的帮助文件

# rpm -qd httpd   

启动脚本:/etc/rc.d/init.d/httpd

日志文件目录:

/var/log/httpd
    access_log:访问日志
    error_log: 错误日志

站点文档目录:(站点根目录)

/var/www/html

httpd的工作目录:/var/www

二、httpd的工作模式

1、MPM: Multipath Processing Module(多路处理模块)

prefork: 多进程模型,每个进程响应一个请求;稳定性好,但并发能力有限;预先生成多个空闲进程;

由于prefork使用select()系统调用,所以最大并发不能超过1024;

worker:多进程模型,每个进程可生成多个线程,每个线程响应一个请求;预先生成多个空闲线程;

event:一个进程直接响应n个请求;可同时启动多个进程;

httpd-2.2: 测试使用; ### Author : Leshami
httpd-2.4: 可生产使用; ### Blog : http://blog.csdn.net/leshami

2、几种工作方式的切换

prefork模式下

    # service httpd start
    Starting httpd:                                            [  OK  ]
    # ps -ef|grep httpd |grep -v grep ###一个主进程,生成了8个空闲进程
    root       6413      1  0 09:40 ?        00:00:00 /usr/sbin/httpd
    apache     6416   6413  0 09:40 ?        00:00:00 /usr/sbin/httpd
    apache     6417   6413  0 09:40 ?        00:00:00 /usr/sbin/httpd
    apache     6418   6413  0 09:40 ?        00:00:00 /usr/sbin/httpd
    apache     6419   6413  0 09:40 ?        00:00:00 /usr/sbin/httpd
    apache     6420   6413  0 09:40 ?        00:00:00 /usr/sbin/httpd
    apache     6421   6413  0 09:40 ?        00:00:00 /usr/sbin/httpd
    apache     6422   6413  0 09:40 ?        00:00:00 /usr/sbin/httpd
    apache     6423   6413  0 09:40 ?        00:00:00 /usr/sbin/httpd   

    # ss -tulpn |grep httpd
    tcp    LISTEN     0   128  :::80   :::*      users:(("httpd",6413,4),("httpd",6416,4),("httpd",6417,4),("httpd",6418,4),
    ("httpd",6419,4),("httpd",6420,4),("httpd",6421,4),("httpd",6422,4),("httpd",6423,4)

    # netstat -nltp|grep 80
    tcp        0      0 :::80                       :::*          LISTEN      6413/httpd   

worker工作方式

    # cat /etc/sysconfig/httpd|grep -v ^#
    HTTPD=/usr/sbin/httpd.worker

    # service httpd restart
    Stopping httpd:                                            [  OK  ]
    Starting httpd:                                            [  OK  ]
    [root@orasrv1 ~]# ps -ef|grep httpd|grep -v grep
    root       2261      1  0 17:47 ?        00:00:00 /usr/sbin/httpd.worker
    apache     2264   2261  0 17:47 ?        00:00:00 /usr/sbin/httpd.worker
    apache     2265   2261  0 17:47 ?        00:00:00 /usr/sbin/httpd.worker
    apache     2266   2261  0 17:47 ?        00:00:00 /usr/sbin/httpd.worker

event工作方式

注,尽管2.2版本可以设置工作方式为httpd.event,生产环境不建议使用

    # cat /etc/sysconfig/httpd|grep -v ^#
    HTTPD=/usr/sbin/httpd.event
    [root@orasrv1 ~]# service httpd restart
    Stopping httpd:                                            [  OK  ]
    Starting httpd:                                            [  OK  ]
    [root@orasrv1 ~]# ps -ef|grep httpd|grep -v grep
    root       2402      1  0 17:49 ?        00:00:00 /usr/sbin/httpd.event
    apache     2405   2402  0 17:49 ?        00:00:00 /usr/sbin/httpd.event
    apache     2406   2402  0 17:49 ?        00:00:00 /usr/sbin/httpd.event
    apache     2407   2402  0 17:49 ?        00:00:00 /usr/sbin/httpd.event

三、httpd模块化特性

高度模块化

core + modules, 
DSO: Dynamic Shared Object

模块目录:

/etc/httpd/modules: 符号链接文件
/usr/lib64/httpd/modules

模块的查看

    httpd -M          ###查看当前httpd进程的所有模块
    httpd.event -M    ###查看event工作模式下的所有模块 更正@20160712
    httpd.worker -M   ###worker工作模式下的所有模块  更正@20160712
    httpd.worker -l   ###worker工作模式下的核心模块  更正@20160712

模块的查看示例

    # httpd -M
    Loaded Modules:
     core_module (static)
     mpm_prefork_module (static)
     http_module (static)
     so_module (static)
     auth_basic_module (shared)
      ..............

    # httpd.event -l
    Compiled in modules:
      core.c
      event.c
      http_core.c
      mod_so.c

模块的动态装载与卸载

    # cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
    # cat /etc/httpd/conf/httpd.conf |grep authn_alias_module
    LoadModule authn_alias_module modules/mod_authn_alias.so
    # vi /etc/httpd/conf/httpd.conf  ###注释mod_authn_alias.so模块
    # cat /etc/httpd/conf/httpd.conf |grep authn_alias_module
      #LoadModule authn_alias_module modules/mod_authn_alias.so
    # service httpd restart
    # httpd -M   ###使用该方式前后进行对比即可知道模块是否装载或卸载    

四、验证httpd服务

# echo "<h1>orasrv1.xlk.com</h1>" >/var/www/html/index.html
# curl http://192.168.21.10
<h1>orasrv1.xlk.com</h1>

Apache 安全配置要求及操作指南

范围

适用于中国电信使用的Apache服务器。本规范提出了Apache服务器安全配置要求,

适用于所有的安全等级,可作为编制设备入网测试、安全验收、安全检查规范等文档的参考。

由于版本不同,配置操作有所不同,本规范以 unix 平台上 Apache2.02.2 为例,

给出参考配置操作。

缩略语

未分类

安全配置要求

账号

未分类

授权

编号:1

未分类

编号:2

未分类

日志

未分类

禁止访问外部文件

未分类

目录列出

未分类

错误页面重定向

未分类

拒绝服务防范

未分类

隐藏Apache的版本号

未分类

关闭TRACE

未分类

禁用CGI

未分类

监听地址绑定

未分类

未分类

补丁

未分类

更改默认端口

未分类

删除缺省安装的无用文件

未分类

HTTP加密协议

未分类

连接数设置

未分类

禁用非法HTTP方法

未分类

Apache httpd 目录列表禁用配置(options indexes)

Apache httpd服务器在缺省的情况下,开启了基于目录列表的访问,这是一个存在安全隐患的问题,因此可以关闭这个功能。在Apache 2.4的版本中,不在支持使用-indexes来配置,需要注释该功能。本文对此给出演示,供大家参考。

一、缺省情况目录列表可查看示例

当前环境

[root@centos7-web ~]# more /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 

[root@centos7-web ~]# apachectl -v
Server version: Apache/2.4.6 (CentOS)
Server built:  Nov 19 2015 21:43:13

为站点添加index.html页面

# echo "This is a apache test index page" > /var/www/html/index.html
[root@centos7-web ~]# curl http://localhost
This is a apache test index page

移除index.html

[root@centos7-web ~]# mv /var/www/html/index.html /var/www/html/index.tmp

依旧可以访问,不过此时为apache的缺省欢迎页面

未分类

移除apache欢迎页面

[root@centos7-web ~]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bk  
[root@centos7-web ~]# cp /usr/share/backgrounds/* /var/www/html/.

未分类

[root@centos7-web ~]# grep -Ev "^$|^#|*#" /etc/httpd/conf/httpd.conf >/etc/httpd/conf/httpd.conf.tmp
[root@centos7-web ~]# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.1106 
[root@centos7-web ~]# mv /etc/httpd/conf/httpd.conf.tmp /etc/httpd/conf/httpd.conf
mv: overwrite ‘/etc/httpd/conf/httpd.conf’? yes

二、关闭options 中Indexes(关闭文件列表)

[root@centos7-web ~]# vim /etc/httpd/conf/httpd.conf 
 [root@centos7-web ~]# grep "Indexes" -B1 -A3 /etc/httpd/conf/httpd.conf   查看修改后的结果
<Directory "/var/www/html">
#  Options Indexes FollowSymLinks   ##注释该行
    AllowOverride None
    Require all granted
</Directory>

[root@centos7-web ~]# systemctl reload httpd    
[root@centos7-web ~]# curl http://localhost                    
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /
on this server.</p>
</body></html>

三、关闭FollowSymLinks(关闭访问符号链接文件)

[root@centos7-web ~]# ln -sv /etc/redhat-release /var/www/html/redhat-release.html
‘/var/www/html/redhat-release.html’ -> ‘/etc/redhat-release’
[root@centos7-web ~]# ls -hltr /var/www/html/redhat-release.html
lrwxrwxrwx 1 root root 19 Sep 21 16:15 /var/www/html/redhat-release.html -> /etc/redhat-release

[root@centos7-web ~]# curl http://localhost/redhat-release.html                  
CentOS Linux release 7.2.1511 (Core) 

[root@centos7-web ~]# vim /etc/httpd/conf/httpd.conf 
Options None   ##改成Options None 
[root@centos7-web ~]# systemctl reload httpd 

[root@centos7-web ~]# curl http://localhost/redhat-release.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>   ##Author : Leshami
<h1>Forbidden</h1> ## Blog : http://blog.csdn.net/leshami
<p>You don't have permission to access /redhat-release.html
on this server.</p>
</body></html>

NGINX,APACHE开启文件目录浏览功能

我们都知道在apache下可以配置访问web服务器的某个路径时,自动显示其目录下面的文件列表的,其实Nginx一点也不比apache弱,它当然也可以实现这个功能,而且还非常容易和简单;主要用到autoindex 这个参数来开启,其配置如下:

复制代码代码如下:

location / {
root /data/www/file                     //指定实际目录绝对路径;
autoindex on;                            //开启目录浏览功能;
autoindex_exact_size off;            //关闭详细文件大小统计,让文件大小显示MB,GB单位,默认为b;
autoindex_localtime on;              //开启以服务器本地时区显示文件修改日期!
}

如上配置后,用IE访问该服务器的根目录,就会显示出 /data/www/file目录下的所有文件列表,Nginx目录浏览效果图:

未分类

为了备忘,最后将apache下的配置方法也记录一下!实现效果和上面一样!

复制代码代码如下:

Alias / ”/data/www/file”
< Directory  ”/data/www/file” >
Options Indexes                                               //开启目录列表索引模式
Order allow,deny
IndexOptions  NameWidth = 25   Charset = UTF -8     //设定文件名显示长度,文字字符编码
Allow from all
</ Directory >

ubuntu LTS 16.04 编译安装配置Apache

操作系统:ubuntu LTS 16.04
apache版本:2.4.27

一、PRE准备工作

Apache编译安装指南 (http://httpd.apache.org/docs/2.4/install.html) 中给出了编译安装的详细过程,以下是注意事项:

1、安装C编译器

安装C语言编译器gcc-5

sudo apt-get install gcc-5

将gcc符号链接到gcc-5,使gcc命令等同于gcc-5

sudo ln -s /usr/bin/gcc-5 /usr/bin/gcc

2、安装C++编译器

安装C语言编译器g++-5

sudo apt-get install g++-5

将g++符号链接到g++-5,使gcc命令等同于g++-5

sudo ln -s /usr/bin/g++-5 /usr/bin/g++

3、安装make

–fix-missing是修复选项

sudo apt-get install make --fix-missing

4、安装依赖包

sudo apt-get install libexpat1-dev

二、编译安装详细过程

将下载的源码文件都放在/usr/local/src目录下

切换到/usr/local/src目录

cd /usr/local/src

1、安装APR

下载安装APR-1.6.2

去APR官网 (http://apr.apache.org/) 下载对应版本的tar.gz源码压缩包,放到/usr/local/src目录下,并解压

# 解压命令
sudo tar zxvpf apr-1.6.2.tar.gz

进到apr-1.6.2源码目录下

cd apr-1.6.2

编译安装

# 设置输出目录
./configure --prefix=/usr/local/apache2/apr-1.6.2

# 根据自己电脑核数×2来设定并行编译参数,提高编译速度
make -j1 

sudo make install

下载安装APR-util-1.6.0

去APR官网 (http://apr.apache.org/) 下载对应版本的tar.gz源码压缩包,放到/usr/local/src目录下,并解压

# 解压命令
sudo tar jxvpf apr-util-1.6.0.tar.bz2

进到apr-1.6.2源码目录下

cd apr-util-1.6.0

编译安装,注意apr路径参数要与之前apr安装路径参数相同

./configure --prefix=/usr/local/apache2/apr-util-1.6.0 --with-apr=/usr/local/apache2/apr-1.6.2

make -j1

make install

下载安装PCRE

去PCRE官网 (https://sourceforge.net/projects/pcre/files/pcre/) 下载pcre-8.41源码压缩包,放到/usr/local/src`目录下,并解压

# 解压命令
sudo tar zxvpf pcre-8.41.tar.gz

进到pcre-8.41源码目录下

cd pcre-8.41

编译安装

./configure --prefix=/usr/local/pcre-8.41

make -j1

make install

下载安装apache2.4.27

去Apache官网 (http://httpd.apache.org/download.cgi#apache24) 下载apache2.4.27源码压缩包,放到/usr/local/src目录下,并解压

# 解压命令
sudo tar zxvpf httpd-2.4.27.tar.gz

进到httpd-2.4.27.tar.gz目录下

cd httpd-2.4.27

编译安装

sudo ./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apache2/apr-1.6.2 --with-apr-util=/usr/local/apache2/apr-util-1.6.0/ --with-pcre=/usr/local/pcre-8.41 --with-expat=builtin --enable-so --enable-rewrite --enable-ssl

sudo make -j1

sudo make install
  • –prefix : 目标路径

  • –with: 依赖的库文件的路径

  • enable-ssl : 支持SSL加密

  • enable-so : 支持动态加载模块

添加启动脚本apache2到service

sudo cp /usr/local/apache2/bin/apachectl /etc/init.d/apache2

添加apache2到环境变量

# 输出启动脚本至 /home/phdchorus/apache2.sh
sudo echo 'export PATH=$PATH:/usr/local/apache2/bin' > /home/phdchorus/apache2.sh

cd /home/phdchorus

# 修改启动脚本的读写权限
sudo chmod a+x apache2.sh

# 拷贝脚本至目录
sudo cp apache2.sh /etc/profile.d

# 更新脚本状态
source /etc/profile.d/apache2.sh

添加apache2到开机启动项

sudo vim /etc/rc.local

将/etc/profile.d/httpd.sh添加到exit 0之前

/etc/profile.d/apache2.sh

exit 0

启动apache2

sudo service apache2 start

三、Apache配置

转到apache目录下,可以看到以下目录结构

phdchorus@phdchorus:/usr/local/apache2$ ls
bin  conf  error  htdocs  logs  modules
  • bin是apache启动目录

  • conf是apache配置文件目录

  • htdocs是默认的DocumentRoot

  • logs是默认的日志目录

  • modules是apache的扩展链接(PHP扩展、SSL扩展…)所在的目录

转到conf目录下,可以看到以下目录结构

phdchorus@phdchorus:/usr/local/apache2/conf$ ls
extra  httpd.conf  magic  mime.types  original
  • httpd.conf是apache的主配置文件

  • extra中存放了httpd.conf之外的配置文件

安装配置Apache中记录了通过apt-get安装Apache后,对apache的各种配置。apt-get安装apache后,apache配置按照种类分散到多个目录文件下面,主配置文件import这些配置文件,从而实现了配置模块化的效果。而编译安装的apache将几乎所有的配置都放到了主配置文件中,是非常不利于维护的。接下来我们先配置Apache,再按照模块化配置的思路,重构apache的主配置文件。

1、配置Apache

基本配置

因为装机时,我们的计划是将网络服务资源放在/var下,所以要修改DocumentRoot及DocumentRoot对应的Directory项

找到DocumentRoot "/usr/local/apache2/htdocs"
修改为DocumentRoot "/var/www/html" --该目录为自己创建的目录

找到:<Directory "/usr/local/apache2/htdocs"> 
修改为:<Directory "/var/www/html">

配置Apache解析PHP

在主配置文件中写入

LoadModule php7_module modules/libphp7.so

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

修复安全漏洞

在主配置文件中写入

TraceEnable off
ServerSignature off

Apache 获取真实ip的配置的实现方法

Apache 获取真实ip的配置的实现方法

最近因为用了web应用防火墙产品(阿里云的),所以获取不到用户的真实ip。

经过多方搜集尝试,方案如下:

apache2.4提供了自带的remoteip模块可以实现获取真实ip。

我的环境是:ubunt16.04 Apache2.4.18

cd /etc/apache2.mods-available

新建配置文件

vim remoteip.conf

输入:

RemoteIPHeader X-Forwarded-For

RemoteIPProxiesHeader X-Forwarded-By

保存

启用:

a2enmod remoteip

重启apache即可生效。

详细分析apache httpd反向代理的用法

代理方式有两种:正向代理和反向代理。

正向代理是为客户端转发请求,各客户端将请求交给正向代理服务器,正向代理服务器再负责转发给服务端,响应时服务端先响应给正向代理服务器,正向代理服务器再转发给对应的客户端。也就是说,正向代理是为局域网内客户端做代理,它扮演的角色类似于NAT。

反向代理是为服务端转发请求,客户端将请求发送至反向代理服务器,反向代理服务器再将请求转发给真正的服务器以处理请求,响应时后端真正的服务器将处理结果发送给反向代理,再由反向代理构建响应并响应给客户端。

一、正向代理

httpd通过ProxyRequests指令配置正向代理的功能。例如:

ProxyRequests On
ProxyVia On

<Proxy "*">
  Require host internal.example.com
</Proxy>

其中< Proxy >容器表示的是只有internal.example.com下的主机可以通过该正向代理去访问任意URL的请求内容。ProxyVia指令表示在响应首部中添加一个Via字段。

二、反向代理

为了成为一个”基本的”web server,提供静态和动态内容给最终用户,httpd(以及其他大多数web server)可以扮演反向代理服务器的角色,也就是众所周知的”网关”服务器。

在这种场景下,Httpd自身不生成产出数据,而是从后端服务器中获取数据,这些后端服务器器一般不会和外界网络通信。当httpd从客户端接收到请求,请求被代理到后端服务器组中的其中一个服务器上,该后端服务器处理请求,生成内容并返回内容给httpd server,最后由httpd server生成实际的HTTP响应给客户端。

有无数应该使用反向代理的理由,最常见的是安全、高可用、负载均衡、集中授权/认证。反向代理的布置和架构中,后端服务器(真正处理请求的服务器)和外界完全绝缘并由此受到保护,对于外界客户端来说,当他们需要关心服务器对象是谁时,它们得到的结果总是反向代理服务器,而非后端服务器。

一个典型的实现如下:

未分类

2.1 简单的反向代理配置

ProxyPass指令用于映射请求到后端服务器。最简单的代理示例是对所有请求”/”都映射到一个后端服务器上:

ProxyPass "/"  "http://www.example.com/"
ProxyPassMatch "^/((?i).*.php)$" "fcgi://127.0.0.1:9000/var/www/a.com/$1"

为了地址重定向时也能正确使用反向代理,应该使用ProxyPassReverse指令。

ProxyPass "/"  "http://www.example.com/"
ProxyPassReverse "/"  "http://www.example.com/"

或者只为特定的URI进行代理,例如下面的配置,只有/images开头的路径才会代理转发,其他的所有请求都在本地处理。

ProxyPass "/images"  "http://www.example.com/"
ProxyPassReverse "/images"  "http://www.example.com/"

假如本地服务器地址为http://www1.example.com,当请求http://www1.example.com/images/a.gif时,将代理为http://www.example.com/a.gif。

2.2 负载均衡:后端成员

上面的配置中没有添加后端服务器节点,无法享受反向代理的优点。因此,有必要添加后端节点。添加的方法是使用< proxy >容器将后端节点定义成一个负载均衡组,各节点是该组中成员,然后代理目标指向组名即可。

例如:

<Proxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080
    ProxySet lbmethod=bytraffic
</Proxy>

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"

balancer://myset告诉httpd,它创建了一个负载均衡节点集合,名称为myset,此集合中有两个后端成员。在上面的配置中,任意/images的请求都会代理至2个成员中的一个。ProxySet指令指定myset均衡组使用的均衡算法为bytraffic,即基于I/O流量字节数权重的算法。ProxySet指令设置的是Proxy容器的公共属性。

httpd有3种复杂均衡算法:

  • byrequests:默认。基于请求数量计算权重。
  • bytraffic:基于I/O流量大小计算权重。
  • bybusyness:基于挂起的请求(排队暂未处理)数量计算权重。

对于上面的示例,还可以稍加修改,使其支持更多功能。例如添加权重比例,使得某后端节点被转发到的权重是另一节点的3倍,等待后端节点返回数据的超时时间为1秒。

<Proxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    ProxySet lbmethod=byrequests
</Proxy>

ProxyPass "/images"  "balancer://myset/"
ProxyPassReverse "/images"  "balancer://myset/"

2.3 故障转移

还可以再次调整实现故障转移,例如当所有负载节点都失败时,指定一个备份节点(standby node)。参考如下配置:

<Proxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    BalancerMember http://hstandby.example.com:8080 status=+H
    BalancerMember http://bkup1.example.com:8080 lbset=1
    BalancerMember http://bkup2.example.com:8080 lbset=1
    ProxySet lbmethod=byrequests
</Proxy>

ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"

其中成员1、2、4、5是负载节点,成员3是备份节点。当所有负载节点都不健康时,将转发请求给备份节点,并由备份节点处理请求,httpd设置备份节点的方式很简单,只需将状态设置为”H”,表示hot-standby。还需注意的是负载节点4、5,它们额外的参数为lbset=1,不写时默认为0,这是负载均衡时的优先级设置,负载均衡时总是先转发给低数值的节点,也就是说或数值越小,优先级越高。所以上面的配置中,当节点1、2正常工作时,只在它们之间进行负载,此时节点4、5处于闲置状态。只有当节点1、2都失败时,才会在节点4、5之间进行负载。

2.4 提供负载状态显示页面

<Location "/bm">
    SetHandler balancer-manager
    Require host localhost
    Require ip 192.168.100
</Location>

然后在浏览器中输入http://server/bm即可,返回结果如图。

未分类

2.5 proxy相关指令

2.5.1 ProxyPass指令

该指令将远程服务器映射到本地主机上,但本地主机不是真实的服务器,而是远程主机的一个镜像。这个镜像通常称为反向代理服务器或网关。该指令不能用于< Directory >、< Files >容器中,且使用该指令时通常会关闭正向代理,即ProxyRequests=off。

语法:

ProxyPass [path] !|url [key=value [key=value ...]]

path参数为本地主机的URL路径,url参数为远程服务器的url一部分,不能包含查询参数。如果第一个参数path尾随了斜线,则url部分也必须尾随斜线,反之亦然。如果该指令封装在< Location >容器中,则第一个参数path可以省略,因为Location中已经指定了URL路径。如果第二个参数为”!”,则表示此path不使用反向代理功能。

例如:

<Location "/mirror/foo/">
    ProxyPass "http://backend.example.com/foo/"
</Location>

当访问http://server/mirror/foo/bar时,将转发到http://backend.example.com主机上,并请求该主机的/foo/bar文件。下面的配置指令与此等价。

ProxyPass "/mirror/foo/" "http://backend.example.com/foo/"

如果想让某个子目录不进行反向代理,而是在本地处理。可以设置第二个参数为”!”。例如,下面的配置中,/mirror/foo会被代理,但/mirror/foo/i则不会被代理。

ProxyPass "/mirror/foo/i" "!"
ProxyPass "/mirror/foo" "http://backend.example.com"

再需要说明的是连接池,httpd会为后端节点创建连接池,httpd会连接连接池中的各个节点。后端节点属性相同的共享一个连接池。后端节点的属性由key=value参数指定。以下是常见的一些属性设置,完整的属性见官方手册 (http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass) 。

  • keepalive=Off|On:默认为Off。设置httpd和后端节点之间是否开启长连接,注意,这和web服务的长连接不一样,此处设置的是反向代理服务器和后端节点两者连接,当httpd将请求转发给连接池中的一个节点,并等待返回数据,当数据返回完成后,连接立即关闭,如果开启了长连接,连接暂时不关闭,只有等待均衡算法下次轮到该节点时才会再使用该连接。通常只有在httpd和后端节点间使用了防火墙时才设置为On。

  • lbset=N:默认为0。设置后端节点的优先级。数值N越低的,优先级越高。httpd总是会先尝试优先级高的,只有优先级高的节点不可用时,才一会尝试优先级低的。

  • ping=N:默认为0。设置健康状况检查时间间隔。该ping只能检查是否能ping同对方,也就是检测是否能与对方通信。更多的健康状况检查应该使用mod_proxy_hcheck模块。

  • retry=N:默认为60秒。当检测到后端某节点错误状态(error status)时,将在每N秒后才转发一次请求给该节点。设置为0表示正常转发请求,不用任何等待时间。该属性通常设置用来维护服务器下线然后再上线的情况。

  • status=VALUE:将节点手动置为何种状态。包括以下几种状态,各状态可使用”+”(默认)来赋予属性,使用”-“来取消属性。例如”+H”,”S-E”。

    • D: 该节点被禁用,不再接受任何请求。

    • S: 该节点处于管理维护的目的被停止。

    • I: 将该节点设置为无视错误(ignore-errors)模式,此模式下httpd将认为该节点可用,总会转发请求给该节点。

    • H: 该节点处于hot-standby模式,该节点只有在其他所有后端节点都失效时才启用。因此,该节点为备份节点。

    • E: 将该节点设置为错误状态(error-state)。

    • N: 将该节点设置为drain模式,该模式只接受已预定粘滞会话的请求sticky session,其他所有请求都会被忽略。

  • timeout=ProxyTimeout:设置httpd等待后端节点返回数据的超时时间。

如果使用了”balancer://”,例如前面的balancer://myset,将创建一个虚拟的连接池。虚拟连接池中的各节点可共享部分属性,也可以为每个节点设置上面所说的属性。共享属性使用ProxySet指令设置,常见的包括下面几种:

  • lbmethod=METHOD:设置负载均衡算法。有三种:byrequests(默认)按照请求数量计算均衡节点;bytraffic按照io流量计算均衡节点;bybusyness按照繁忙程度计算计算均衡节点。

  • nofailover=On|Off:默认为off。session不可用时是否转移到其他具有相同session的节点上。如果后端节点不支持session复制,应将此项设置为on。

  • stickysession:设置session粘滞的名称,如JSESSIONID、PHPSESSIONID。

例如:

<Proxy balancer://myset>
    BalancerMember http://www2.example.com:8080
    BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
    BalancerMember http://hstandby.example.com:8080 status=+H
    BalancerMember http://bkup1.example.com:8080 lbset=1
    BalancerMember http://bkup2.example.com:8080 lbset=1
    ProxySet lbmethod=byrequests
</Proxy>

ProxyRequests off
ProxyPass "/images/"  "balancer://myset/"
ProxyPassReverse "/images/"  "balancer://myset/"

2.5.2 ProxyPassMatch指令

正则匹配模式的ProxyPass。例如:

ProxyPassMatch "^/(.*.gif)$" "http://backend.example.com/$1"
ProxyPassMatch "^/((?i).*.php)$" "fcgi://127.0.0.1:9000/var/www/a.com/$1"

唯一需要注意的是,在正则匹配之前,远程url参数必须是能够解析的URL地址。例如下面两条指令,第一条指令将失败,因为在正则解析前,url参数无法解析为正确的URL地址,这是一个bug,可以通过修改正则表达式的分组部分将”/”分离出去,正如下面的第二个指令。

ProxyPassMatch "^(/.*.gif)$" "http://backend.example.com:8000$1"
ProxyPassMatch "^/(.*.gif)$" "http://backend.example.com:8000/$1"

2.5.3 ProxySet指令

设置Proxy后端节点的属性。通常用来设置共享属性,但也可以设置某一个节点的属性。

例如:

<Proxy "balancer://hotcluster">
    BalancerMember "http://www2.example.com:8080" loadfactor=1
    BalancerMember "http://www3.example.com:8080" loadfactor=2
    ProxySet lbmethod=bytraffic
</Proxy>
<Proxy "http://backend">
    ProxySet keepalive=On
</Proxy>
ProxySet "balancer://foo" lbmethod=bytraffic timeout=15

2.5.4 < Proxy >容器

< Proxy >容器用于封装一组proxy相关指令,这些指令主要用于设置访问权限、负载均衡成员组以及它们的属性。

例如,下面的设置了只有yournetwork.example.com下的主机才能通过该(正向或反向代理)服务器访问任意请求的内容(使用了*进行通配)。

<Proxy "*">
  Require host yournetwork.example.com
</Proxy>
<Proxy "balancer://hotcluster">
    BalancerMember "http://www2.example.com:8080" loadfactor=1
    BalancerMember "http://www3.example.com:8080" loadfactor=2
    ProxySet lbmethod=bytraffic
</Proxy>

2.5.5 ProxyStatus指令

ProxyStatus {on|off|full}决定是否开启server-status中关于proxy的状态信息,默认为off,full是on的同义词。

例如:

ProxyStatus on
<Location "/server-status">
        SetHandler server-status
        Require all granted
</Location>

以下是关于proxy相关的状态示例:

     ----------------------------------------------------------------------

                 Proxy LoadBalancer Status for balancer://myset

   SSes Timeout Method     
   -    0       byrequests 

   Sch  Host           Stat         Route Redir F Set Acc Wr Rd 
   http 192.168.100.14 Init Ok                  1 0   0   0  0  
   http 192.168.100.15 Init Ok                  3 0   0   0  0  
   http 192.168.100.54 Init Stby Ok             1 0   0   0  0  
   http 192.168.100.16 Init Ok                  1 1   0   0  0  
   http 192.168.100.21 Init Ok                  3 1   0   0  0  

     ----------------------------------------------------------------------

   SSes    Sticky session name         
   Timeout Balancer Timeout            
   Sch     Connection scheme           
   Host    Backend Hostname            
   Stat    Worker status               
   Route   Session Route               
   Redir   Session Route Redirection   
   F       Load Balancer Factor        
   Acc     Number of uses              
   Wr      Number of bytes transferred 
   Rd      Number of bytes read

2.5.6 ProxyVia指令

是否在响应首部中添加”Via:”字段。可以设置为On/Off等。例如如设置为On时:

[root@xuexi ~]# curl -I http://192.168.100.17/index.html
HTTP/1.1 200 OK
Date: Sun, 01 Oct 2017 18:10:17 GMT
Server: Apache/2.4.27 (Unix)
Last-Modified: Sun, 01 Oct 2017 14:10:48 GMT
ETag: "29-55a7cd31f2329"
Accept-Ranges: bytes
Content-Length: 41
Content-Type: text/html; charset=UTF-8
Via: 1.1 customer.sharktech.net

2.6 ProxyPass指令的排序和共享问题

ProxyPass指令有个需要注意的问题,在匹配生效时,最先被匹配到的指令立即生效,后面的都将失效。但如果ProxyPass指令放在< Location >容器中时,由于容器中只能放置一个ProxyPass指令(因为path参数一样),此时匹配越精确的越优先。

例如下面的指令,如果将两个ProxyPass指令位置调换,则/mirror/foo/i也仍会被代理。

ProxyPass "/mirror/foo/i" "!"
ProxyPass "/mirror/foo" "http://backend.example.com"

可以将它们分别定义到< Location >容器中,这样就无需考虑位置顺序,而是考虑匹配的精确程度,因为Location容器自身有加载顺序优先级。例如,下面的配置是可行的。

<Location "/mirror/foo/">
    ProxyPass "http://backend.example.com/"
</Location>
<Location "/mirror/foo/i">
    ProxyPass "!"
</Location>

还需考虑一个共享的问题。下面两个指令中的url参数各有长短,且第一个url是第二个url的子串。这时第二个ProxyPass的属性部分总是会使用第一个指令的属性。因此/examples/bar的请求被转发到backend.example.com/examples/bar时,它的属性timeout=60而非10。这样的属性共享可以减少创建连接池,相对来说更有效一些。

ProxyPass "/apps" "http://backend.example.com/" timeout=60
ProxyPass "/examples" "http://backend.example.com/examples" timeout=10

三、健康状况检查模块

ProxyPass指令自带了ping属性,可用于简单判断后端节点是否健康,只要Ping能通信就认为是健康的。但显然,对于Http服务来说,健康的指标并不能简单地通过它来判断。例如,检测某个页面是否正常、是否允许某方法等。因此,httpd提供了一个专门的健康状况检查模块mod_proxy_hcheck用于个性化订制检查指标。

检查指标也即检查方法有以下几种,由hcmethod指定:

  • TCP:检查是否能与后端节点建立TCP套接字,这就是问对方”你还活着吗”。

  • OPTIONS:发送一个HTTP OPTIONS请求给后端节点。

  • HEAD:发送一个HTTP HEAD请求给后端节点。

  • GET:发送一个HTTP GET请求给后端节点。

该健康状况检查模块认为,只要HTTP方法的检查指标返回2xx或3xx状态码都认为是健康的。

指定了检查方法后,还需订制检查的细节,例如检查的时间间隔。包括以下几项:

  • hcinterval:默认为30秒。发送检查的时间间隔,单位为秒。

  • hcuri:健康检查时,追加在URL后的URI。通常用于GET检查方法。

  • hcpasses:默认为1。表示只有检查了N次后都是通过的,才认为该节点是健康的可再次启用。

  • hcfails:默认为1。表示只有检查了N次后都是失败的,才认为该节点已经不健康,于是禁止使用该节点。

例如,以下是几个健康检查的配置示例:

<Proxy balancer://foo>
  BalancerMember http://www.example.com/  hcmethod=GET hcuri=/status.php
  BalancerMember http://www1.example.com/ hcmethod=TCP hcinterval=5 hcpasses=2 hcfails=3
  BalancerMember http://www2.example.com/
</Proxy>

ProxyPass "/" "balancer://foo"
ProxyPassReverse "/" "balancer://foo"

CentOS 7 系统配置Apache

现在公司的项目由于一直是一个外包团队在维护,一直运行在Windows Server上,我接手之后从长远考虑以及熟练及安全、性能等方面考虑,我最终决定换成Linux,而由于运行的是公司的正式项目,毫无疑问选择了CentOS,至于版本,我选择了最新的CentOS7。而服务器本打算是用流行的Nginx的,但是几个CGI参数始终无法配置好,出于稳定性考虑,最后选择了Apache。

安装基本软件包

由于CentOS 7 自带的PHP版本才5.4,不能满足我们开发的程序的要求,本着能包管理器安装就不编译安装的原则,选择了webstatic这个源的包,更新系统:

yum update

安装EPEL源:

yum install epel-release

安装webstatic源:

rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

安装Apache、安装PHP及Mariadb数据库命令如下:

yum install httpd php56w php56w-mysql php56w-pdo php56w-gd php56w-mcrypt php56w-mbstring php56w-json php56w-xml php56w-openssl mariadb-server -y

对,你没看错,CentOS下的Apache在包管理器中的名字就是httpd。这样就安装好了各个所需要的组件,接下来就是配置了。

Apache基本配置

用 yum 安装的apache,配置文件在 /etc/httpd/ ,我们需要改的各个配置文件都在这个目录下面。

首先,更改/etc/httpd/conf/httpd.conf中的ServerName字段,否则会提示AH00558字段:

[root@localhost ~]# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
Syntax OK

接着,在/etc/httpd/conf.d/下面新建一个example.conf文件,这个就是我们需要的虚拟主机配置文件,如果只是想要HTTP服务,复制下面这段并进行相应修改即可:

<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/example/
ServerAlias example
ErrorLog /var/log/httpd/example.error.log
CustomLog /var/log/httpd/example.log combined
<Directory /var/www/example>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride FileInfo Options
        Order allow,deny
        allow from all
</Directory>
Header unset X-Powered-By
</VirtualHost>

配置完成之后,用apache自带的工具检查是否有语法错误。

配置Apache提供HTTPS服务

但是由于现在的潮流是提供HTTPS服务,我们这个项目也给App端提供数据接口服务,按照苹果的要求以及处于安全性考虑,确实有必要上HTTPS服务,但是考虑到实际业务情况,我们现阶段不打算强制跳转到HTTPS访问,于是采用的是HTTP和HTTPS都可访问策略,这就要求要准备一份SSL证书了,申请证书这一步按下不表,很多途径都可以申请,我这里只记录下配置步骤。

要使用yum包管理器安装的Apache支持SSL,还需要安装一个Apache模块,命令如下:

yum install mod_ssl

然后是增加对应的SSL配置,在上面那个配置文件末尾增加或者新建一个配置文件都行,相应配置:

<VirtualHost *:443>
ServerName https://www.example.com
DocumentRoot /var/www/example/
ServerAlias example
ErrorLog /var/log/httpd/example.error.log
CustomLog /var/log/httpd/example.log combined
<Directory /var/www/example>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride FileInfo Options
        Order allow,deny
        allow from all
</Directory>
SSLEngine on
SSLCertificateFile /var/www/example-ssl/xxx.pem
SSLCertificateKeyFile /var/www/example-ssl/xxx.key
</VirtualHost>

复制,更改对应的项即可。

然后再次检查一下语法是否有误:

httpd -t

如果没问题,可以重启httpd服务:

systemctl restart httpd

额外配置

上面有个配置项我这里记录一下,Header unset X-Powered-By这一行是让Apache隐藏对应的http header,处于安全考虑不允许后端暴露太多信息。

同样需要隐藏的还有Apache的版本号以及操作系统信息,在/etc/httpd/conf/httpd.conf文件末尾增加下面两行:

ServerTokens Prod
ServerSignature Off

最后再检查一下是否有语法错误,如果一切正常则可以重启Apache服务或者重新加载配置文件。

由于Apache是以apache用户组下的apache用户运行的,所以,对应的网站目录文件需要给予对应的权限才能使网站正常运行:

chown -R apache.apache /var/www/example

上面的文件路径改成对应的网站文件路径即可。