作为程序员一定要保持良好的睡眠,才能好编程

linux安装apache安装服务及相关配置

发布时间:2019-07-11

近日在学习反向代理,反向代理使用了  nginx  与 apache的结合。

其中 nginx主要负责 html 以及静态页面的处理,php交给apache处理。


这叫动静分离,其实叫反向代理。呵呵。


我机器上只安装了nginx  没有apache,现在来安装一下apache,然后设置下反向代理:


我们下载最新的安装包,进行安装:


https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/


我们选择最新版本进行安装:


 httpd-2.4.34.tar.gz     2018-07-14 04:45  8.7M  HTTP Server project


我本地已经下载好。


httpd-2.4.34.tar.gz



其实可以使用yum进行安装   rpm qa| grep httpd   检测是否安装 ,如果安装了,可以使用 yum remove httpd 进行卸载。


声明:


这两项必须编译安装:


打开 https://mirrors.cnnic.cn/apache/apr/  去找一下 最新安装包,


我这里已经下载好了,现在上传上来:

apr-util-1.6.1.tar.gz

apr-1.6.3.tar.gz



# mkdir /usr/local/apr

# tar xvf apr-1.6.3.tar.gz

#cd apr-1.6.3

#./configure --prefix=/usr/local/apr

#make && make install


apr-util

# mkdir /usr/local/apr-util

# tar xvf 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



然后进行apache的安装:


#tar -xf httpd-2.4.34.tar.gz
#cd httpd-2.4.34
#./configure \
--prefix=/usr/local/apache \
--sysconfdir=/usr/local/apache/confs \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--enable-mods-shared=most \
--enable-mpms-shared=all \
--with-mpm=prefork
#make && make install



温馨提示: ./configure 编译完成后 出现这个页面

apache_install.png


执行完 make && make install 会出现这个页

apache_install_success.png


哎,没有提醒安装成功,截图保存下,以便后期查看。


apache的配置文件位于  /etc/httpd/conf/httpd.conf


编辑的位置有两点:


1、监听端口  默认80    Listen 8080

    

2、打开 ServerName localhost   前边的注释

     如若没有打开在启动apache的时候会报错,httpd: Could not reliably determine the server's fully qualified domain name


3、找到 Directory  改成下面

<Directory />
    Options +Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

4、打开虚拟机配置文件

# Virtual hosts

Include confs/extra/httpd-vhosts.conf



虚拟机设置:

#mkdir -p /usr/local/apache/www/test

#vim /usr/local/apache/confs/extra/httpd-vhosts.conf

# #把不需要的VirtualHost 去掉,加上真实的地址。

Listen 8081
<VirtualHost *:8081>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/usr/local/apache/www/test"
    ServerName localhost:8081
    #ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-8081-error_log"
    CustomLog "logs/dummy-8081-access_log" common
</VirtualHost>


保存退出。





服务器启动:


进入 /usr/local/apache/bin/ 目录下 执行:


#apachectl start    //启动服务器


#apachectl restart  //重新启动


#apachectl stop  //停止




DocumentRoot 指定网站根目录


DirectoryIndex 设置网站默认首页 

语法:DirectoryIndex index.html index.htm index.php  就是依次查找 index.html 如果不存在查找 index.htm 如果也是不存在就查找index.php


Listen 监听端口



<Directory>

Options  如果文件不存在是否显示列表 ,默认取值All     取值范围  none  All   Indexes ....

PS: none 禁用服务器特性  ;All 开启服务器所有特性  ;Indexes 如果首页文件不存在,则显示目录列表

        ExecCGI 是否可执行(php)     FollowSymLinks  



Order 指定Deny 和 Allow 的执行顺序

PS:   Order:指定Allow(允许)和Deny(禁止)的执行顺序。
Order Allow,Deny 先允许访问,再禁止IP访问
Order Deny,Allow 先禁止所有访问,再开启指定IP的访问

Deny From 192.168.1.99

Allow From All

</Directory>



禁用IP地址:

看图说话:

denyip.png


Deny From All #禁止所有IP访问你的主机,包括你自己。

Deny From 127.0.0.1 192.168.1.22 #禁止指定IP访问你的主机。禁止客户端的IP地址

Deny From 127.0.0.1 192.168.1.22 #同时禁用两个外部IP访问你的主机

Deny From 192.168.1 #禁止网段介于192.168.1.0~192.168.1.255之间所有IP访问




简单说明 一个虚拟服务器下可以配置多个<Directory> 的标签,可以为单独的目录配置不同的权限

比如说 目录浏览,是否可以执行php文件?  或是否可以创建目录?


禁止某个目录执行php文件的方法:

第一种:

  <Directory "E:\phpStudy\WWW\yangrou\nophp">
      Options none
  </Directory>

第二种:

 <Directory "E:\phpStudy\WWW\yangrou\nophp">
    <FilesMatch "\.(?i:php)$"> 
      #?是尽可能多的匹配.php的字符串,i是不区分大小写,然后冒号后面跟上正则表达式,
      #也可以写成:<FilesMatch "\.(php|php3)$">
      Order allow,deny
      Deny from all
    </FilesMatch>
  </Directory>


都是禁用执行php文件的,由此可以连想到一些其他的禁用也是可以这样做的。



配置404页面:


如果文件找不到,指向根目录下的404页面


404、.png

<VirtualHost *:80>
    DocumentRoot "E:\phpStudy\WWW\yangrou"
    ServerName www.jfsc.com 
    ServerAlias www.hhh.com
    ErrorDocument 404 404.html
  <Directory "E:\phpStudy\WWW\yangrou">
      Options All FollowSymLinks ExecCGI
      AllowOverride All
      Order allow,deny
      Allow from all
      #deny from 127.0.0.1 192.168.1.22
      Require all granted      
  </Directory>
  
</VirtualHost>


解释说明:
ErrorDocument 404 404.html   如果没有写路径,则在服务器运行时遇到404  直接会打印出  404.html 这样的字符串

ErrorDocument 404 /404.html 带有根目录的404 页面,会显示出 根目录下的404 文件内容。


配置中正则是使用方法

~ 与指定正则表达式模式匹配时返回真  判断匹配与否 是区分大小写的

~*与指定正则表达式模式匹配时返回真 判断匹配与否 不分区大小写

!-与指定正则表达式不匹配时返回真 区分大小写

!-*与指定正则表达式不匹配时返回真  不区分大小写


<VirtualHost *:80>
        DocumentRoot /data/webroot/www/mytyrenet2017
        ServerName  mytyrenet.com      
        ErrorLog "/data/webroot/www/mytyre17/default-error.log"
        CustomLog "/data/webroot/www/mytyrenet2017/default.log" common
        ErrorDocument 404 /404.html
        #禁止data目录下所有的html文件访问
        <Directory "/data/webroot/www/mytyrenet2017/data">
                <Files ~ "\.html$">

                Order allow,deny
                Deny from all

                </Files>
        </Directory>
</VirtualHost>






禁止访问某些文件/目录

在数据库配置文件或一些重要文件的时候,通常会禁止通过http去请求访问,

这需要对这一类或同一个目录下更或者是某一个文件,进行访问配置:

比如说,网站下 有一个配置文件  config.inc,需要禁止http请求访问,怎么做?


<VirtualHost *:80>
    ...
    
    <Files ~ "\.inc$">
    Order allow,deny
    Deny from all
    </Files>
    
    ...
    
</VirtualHost>


未加代码前

denyfile.png

加上代码后

denyfiletrue.png

我们看到已经成功的禁止掉了 所有后缀为 inc 文件的访问。


如果只是单独过滤一个文件,只需要

<VirtualHost *:80>
    ...
    
  <Files ~ "config.inc$">
    Order allow,deny
    Deny from all
  </Files>
    
    ...
    
</VirtualHost>

添加这样的代码,保存 即可。



禁止访问某些指定的目录:(可以用 <DirectoryMatch> 来进行正则匹配)

<Directory ~ "^/var/www/(.+/)*[0-9]{3}">
Order allow,deny
Deny from all
</Directory>


<FilesMatch \.(?i:gif|jpe?g|png)$>
Order allow,deny
Deny from all
</FilesMatch>




<Directory />
    Options +Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>


apache配置Directory目录权限的一些配置
可以使用<Directory 目录路径>和</Directory>这对语句为主目录或虚拟目录设置权限,它们是一对容器语句,必须成对出现,它们之间封装的是具体 的设置目录权限语句,这些语句仅对被设置目录及其子目录起作用。下面是主配置文件中设置目录权限的例子。

<Directory "/var/www/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
(1)定义目录使用哪些特性

Options Indexes MultiViews
Options选项用于定义目录使用哪些特性,包括Indexes、MultiViews和ExecCGI等,如表7-1所示。

表7-1           目录特性选项

 

命令说明
Indexes	允许目录浏览
当客户仅指定要访问的目录,但没有指定要访问目录下的哪个文件,而且目录下不存在默认文档时,Apache以超文本形式返回目录中的文件和子目录列表(虚拟目录不会出现在目录列表中),如图7-8所示

MultiViews	允许内容协商的多重视图
MultiViews其实是Apache的一个智能特性。当客户访问目录 中一个不存在的对象时,如访问“http://192.168.16.177/icons/a”,则Apache会查找这个目录下所有a.*文件。由于 icons目录下存在a.gif文件,因此Apache会将a.gif文件返回给客户,而不是返回出错信息

All	All包含了除MultiViews之外的所有特性,如果没有Options语句,默认为All
ExecCGI	允许在该目录下执行CGI脚本
FollowSymLinks	可以在该目录中使用符号连接
Includes	允许服务器端包含功能
IncludesNoExec	允许服务器端包含功能,但禁用执行CGI脚本
让主目录允许目录浏览

细心的用户可能会发现虽然在主目录设置了Indexes权限,且主目录中并不存在默认文档,但访问时并不会出现目录列表,而只出现Apache的测 试页面。解决这个问题的方法很简单,只要将位于/etc/httpd/conf.d/目录下的welcome.conf文件删除后重启Apache即可。

允许目录浏览要小心

一旦定义允许目录浏览,就会将Web站点的文件夹和文件名结构暴露给黑客。目录浏览还会允许黑客浏览文件并掌握服务器配置信息,所以指定该权限往往带来安全性上的隐患。除非有充足的理由要使用目录浏览,否则应该禁用它。

(2)设置.htaccess文件中的指令类型

AllowOverride None
AllowOverride选项用于定义位于每个目录下.htaccess(访问控制)文件中的指令类型。基于安全和效率的原因,虽然可以通 过.htaccess来设置目录的访问权限,但应尽可能地避免使用.htaccess文件,所以一般将AllowOverride设置为”None”,即 禁止使用.htaccess文件,而将目录权限的设置放在主配置文件httpd.conf的<Directory> 和</Directory>语句之间。

(3)设置缺省的访问权限与Allow和Deny语句的处理顺序

Order allow, deny
Order选项用于定义缺省的访问权限与Allow和Deny语句的处理顺序。Allow和Deny语句可以针对客户机的域名或IP地址进行设置,以决定哪些客户机能够访问服务器。Order语句通常设置为以下两种值之一。

allow, deny:缺省禁止所有客户机的访问,且Allow语句在Deny语句之前被匹配。如果某条件既匹配Deny语句又匹配Allow语句,则Deny语句会起作用(因为Deny语句覆盖了Allow语句)。

deny, allow:缺省允许所有客户机的访问,且Deny语句在Allow语句之前被匹配。如果某条件既匹配Deny语句又匹配Allow语句,则Allow语句会起作用(因为Allow语句覆盖了Deny语句)。
下面举一些例子来说明Order、Allow和Deny语句的使用方法。

【例1】允许所有客户机的访问。

Order allow,deny
Allow from all
【例2】除了来自hacker.com域和IP地址为192.168.16.111的客户机外,允许所有客户机的访问。

Order deny ,allow
Deny from hacker.com
Deny from 192.168.16.111
【例3】仅允许来自网络192.168.16.0/24客户机的访问。

Order allow,deny
Allow from 192.168.16.0/24
对比:

Order deny ,allow
Allow from 192.168.16.0/24
这两条语句是允许所有客户机的访问。

【例4】仅允许来自网络192.168.16.0/24客户机的访问,但IP地址为192.168.16.111的客户机除外。

Order allow,deny
Allow from 192.168.16.0/24
Deny from 192.168.16.111
对比:
Order deny ,allow
Allow from 192.168.16.0/24
Deny from 192.168.16.111
由于Allow语句覆盖了Deny语句,因此这3条语句是允许所有客户的访问




%a 远端IP地址
%A 本机IP地址
%B 除HTTP头以外传送的字节数
%b 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-'而不是0。
%{Foobar}C 在请求中传送给服务端的cookieFoobar的内容。
%D 服务器处理本请求所用时间,以微为单位。
%{FOOBAR}e 环境变量FOOBAR的值
%f 文件名
%h 远端主机
%H 请求使用的协议
%{Foobar}i 发送到服务器的请求头Foobar:的内容。
%l 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。
%m 请求的方法
%{Foobar}n 来自另一个模块的注解Foobar的内容。
%{Foobar}o 应答头Foobar:的内容。
%p 服务器服务于该请求的标准端口。
%P 为本请求提供服务的子进程的PID。
%{format}P 服务于该请求的PID或TID(线程ID),format的取值范围为:pid和tid(2.0.46及以后版本)以及hextid(需要APR1.2.0及以上版本)
%q 查询字符串(若存在则由一个"?"引导,否则返回空串)
%r 请求的第一行
%s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。
%t 时间,用普通日志时间格式(标准英语格式)
%{format}t 时间,用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式)
%T 处理完请求所花时间,以秒为单位。
%u 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)
%U 请求的URL路径,不包含查询字符串。
%v 对该请求提供服务的标准ServerName。
%V 根据UseCanonicalName指令设定的服务器名称。
%X 请求完成时的连接状态:X= 连接在应答完成前中断。
+= 应答传送完后继续保持连接。
-= 应答传送完后关闭连接。

(在1.3以后的版本中,这个指令是%c,但这样就和过去的SSL语法:%{var}c冲突了)
%I 接收的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。
%O 发送的字节数,包括请求头的数据,并且不能为零。要使用这个指令你必须启用mod_logio模块。

修饰符
可以紧跟在"%"后面加上一个逗号分隔的状态码列表来限制记录的条目。例如,"%400,501{User-agent}i" 只记录状态码400和501发生时的User-agent头内容;不满足条件时用"-"代替。状态码前还可以加上"!"前缀表示否 定,"%!200,304,302{Referer}i"记录所有不同于200,304,302的状态码发生时的Referer头内容。

"<"和">"修饰符可以用来指定对于已被内部重定向的请求是选择原始的请求还是选择最终的请求。默认情况下,%s, %U, %T, %D, %r 使用原始请求,而所有其他格式串则选择最终请求。例如,%>s 可以用于记录请求的最终状态,而 %<u 则记录一个已经被内部重定向到非认证资源的请求的原始认证用户。

一些说明
出于安全考虑,从2.0.46版本开始,%r, %i, %o 中的特殊字符,除了双引号(")和反斜线(\)分别用 \" 和 \\ 进行转义、空白字符用C风格(\n, \t 等)进行转义以外,非打印字符和其它特殊字符使用 \xhh 格式进行转义(hh是该字符的16进制编码)。在2.0.46以前的版本中,这些内容会被完整的按原样记录。这种做法将导致客户端可以在日志中插入控制字 符,所以你在处理这些日志文件的时候要特别小心。

在2.0版本中(不同于1.3),%b 和 %B 格式字符串并不表示发送到客户端的字节数,而只是简单的表示HTTP应答字节数(在连接中断或使用SSL时与前者有所不同)。mod_logio提供的 %O 格式字符串将会记录发送的实际字节数。

示例
一些常见的格式串:

通用日志格式(CLF)
"%h %l %u %t \"%r\" %>s %b"

带虚拟主机的通用日志格式
"%v %h %l %u %t \"%r\" %>s %b"

NCSA扩展/组合日志格式
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""

Referer日志格式
"%{Referer}i -> %U"

Agent(Browser)日志格式
"%{User-agent}i"




日志如何定义

定义日志

ErrorLog "logs/error_log"


LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn


 
 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

<IfModule logio_module>
  # You need to enable mod_logio.c to use %I and %O
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>

#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here.  Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog "logs/access_log" common



apachectl -f /etc/httpd/httpd.conf    指定加载的配置文件

apachectl 一些命令:

Usage: /usr/local/apache/bin/httpd [-D name] [-d directory] [-f file]
                                   [-C "directive"] [-c "directive"]
                                   [-k start|restart|graceful|graceful-stop|stop]
                                   [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number 显示版本
  -V                 : show compile settings 显示编译文本
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed vhost settings 
  -t -D DUMP_RUN_CFG : show parsed run settings 
  -S                 : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
  -t -D DUMP_MODULES : show all loaded modules 
  -M                 : a synonym for -t -D DUMP_MODULES
  -t -D DUMP_INCLUDES: show all included configuration files 判断所有配置文件是否正常
  -t                 : run syntax check for config files 
  -T                 : start without DocumentRoot(s) check
  -X                 : debug mode (only one worker, do not detach)





卸载apache : 


卸载其实很简单  直接把进程干掉  、直接把目录文件删除即可


如果需要重新安装,进入  /usr/local/src/httpd-2.4.34,执行  make clean 清除以前编译文件。




使用apache支持PHP



这里安装最新版本PHP


php-7.2.8.tar.gz


直接下载安装包到 /usr/local/src


#tar -xf php-7.2.8.tar.gz
#cd php-7.2.8
#./configure --prefix=/usr/local/apache/php/php7.2 --with-config-file-path=/usr/local/apache/php/php7.2/etc --with-mysqli=/usr/local/mysql5.6/bin/mysql_config --with-apxs2=/usr/local/apache/bin/apxs --with-pdo-mysql=/usr/local/mysql5.6 -enable-mbstring  --enable-ftp --enable-fpm  --with-curl --with-mhash --enable-zip --with-pcre-regex --with-gd --with-jpeg-dir -with-gettext --enable-xml
#make && make install


注意:--with-mysqli=/usr/local/mysql5.6/bin/mysql_config --with-pdo-mysql=/usr/local/mysql5.6  写真实的mysql安装路径


直至编译成功。


然后复制  php.ini-development  到 php.ini

cp /usr/local/src/php-7.2.8/php.ini-development  /usr/local/apahce/php/php7.2/etc/php.ini


vim  /usr/local/apahce/php/php7.2/etc/php.ini


data.timezone=Asia/Shanghai


改时区后,保存退出。


修改apache配置文件:

LoadModule php7_module        modules/libphp7.so

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>


然后重新启动apache即可

php7.2.png


 



在/usr/local/apache/www/test 目录下创建一个.htaccess 文件,然后写下面代码

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>


<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews

  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d

  RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
#  RewriteRule .* index.php
</IfModule>