18.WEB 服务器
WEB 服务器
WEB 服务器简介
WEB(全称为 WWW,即 WORLD WIDE WEB),中文常称为万维网或全球信息网。它的核心功能很简单:为互联网用户提供信息浏览服务。比如,当你在浏览器里输入网址(像 http://www.example.com
)并按下回车时,背后就是 WEB 服务器在工作 —— 它会接收你的请求,然后把对应的网页、图片、视频等内容发送到你的浏览器上,让你能看到这些信息。
除了最基础的网页浏览,WEB 服务器还能扩展出更多功能,比如提供电子邮件(Email)收发、文件传输(FTP)等互联网服务。
常见的 WEB 服务器有:Apache、Nginx、Lighttpd、Tomcat、IIS 等。
Nginx
Nginx 相关实验流程
1. Nginx 基础安装与配置
- 安装 Nginx 并设置开机自启
- 替换默认首页内容
- 配置防火墙允许 HTTP 服务
- 客户端测试访问(配置客户端 hosts 文件后验证)
2. 启用 UserDir 功能
- 配置 Nginx 支持 UserDir(在 server 块中添加相关规则)
- 重启 Nginx 使配置生效
- 若启用 SELinux,修改布尔值允许 HTTP 服务访问用户家目录
- 普通用户创建个人网页(修改家目录权限、创建 public_html 文件夹及测试首页)
- 测试访问用户目录下的网页
3. 虚拟主机配置
根据名称(域名)区分虚拟主机
- 创建虚拟主机配置文件
- 在配置文件中分别设置对应不同域名的虚拟主机(指定域名和网站文件存放目录)
根据端口区分虚拟主机
- 创建端口虚拟主机配置文件
- 在配置文件中分别设置监听不同端口的虚拟主机(指定端口、域名和网站文件存放目录)
4. 配置 SSL/TLS
- 生成 RSA 私钥
- 生成证书签名请求(CSR)
- 生成自签名证书
- 创建证书存放目录并移动证书文件
- 配置 Nginx 站点支持 HTTPS(指定监听端口、域名、证书路径等)
- 配置 HTTP 自动重定向到 HTTPS
- 配置防火墙允许 HTTPS 服务通过
- 测试 HTTPS 配置及重定向功能
5. 配置 Nginx 基本认证(密码保护特定目录)
- 安装生成密码文件的工具
- 编辑 Nginx 配置文件,添加基本认证规则(指定保护路径、认证提示信息和密码文件路径)
- 重启 Nginx 使配置生效
- 创建基本认证的用户和密码文件
- 创建测试页面
- 测试基本认证功能
6. 支持动态脚本
使用 PHP
- 安装 PHP 和 php-fpm 及常用扩展
- 验证 PHP 版本及命令行运行是否正常
- 准备 PHP 测试页
- 启动 php-fpm 并设置开机自启
- 配置 Nginx 解析 PHP(添加 PHP 解析规则)
- 重启 Nginx 使配置生效
- 测试访问 PHP 页面
使用 FastCGI
- 安装 fcgiwrap(FastCGI 处理器)
- 配置 Nginx 支持 FastCGI(指定 CGI 脚本存放目录等规则)
- 创建 CGI 脚本存放目录并设置权限
- 在 SSL 站点配置中引入 FastCGI 规则
- 重启 Nginx 使配置生效
- 创建 fcgiwrap 的 systemd 服务文件和 socket 配置文件
- 启动 fcgiwrap 服务并设置开机自启
- 若启用 SELinux,修改策略允许 Nginx 访问 fcgiwrap 的 socket
- 准备测试脚本并添加执行权限
- 测试访问 CGI 脚本
7. 部署反向代理
代理服务器配置
- 配置域名解析使代理服务器能访问真实服务器
- 安装 Nginx 并设置开机自启
- 配置防火墙允许 HTTP 服务通过
- 配置反向代理规则(设置监听端口、代理相关参数及转发路径)
- 重启 Nginx 使配置生效
- 若启用 SELinux,允许 Nginx 发起网络连接
真实服务器配置
- 安装 Nginx 并设置开机自启
- 配置防火墙允许 HTTP 服务通过
- 准备测试页
- 测试代理效果(客户端访问代理服务器对应路径,验证是否返回真实服务器内容)
Nginx 是一款高性能的 HTTP 服务器和反向代理服务器。它的一大优势是 “聪明”—— 能根据不同的操作系统(比如 Linux、BSD)选择最高效的网络 I/O 模型(比如 Linux 上的 epoll、BSD 上的 kqueue)。这让 Nginx 在面对大量用户同时访问时表现特别好:能支持高达 5 万个并发连接,同时对服务器的内存、CPU 消耗很低,运行也很稳定,因此常被用于访问量很大的网站。
实验操作
安装 Nginx
# 功能:使用 yum 包管理工具自动安装 Nginx 及其依赖的组件
# 语法:yum -y install 软件名
# 选项:-y 自动确认所有安装提示,无需手动输入 yes(避免安装过程中频繁确认)
[root@server ~]# yum -y install nginx# 功能:启动 nginx 服务,并设置开机自动启动
# 语法:systemctl enable 服务名 --now
# 选项:
# enable:将服务设置为开机自动启动(重启服务器后仍会自动运行)
# --now:在设置开机自启的同时,立即启动服务(无需再单独执行 start 命令)
[root@server ~]# systemctl enable nginx --now# 功能:备份默认首页文件(避免被新内容覆盖)
# 语法:mv 源文件 目标文件
# 说明:{,.ori} 是 Shell 的简写,等价于 mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.ori
[root@server ~]# mv /usr/share/nginx/html/index.html{,.ori}# 功能:创建新的首页文件,内容为 "Hello World From Nginx"
# 语法:echo 内容 > 文件名(将内容写入文件,若文件不存在则创建)
[root@server ~]# echo Hello World From Nginx > /usr/share/nginx/html/index.html# 功能:配置防火墙,允许 HTTP 服务的流量通过(默认端口 80)
# 语法:firewall-cmd --add-service=服务名 --permanent
# 选项:
# --add-service=http:允许 HTTP 服务(对应端口 80)的流量进入服务器
# --permanent:设置为永久生效(重启防火墙或服务器后仍有效,否则仅当前会话有效)
[root@server ~]# firewall-cmd --add-service=http --permanent# 功能:重新加载防火墙配置,使上述设置生效
# 语法:firewall-cmd --reload
[root@server ~]# firewall-cmd --reload# 功能:在客户端测试能否访问服务器的网页
# 语法:curl 网址(发送 HTTP 请求并显示响应内容)
[root@client ~]# curl http://www.bq.cloud# 说明:客户端需要配置 hosts 文件,让域名解析到服务器的 IP(否则无法通过域名访问)
# Windows 系统:修改 C:\Windows\System32\drivers\etc\hosts 文件
# Linux/Unix 系统:修改 /etc/hosts 文件
# 格式:服务器 IP 域名(表示访问该域名时,实际指向服务器的 IP)
10.1.8.10 www.bq.cloud
启用 UserDir
UserDir 功能简单说就是:让每个用户在自己的家目录下创建一个 public_html
文件夹,用来存放个人网页,其他人可以通过 http://域名/~用户名/
访问到这些网页(比如 http://www.bq.cloud/~bq/
访问用户 bq
的网页)。
# 功能:编辑 Nginx 配置文件,添加 UserDir 支持的规则
[root@server ~]# vim /etc/nginx/nginx.conf# 在 server 块中添加以下配置(匹配用户目录访问规则)
server {# 功能:匹配以 ~用户名 开头的 URL(比如 /~bq/ 或 /~bq/test.html)# 语法:location ~ 正则表达式 { ... }(~ 表示正则匹配)# 正则说明:^/~(.+?)(/.*)?$ # - ^ 表示开头,$ 表示结尾# - (.+?) 提取用户名(比如从 /~bq/ 中提取 bq)# - (/.*)? 提取后续路径(比如从 /~bq/test.html 中提取 /test.html,可选)location ~ ^/~(.+?)(/.*)?$ {# 功能:将 URL 映射到实际的文件路径# 说明:/home/$1/public_html$2 中,$1 是提取的用户名,$2 是后续路径# 例如:访问 /~bq/test.html 时,实际访问 /home/bq/public_html/test.htmlalias /home/$1/public_html$2;# 功能:指定访问目录时默认查找的首页文件(按顺序优先匹配存在的文件)index index.html index.htm;}
}# 功能:重启 Nginx 服务,使新配置生效
# 语法:systemctl restart 服务名
[root@server ~]# systemctl restart nginx# 功能:如果服务器启用了 SELinux,需修改规则允许 HTTP 服务访问用户家目录
# 语法:setsebool -P 布尔值 状态
# 选项:
# -P:永久生效(重启服务器后仍有效)
# httpd_enable_homedirs on:允许 httpd 进程(Nginx 也受此规则影响)访问用户家目录
[root@server ~]# setsebool -P httpd_enable_homedirs on# 普通用户测试步骤:
# 1. 功能:修改家目录权限,允许 httpd 进程进入(需要执行权限 x)
# 语法:chmod 权限 目录(711 表示所有者有全部权限,组和其他用户只有执行权限)
[bq@server ~]$ chmod 711 /home/bq# 2. 功能:创建 public_html 文件夹(用于存放个人网页)
# 语法:mkdir 文件夹名(~ 表示用户家目录,即 /home/bq)
[bq@server ~]$ mkdir ~/public_html# 3. 功能:修改 public_html 权限,允许 httpd 进程读取内容(需要读 r 和执行 x 权限)
# 语法:chmod 权限 目录(755 表示所有者有全部权限,组和其他用户有读和执行权限)
[bq@server ~]$ chmod 755 ~/public_html# 4. 功能:创建测试首页文件
[bq@server ~]$ vim ~/public_html/index.html
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: center;">
Nginx UserDir Test Page <!-- 页面内容:显示 UserDir 测试页 -->
</div>
</body>
</html># 功能:在客户端测试访问用户目录下的网页
[root@client ~]# curl http://www.bq.cloud/~bq/
虚拟主机
虚拟主机可以理解为:在同一台 WEB 服务器上,通过配置让它 “分身” 成多个网站 —— 比如用不同的域名(如 web1.bq.cloud
和 web2.bq.cloud
)或不同的端口(如 8081 和 8082),访问时会得到不同的内容。
根据名称(域名)区分虚拟主机
通过不同的域名访问同一服务器的 80 端口(HTTP 默认端口),得到不同的网站内容。
# 功能:创建虚拟主机配置文件(Nginx 推荐将虚拟主机配置放在 conf.d 目录,方便管理)
[root@server ~]# vim /etc/nginx/conf.d/vhost-name.conf
# 第一个虚拟主机:对应域名 web1.bq.cloud
server {server_name web1.bq.cloud; # 绑定的域名(访问该域名时匹配此配置)root /usr/share/nginx/web1; # 网站文件存放目录(web1 的内容存在这里)
}# 第二个虚拟主机:对应域名 web2.bq.cloud
server {server_name web2.bq.cloud; # 绑定的域名root /usr/share/nginx/web2; # 网站文件存放目录(web2 的内容存在这里)
}
根据端口区分虚拟主机
通过同一域名的不同端口访问,得到不同的网站内容。
# 功能:创建端口虚拟主机配置文件
[root@server ~]# vim /etc/nginx/conf.d/vhost-port.conf
# 第一个虚拟主机:监听 8081 端口
server {listen 8081; # 监听的端口(访问 8081 端口时匹配此配置)server_name www.bq.cloud; # 绑定的域名root /usr/share/nginx/8081; # 网站文件存放目录
}# 第二个虚拟主机:监听 8082 端口
server {listen 8082; # 监听的端口server_name www.bq.cloud; # 绑定的域名root /usr/share/nginx/8082; # 网站文件存放目录
}
补充:配置端口虚拟主机后,需在防火墙开放对应端口(如 8081、8082),否则外部无法访问(或者直接将防火墙关闭):
# 开放 8081 端口(永久生效) firewall-cmd --add-port=8081/tcp --permanent # 开放 8082 端口(永久生效) firewall-cmd --add-port=8082/tcp --permanent # 重新加载防火墙配置 firewall-cmd --reload
配置 SSL/TLS
SSL/TLS 是用于加密网络通信的协议。配置后,网站可以通过 HTTPS(默认端口 443)提供服务,让用户和服务器之间的数据传输更安全(比如登录密码、支付信息不会被中途窃取)。
OpenSSL 工具
OpenSSL 是一个开源的加密工具库,是配置 SSL/TLS 的 “核心工具”,可以生成密钥、证书,还能进行加密解密等操作。
基础选项
-in <file>
:指定输入文件(比如私钥、证书等)。-out <file>
:指定输出文件(比如生成的密钥、证书等)。-help
:查看某个子命令的详细选项(例如openssl genrsa -help
)。
密钥生成相关命令
openssl genrsa
(生成 RSA 私钥)- 功能:生成 RSA 算法的私钥(私钥是加密通信的核心,必须妥善保管,不能泄露)。
- 语法:
openssl genrsa [选项] 密钥长度
- 常用选项:
-des3
:用 3DES 算法加密私钥(使用私钥时需要输入密码,更安全但麻烦)。-aes256
:用 AES-256 算法加密私钥(比 3DES 更安全,推荐使用)。2048
/4096
:指定密钥长度(单位:位)。2048 位满足基础安全需求,4096 位更安全但加密解密速度稍慢。-out <file>
:将生成的私钥保存到指定文件。
openssl ecparam
(生成 ECC 椭圆曲线密钥)- 功能:生成基于椭圆曲线算法(ECC)的私钥(ECC 比 RSA 更高效,相同安全级别下密钥更短)。
- 语法:
openssl ecparam [选项]
- 常用选项:
-genkey
:生成椭圆曲线私钥。-name <curve>
:指定椭圆曲线类型(如secp256r1
、prime256v1
,安全性高且性能好)。
证书签名请求(CSR)相关命令
openssl req
(生成 CSR 或自签名证书)
- 功能:生成 CSR(向证书颁发机构 CA 申请正式证书的请求文件),或直接生成自签名证书(用于测试,浏览器会提示 “证书不受信任”)。
- 语法:
openssl req [选项]
- 常用选项:
-new
:生成新的 CSR 文件。-key <file>
:指定私钥文件(CSR 必须与私钥绑定)。-x509
:跳过 CSR 步骤,直接生成自签名证书(仅用于测试)。-days <num>
:指定证书有效期(仅与-x509
配合使用,如 365 表示 1 年)。-subj <string>
:非交互式指定证书主题信息(避免手动输入),格式:
/C=国家代码/ST=省份/L=城市/O=组织名称/OU=部门名称/CN=域名/emailAddress=管理员邮箱
(注意:CN
必须与网站域名一致,否则浏览器会提示证书无效)。
证书查看与验证命令
openssl x509
(处理 X.509 格式证书)
- 功能:查看、转换或验证 X.509 格式证书(最常用的证书格式)。
- 语法:
openssl x509 [选项] -in 证书文件
- 常用选项:
-noout
:不输出证书原始内容(只显示解析后的信息)。-text
:显示证书详细信息(包括版本、序列号、颁发者、有效期、公钥等)。-subject
:只显示证书主体信息(如域名、组织等)。-issuer
:只显示证书颁发者信息(CA 机构)。-dates
:显示证书有效期(notBefore
起始时间,notAfter
过期时间)。-fingerprint
:显示证书指纹(如 SHA256 指纹,用于校验证书是否被篡改)。
文件加密 / 解密命令
openssl enc
(对称加密文件)
- 功能:用对称加密算法(如 AES)加密或解密文件(比如加密敏感文档)。
- 语法:
openssl enc -算法 [选项] -in 输入文件 -out 输出文件
- 常用选项:
-e
:加密模式(默认,可省略)。-d
:解密模式。-aes-256-cbc
/-aes-128-gcm
:指定加密算法(GCM 模式比 CBC 更安全,推荐)。-salt
:自动添加随机盐值(增强加密强度,必须开启)。-k <password>
:指定加密 / 解密密码(也可通过-pass file:密码文件
从文件读取)。
格式转换命令
-
openssl pkcs12
(转换为 PFX/PKCS#12 格式)-
功能:将私钥和证书打包为单一文件(Windows 系统常用此格式,方便导入)。
-
语法:
openssl pkcs12 -export -inkey 私钥文件 -in 证书文件 -name 别名 -out 输出文件
-
示例:
# 将 private.key 私钥和 cert.crt 证书打包为 cert.pfx openssl pkcs12 -export -inkey private.key -in cert.crt -name "mycert" -out cert.pfx
-
-
PEM 与 DER 格式互转
-
PEM 是文本格式(以-----BEGIN…开头),DER 是二进制格式,两者可通过以下命令转换:
# PEM 证书转 DER 证书 openssl x509 -in cert.pem -out cert.der -outform der# DER 私钥转 PEM 私钥 openssl rsa -in key.der -out key.pem -inform der
-
生成 SSL 证书(自签名证书,用于 HTTPS 加密)
自签名证书是自己生成并签名的,适合测试(浏览器会提示 “证书不受信任”);正式环境需要用 CA 机构(如 Let’s Encrypt)颁发的证书。
# 1. 生成 RSA 私钥
# 功能:生成 2048 位的 RSA 私钥,保存到 www.key 文件
# 语法:openssl genrsa -out 输出文件 密钥长度
# 说明:私钥需保密,权限建议设为 600(只有所有者可读写)
[root@server ~]# openssl genrsa -out www.key 2048 # 2. 生成证书签名请求(CSR)
# 功能:基于私钥生成 CSR 文件(用于向 CA 申请证书)
# 语法:openssl req -new -key 私钥文件 -out CSR 文件 -subj 主题信息
# 选项说明:
# -new:生成新的 CSR
# -key:指定私钥文件(与 CSR 绑定)
# -out:输出 CSR 文件
# -subj:非交互式指定主题信息(避免手动输入)
# /C=CN:国家(CN 表示中国)
# /ST=JS:省份(JS 表示江苏省)
# /L=NJ:城市(NJ 表示南京市)
# /O=LM:组织名称(自定义)
# /OU=DEVOPS:部门名称(自定义)
# /CN=www.bq.cloud:域名(必须与网站域名一致)
# /emailAddress=bq@bq.cloud:管理员邮箱(可选)
[root@server ~]# openssl req -new -key www.key -out www.csr -subj "/C=CN/ST=JS/L=NJ/O=LM/OU=DEVOPS/CN=www.bq.cloud/emailAddress=bq@bq.cloud" # 3. 生成自签名证书(用自己的私钥签名 CSR)
# 功能:基于 CSR 和私钥生成自签名证书,有效期 3650 天
# 语法:openssl x509 -req -days 有效期 -in CSR 文件 -signkey 私钥文件 -out 证书文件
# 选项说明:
# -req:表示输入文件是 CSR
# -days:证书有效期(天)
# -in:输入 CSR 文件
# -signkey:用指定的私钥签名(自签名)
# -out:输出证书文件(用于配置到服务器)
[root@server ~]# openssl x509 -req -days 3650 -in www.csr -signkey www.key -out www.crt
配置 Nginx 站点支持 HTTPS
# 功能:创建证书存放目录(按域名分类,方便管理多个证书)
[root@server ~]# mkdir /etc/ssl/certs/www.bq.cloud# 功能:将生成的证书文件(私钥、CSR、证书)移动到专用目录
[root@server ~]# mv www* /etc/ssl/certs/www.bq.cloud# 功能:编辑 Nginx SSL 配置文件(创建新文件管理 HTTPS 站点)
[root@server ~]# vim /etc/nginx/conf.d/ssl.conf
server {# 功能:监听 443 端口(HTTPS 默认端口),启用 SSL 加密和 HTTP/2 协议# 说明:HTTP/2 比 HTTP/1 性能更好,支持多路复用listen 443 ssl http2 default_server;listen [::]:443 ssl http2 default_server;# 绑定的域名(必须与证书的 CN 字段一致,否则证书无效)server_name www.bq.cloud;# 网站根目录(存放网页文件的位置)root /usr/share/nginx/html;# 配置 SSL 证书路径(公钥证书,客户端会验证此证书)ssl_certificate "/etc/ssl/certs/www.bq.cloud/www.crt";# 配置 SSL 私钥路径(服务器用于解密客户端请求,需保密)ssl_certificate_key "/etc/ssl/certs/www.bq.cloud/www.key";
}# 功能:重启 Nginx 服务,使 HTTPS 配置生效
[root@server ~]# systemctl restart nginx# 功能:配置 HTTP(80 端口)自动重定向到 HTTPS(443 端口)
# 说明:用户访问 http://www.bq.cloud 时,自动跳转到 https://www.bq.cloud
[root@server ~]# vim /etc/nginx/nginx.confserver {# 监听 80 端口(HTTP 默认端口)listen 80 default_server;listen [::]:80 default_server;# 绑定的域名(与 HTTPS 站点一致)server_name www.bq.cloud;# 网站根目录(重定向场景下可省略实际内容)root /usr/share/nginx/html;# 功能:301 永久重定向,将所有 HTTP 请求转发到 HTTPS# 变量说明:# $host:当前请求的域名(如 www.bq.cloud)# $request_uri:当前请求的路径和参数(如 /test?a=1)return 301 https://$host$request_uri;}# 功能:重启 Nginx 服务,使重定向配置生效
[root@server ~]# systemctl restart nginx# 功能:配置防火墙,允许 HTTPS 服务通过(默认端口 443)
[root@server ~]# firewall-cmd --add-service=https --permanent
[root@server ~]# firewall-cmd --reload# 测试 HTTPS 配置:
# 1. 测试 HTTP 是否自动重定向到 HTTPS(应返回 301 跳转信息)
[root@client ~]# curl http://www.bq.cloud/# 2. 测试 HTTPS 访问(-k 选项:忽略自签名证书的不信任提示,正式环境无需此选项)
[root@client ~]# curl -k https://www.bq.cloud/
配置 Nginx 基本认证(密码保护特定目录)
基本认证是通过 “用户名 + 密码” 限制访问特定目录的功能。但要注意:用户名和密码会通过 HTTP 明文传输,因此必须配合 SSL/TLS(HTTPS)使用,否则有安全风险。
# 功能:安装生成密码文件的工具(httpd-tools 包含 htpasswd 命令)
[root@server ~]# yum -y install httpd-tools# 功能:编辑 Nginx SSL 配置文件,添加基本认证规则
[root@server ~]# vim /etc/nginx/conf.d/ssl.conf
# 在 server 块中添加以下配置(保护 /auth-basic/ 路径)
server {.....# 功能:对访问 /auth-basic/ 路径的请求启用基本认证location /auth-basic/ {auth_basic "Basic Auth"; # 认证提示信息(浏览器弹窗显示)auth_basic_user_file "/etc/nginx/.htpasswd"; # 密码文件路径(存储用户名和加密后的密码)}
}# 功能:重启 Nginx 服务,使认证配置生效
[root@server ~]# systemctl restart nginx# 功能:创建基本认证的用户(用户名:bq)和密码文件
# 语法:htpasswd -c 密码文件 用户名(-c 仅首次创建文件时使用,否则会覆盖)
# 说明:密码会被加密存储(不是明文),密码文件权限建议设为 600
[root@server ~]# htpasswd -c /etc/nginx/.htpasswd bq
New password: # 输入密码(如 redhat,输入时不显示)
Re-type new password: # 再次输入密码确认
Adding password for user bq # 提示用户创建成功# 功能:创建测试页面(用于验证基本认证)
[root@server ~]# mkdir /usr/share/nginx/html/auth-basic # 创建被保护的目录
# 创建测试页面内容
[root@server ~]# vim /usr/share/nginx/html/auth-basic/index.html
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: center;">
Test Page for Basic Authentication <!-- 页面内容:基本认证测试页 -->
</div>
</body>
</html># 测试基本认证:
# 1. 直接访问会提示 401 Unauthorized(未授权)
[root@client ~]# curl http://www.bq.cloud/auth-basic/# 2. 带用户名密码的访问命令(正确格式):
# 语法:curl -u 用户名:密码 https://域名/路径 -k(-k 用于自签名证书)
[root@client ~]# curl -u bq:redhat https://www.bq.cloud/auth-basic/ -k
支持动态脚本
Nginx 本身不能直接解析动态脚本(如 PHP、Python 等),需要通过 FastCGI 等方式配合对应的处理器(如 php-fpm 处理 PHP、fcgiwrap 处理多种脚本)来实现。
使用 PHP
PHP 是常用的动态网页开发语言,Nginx 通过 php-fpm(PHP FastCGI 进程管理器)来解析 PHP 脚本。
# 功能:安装 PHP 和 php-fpm(php-fpm 是处理 PHP 的 FastCGI 进程管理器)
# 说明:同时安装常用扩展(如 gd 处理图片、mbstring 处理多字节字符等)
[root@server ~]# yum install -y php php-fpm
[root@server ~]# yum install -y php-gd php-common php-pear php-mbstring php-mcrypt# 功能:查看 PHP 版本(验证安装成功)
[root@server ~]# php -v# 功能:测试 PHP 命令行运行是否正常
# 创建一个简单的 PHP 脚本:输出 "PHP Test Page" 并换行
[root@server ~]# echo "<?php echo 'PHP Test Page'.\"\n\"; ?>" > php_test.php
# 执行脚本(若输出 "PHP Test Page" 则正常)
[root@server ~]# php php_test.php
PHP Test Page# 功能:准备测试页(通过网页访问 PHP 信息)
# 创建 info.php,内容为 phpinfo() 函数(输出 PHP 详细配置信息)
[root@server ~]# echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php # 功能:启动 php-fpm 并设置开机自启(否则 Nginx 无法解析 PHP)
[root@server ~]# systemctl enable php-fpm --now# 功能:配置 Nginx 解析 PHP
[root@server ~]# vim /etc/nginx/conf.d/default.conf
server {...# 添加 PHP 解析规则:匹配 .php 结尾的请求location ~ \.php$ {root /usr/share/nginx/html; # PHP 文件存放目录fastcgi_pass 127.0.0.1:9000; # 连接 php-fpm 进程(默认监听 9000 端口)fastcgi_index index.php; # 默认 PHP 首页# 功能:指定 PHP 文件的实际路径(供 php-fpm 查找文件)# 变量说明:$document_root 是 root 配置的目录,$fastcgi_script_name 是请求的 PHP 文件名fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params; # 包含 FastCGI 通用参数(如请求方法、URL 等)}
}# 功能:重启 Nginx 服务,使配置生效
[root@server ~]# systemctl restart nginx# 功能:测试通过网页访问 PHP 页面(应输出 PHP 配置信息)
[root@client ~]# curl http://www.bq.cloud/info.php
使用 FastCGI
FastCGI 是一种通信协议,用于 WEB 服务器与动态脚本处理器之间的通信。fcgiwrap 是一个通用的 FastCGI 处理器,可解析多种脚本(如 Python、Perl 等)。
# 功能:从 EPEL 源安装 fcgiwrap(FastCGI 处理器)
[root@server ~]# yum install -y fcgiwrap# 功能:配置 Nginx 支持 FastCGI(指定 CGI 脚本存放目录)
[root@server ~]# vim /etc/nginx/fcgiwrap.conf
# 示例:允许访问 /cgi-bin/ 路径下的 CGI 脚本
location /cgi-bin/ {gzip off; # 关闭压缩(避免二进制数据压缩导致解析错误)root /usr/share/nginx; # 网站根目录(/cgi-bin/ 实际路径为 /usr/share/nginx/cgi-bin/)fastcgi_pass unix:/var/run/fcgiwrap.socket; # 连接 fcgiwrap 的 Unix socket(进程间通信的一种方式)include /etc/nginx/fastcgi_params; # 包含 FastCGI 通用参数# 功能:指定 CGI 脚本的实际路径# 变量说明:$document_root 是 root 配置的目录,$fastcgi_script_name 是请求的脚本路径fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}# 功能:创建 CGI 脚本存放目录(权限设为 755,允许 Nginx 访问)
[root@server ~]# mkdir -m 755 /usr/share/nginx/cgi-bin# 功能:在 SSL 站点配置中引入 FastCGI 规则
[root@server ~]# vim /etc/nginx/conf.d/ssl.conf
server {.....include fcgiwrap.conf; # 引入上面创建的 fcgiwrap 配置
}# 功能:重启 Nginx 服务,使配置生效
[root@server ~]# systemctl restart nginx# 功能:创建 fcgiwrap 的 systemd 服务文件(管理 fcgiwrap 进程)
[root@server ~]# vim /usr/lib/systemd/system/fcgiwrap.service
[Unit]
Description=Simple CGI Server # 服务描述信息
After=nss-user-lookup.target # 表示该服务在用户信息服务启动后再启动
Requires=fcgiwrap.socket # 依赖 fcgiwrap.socket 服务(必须先启动 socket)[Service]
EnvironmentFile=/etc/sysconfig/fcgiwrap # 加载环境变量配置文件(定义进程数等参数)
# 启动 fcgiwrap 进程,指定进程数($DAEMON_PROCS 从环境变量获取)
ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} -c ${DAEMON_PROCS}
User=nginx # 运行进程的用户(与 Nginx 一致,避免权限问题)
Group=nginx # 运行进程的组[Install]
Also=fcgiwrap.socket # 安装时同时启用 socket 服务
# 功能:创建 fcgiwrap 的 socket 配置文件(定义 socket 路径和类型)
[root@server ~]# vim /usr/lib/systemd/system/fcgiwrap.socket
[Unit]
Description=fcgiwrap Socket # socket 描述信息[Socket]
ListenStream=/run/fcgiwrap.socket # 监听的 Unix socket 路径(需与 Nginx 配置中的路径一致)[Install]
WantedBy=sockets.target # 属于 sockets.target 目标(系统启动时激活)
# 功能:启动 fcgiwrap 服务并设置开机自启
[root@server ~]# systemctl enable --now fcgiwrap# 功能:若 SELinux 启用,需修改策略允许 Nginx 访问 fcgiwrap 的 socket
# 创建 SELinux 模块文件(允许 httpd_t 域写入 var_run_t 类型的 socket 文件)
[root@server ~]# vim nginx-www.te
module nginx-server 1.0; # 模块名称和版本require {type httpd_t; # Nginx 进程的 SELinux 域type var_run_t; # /run 目录的 SELinux 类型class sock_file write; # 允许的操作:写入 socket 文件
}# 允许 httpd_t 域对 var_run_t 类型的 socket 文件执行写入操作
allow httpd_t var_run_t:sock_file write;# 编译 SELinux 模块:
# 1. 将 .te 文件转换为二进制模块(.mod)
[root@server ~]# checkmodule -m -M -o nginx-server.mod nginx-server.te
# 2. 将 .mod 文件打包为可安装的 .pp 包
[root@server ~]# semodule_package --outfile nginx-server.pp --module nginx-server.mod
# 3. 安装模块(使策略生效)
[root@server ~]# semodule -i nginx-server.pp
测试 FastCGI
# 功能:准备测试脚本(以 Python3 为例,放在 /cgi-bin/ 目录下)
[root@server ~]# vim /usr/share/nginx/cgi-bin/index.cgi
#!/usr/bin/python3 # 指定脚本解释器(Python3)
# CGI 协议要求:必须先输出 Content-type 头部, followed by 空行(告诉浏览器内容类型)
print("Content-type: text/html\n")
print("<html>\n<body>")
print("<div style=\"width: 100%; font-size: 40px; font-weight: bold; text-align: center;\">")
print("CGI Script Test Page") # 页面内容:CGI 测试页
print("</div>")
print("</body>\n</html>")# 功能:给脚本添加执行权限(否则无法运行)
[root@server ~]# chmod 755 /usr/share/nginx/cgi-bin/index.cgi # 功能:测试访问 CGI 脚本(应输出测试页面内容)
[root@client ~]# curl http://www.bq.cloud/cgi-bin/index.cgi
部署反向代理
反向代理简单说就是:用户(客户端)只访问代理服务器,代理服务器偷偷把请求转发给内部的真实服务器,然后把真实服务器的响应返回给用户。这样用户看不到真实服务器的 IP(更安全),还能通过代理实现负载均衡(多台真实服务器分担压力)、缓存(加速访问)等功能。
角色说明
- 代理服务器:IP 为 10.1.8.20(用户直接访问此服务器)。
- 真实服务器:IP 为 10.1.8.10(实际处理请求的服务器,对用户不可见)。
代理服务器配置
# 功能:配置域名解析,使代理服务器能通过域名访问真实服务器
[root@proxy ~]# echo '10.1.8.10 www.bq.cloud' >> /etc/hosts# 功能:安装 Nginx(代理服务器也需要 Nginx 来处理转发)
[root@proxy ~]# yum -y install nginx# 功能:启动 Nginx 并设置开机自启
[root@proxy ~]# systemctl enable --now nginx# 功能:配置防火墙,允许 HTTP 服务通过
[root@proxy ~]# firewall-cmd --add-service=http --permanent
[root@proxy ~]# firewall-cmd --reload# 功能:配置反向代理规则(修改 Nginx 主配置)
[root@proxy ~]# vim /etc/nginx/nginx.conf
# 修改 server 块如下server {listen 80 default_server; # 监听 80 端口(用户访问的端口)listen [::]:80 default_server;server_name _; # 不指定具体域名(匹配所有未被其他 server 匹配的请求)root /usr/share/nginx/html;# 反向代理相关配置:proxy_redirect off; # 禁止自动重定向(避免真实服务器的重定向被修改)# 传递客户端真实 IP 给真实服务器(真实服务器可通过 X-Real-IP 获取用户 IP)proxy_set_header X-Real-IP $remote_addr;# 传递代理链信息(若有多层代理,真实服务器可通过 X-Forwarded-For 获取所有代理 IP)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 传递用户请求的 Host 头部(真实服务器可知道用户访问的域名)proxy_set_header Host $http_host;......# 功能:将 /proxy/ 路径的请求转发到真实服务器location /proxy/ {# 功能:指定真实服务器地址(www.bq.cloud 已解析到 10.1.8.10)# 说明:末尾的 / 表示将 /proxy/ 后面的路径拼接到真实服务器地址后# 例如:用户访问 /proxy/test.html,会转发到 http://www.bq.cloud/test.htmlproxy_pass http://www.bq.cloud/;}}# 功能:重启 Nginx 服务,使代理配置生效
[root@proxy ~]# systemctl restart nginx# 功能:若 SELinux 启用,需允许 Nginx 发起网络连接(反向代理需要访问真实服务器)
[root@proxy ~]# setsebool -P httpd_can_network_connect on
真实服务器配置
# 功能:安装 Nginx(真实服务器提供实际的网页内容)
[root@server ~]# yum -y install nginx# 功能:启动 Nginx 并设置开机自启
[root@server ~]# systemctl enable --now nginx# 功能:配置防火墙,允许 HTTP 服务通过(接收代理服务器的请求)
[root@server ~]# firewall-cmd --add-service=http --permanent
[root@server ~]# firewall-cmd --reload# 功能:准备测试页(供代理服务器转发访问)
[root@server ~]# echo hello bq > /usr/share/nginx/html/test.html# 测试效果:用户访问代理服务器的 /proxy/test.html,应返回真实服务器的内容
# 说明:用户的客户端需配置 hosts 使 www.bq.cloud 指向代理服务器 IP(10.1.8.20)
[root@client ~]# curl http://www.bq.cloud/proxy/test.html
# 预期输出:hello bq
Nginx 常用补充命令
-
检查配置文件语法是否正确(修改配置后必做,避免配置错误导致服务启动失败):
nginx -t
-
平滑重启 Nginx(不中断服务,使配置生效,推荐使用):
nginx -s reload
-
停止 Nginx 服务:
systemctl stop nginx
-
查看 Nginx 版本及编译参数(了解服务器安装的 Nginx 特性):
nginx -V
-
查看 Nginx 进程状态(检查服务是否正常运行):
systemctl status nginx
-
查看 Nginx 访问日志(分析用户访问情况,默认路径:
/var/log/nginx/access.log
):tail -f /var/log/nginx/access.log # 实时查看最新日志
-
查看 Nginx 错误日志(排查服务异常,默认路径:
/var/log/nginx/error.log
):tail -f /var/log/nginx/error.log
Tomcat
Tomcat 由来
Tomcat 最初由 Sun 公司的詹姆斯・邓肯・戴维森开发,后来他将其开源,并由 Sun 贡献给 Apache 软件基金会。因为当时很多开源项目的 O’Reilly 书籍封面都会设计成动物素描,他希望这个项目能像 “公猫(Tomcat)” 一样 “能自己照顾自己”(稳定运行),因此命名为 Tomcat。O’Reilly 出版的 Tomcat 书籍封面也用了公猫形象,Tomcat 的 Logo 和吉祥物也随之定为一只公猫。
Tomcat 介绍
Tomcat 是一款免费开源的 Web 应用服务器,属于轻量级服务器,适合中小型系统和并发访问量不高的场景,是开发和调试 JSP 程序的首选工具。它技术先进、性能稳定且免费,深受 Java 开发者喜爱,成为流行的 Web 应用服务器。
Tomcat 不仅是 Java 容器(运行 Java 程序),也能处理 HTML 等静态页面,但和 Apache、Nginx 相比,处理静态页面的效率较低。因此,实际中常将 Tomcat 和 Apache/Nginx 配合使用:让 Apache/Nginx 处理静态 HTML,Tomcat 处理 JSP 和 Java 程序(分工合作,提高效率)。
JSP(Java Server Pages) 是一种动态网页技术:在传统 HTML 中插入 Java 程序段和 JSP 标记,形成 .jsp
文件。用 JSP 开发的 Web 应用是跨平台的,既能在 Linux 上运行,也能在其他操作系统上运行。
官方网站:http://tomcat.apache.org/
Tomcat 虽然能运行 JSP 网页,但通常不单独作为 Web 服务器,而是作为中间件(专注处理 Java 程序)。
Tomcat 相关实验流程
1. Tomcat 部署
- 安装 Tomcat(会自动安装相关 Java 环境)
- 验证 Java 版本
- 启动 Tomcat 并设置开机自启
- 准备 JSP 测试页面(放在默认发布目录下)
- 测试访问 JSP 页面
2. 配置管理界面
- 安装管理页面及可选的在线文档
- 添加管理员用户(配置 tomcat-users.xml 文件)
- 重启 Tomcat 服务器
- 从本地访问管理界面
3. 项目实战(Nginx 反向代理 Tomcat)
- 在客户端(作为 Nginx 反向代理)安装 Nginx
- 配置 Nginx 反向代理规则(设置 upstream 指向 Tomcat 服务器,添加代理相关参数及转发路径)
- 重启 Nginx 服务
- 准备 Nginx 测试页面
- 客户端通过网页浏览测试不同路径的访问效果
Tomcat实验操作
Tomcat 部署
# 功能:安装 tomcat,会自动安装依赖的 Java 环境(java-1.8.0-openjdk-headless)
[root@server ~]# yum install -y tomcat# 功能:验证 Java 环境是否安装成功(Tomcat 依赖 Java 运行)
[root@server ~]# java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)# 功能:启动 tomcat 并设置开机自启
[root@server ~]# systemctl enable --now tomcat.service# 说明:Tomcat 默认发布目录是 /var/lib/tomcat/webapps(网页文件存放在这里)
[root@server ~]# grep ^TOMCATS_BASE /etc/tomcat/tomcat.conf # 查看基础目录
TOMCATS_BASE="/var/lib/tomcats/"
[root@server ~]# grep appBase /etc/tomcat/server.xml # 查看应用发布目录<Host name="localhost" appBase="webapps"# 功能:准备测试页面(JSP 页面)
[root@server ~]# cd /var/lib/tomcat/webapps/ # 进入发布目录
[root@server webapps]# mkdir test # 创建测试目录
[root@server webapps]# vim test/index.jsp # 创建 JSP 测试页
<html><head><title>第一个 JSP 程序</title> <!-- 页面标题 --></head><body><%out.println("Hello World!"); // Java 代码:输出 Hello World!%></body>
</html># 功能:测试访问 JSP 页面(Tomcat 默认端口 8080)
[root@server ~]# curl http://www.laoma.cloud:8080/test/index.jsp
管理界面
# 功能:安装 Tomcat 管理页面(webapps 包含默认应用,admin-webapps 包含管理界面)
[root@server ~]# yum install -y tomcat-webapps tomcat-admin-webapps# 功能:安装在线文档(可选,方便查阅使用说明)
[root@server ~]# yum install -y tomcat-docs-webapp
如果服务器没有图形化界面,需安装以下软件包才能通过浏览器访问管理界面:
yum install -y mesa-dri-drivers libglvnd-glx xorg-x11-xauth firefox
# 功能:添加管理员用户(用于登录管理界面)
[root@server ~]# vim /etc/tomcat/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
......
<role rolename="manager-gui"/> <!-- 定义 manager 管理界面的角色 -->
<role rolename="admin-gui"/> <!-- 定义 admin 管理界面的角色 -->
<!-- 创建用户:用户名 root,密码 root,拥有两个管理角色 -->
<user username="root" password="root" roles="manager-gui,admin-gui"/>
</tomcat-users># 功能:重启 tomcat 服务器,使用户配置生效
[root@server tomcat]# systemctl restart tomcat
进入管理界面
管理界面默认只能从 Tomcat 本地访问(http://localhost:8080
)。
项目实战:
# 场景:server 作为 tomcat 服务器,client 作为 nginx 反向代理(用户访问 client,由 client 转发到 server 的 tomcat)# client(代理服务器)操作:
# 1. 安装 nginx
yum install -y nginx# 2. 配置 nginx 反向代理到 tomcat
vim /etc/nginx/nginx.confhttp {......# 定义上游服务器(tomcat 服务器)upstream tomcat {server www.laoma.cloud:8080; # tomcat 服务器的地址和端口}......server {......# 反向代理相关配置(传递用户真实信息给 tomcat)proxy_redirect off;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;# 将 /tomcat/ 路径的请求转发到 tomcat 服务器location /tomcat/ {proxy_pass http://tomcat/;}}
} # 3. 重启 nginx 服务,使配置生效
systemctl restart nginx.service # 4. 准备静态页面(测试 nginx 自身功能)
echo hello world > /usr/share/nginx/html/index.html # 根目录页面
mkdir /usr/share/nginx/html/web1 # 创建 web1 目录
echo hello WEB1 > /usr/share/nginx/html/web1/index.html # web1 页面# 用户通过浏览器访问测试:
# 1. 访问 nginx 自身的静态页面
http://www.bq.cloud
# 2. 访问 nginx 的 web1 目录
http://www.bq.cloud/web1
# 3. 访问代理转发的 tomcat 页面
http://www.bq.cloud/tomcat/test/index.jsp
如涉及版权问题请联系作者处理!!!