我试着总结一下Apache
为了学习Linuc2,我对Apache进行了概括。
说实话,以前只需要使用yum进行安装,所以并没有太在意详细的配置。
编辑httpd.conf,并使用apache configtest等工具进行确认,基本上会显示以AH开头的错误,比较容易上手。
安装
使用源代码进行编译
个人而言,我始终只使用yum进行安装,建议您参考以下文章。配置、编译、安装
顺便提一下,如果想要从源代码编译,还需要安装APR和APR-util。
使用包裹进行
# yum install -y httpd
设置文件
htpd.conf配置文件
- 基本的な書式
設定值的指令名
- 適用範囲を指定する場合
<文件名文件> … </文件名文件>
<目录名目录> … </目录名目录>
<位置网址> … </位置网址>
外部配置文件
要使用外部文件(.htaccess)覆盖httpd.conf的设置,需要使用AccessFileName指令。
AccessFileName .htaccess
要允许使用外部设置文件,需在AllowOverride目录块中进行指定。
以下的例子是使用.htaccess 文件来实现身份验证和访问控制。
AllowOverride AuthConfig Limit
apachectl 可以被简化为:Apache控制工具。
模块
模块列表
要加载模块,需按照以下方式进行指定。
LoadModule perl_module modules/mod_perl.so
在安装Apache后,可以使用apxs来导入模块。然后,在LoadModule目录中像上面一样添加。另外,要安装apxs,需要安装httpd-devel软件包。
# yum install httpd-devel
# apxs -i -c mod_foobar.c
使用以下命令显示已嵌入模块和DSO模块的列表,并且还可以检查配置文件的语法:httpd -M。
# httpd -l
# httpd -M
脚本语言
我们将讨论经常被用作WEB应用的php。
# yum install -y php
将 /etc/httpd/conf.d/php.conf 文件添加到配置中。
当创建下列类型文件并重新启动Apache时,会显示如下内容。
<?php
phpinfo();
?>
客户端访问的身份验证
基本认证
要使用BASIC身份验证,在httpd.conf文件中添加用户认证设置,并准备一个专用的密码文件。
user:ユーザ名のリストにに指定されたユーザだけを許可
group:グループ名のリスト指定されたグループのユーザだけを許可OrderDeny,Allow:DenyされないクライアントとAllowされたクライアントを許可。それ以外は拒否。
Allow,Deny:AllowされないクライアントとDenyされたクライアントを拒否。それ以外は許可。Denyアクセスを拒否するホストを指定。Allowアクセスを許可するホストを指定。Satisfyホストのアクセス制御とユーザー認証の両方が指定されている時のアクセスポリシーを指定。
**Any**:AllowとRequireのどちらかを満たせば許可。
All:Allowとrequire両方を満たせば許可。
<Directory "/var/www/html/private-area">
AuthType Basic
AuthName "Please enter your ID and password"
AuthUserfile /etc/httpd/conf/.htpasswd
require valid-user
</Directory>
要为认证设置用户名和密码,需要使用 htpasswd。
# htpasswd -c /etc/httpd/conf/.htpasswd linuc1
New password:
Re-type new password:
Adding password for user linuc
# cat /etc/httpd/conf/.htpasswd
linuc:$apr1$szHx1lmc$PVMPwHwo/7T0bnlbRhAFP0
要在组级别上设置BASIC身份验证,需要使用AuthGroupfile指定组密码文件。
密码文件的格式如下:
组名:用户名1 用户名2…
指定的用户应该在htpasswd中设置密码。
在 require 中,使用以下格式指定组名:require group 组名。
摘要认证
<Directory "/var/www/html/secret-area">
AuthType Digest
AuthName "secret-area"
AuthUserfile /etc/httpd/conf/.htdigestfile
require valid-user
</Directory>
为了进行摘要认证,我们使用 htdigest 来创建用户并更改密码。
# htdigest -c /etc/httpd/conf/.htdigest secret-area linuc2
Adding password for linuc2 in realm secret-area.
New password:
Re-type new password:
# cat /etc/httpd/conf/.htdigest
linuc2:secret-area:2b2b3ade579cc9e0121b4f1df227db6b
主机基于的访问控制
如果您想要使用IP地址、主机名、域名等控制访问,请使用require指令。此功能由authz_host_module提供。
如果想要阻止来自172.31.0.0/16的访问,只允许来自其他主机的访问,可以按照以下方式指定。
require all granted
require not ip 172.31.0.0/16
虚拟主机功能
您可以在一个主机上管理多个网站。
名稱為基礎的虛擬主機
在一个主机上设置一个IP地址和多个域名。
将其写在VirtualHost指令内。
通过正确配置DNS,可以独立运营每个网站。
<VirtualHost *:80>
ServerName web.example.com
DocumentRoot /var/www/virtual/web
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.net
DocumentRoot /var/www/virtual/example
</VirtualHost>
SNI的中文翻译为”服务器名称指示”。
-
- SSLハンドシェイク時にクライアントがアクセスしたいホスト名を平文で伝える仕組みです。
-
- SSLでは、接続するサーバが決まってから復号化が行われますが、名前ベースのバーチャルホストの場合、ホスト名が指定されたHTTPプロトコルヘッダが、SSLによって暗号化されているため、接続するサーバを決定することができません。この問題を解決したのがSNIです。
- SNIは、サーバだけでなく、クライアントも対応している必要があります。
基于IP的虚拟主机
在一个主机上设置多个IP地址和多个域名。
需要在VirtualHost指令内进行设置。
还需要在Listen指令中指定每个IP地址。
Listen 192.168.1.10:80
Listen 192.168.1.11:80
<VirtualHost 192.168.1.10:80>
ServerName web.example.com
DocumentRoot /var/www/virtual/web
</VirtualHost>
<VirtualHost 192.168.1.11:80>
ServerName www.example.net
DocumentRoot /var/www/virtual/example
</VirtualHost>
监视与维护
服务状态:关于服务器运行情况的信息
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
</Location>
模块信息:关于服务器设置的信息
LoadModule info_module modules/mod_info.so
<Location /server-info>
SetHandler server-info
</Location>
SSL/TLS (Secure Sockets Layer/Transport Layer Security) can be paraphrased in Chinese as “安全套接字层/传输层安全” / ɡ .
通过使用mod_ssl,实现了对SSL的支持。
您需要从认证机构获取网站证书。
1. 生成公钥和密钥。
2. 将生成的公钥连同证明企业身份的文件等一起发送给认证机构(CA)。
3. CA会发行并返回证书。(使用该证书,Web服务器可以向Web浏览器证明其身份。)
4. 将收到的证书安装到Web服务器上。
服务器证书是针对IP地址或域名进行颁发的。
在这里,我们将讨论自签名证书的问题(作为自己的认证机构,通过该认证机构对证书进行签名的方法)。
在CentOS中,已经为安装了SSL的目录准备了一个名为CA.sh的脚本,因此我们可以复制它并按照交互方式进行创建。
# cd /etc/pki/tls/misc
# ./CA -newca
以下是一种方式:
私钥:/etc/pki/CA/private/cakey.pem
公钥:/etc/pki/CA/cacert.pem
被创建出来。
为了构建支持SSL的HTTP服务器,需要创建服务器私钥server.key。
# openssl genrsa -out server.key 2048
创建证书签名请求(CSR),向认证机构请求颁发证书,并命名为 server.csr。
# openssl req -new -key server.key -out server.csr
我們將對提交證書申請的文件進行簽名,並創建一個名為 server.crt 的服務器證書。
# openssl ca -out server.crt -infiles server.csr
将服务器私钥和服务器证书移动到适当的目录,并在httpd.conf文件中写入必要的设置。
Apache2.4.8以降:サーバ証明書と中間CA証明書を1つに纏めたファイルを作成し、SSLCertificateFileに記載する。
Apache2.4.8以前:サーバ証明書をSSLCertificateKeyFile、中間CA証明書をSSLCertificateChainFileに記載する。SSLCACertificateFileクラアイント証明書発行のCA証明書発行ファイルSSLCACertificatePAthクラアイント証明書発行のCA証明書発行ディレクトリSSLVerifyClientクライアント認証のレベル
ApacheでIP制限とクライアント認証をor条件で運用する
LoadModule ssl_module modules/mod_ssl.so
Listen 443 https
<VirtualHost _default_:443>
ServerName www.example.net:443
DocumentRoot "/var/www/html"
ErrorLog logs/ssl_errorlog
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA:!DH
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
</VirtualHost>
如果你希望在验证等方面尝试,你可以使用Let’s Encrypt免费发行数字证书。
日志文件
访问日志文件
/var/log/httpd/access_log – Apache访问日志
使用LogFormat指令指定格式化方式,并使用CustomLog指令将日志文件名与格式化方式关联起来。
LogFormat
CustomLog logs/access_log combined
错误日志文件 (錯誤日誌文件)
/var/log/httpd/error_log 可以被翻译为 “/var/log/httpd 错误日志”。
你可以通过LogLevel指令来指定要记录的日志级别。
LogLevel warn