部署 Web 服务器和反向代理
大约 30 分钟
部署 Web 服务器和反向代理
来源:官方文档 原始多页入口:部署 Web 服务器和反向代理 内容规模:约 31,921 字符,32 个章节标题,168 个命令/代码块,10 条提示框
阅读提要
- 副标题:配置 Web 服务器和反向代理
- 摘要:配置并运行 Apache HTTP web 服务器、NGINX web 服务器或 Squid 缓存代理服务器。配置 TLS 加密。为 Apache HTTP web 服务器配置 Kerberos 身份验证。将 NGINX 配置为 HTTP 流量的反向代理或 HTTP 负载均衡器。将 Squid 配置为没有身份验证、具有 LDAP 身份验证,或具有 Kerberos 身份验证的缓存代理。
- 主要章节:配置 Web 服务器和反向代理;对红帽文档提供反馈;第 1 章 配置 Apache HTTP web 服务器;第 2 章 配置 NGINX;第 3 章 配置 Squid 缓存代理服务器
- 推荐阅读顺序:先看“阅读提要”和目录,再按章节查看“关键点/命令/注意”;需要原文细节时点击来源链接。
章节笔记
概览
- 该章节主要为下一级主题的入口。
配置 Web 服务器和反向代理
- 要点:摘要
对红帽文档提供反馈
- 要点:我们致力于为您提供高质量的文档,您的反馈将对我们有很大帮助。为帮助我们改进,您可以通过 Red Hat Jira 跟踪系统提交建议或报告错误。
- 要点:流程
- 列表:登录到 Jira 网站。 如果您还没有帐户,请创建一个。
- 列表:单击顶部导航栏中的 Create。
- 列表:在 Summary 字段中输入描述性标题。
- 列表:在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 列表:点窗口底部的 Create。
第 1 章 配置 Apache HTTP web 服务器
- 要点:将 Apache HTTP 服务器部署到托管网站和 Web 应用程序。有效地配置虚拟主机、管理服务,并将静态或动态内容分发到客户端。
1.1. Apache HTTP web 服务器简介
- 要点:要托管网站和 Web 应用程序,您可以使用 Apache HTTP Web 服务器。Web 服务器 是一个通过互联网向客户端分发内容的网络服务,包括网页和其他文档类型。
- 要点:Web 服务器也称为 HTTP 服务器,因为它们使用 HTTP 协议。Apache HTTP 服务器(也称为 httpd )是由 Apache 软件基础开发的开源 Web 服务器。如果您要从以前的 Red Hat Enterprise Linux 版本升级,您必须更新 httpd 服务配置。
1.2. Apache 配置文件
- 要点:您可以将 Apache HTTP web 服务器配置为设置服务器参数和虚拟主机。默认情况下,httpd 服务会在启动时读取配置文件。
- 要点:虽然主配置文件适用于大多数情况,但您也可以使用其他配置选项。
- 命令/配置摘录:
# apachectl configtest Syntax OK- 表格样本(共 4 行):
- 路径 | 描述
- /etc/httpd/conf/httpd.conf | 主配置文件。
- /etc/httpd/conf.d/ | 主配置目录为配置文件提供辅助目录。
- /etc/httpd/conf.modules.d/ | 用于加载 Red Hat Enterprise Linux 中打包动态模块的配置文件的辅助目录。在默认配置中,处理这些配置文件是优先级。
1.3. 管理 httpd 服务
- 要点:您可以启动、停止和重新启动 httpd 服务来管理 Apache HTTP Web 服务器。
- 要点:先决条件
- 列表:已安装 Apache HTTP 服务器。
- 列表:要启动 httpd 服务,请输入: # systemctl start httpd
- 列表:要停止 httpd 服务,请输入: # systemctl stop httpd
- 列表:要重启 httpd 服务,请输入: # systemctl restart httpd
- 命令/配置摘录:
# systemctl start httpd
# systemctl stop httpd1.4. 配置单实例 Apache HTTP 服务器
- 要点:要通过您的 Web 服务器分发静态内容,请将 Apache HTTP 服务器配置为分发这些内容。
- 要点:默认情况下,Apache HTTP 服务器为与服务器关联的所有域提供相同的内容。要为不同的域提供不同的内容,请配置基于名称的虚拟主机。详情请参阅 配置基于 Apache 名称的虚拟主机。
- 列表:在配置传输层安全(TLS)协议前,您已创建了防火墙规则来启用基本 Web 服务连接。
- 列表:安装 httpd 软件包: # dnf install httpd
- 列表:如果使用 firewalld,请在本地防火墙中打开 TCP 端口 80 : # firewall-cmd --permanent --add-port=80/tcp # firewall-cmd --reload
- 列表:启用并启动 httpd 服务: # systemctl enable --now httpd
- 列表:可选:将 HTML 文件添加到 /var/www/html/ 目录中。 注意 在 向/var/www/html/ 添加内容时,在httpd默认运行的情况下,文件和目录必须可被用户读取。内容所有者可以是 root 用户和 root 用户组,也可以是管理员选择的其他用户或组。如果内容所有者是 root 用户和 root 用户组,则文件必须可被其他用户读取。所有文件和目录都必须具有 httpd_sys_content_t SELinux 上下文,该上下文默认适用于 /var/www 目录中的所有内容。
- 列表:在 http://server_IP_or_host_name/ 处连接至 Web 浏览器。 如果 /var/www/html/ 目录为空,或者不包含 index.html或index.htm文件,则 Apache 会显示 Red Hat Enterprise Linux 测试页面。如果 /var/www/html/ 包含具有不同名称的 HTML 文件,您可以通过输入该文件的 URL 来加载它们,如 http://server_IP_or_host_name/example.html。 详情请查看您系统的 httpd.service (8) 手册页。
- 命令/配置摘录:
# dnf install httpd
# firewall-cmd --permanent --add-port=80/tcp- 注意:注意 在 向/var/www/html/ 添加内容时,在httpd默认运行的情况下,文件和目录必须可被用户读取。内容所有者可以是 root 用户和 root 用户组,也可以是管理员选择的其他用户或组。如果内容所有者是 root 用户和 root 用户组,则文件必须可被其他用户读取。所有文件和目录都必须具有 httpd_sys_content_t SELinux 上下文,该上下文默认适用于 /var/www 目录中的所有内容。
1.5. 配置基于 Apache 名称的虚拟主机
- 要点:要在单个 Apache HTTP 服务器上托管不同域的多个网站,您可以配置基于名称的虚拟主机。使用基于名称的虚拟主机,Apache HTTP 服务器可以将不同的网站分发到解析到服务器 IP 地址的不同域。
- 要点:您可以使用单独的文档根目录为 example.com 和 example.net 域配置基于名称的虚拟主机。两个虚拟主机都提供静态 HTML 内容。
- 列表:客户端和 Web 服务器将 example.com 和 example.net 域解析为 Web 服务器的 IP 地址。 请注意,您必须手动将 example.com 和 example.net 域条目添加到 DNS 服务器中。
- 列表:安装 httpd 软件包: # dnf install httpd
- 列表:编辑 /etc/httpd/conf/httpd.conf 文件: 为 example.com 域附加以下虚拟主机配置: <VirtualHost *:80> DocumentRoot "/var/www/example.com/" ServerName example.com CustomLog /var/log/httpd/example.com_access.log combined ErrorLog /var/log/httpd/example.com_error.log </VirtualHost> 这些设置配置以下内容: <VirtualHost *:80> 指令中的所有设置都是针对这个虚拟主机的。 Docum…
- 列表:为 example.com 域附加以下虚拟主机配置: <VirtualHost *:80> DocumentRoot "/var/www/example.com/" ServerName example.com CustomLog /var/log/httpd/example.com_access.log combined ErrorLog /var/log/httpd/example.com_error.log </VirtualHost> 这些设置配置以下内容: <VirtualHost *:80> 指令中的所有设置都是针对这个虚拟主机的。 DocumentRoot 设置虚拟主机 Web 内容的路径。 ServerNa…
- 列表:<VirtualHost *:80> 指令中的所有设置都是针对这个虚拟主机的。
- 列表:DocumentRoot 设置虚拟主机 Web 内容的路径。
- 命令/配置摘录:
# dnf install httpd
<VirtualHost *:80> DocumentRoot "/var/www/example.com/" ServerName example.com CustomLog /var/log/httpd/example.com_access.log combined ErrorLog /var/log/httpd/example.com_error.log </VirtualHost>- 注意:注意 Apache HTTP 服务器使用配置中找到的第一个虚拟主机,也与 ServerName 和 ServerAlias 参数中设置的任何域不匹配的请求。这还包括发送到服务器 IP 地址的请求。
1.6. 为 Apache HTTP web 服务器配置 Kerberos 验证
- 要点:要在 Red Hat Enterprise Linux (RHEL)上使用 mod_auth_gssapi Apache 模块,请为 Apache HTTP web 服务器配置 Kerberos 身份验证。Generic Security Services API (GSSAPI)是请求使用 Kerberos 安全库的应用程序的接口。
1.6.1. 在 IdM 环境中配置 gss-proxy
- 要点:要在各种服务和应用程序中启用对 Kerberos 保护资源的安全和经过身份验证的访问,您可以在 Apache HTTP web 服务器上设置通用安全服务代理(GSS-Proxy)
- 要点:您可以使用 gssproxy 服务为 httpd 服务器启用权限分离。gssproxy 为这个过程提供安全优化。请注意,mod_auth_gssapi 模块替换了 mod_auth_kerb 模块,该模块在当前 Red Hat Enterprise Linux(RHEL)版本中不再可用。
- 列表:您已安装了 httpd,mod_auth_gssapi 和 gssproxy 软件包。
- 列表:您已配置并启动 httpd 服务。
- 列表:通过创建服务主体来启用对 HTTP/<SERVER_NAME>@realm 主体的 keytab 文件的访问: # ipa service-add HTTP/<SERVER_NAME>
- 列表:检索存储在 /etc/gssproxy/http.keytab 文件中的主体的 keytab : # ipa-getkeytab -s $(awk '/^server =/ {print $3}' /etc/ipa/default.conf) -k /etc/gssproxy/http.keytab -p HTTP/$(hostname -f) 此步骤将权限设置为 400,因此只有 root 用户有权访问 keytab 文件。apache 用户没有此权限。
- 列表:使用以下内容创建 /etc/gssproxy/80-httpd.conf 文件: [service/HTTP] mechs = krb5 cred_store = keytab:/etc/gssproxy/http.keytab cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U euid = apache
- 列表:重启并启用 gssproxy 服务: # systemctl restart gssproxy.service # systemctl enable gssproxy.service
- 命令/配置摘录:
# ipa service-add HTTP/<SERVER_NAME>
# ipa-getkeytab -s $(awk '/^server =/ {print $3}' /etc/ipa/default.conf) -k /etc/gssproxy/http.keytab -p HTTP/$(hostname -f)1.6.2. 为 Apache HTTP Web 服务器共享的目录配置 Kerberos 身份验证
- 要点:要确保授权用户只能访问或修改 /var/www/html/private/ 目录中的内容,您可以为这个目录配置 Kerberos 身份验证。
- 要点:先决条件
- 列表:您已安装了 httpd,mod_auth_gssapi 和 gssproxy 软件包。
- 列表:您已配置并启动 httpd 服务。
- 列表:您已配置并启动 gssproxy 服务。
- 列表:配置 mod_auth_gssapi 模块,以保护 /var/www/html/private/ 目录: <Location /var/www/html/private> AuthType GSSAPI AuthName "GSSAPI Login" Require valid-user </Location>
- 列表:创建系统单元配置置入文件: # systemctl edit httpd.service
- 列表:在系统置入文件中添加以下参数: [Service] Environment=GSS_USE_PROXY=1
- 命令/配置摘录:
<Location /var/www/html/private> AuthType GSSAPI AuthName "GSSAPI Login" Require valid-user </Location>
# systemctl edit httpd.service1.7. 在 Apache HTTP 服务器中配置 TLS 加密
- 要点:默认情况下,Apache 使用不安全的 HTTP 连接将内容分发到客户端。要保护 Web 流量,您可以启用 TLS 加密,并在 Apache HTTP 服务器上配置经常使用与加密相关的设置。
1.7.1. 在 Apache HTTP 服务器中添加 TLS 加密
- 要点:您可以通过安装 mod_ssl 来保护 Web 流量。将虚拟主机配置为使用 IdM 发布的私钥和证书,以使用子 CA 凭据为域启用加密 HTTPS 连接。
- 要点:先决条件
- 列表:Apache HTTP 服务器已安装并运行。
- 列表:私钥存储在 /etc/pki/tls/private/example.com.key 文件中。 有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。
- 列表:TLS 证书存储在 /etc/pki/tls/certs/example.com.crt 文件中。如果您使用不同的路径,请按照流程的对应步骤操作。
- 列表:CA 证书存储在 /etc/pki/tls/certs/ca.crt 文件中。如果您使用不同的路径,请按照流程的对应步骤操作。
- 列表:客户端和 Web 服务器会将服务器的主机名解析为 Web 服务器的 IP 地址。
- 列表:如果服务器运行 Red Hat Enterprise Linux 10 (RHEL)和联邦信息处理标准(FIPS)模式,客户端必须支持 扩展主 Secret (EMS)扩展或使用传输层安全(TLS) 1.3。没有 EMS 的 TLS 1.2 连接会失败。详情请查看红帽知识库解决方案 TLS 扩展"Extended Master Secret "。
- 命令/配置摘录:
# dnf install mod_ssl
ServerName example.com- 注意:警告 如果未授权用户访问私钥,撤销证书,创建一个新私钥,然后请求新证书。否则,TLS 连接就不再安全。
1.7.2. 在 Apache HTTP 服务器中设置支持的 TLS 协议版本
- 要点:Red Hat Enterprise Linux(RHEL)上的 Apache HTTP 服务器具有系统级别的加密策略。此策略定义与浏览器兼容的安全默认值。例如,在 Apache HTTP 服务器中, DEFAULT 策略定义仅启用 TLSv1.2 和 TLSv1.3 协议版本。
- 要点:您可以手动配置 Apache HTTP 服务器支持的 TLS 协议版本。在以下情况下,您需要在环境中只启用特定的 TLS 协议版本:
- 列表:如果您的环境要求客户端也可以使用弱 TLS1 (TLSv1.0)或TLS1.1协议。
- 列表:如果你想将 Apache 配置为只支持TLSv1.2或TLSv1.3协议。
- 列表:您已在服务器上启用了传输层安全(TLS)加密。
- 列表:如果 Red Hat Enterprise Linux(RHEL)服务器以 Federal Information Processing Standards(FIPS)模式运行,FIPS 只允许符合加密标准的连接。在这个模式中,客户端必须使用 TLS 1.3,如果使用 TLS 1.2,则支持 Extended Master Secret(EMS)扩展。FIPS 不允许在没有 EMS 支持的情况下进行 TLS 1.2 连接。如需更多信息,请参阅红帽知识库解决方案 强制执行 TLS 扩展"Extended Master Secret"。
- 列表:编辑 /etc/httpd/conf/httpd.conf 文件,并添加您要为其设置 TLSv1.3 协议版本的 < VirtualHost > 指令: SSLProtocol -All TLSv1.3
- 列表:重启 httpd 服务: # systemctl restart httpd
- 命令/配置摘录:
SSLProtocol -All TLSv1.3
# systemctl restart httpd1.7.3. 在 Apache HTTP 服务器上设置支持的密码
- 要点:默认情况下,Apache HTTP 服务器使用系统范围的加密策略来定义安全默认值,这些值也与最新的浏览器兼容。有关系统范围的加密策略允许的密码列表,请查看 /etc/crypto-policies/back-ends/openssl.config 文件。
- 要点:您可以手动配置 Apache HTTP 服务器支持的密码。
- 列表:您已在服务器上启用了传输层安全(TLS)加密。
- 列表:安装nmap软件包: # dnf install nmap
- 列表:编辑 /etc/httpd/conf/httpd.conf 文件,并将 SSLCipherSuite 参数添加到您要为其设置 TLS 密码的 <VirtualHost > 指令中: SSLCipherSuite "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!SHA1:!SHA256" 这个示例只启用 EECDH+AESGCM、EDH+AESGCM、AES256+EECDH 和 AES256+EDH 密码,并禁用所有使用 SHA1 和 SHA256 消息身份验证代码(MAC)的密码。
- 列表:重启 httpd 服务: # systemctl restart httpd
- 列表:显示支持的密码: # nmap --script ssl-enum-ciphers -p 443 example.com ... PORT STATE SERVICE 443/tcp open https | ssl-enum-ciphers: | TLSv1.2: | ciphers: | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A | TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A …
- 列表:安装 Apache HTTP 服务器手册
- 命令/配置摘录:
# dnf install nmap
SSLCipherSuite "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!SHA1:!SHA256"1.8. 配置 TLS 客户端证书身份验证
- 要点:要只允许经过身份验证的用户访问 web 服务器上的资源,请为 /var/www/html/Example/ 目录配置客户端证书身份验证。
- 要点:如果 Apache HTTP 服务器使用传输层安全(TLS) 1.3 协议,一些客户端需要额外的配置。例如,在 Mozilla Firefox 中,将 about:config 菜单中的 security.tls.enable_post_handshake_auth 参数设置为 true。
- 列表:您已在服务器上启用了 TLS 加密。
- 列表:编辑 /etc/httpd/conf/httpd.conf 文件来配置客户端身份验证: <Directory "/var/www/html/Example/"> SSLVerifyClient require </Directory> SSLVerifyClient 要求 将服务器配置为需要客户端证书,然后客户端才能访问 /var/www/html/Example/ 目录中的内容。
- 列表:重启 httpd 服务: # systemctl restart httpd
- 列表:在没有客户端身份验证的情况下访问 https://example.com/Example/ URL: $ curl \https://example.com/Example/ curl: (56) OpenSSL SSL_read: error:1409445C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required, errno 0 这个错误表示 web 服务器需要客户端证书验证。
- 列表:通过传递客户端私钥和证书以及 CA 证书,通过客户端身份验证访问相同的 URL: $ curl --cacert ca.crt --key client.key --cert client.crt https://example.com/Example/ 如果请求成功,curl 工具会显示存储在 /var/www/html/Example/ 目录中的 index.html 文件。
- 命令/配置摘录:
<Directory "/var/www/html/Example/"> SSLVerifyClient require </Directory>
# systemctl restart httpd1.9. 安装 Apache HTTP 服务器手册
- 要点:要执行各种配置任务,您可以使用 Apache HTTP 服务器手册。这个手册包括配置参数和指令的详细文档、性能调优、身份验证设置、模块、内容缓存、安全提示和配置 TLS 加密。
- 要点:先决条件
- 列表:Apache HTTP 服务器已安装并运行。
- 列表:安装 httpd-manual 软件包: # dnf install httpd-manual
- 列表:可选:默认情况下,所有连接到 Apache HTTP 服务器的客户端都可以显示手册。要限制对特定 IP 范围(如 192.0.2.0/24 子网)的访问,请编辑 /etc/httpd/conf.d/manual.conf 文件,并将 Require ip 192.0.2.0/24 设置添加到 <Directory "/usr/share/httpd/manual"> 指令中: <Directory "/usr/share/httpd/manual"> ... Require ip 192.0.2.0/24 ... </Directory>
- 列表:重启 httpd 服务: # systemctl restart httpd
- 列表:要显示 Apache HTTP 服务器手册,使用 Web 浏览器连接到 http://host_name_or_IP_address/manual/ URL。
- 命令/配置摘录:
# dnf install httpd-manual
<Directory "/usr/share/httpd/manual"> ... Require ip 192.0.2.0/24 ... </Directory>1.10. 使用 Apache 模块
- 要点:httpd 服务是一个模块化应用程序,您可以使用几个 Dynamic Shared Objects (DSO)进行扩展。您可以根据需要在运行时动态加载或卸载 DSO 模块。您可以在 /usr/lib64/httpd/modules/ 目录中找到这些模块。
1.10.1. 加载动态共享对象模块
- 要点:要配置 Apache HTTP 服务器的功能,您可以加载 Dynamic Shared Object (DSO)模块。使用 LoadModule 指令载入特定的 DSO 模块。单独的软件包具有自己的配置文件的模块,其配置文件存储在 /etc/httpd/conf.modules.d/ 目录中。
- 要点:先决条件
- 列表:已安装 httpd 软件包。
- 列表:在 /etc/httpd/conf.modules.d/ 目录中的配置文件中搜索模块名称: # grep mod_ssl.so /etc/httpd/conf.modules.d/*
- 列表:在存在模块名称的配置文件中取消注释模块的 LoadModule 指令: LoadModule ssl_module modules/mod_ssl.so
- 列表:如果模块不存在,请使用以下指令创建一个配置文件,如 /etc/httpd/conf.modules.d/30-example.conf: LoadModule ssl_module modules/<custom_module>.so 例如,Red Hat Enterprise Linux(RHEL)软件包不包括 模块。
- 列表:重启 httpd 服务: # systemctl restart httpd
- 列表:验证模块是否已加载并启用: # httpd -M | grep ssl
- 命令/配置摘录:
# grep mod_ssl.so /etc/httpd/conf.modules.d/*
LoadModule ssl_module modules/mod_ssl.so1.10.2. 编译自定义 Apache 模块
- 要点:您可以使用 httpd-devel 软件包创建自己的模块并进行构建。此软件包包含编译模块所需的 includes 文件、头文件和 Apache Extension(apxs)工具。
- 要点:先决条件
- 列表:已安装 httpd-devel 软件包。
- 列表:构建自定义模块: # apxs -i -a -c module_name.c
- 列表:加载模块的方式与加载 DSO 模块中所述的方法相同。
- 命令/配置摘录:
# apxs -i -a -c module_name.c第 2 章 配置 NGINX
- 要点:NGINX 是一个高性能和模块化服务器,可用作 Web 服务器、反向代理或 HTTP 负载均衡器。
2.1. 安装并准备 NGINX
- 要点:红帽使用 Application Streams 来提供不同的 NGINX 版本。使用 Application Streams,您可以选择流并安装 NGINX,在防火墙中打开所需的端口,启用并启动 nginx 服务。
- 要点:默认情况下,NGINX 服务器在端口 80 上运行,并从 /usr/share/nginx/html/ 目录中提供内容。
- 列表:您有一个 红帽订阅。
- 列表:firewalld 服务已启用并正在运行。
- 列表:安装 nginx 软件包: # dnf install nginx
- 列表:打开 NGINX 应该在其上在防火墙中运行其服务的端口。例如,要在 firewalld 中为 HTTP (端口 80)和 HTTPS (端口 443)打开默认端口,请输入: # firewall-cmd --permanent --add-port={80/tcp,443/tcp} # firewall-cmd --reload
- 列表:在系统引导时使 nginx 服务自动启动: # systemctl enable nginx
- 列表:可选:启动 nginx 服务: # systemctl start nginx 如果您不想使用默认配置,请跳过这一步,并在启动该服务前配置 NGINX。
- 命令/配置摘录:
# dnf install nginx
# firewall-cmd --permanent --add-port={80/tcp,443/tcp} # firewall-cmd --reload2.2. 将 NGINX 配置为 web 服务器为不同域分配不同的内容
- 要点:要优化资源使用量和管理,您可以将 NGINX web 服务器配置为为不同的域分发不同的内容。默认情况下,NGINX 将同一内容分发到与服务器 IP 地址关联的所有域名的客户端。
- 要点:您可以将 NGINX 配置为为不同的域提供不同的内容。例如,使用 /var/www/example.com/ 目录中的内容配置 example.com 域,并使用 /var/www/example.net/ 目录中的内容配置 example.net 域。配置所有其他请求,以使用 /usr/share/nginx/html/ 目录中的内容。
- 列表:NGINX 已安装。
- 列表:客户端和 Web 服务器将 example.com 和 example.net 域解析为 Web 服务器的 IP 地址。 请注意,您必须手动将这些条目添加到 DNS 服务器中。
- 列表:编辑 /etc/nginx/nginx.conf 文件: 默认情况下,/etc/nginx/nginx.conf 文件已经有一个默认配置。如果您已从配置中删除了这部分,请将以下 server 块重新添加到 /etc/nginx/nginx.conf 文件中的 http 块中: server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; } listen 指令定义服务侦听的 IP 地址和端口。在这种情况下,NGINX 监听所有 IPv4 和 IPv6 地址上的端口 80…
- 列表:默认情况下,/etc/nginx/nginx.conf 文件已经有一个默认配置。如果您已从配置中删除了这部分,请将以下 server 块重新添加到 /etc/nginx/nginx.conf 文件中的 http 块中: server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; } listen 指令定义服务侦听的 IP 地址和端口。在这种情况下,NGINX 监听所有 IPv4 和 IPv6 地址上的端口 80。default_server 参数表示 NGINX 使用…
- 列表:listen 指令定义服务侦听的 IP 地址和端口。在这种情况下,NGINX 监听所有 IPv4 和 IPv6 地址上的端口 80。default_server 参数表示 NGINX 使用这个 server 块作为用于与 IP 地址和端口匹配的请求的默认服务器。
- 列表:server_name 参数定义此 server 块所负责的主机名。将 server_name 设置为 _ 将 NGINX 配置为接受这个 server 块的任何主机名。
- 命令/配置摘录:
server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; }
server { server_name example.com; root /var/www/example.com/; access_log /var/log/nginx/example.com/access.log; error_log /var/log/nginx/example.com/error.log; }2.3. 在 NGINX web 服务器中添加 TLS 加密
- 要点:要防止窃取和中间人攻击,您可以在 NGINX web 服务器上启用传输层安全(TLS)协议加密。
- 要点:先决条件
- 列表:已安装 NGINX。详情请查看 安装和准备 NGINX。
- 列表:私钥存储在 /etc/pki/tls/private/example.com.key 文件中。 有关创建私钥和证书签名请求(CSR)的详细信息,以及如何从证书颁发机构(CA)请求证书,请参阅您的 CA 文档。
- 列表:TLS 证书存储在 /etc/pki/tls/certs/example.com.crt 文件中。如果您使用其他路径,请调整该流程的对应步骤。
- 列表:CA 证书已附加到服务器的 TLS 证书文件中。
- 列表:客户端和 Web 服务器会将服务器的主机名解析为 Web 服务器的 IP 地址。
- 列表:端口 443 在本地防火墙中已打开
- 命令/配置摘录:
server { listen 443 ssl; server_name example.com; root /usr/share/nginx/html; ssl_certificate /etc/pki/tls/certs/example.com.crt; ssl_certificate_key /etc/pki/tls/private/example.com.key; }
ssl_pass_phrase_dialog exec:<path_to_program>;- 注意:警告 如果未授权的用户可以访问私钥,撤销证书,创建一个新的私钥,并请求新证书。否则,TLS 连接就不再安全。
2.4. 将 NGINX 配置为 HTTP 流量的反向代理
- 要点:要将请求转发到远程服务器上的特定子目录,您可以将 NGINX Web 服务器配置为充当 HTTP 流量的反向代理。
- 要点:当 NGINX 用作反向代理时,客户端会从它访问的主机加载内容。但是 NGINX 会从远程服务器加载实际内容并将其转发给客户端。您可以将 NGINX 配置为将 web 服务器上的 /example 目录的流量转发到 URL https://example.com。
- 列表:NGINX 已安装。
- 列表:可选:反向代理上启用了 TLS 加密。
- 列表:编辑 /etc/nginx/nginx.conf 文件,并将以下设置添加到应提供反向代理的 server 块中: location /example { proxy_pass https://example.com; } location 块定义 NGINX 将 /example 目录中的所有请求传给 https://example.com。
- 列表:将 httpd_can_network_connect Security-Enhanced Linux (SELinux) 布尔值参数设置为 1,来配置 SELinux 允许 NGINX 转发流量: # setsebool -P httpd_can_network_connect 1
- 列表:重启 nginx 服务: # systemctl restart nginx
- 列表:使用浏览器并连接到 http://host_name/example,显示 https://example.com 的内容。
- 命令/配置摘录:
location /example { proxy_pass https://example.com; }
# setsebool -P httpd_can_network_connect 12.5. 将 NGINX 配置为 HTTP 负载均衡器
- 要点:要配置到不同服务器的请求数并定义回退主机,您可以使用 NGINX 反向代理功能进行负载均衡。
- 要点:将 NGINX 配置为 HTTP 负载均衡器将流量定向到多个服务器。负载平衡器选择一个具有最少活跃连接的服务器。如果主服务器不可用,NGINX 会自动发送请求到回退主机。
- 列表:已安装 NGINX。
- 列表:编辑 /etc/nginx/nginx.conf 文件中的设置: http { upstream backend { least_conn; server server1.example.com; server server2.example.com; server server3.example.com backup; } server { location / { proxy_pass http://backend; } } } 后端名为 host group 的 least_conn 指令定义 NGINX 将请求发送到 server1.example.com 或 server2.example.com。…
- 列表:不指定方法,使用轮询的方式在服务器间平均分发请求。
- 列表:ip_hash:从一个客户端地址向同一服务器发送请求。请求基于从 IPv4 地址的前三个二进制八位数或客户端的整个 IPv6 地址计算的哈希值。
- 列表:hash :根据用户定义的密钥来声明服务器,可以是字符串、变量或两者的组合。consistent 参数配置 NGINX 根据用户定义的散列键值将请求分发到所有服务器。
- 列表:Random :向随机选择的服务器发送请求。
- 命令/配置摘录:
http { upstream backend { least_conn; server server1.example.com; server server2.example.com; server server3.example.com backup; } server { location / { proxy_pass http://backend; } } }
# systemctl restart nginx第 3 章 配置 Squid 缓存代理服务器
- 要点:要减少带宽并快速加载网页,请使用 Squid。这是一个缓存代理服务器,可以充当 HTTP、HTTPS 和 FTP 协议的代理,允许访问身份验证和限制。详情请查看 /usr/share/doc/squid/squid.conf.documented 中的配置参数。
3.1. 将 Squid 配置为没有身份验证的缓存代理
- 要点:为了简化用户的访问,同时通过使用内容缓存提高带宽效率和响应时间,请将 Squid 配置为没有身份验证的缓存代理。您需要仅根据 IP 范围限制对代理的访问。
- 要点:先决条件
- 列表:squid 软件包包含 /etc/squid/squid.conf 文件。如果您在之前编辑了这个文件,请删除并重新安装该软件包。
- 列表:安装 squid 软件包: # dnf install squid
- 列表:编辑 /etc/squid/squid.conf 文件: # vi /etc/squid/squid.conf 调整 localnet 访问控制列表(ACL)以匹配可以访问代理的 IP 范围: acl localnet src 192.0.2.0/24 acl localnet 2001:db8:1::/64 默认情况下,/etc/squid/squid.conf 文件包含 http_access allow localnet 规则。此规则使用本地网络 ACL 中指定的所有 IP 范围中的代理。您必须在 http_access allow localnet 规则前指定所有 localnet ACL。 重要 删除所有与您的环境不匹配…
- 列表:调整 localnet 访问控制列表(ACL)以匹配可以访问代理的 IP 范围: acl localnet src 192.0.2.0/24 acl localnet 2001:db8:1::/64 默认情况下,/etc/squid/squid.conf 文件包含 http_access allow localnet 规则。此规则使用本地网络 ACL 中指定的所有 IP 范围中的代理。您必须在 http_access allow localnet 规则前指定所有 localnet ACL。 重要 删除所有与您的环境不匹配的现有 acl localnet 条目。
- 列表:要授予用户在其他端口上使用 HTTPS 协议的用户,请为每个端口添加一个 ACL: acl SSL_ports port <port_number> 以下 ACL 存在于默认配置中,并将 443 定义为使用 HTTPS 协议的端口: acl SSL_ports port 443
- 列表:更新 acl Safe_ports 规则列表,以配置 Squid 可以建立连接的端口: acl Safe_ports port 21 acl Safe_ports port 80 acl Safe_ports port 443 将客户端配置为仅通过代理访问端口 21 文件传输协议 (FTP)、80 (HTTP) 和 443 (HTTPS) 上的资源。在配置文件中添加 acl Safe_ports 声明。默认情况下,配置文件包含 http_access deny !Safe_ports 规则。此规则定义了对未在 Safe_ports ACL 中定义的端口的访问拒绝。
- 命令/配置摘录:
# dnf install squid
# vi /etc/squid/squid.conf- 注意:重要 删除所有与您的环境不匹配的现有 acl localnet 条目。
3.2. 使用 LDAP 身份验证将 Squid 配置为缓存代理
- 要点:要只允许经过身份验证的用户使用代理,请将 Squid 配置为具有轻量级目录访问协议(LDAP)身份验证的缓存代理。
- 要点:先决条件
- 列表:您已安装了 squid 软件包。
- 列表:squid 软件包包含 /etc/squid/squid.conf 文件。如果您在之前编辑了这个文件,请删除并重新安装该软件包。
- 列表:LDAP 目录中存在一个服务用户,如 uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com。Squid 只使用此帐户搜索验证用户。如果存在身份验证用户,Squid 会将此用户绑定到 目录以验证身份验证。
- 列表:编辑 /etc/squid/squid.conf 文件: 要配置 basic_ldap_auth 帮助工具,请在 /etc/squid/squid.conf 的顶部添加以下配置条目: auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -…
- 列表:要配置 basic_ldap_auth 帮助工具,请在 /etc/squid/squid.conf 的顶部添加以下配置条目: auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.exam…
- 列表:-b base_DN 指定 LDAP 搜索基础的可分辨名称(DN),Squid 将从该搜索基础开始搜索用户。
- 命令/配置摘录:
auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389
acl ldap-auth proxy_auth REQUIRED http_access allow ldap-auth- 注意:重要 在 http_access deny 所有规则前指定这些设置。
3.3. 将 Squid 配置为带有 Kerberos 身份验证的缓存代理
- 要点:要使用 Kerberos 向活动目录(AD)验证用户,请将 Squid 配置为缓存代理。只有经过身份验证的用户才能使用代理。
- 要点:先决条件
- 列表:squid 软件包包含 /etc/squid/squid.conf 文件。如果您在之前编辑了这个文件,请删除并重新安装该软件包。
- 列表:要安装 Squid 的服务器是 AD 域的成员。
- 列表:安装软件包: # dnf install squid krb5-workstation
- 列表:以 AD 域管理员身份进行身份验证: # kinit administrator@AD.EXAMPLE.COM
- 列表:为 Squid 创建 keytab,将其存储在 /etc/squid/HTTP.keytab 文件中,并将 HTTP 服务主体添加到 keytab 中: # export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab # net ads keytab CREATE -U administrator # net ads keytab ADD HTTP -U administrator
- 列表:可选:如果系统最初使用 realm (通过 adcli)加入到 AD 域,请添加 HTTP 主体并为 Squid 创建 keytab 文件: 将 HTTP 服务主体添加到默认的 keytab 文件 /etc/krb5.keytab 中,并验证: # adcli update -vvv --domain=ad.example.com --computer-name=PROXY --add-service-principal="HTTP/proxy.ad.example.com" -C # klist -kte /etc/krb5.keytab | grep -i HTTP 加载 /etc/krb5.keytab 文件,删除除 HTT…
- 命令/配置摘录:
# dnf install squid krb5-workstation
# kinit administrator@AD.EXAMPLE.COM- 注意:警告 如果系统安全服务守护进程(SSSD)或 Samba/winbind 更新了机器帐户密码,/etc/krb5.keytab 中的密钥可能会被更新。更新后,/etc/squid/HTTP.keytab 中的密钥停止工作。您必须重复 ktutil 步骤,将新密钥复制到 keytab 中。
- 注意:重要 在 http_access deny all 规则前指定这些设置。
3.4. 在 Squid 中配置域拒绝列表
- 要点:要阻止对特定域的访问,请在 Squid 中配置域拒绝列表。阻止恶意或垃圾邮件的域会很有用。
- 要点:先决条件
- 列表:您已将 Squid 配置为缓存代理,用户可以使用代理。
- 列表:编辑 /etc/squid/squid.conf 文件中的以下设置: acl domain_deny_list dstdomain "/etc/squid/domain_deny_list.txt" http_access deny all domain_deny_list 重要 在允许访问用户或客户端的第一个 http_access allow 语句前添加这些条目。
- 列表:创建 /etc/squid/domain_deny_list.txt 文件,并添加您要阻止的域。例如,要阻止对包括子域的 example.com 的访问,并只阻止 example.net 的访问,请添加: .example.com example.net 重要 如果您引用了 squid 配置中的 /etc/squid/domain_deny_list.txt 文件,则该文件不能为空。如果文件为空,Squid 无法启动。
- 列表:重启 squid 服务: # systemctl restart squid
- 命令/配置摘录:
acl domain_deny_list dstdomain "/etc/squid/domain_deny_list.txt" http_access deny all domain_deny_list
.example.com example.net- 注意:重要 在允许访问用户或客户端的第一个 http_access allow 语句前添加这些条目。
- 注意:重要 如果您引用了 squid 配置中的 /etc/squid/domain_deny_list.txt 文件,则该文件不能为空。如果文件为空,Squid 无法启动。
3.5. 将 Squid 服务配置为监听特定端口或 IP 地址
- 要点:要将 Squid 服务配置为监听特定端口或 IP 地址,请编辑 /etc/squid/squid.conf 文件。默认情况下,Squid 代理服务侦听所有网络接口上的 3128 端口。
- 要点:先决条件
- 列表:您已安装了 squid 软件包。
- 列表:编辑 /etc/squid/squid.conf 文件: 要设置 Squid 服务侦听的端口,请在 http_port 参数中设置端口号。例如,要将端口设置为 8080,请输入: http_port 8080 要配置 Squid 服务侦听的 IP 地址,请在 http_port 参数中设置 IP 地址和端口号。例如,要配置 Squid 只监听 192.0.2.1 IP 地址的端口 3128,请输入: http_port 192.0.2.1:3128 向配置文件中添加多个 http_port 参数,以配置 Squid 侦听多个端口和 IP 地址: http_port 192.0.2.1:3128 http_port 192.0.2.…
- 列表:要设置 Squid 服务侦听的端口,请在 http_port 参数中设置端口号。例如,要将端口设置为 8080,请输入: http_port 8080
- 列表:要配置 Squid 服务侦听的 IP 地址,请在 http_port 参数中设置 IP 地址和端口号。例如,要配置 Squid 只监听 192.0.2.1 IP 地址的端口 3128,请输入: http_port 192.0.2.1:3128
- 列表:向配置文件中添加多个 http_port 参数,以配置 Squid 侦听多个端口和 IP 地址: http_port 192.0.2.1:3128 http_port 192.0.2.1:8080
- 列表:如果您配置了 Squid 使用与默认 3128 不同的端口: 在防火墙中打开端口: # firewall-cmd --permanent --add-port=port_number/tcp # firewall-cmd --reload 安装 policycoreutils-python-utils 软件包以使用 semanage 工具: # dnf install policycoreutils-python-utils 如果您在 enforcing 模式下运行 Security-Enhanced Linux(SELinux),请将端口分配给 squid_port_t 端口类型定义: # semanage port -a -t…
- 命令/配置摘录:
http_port 8080
http_port 192.0.2.1:3128完整目录
- 配置 Web 服务器和反向代理
- 对红帽文档提供反馈
- 第 1 章 配置 Apache HTTP web 服务器
- 1.1. Apache HTTP web 服务器简介
- 1.2. Apache 配置文件
- 1.3. 管理 httpd 服务
- 1.4. 配置单实例 Apache HTTP 服务器
- 1.5. 配置基于 Apache 名称的虚拟主机
- 1.6. 为 Apache HTTP web 服务器配置 Kerberos 验证
- 1.6.1. 在 IdM 环境中配置 gss-proxy
- 1.6.2. 为 Apache HTTP Web 服务器共享的目录配置 Kerberos 身份验证
- 1.7. 在 Apache HTTP 服务器中配置 TLS 加密
- 1.7.1. 在 Apache HTTP 服务器中添加 TLS 加密
- 1.7.2. 在 Apache HTTP 服务器中设置支持的 TLS 协议版本
- 1.7.3. 在 Apache HTTP 服务器上设置支持的密码
- 1.8. 配置 TLS 客户端证书身份验证
- 1.9. 安装 Apache HTTP 服务器手册
- 1.10. 使用 Apache 模块
- 1.10.1. 加载动态共享对象模块
- 1.10.2. 编译自定义 Apache 模块
- 第 2 章 配置 NGINX
- 2.1. 安装并准备 NGINX
- 2.2. 将 NGINX 配置为 web 服务器为不同域分配不同的内容
- 2.3. 在 NGINX web 服务器中添加 TLS 加密
- 2.4. 将 NGINX 配置为 HTTP 流量的反向代理
- 2.5. 将 NGINX 配置为 HTTP 负载均衡器
- 第 3 章 配置 Squid 缓存代理服务器
- 3.1. 将 Squid 配置为没有身份验证的缓存代理
- 3.2. 使用 LDAP 身份验证将 Squid 配置为缓存代理
- 3.3. 将 Squid 配置为带有 Kerberos 身份验证的缓存代理
- 3.4. 在 Squid 中配置域拒绝列表
- 3.5. 将 Squid 服务配置为监听特定端口或 IP 地址
