ubuntu环境下安装Apache2最简单的方式是使用包安装,命令如下:
sudo apt-get install update
sudo apt-get install apache2
这两条命令执行完之后,就会进行apache2的安装。安装完之后,apache2的配置信息在/etc/apache1目录下,该目录结构如下:
---apache2
---apache2.conf
---conf-available
--charset.conf
--localized-error-pages.conf
--other-vhosts-access-log.conf
--security.conf
--serve-cgi-bin.conf
---conf-enabled
--charset.conf
--localized-error-pages.conf
--other-vhosts-access-log.conf
--security.conf
--serve-cgi-bin.conf
---envvars
---magic
---mods-available
-- ...
--- mods-enabled
-- ...
---ports.conf
---sites-available
--000-default.conf
--default-ssl.conf
---sites-enabled
--000-default.conf
这些配置文件中,最重要的就是apache2.conf,在这个文件里引入了其他的配置文件,这个文件是apache2的全部配置文件。现在开始看这个配置文件,这个文件中第一条(注释不算)命令是:
Mutex file:${APACHE_LOCK_DIR} default
这条命令的作用是指定序列化的锁的文件必须要保存在本地磁盘上(...我也不太懂是啥意思,感觉跟我们使用关系不大,默认即可)
第二条命令是:
PidFile ${APACHE_PID_FILE}
这个是指定apache2进程的pid,就是说在apache2进程运行时,进程的标志序号,APACHE_PID_FILE这个变量在/etc/apache2/envvars里进行设值
第三条命令:
Timeout 300
这个一看到Timeout就应该知道是什么了吧,指的是超时时间,就是收到请求后在这个时间内没有回应就算失败
第四条命令:
KeepAlive On
这个命令的作用是优化服务器的,接下来的几个命令也与之相关,命令英文名直接翻译,保持活性,指的是一个客户端发送请求到服务器后,服务器会保持这个连接,如果这个客户端继续发送请求时,不用每次都发费时间去创建连接,这会大大减少服务器的相应时间(客户端发送请求到收到回应的时间就是相应时间,创建连接当然也是相应时间的一部分啊),所以这个命令后的 On参数就是指的是打开这个“保持活性的功能”。
MaxKeepAliveRequests 100
KeepAliveTimeout 5
很多东西都有两面性,有优点也有缺点,KeepAlive也是一样,如果不对其进行相应的设置,那么所有的客户端只要发送过请求,服务器就一直维持着一个两者之间的连接,这是不可能的,服务器同时维持数以百万计的连接,这是不可能的,而且有些连接已经很久没有在发送过请求了,这种连接已经没必要在维持了,上面两条命令就是对维持连接的一些限制,MaxKeepAliveRequests 100 指的是最多保持活性连接的数量,这个可以自己根据服务器硬件情况进行调整
KeepAliveTimeout 5 指的是每个活性连接保持的时间,也是可以根据服务器硬件情况进行调整。
不过千万不要瞎调,举个例子,如果你把这两个参数改为500,100,假如说你的网站每秒有100个人(客户端)进行访问,服务器会建立100个连接,每个连接保持活性100秒,这样的话,服务器最大会同时处理100*100=10000个连接,这个内存开销会让你服务器宕机的,跟别提如果每秒有500个人进行访问的。
接下来的命令是
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
这个命令一眼就知道是什么作用,设置运行apache2的用户和用户组,里面的参数在/etc/apache2/envvars里进行设值(都有默认初始值,看需求是否要改动这些,不需要就不要改)
HostnameLookups Off
这个命令HostnameLookups后面的参数默认是off关的,HostnameLookups的功能是在日志里显示时将客户端的IP地址转换为域名,配置文件中注释的例子是# e.g., www.apache.org (on) or 204.62.129.132 (off).就是说HostnameLookups后面的参数是on时日志里显示的是www.apache.org,是off时显示204.62.129.132,显示域名看着很舒服,但是将ip转换为域名是需要查询DNS的,而且会双向查询,即先查www.apache.org的ip是什么,假如查到是204.62.129.132,再查204.62.129.132的域名是什么,为什么这么做呢,是防止客户端进行域名欺骗。这会发费很长的时间,但是作用不大,这个功能的性价比太低了,所以apache2默认是关掉的,如果用户有特殊的需求,可以自行打开。
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
这两行命令是指Apache2的错误日志和日志的级别,如果一个apache服务器上只运行一个项目时,ErrorLog可以不用改动,LogLevel可以视情况改动,Loglevel的几个级别在apache官网上也可以很容易查到。如果一个服务器上同时运行多个项目,就需要配置虚拟主机了,配置虚拟主机时需要修改ErrorLog的配置,使得每个项目的错误日志分开,不然所有的错误日志都在一个文件下,会很乱。关于配置虚拟主机稍后会提到。
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
这两行是引入/etc/apache2/mods-enabled下的所有.load和.conf文件,这是加载激活的模块和对应的配置文件,所有已安装且打开的模块都在mods-enabled文件下。
Include ports.conf
加载ports.conf文件,这个文件里制定了apache运行的端口,如果修养修改端口,可以在这个文件里进行修改。
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
上面一大串命令的作用是项目的文件的地址,<Directory xxx />...</Directory />标签中xxx指的是文件的路径,...指的是对这些文件的一些设置,例如 /var/www/ ,稍微用过apache的都应该清楚,apache的项目放在/var/www/路径下,这些可以改,根据需要吧,没有特殊要求没必要改,约定俗成的路径,能遵守就遵守。再来看看标签里的命令,以一组标签内的命令为例:
Options FollowSymLinks 操作 允许符号连接(符号连接类似与windows的快捷方式)
AllowOverride None 允许重写 拒绝 (不允许对文件进行重写)
Require all denied 请求 全部 拒绝 (拒绝所有请求)
第一组标签的含义就是不允许客户端请求访问服务器根路径下的文件
注意:每组标签内部的设置只作用于标签头里面的路径下的文件。
AccessFileName .htaccess
这一条命令很重要,假如要求一个项目中的部分目录只允许部分人看(VIP大佬),这个时候就需要这个命令发挥作用了。有个疑问?这个命令不是注释的,说明一直生效,但是项目上的所有东西都可以访问啊?...那是因为apache2根目录没有.htacces文件,如果你在根目录下创建一个.htacess文件,并在里面进行设置的话,重启apache后,访问你指定部分的文件时就会提示你输入账号密码,验证成功后才可以访问。
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
这一段命令是是,apache服务器会拒绝所有的.ht文件。这个.ht文件指的就是AccessFileName 参数的文件类型,拒绝.ht文件是防止别有用心的人通过客户端上传.ht文件,对网站上的文件进行加锁或其他危害性的设置。
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
上面几行命令指的都是日志的格式,在你使用ErrorLog指的日志的存放位置时,可以在后面添加vhost_combined、combined、common、agent、referer以指定日志的输出格式。当然你也可以在上面那几行命令下面添加一些自定义的日志输出格式。
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
上面一行表示加载conf-enabled下的所有.conf文件,下面的一行表示加载sites-enabled文件下的.conf文件。conf-enabled下的文件存放普通配置文件,sites-enabled下存放虚拟主机配置文件。这样的作用就是,你增加一些普通配置文件时只需要在conf-enabled文件下新建一个xxx.conf,写在这个文件里就行,而不是把多有的配置文件都赛到一个文件里,虚拟主机配置文件类似。
ps:这个方式让我想到在学校学习的软件设计模式中提到的,好的软件具有可扩展性,健壮性,新增功能时不需要修改原有代码。
最关键的一个文件说完了,下面简要提一下根路径下的其他几个文件
conf-available里是一个可用的配置文件的模板(可能描述的不准确),就是说这里面提供的一些配置文件你可以改一改它的参数,然后把它放到conf-enabled里,这个配置文件就可以生效。
conf-enabled 已经提到过,存放普通的配置文件。apache2.conf里会加载conf-enabled下的所有配置文件。
envvars 存放一些环境变量啥的。
magic 一个模块,不知道什么原因放在更目录下了。
mods-available 已安装却没有启用的模块
mods-enabled 已经启用的模块
ports.conf 配置apache服务器运行时的端口
sites-available 虚拟主机配置文件的模板
sites-enabled 已经启用的虚拟主机的配置文件
上面这些,只有一个虚拟主机的配置需要好好说一下
sites-available文件下有两个模板,一个是000-default.conf,另外一个是default-ssl.conf。你可以这样理解,前者是http的模板,后者是https的模板。下面会仔细解释https的模板,
https的模板如下(删除了所有的英文注释):
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
<IfModule>是一组标签,头部指定模块,https使用ssl协议,所以指定mod_ssl.c模块,IfModule标签下有一组VirtualHost标签,
VirtualHost里面就是真正配置虚拟主机的部分了,<VirtualHost _default_:443>指定了默认的ip地址和端口,默认ip为本机的本地回环地址127.0.0.1,端口为443。
ServerAdmin 后面参数为一个邮箱,含义是指定这个虚拟主机的管理人员,如果其他人对这个虚拟主机有问题可以发邮件找这个人网聊
DocumentRoot 指定是这个虚拟主机加载项目的路径 给定的默认参数是/var/www/html (可以根据情况修改)
ErrorLog ${APACHE_LOG_DIR}/error.log 这个虚拟主机的错误日志存放的路径(可以根据清空修改)
CustomLog ${APACHE_LOG_DIR}/access.log combined 这个虚拟主机的访问日志存放的路径 后面的combined指的是日志的格式
SSLCertificateFile
SSLCertificateKeyFile https需要证书,这里两个命令的参数就是对应存放pem和key的路径
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
上面是https虚拟主机的最后一部分,FilesMatch 是匹配文件,将所有的.cgi、shtml、phtml、php文件交给/usr/lib/cgi-bin进行解释处理
想了一想,还是说一下http的虚拟主机配置吧
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
这是给出的模板,里面的设置https里面都有,这只是一个最简单的模板,也可以再加入一些配置,比如加入
ServerName xxx.com.cn
加入ServerName 会让虚拟主机通过请求header里面的域名进行分配,假如我的apache服务器上运行了三个项目,分别是kuye.com,kuye1.com和kuye2.com,这是三个不同的网站,但是都在我这一台机器上,这三个域名解析的ip地址都是我主机的ip地址,怎么样才能让请求找到对应的虚拟主机呢?这就需要在VirtualHost标签下设置ServerName了,如果请求的域名与某个VirtualHost的ServerName一样,就将请求交于这个虚拟主机进行处理,如果都不一样,交给列表里的第一台虚拟主机进行处理。
另外还要说的是,虽然DocumentRoot指定了虚拟主机加载项目的路径,但是没有设置一个权限,可以通过Directory标签设置请求的操作项目下文件的权限
举个完整的例子
<VirtualHost *:80> //不需要改
ServerAdmin xxx@qq.com //设置一下邮箱,谁的都行
DocumentRoot "/var/kuye/kuyedemo" //我的项目路径在/var/kuye/kuyedemo
ServerName kuye.com //我的项目的域名 (瞎扯的域名,穷逼买不起域名)
ErrorLog "/var/logs/kuyedemo-error.log" //错误日志放在var/logs/kuyedemo-error.log
CustomLog "/var/logs/kuyedemo-access.log" combined //访问日志
<Directory "/var/kuye/kuyedemo"> //对客户端的请求访问我项目文件下目录做一些限制
AllowOverride All //允许重写
Allow from all //允许所有人访问
</Directory>
</VirtualHost>
上面只是个人玩闹的例子,如果是公司的话,有些参数需要改的,不然谁都能访问,而且还可以重写,那岂不是爆炸啊。
最后附上apache2的中文手册apache2中文手册