文章目录
- 前言
- 一、Web服务器是什么?
- 二、Apache和Nginx概念和比较
- HTTP Server
- 2.对比
- 三、反向代理服务器
- 1.反向代理服务器的概念
- 2.设计反向代理服务器的好处
- 四、SSL/TLS安全保障
- 1.什么是 SSL 和 TLS?
- 2.主要功能
- 3.工作原理
- 4.证书
- 五、配置你的Nginx
- 1.安装 Nginx
- 2.启动Nginx
- 3.配置反向代理
- 4.配置SSL/TLS增加安全性(建议)
- 5.验证反向代理设置
- 6.自动续期
- 六、配置你的Apache
- 1.安装 Apache
- 2.启动Apache
- 3.配置虚拟主机(可选)
- 4.配置SSL/TLS增加安全性(建议)
- 5.验证配置并重新加载 Apache
- 6.自动续期
- 七、配置时可能会遇到的问题
前言
如果你想让你在Linux服务器上的制作的网页、图像、文件等能被大众所访问,这时你就需要一个重要的工具(软件)——Web服务器,本文向大家介绍两款Linux上主流并且高性能的Web服务器:Apache Http Server和Nginx,以及如何确保两者在使用时的安全。
提示:老规矩,先讲概念
一、Web服务器是什么?
Web服务器是互联网应用的核心组件,提供了处理请求、传输内容、保证安全、提升性能、支持扩展等多种关键功能。无论是简单的静态网站还是复杂的动态Web应用,Web服务器都是不可或缺的基础设施,确保用户能够高效、安全地访问和使用Web资源。
二、Apache和Nginx概念和比较
HTTP Server
概念与历史
-
Apache HTTP Server,通常简称为 Apache,是由 Apache 软件基金会开发和维护的开源
Web服务器。Apache 是最早的 Web 服务器之一,并且在 Web 服务器市场上长期占据主导地位。 -
历史:Apache 的开发始于 1995 年,是最早的开源项目之一。它的名字来源于 “a patchy server”(一个打了很多补丁的服务器),因为它最初是基于 NCSA HTTPd 服务器的多个补丁集合。
功能
-
静态和动态内容服务:Apache能够提供静态文件(HTML、CSS、JavaScript、图像等)的服务,还可以通过模块支持动态内容(如PHP、Python、Perl、Ruby)。
-
模块化架构:Apache 的设计是模块化的,功能可以通过加载模块来扩展。常见模块包括mod_rewrite(用于 URL重写)、mod_ssl(用于 SSL/TLS 支持)和 mod_proxy(用于反向代理)。
-
虚拟主机:支持基于 IP 地址、域名和端口的虚拟主机配置,可以在同一服务器上托管多个网站。
-
高度可配置:Apache 的配置文件(通常是 和 )允许用户对服务器的各个方面进行详细配置。
-
认证和授权:Apache 提供多种认证和授权机制,支持基本认证、摘要认证以及与数据库或 LDAP 的集成。
-
日志记录:提供详细的访问日志和错误日志功能,支持自定义日志格式。
概念与历史
-
Nginx,发音为 “engine-x”,是由 Igor Sysoev 于 2004 年创建的开源 Web服务器和反向代理服务器。它的设计目标是高性能和高并发处理能力。
-
历史:Nginx 的开发始于 2002 年,并于 2004年首次发布。它迅速受到欢迎,尤其是在高流量网站中,因为它在处理大量并发连接时表现非常出色。
功能
-
高并发处理:Nginx 采用异步、事件驱动的架构,使其在处理高并发连接时具有显著优势。它可以处理数千个并发连接,资源消耗低。
-
反向代理和负载均衡:Nginx 提供强大的反向代理和负载均衡功能,可以将请求分发到后端服务器。
-
静态内容服务:非常适合提供静态文件的服务,性能优越。
-
模块化架构:与 Apache 类似,Nginx 的功能可以通过模块扩展,但 Nginx 的模块在编译时选择,并且不能像 Apache那样在运行时动态加载。
-
简洁的配置文件:Nginx 的配置文件采用简单、直观的语法,配置较为简洁。
-
SSL/TLS 支持:内置对 SSL/TLS 的支持,能够为网站提供 HTTPS 服务。
-
缓存:内置缓存功能,可以缓存静态和动态内容,提高性能。
-
可扩展性:通过 Lua 模块和其他第三方模块,Nginx 可以高度定制和扩展。
2.对比
1.设计架构
Apache:采用多进程或多线程模型,每个请求由单独的进程或线程处理。此模型在高负载情况下消耗较多资源。
Nginx:采用异步、事件驱动的模型,能够处理大量并发连接,资源消耗低。
2.性能
Apache:在处理静态内容时性能较好,但在高并发情况下性能不如 Nginx。
Nginx:在处理高并发连接和静态内容时表现出色,性能优越。
3.配置与管理
Apache:配置文件详细且复杂,适合需要精细控制的场景。
Nginx:配置文件简洁明了,易于理解和管理。
4.模块扩展
Apache:支持在运行时动态加载模块,模块生态系统丰富。
Nginx:模块在编译时选择,不能在运行时动态加载,模块数量较少但专注于性能。
5.使用场景
Apache:适用于需要复杂配置和模块支持的场景,如需要强大的认证、授权和 URL 重写功能的应用。
Nginx:适用于高并发、高性能需求的场景,如静态内容服务、反向代理和负载均衡。
注意:Apache 和 Nginx 各有优势,选择哪一个取决于具体的应用需求和性能要求。很多情况下,二者可以结合使用,例如 Nginx 作为反向代理服务器,前端处理所有的客户端请求,并将动态请求转发给后端的 Apache 服务器。
三、反向代理服务器
1.反向代理服务器的概念
反向代理服务器是一种服务器,位于客户端和目标服务器之间,用于转发客户端请求到目标服务器并将目标服务器的响应返回给客户端。反向代理服务器对外表现为实际的服务器,而实际的服务器(也称为后端服务器或上游服务器)在反向代理服务器的背后。
2.设计反向代理服务器的好处
-
负载均衡
目的:提高系统的可用性和扩展性。分担负载:通过将请求分发到多台后端服务器,反向代理可以有效分散负载,防止单个服务器过载。
健康检查:反向代理服务器可以监控后端服务器的状态,自动将流量转移到健康的服务器,确保服务的高可用性。
-
安全性增强
目的:保护后端服务器和数据。隐藏后端服务器:反向代理可以隐藏后端服务器的真实 IP 地址和配置,防止直接攻击。
SSL/TLS 终止:反向代理服务器可以处理所有的 SSL/TLS 加密和解密工作,将解密后的流量转发给后端服务器,简化后端服务器的配置,减轻其负担。
防火墙和访问控制:反向代理可以作为额外的安全层,过滤恶意流量、阻止 DDoS 攻击等。
-
缓存
目的:提高响应速度,减少后端服务器压力。内容缓存:反向代理服务器可以缓存静态内容和部分动态内容,减少对后端服务器的请求次数,提升性能和响应速度。
减少带宽使用:通过缓存常用资源,反向代理减少了重复的数据传输,从而降低了带宽消耗。
-
提高性能和响应速度
目的:优化用户体验。压缩和优化内容:反向代理可以在将内容返回给客户端之前进行压缩和优化,减少传输时间。
内容分发网络(CDN)集成:反向代理常用于 CDN 中,将内容分发到全球各地的缓存服务器,以降低延迟。
-
简化配置和管理
目的:集中化管理,简化维护。统一入口:反向代理提供了一个统一的入口,所有的请求都经过反向代理,这样可以集中管理安全策略、日志记录、认证等。
灵活的路由和重写规则:反向代理可以根据不同的规则,将请求路由到相应的后端服务器或应用。
-
协议转换和支持多种协议
目的:增加系统的兼容性和灵活性。协议转换:反向代理可以在不同的协议之间进行转换,例如将 HTTPS 请求转换为 HTTP 请求,将 WebSocket 请求转换为 HTTP 请求等。
支持多种协议:反向代理可以支持 HTTP、HTTPS、FTP、SMTP 等多种协议,为不同类型的应用提供服务。
-
会话持久性(粘性会话)
目的:确保用户会话的一致性。会话持久性:反向代理可以根据特定的规则(如 IP 地址、Cookie 等),将同一客户端的请求始终转发到同一台后端服务器,确保会话的一致性。
-
简化 SSL/TLS 管理
目的:简化证书管理和加密处理。集中化证书管理:在反向代理服务器上集中管理 SSL/TLS 证书,简化了证书的部署和更新。
SSL/TLS 卸载:反向代理处理所有的 SSL/TLS 加密和解密工作,后端服务器只需处理解密后的流量。
四、SSL/TLS安全保障
1.什么是 SSL 和 TLS?
SSL(Secure Sockets Layer)
SSL 是最早开发的加密协议,用于在客户端和服务器之间建立安全连接。它已经经历了多个版本,但由于一些已知的漏洞和安全问题,SSL 已经逐渐被弃用。
TLS(Transport Layer Security)
TLS 是 SSL 的继承者,旨在提供更强的安全性和性能。TLS 1.0 是 SSL 3.0 的改进版本,从那以后,TLS 协议不断演进,最新的版本是 TLS 1.3。
2.主要功能
加密:确保数据在传输过程中不能被未经授权的第三方读取。
认证:使用证书验证通信双方的身份,防止中间人攻击。
数据完整性:确保数据在传输过程中没有被篡改。
3.工作原理
SSL/TLS 工作原理通常分为以下几个步骤:
-
握手协议(Handshake Protocol):
客户端向服务器发送支持的 SSL/TLS 版本和加密算法。
服务器选择最强的加密算法,并将其证书发送给客户端。
客户端验证服务器证书的真实性,并生成一个会话密钥(sessionkey),用服务器的公钥加密后发送给服务器。
服务器使用其私钥解密会话密钥,并确认握手过程。
-
加密通信(Encrypted Communication):
双方使用会话密钥进行对称加密,确保数据的机密性和完整性。
4.证书
SSL/TLS 使用数字证书来验证服务器和客户端的身份。证书由受信任的第三方机构(证书颁发机构,CA)签署。一个典型的 SSL/TLS 证书包括:
公钥:用于加密会话密钥。
域名:验证证书属于的域名。
证书颁发机构的签名:验证证书的真实性。
SSL 证书既有付费的,也有免费的选择,免费的选项(如 Let's Encrypt 和 Cloudflare)对于大多数网站来说已经足够。但如果你需要更高级的功能、支持和信任级别,可以选择付费证书。无论选择哪种证书,确保网站使用 HTTPS 是至关重要的,因为它不仅保护了用户的数据,还提升了搜索引擎的排名和用户信任度。
我个人还是比较推荐使用Certbot来获取和管理 Let’s Encrypt 免费证书
五、配置你的Nginx
注意:以下内容均在CentOS 7root用户下下进行
注意:经本人测试CentOS 7自带的yum软件包中可能未添加Nginx 软件源,此时需要我们先手动添加
yum-config-manager --add-repo=/packages/mainline/centos/7/x86_64/
1.安装 Nginx
yum install -y nginx
2.启动Nginx
systemctl start nginx
systemctl enable nginx
3.配置反向代理
编辑Nginx配置文件以设置反向代理。你可以将配置放在默认的/etc/nginx/文件中,或者创建一个新的配置文件放在/etc/nginx//目录中。
下面是一个基本的反向代理配置示例,将请求代理到后端服务器(假设后端服务器运行在http://backend_server:8080):
server {
listen 80;
server_name your_domain_or_ip;#nginx的ip
location / {
proxy_pass http://backend_server:8080;#你的后端服务器的ip
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
测试Nginx配置以确保没有语法错误
nginx -t
如果测试通过,重新加载Nginx配置
systemctl reload nginx
4.配置SSL/TLS增加安全性(建议)
-
安装Certbot
Certbot是用于自动获取和管理SSL证书的工具,强烈推荐
yum -y install certbot python3-certbot-nginx
- 获取证书并自动配置Nginx
certbot --nginx -d your_domain_or_ip
5.验证反向代理设置
确保反向代理设置正确,可以通过访问你的域名或IP地址来验证。你应该能够看到反向代理服务器将请求转发到后端服务器并返回响应。
你也可以检查默认配置文件/etc/nginx/
cat /etc/nginx/
你大致会看到如下内容
server {
listen 80;
server_name your_domain_or_ip;
# Redirect HTTP to HTTPS
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name your_domain_or_ip;
ssl_certificate /etc/letsencrypt/live/your_domain_or_ip/;
ssl_certificate_key /etc/letsencrypt/live/your_domain_or_ip/;
include /etc/letsencrypt/;
ssl_dhparam /etc/letsencrypt/;
location / {
proxy_pass http://backend_server:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
6.自动续期
Let’s Encrypt 证书的有效期为 90 天,但 Certbot 会自动设置定时任务,定期检查和续期证书。你可以通过以下命令手动测试续期过程:
certbot renew --dry-run
六、配置你的Apache
为了避免之前的操作照成源被修改无法下载httpd建议:
yum update
yum -y install epel-release # 如果尚未安装 EPEL 仓库,首先安装 EPEL 仓库
1.安装 Apache
yum install httpd
2.启动Apache
#启动httpd(apache)
sudo systemctl start httpd
#开机自启动
sudo systemctl enable httpd
3.配置虚拟主机(可选)
如果你想在同一台服务器上托管多个网站,你需要配置虚拟主机。虚拟主机允许 Apache 在同一台服务器上为不同的域名提供不同的内容。
在 CentOS/RHEL 系统上,虚拟主机配置文件位于 /etc/httpd// 目录下,通常以 .conf 为后缀。
以下是一个简单的虚拟主机配置示例:
<VirtualHost *:80>
ServerAdmin webmaster@
DocumentRoot /var/www/html/example
ServerName
ServerAlias
ErrorLog /var/log/httpd/example_error.log
CustomLog /var/log/httpd/example_access.log combined
</VirtualHost>
在这个示例中,虚拟主机配置了一个基本的网站,将 和 的请求指向 /var/www/html/example 目录下的文件。
4.配置SSL/TLS增加安全性(建议)
- 安装OpenSSL
yum -y install httpd openssl
# 重启httpd服务
systemctl restart httpd
- 安装Certbot
yum -y install certbot python3-certbot-apache
- 获取证书并自动配置Apache
certbot --apache -d your_domain_or_ip
这将启动 Certbot 的交互式界面,并引导你完成获取证书的过程。Certbot 将自动检测你的 Apache 配置,并配置 SSL 虚拟主机以提供 HTTPS 连接。
按照提示操作:Certbot 会要求你提供一些信息,如邮箱地址、同意服务条款等。接受后,它会自动检测你的域名,并生成 SSL/TLS 证书。一旦证书生成成功,Certbot 将自动更新你的 Apache 配置以启用 HTTPS。
5.验证配置并重新加载 Apache
#验证 Apache 配置文件是否正确
apachectl configtest
#如果没有错误,重新加载 Apache 以应用新的配置
systemctl reload httpd
6.自动续期
通常,Certbot 会创建一个定时任务来自动续期证书。你可以使用以下命令来模拟续期过程,确保其正常工作:
certbot renew --dry-run
七、配置时可能会遇到的问题
不同的系统或者版本可能会出现格式各样的错误,我会尽我所能把我遇到过的问题反馈给大家
报错1:Public key for nginx-1.27.0-2..x86_64.rpm is not installed
这个错误提示表明你的系统没有安装 Nginx 软件包所需的 GPG 公钥。这可能会导致安装软件包失败。
解决方法:
#手动导入 GPG 公钥
wget /keys/nginx_signing.key
#导入 GPG 公钥到系统中
rpm --import nginx_signing.key
#安装 epel-release 软件包
yum -y install epel-release
#有时候软件包下载过程中可能出现问题,导致其中的 GPG 公钥不完整。你可以尝试删除已下载的软件包,并重新下载:
rm -rf /var/cache/yum/*
yum clean all
yum update
然后再重新安装Nginx
报错2:Job for failed because the control process exited with error code. See “systemctl status ” and “journalctl -xe” for details.根据本人经验,这很可能是你的80端口被占用,因为Nginx 默认端口为 80,在80端口被占用的情况下Nginx服务无法绑定到 0.0.0.0:80所以启动失败
解决方法:
1.停止占用端口 80 的服务
#找出哪个服务占用了端口 80
netstat -tuln | grep :80
#或者用lsof 命令可以列出打开的文件(包括网络连接),并显示打开文件的进程信息
lsof -i :80
#停止服务
kill [PID]
2.修改 Nginx 配置文件(可以但是不建议):
如果你无法停止占用端口 80 的其他服务,你可以尝试修改 Nginx 的配置文件,将 Nginx 监听在其他空闲端口上。打开 Nginx 配置文件(通常是 /etc/nginx/ 或 /etc/nginx/sites-available/default),找到监听端口的部分,将端口改为其他值,例如 8080:
server {
listen 8080;
...
}
报错3:An unexpected error occurred:The server will not issue certificates for the identifier :: Error creating new order :: Cannot issue for “y”: Domain name needs at least one dot.
分析:可能的原因之一是在请求证书时提供了一个无效的域名。请确保你提供的域名是正确的,包含有效的*域名和子域名,并且在 DNS 中正确配置。如果你使用的是自定义域名,请确保它已正确指向你的服务器。
解决方法:
#确认目标可达
ping
#然后重新配置证书(一定要按照Certbot 的交互式界面的引导完成)
certbot --apache