当前位置: 首页 > news >正文

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 基础安装与配置
  1. 安装 Nginx 并设置开机自启
  2. 替换默认首页内容
  3. 配置防火墙允许 HTTP 服务
  4. 客户端测试访问(配置客户端 hosts 文件后验证)
2. 启用 UserDir 功能
  1. 配置 Nginx 支持 UserDir(在 server 块中添加相关规则)
  2. 重启 Nginx 使配置生效
  3. 若启用 SELinux,修改布尔值允许 HTTP 服务访问用户家目录
  4. 普通用户创建个人网页(修改家目录权限、创建 public_html 文件夹及测试首页)
  5. 测试访问用户目录下的网页
3. 虚拟主机配置
根据名称(域名)区分虚拟主机
  1. 创建虚拟主机配置文件
  2. 在配置文件中分别设置对应不同域名的虚拟主机(指定域名和网站文件存放目录)
根据端口区分虚拟主机
  1. 创建端口虚拟主机配置文件
  2. 在配置文件中分别设置监听不同端口的虚拟主机(指定端口、域名和网站文件存放目录)
4. 配置 SSL/TLS
  1. 生成 RSA 私钥
  2. 生成证书签名请求(CSR)
  3. 生成自签名证书
  4. 创建证书存放目录并移动证书文件
  5. 配置 Nginx 站点支持 HTTPS(指定监听端口、域名、证书路径等)
  6. 配置 HTTP 自动重定向到 HTTPS
  7. 配置防火墙允许 HTTPS 服务通过
  8. 测试 HTTPS 配置及重定向功能
5. 配置 Nginx 基本认证(密码保护特定目录)
  1. 安装生成密码文件的工具
  2. 编辑 Nginx 配置文件,添加基本认证规则(指定保护路径、认证提示信息和密码文件路径)
  3. 重启 Nginx 使配置生效
  4. 创建基本认证的用户和密码文件
  5. 创建测试页面
  6. 测试基本认证功能
6. 支持动态脚本
使用 PHP
  1. 安装 PHP 和 php-fpm 及常用扩展
  2. 验证 PHP 版本及命令行运行是否正常
  3. 准备 PHP 测试页
  4. 启动 php-fpm 并设置开机自启
  5. 配置 Nginx 解析 PHP(添加 PHP 解析规则)
  6. 重启 Nginx 使配置生效
  7. 测试访问 PHP 页面
使用 FastCGI
  1. 安装 fcgiwrap(FastCGI 处理器)
  2. 配置 Nginx 支持 FastCGI(指定 CGI 脚本存放目录等规则)
  3. 创建 CGI 脚本存放目录并设置权限
  4. 在 SSL 站点配置中引入 FastCGI 规则
  5. 重启 Nginx 使配置生效
  6. 创建 fcgiwrap 的 systemd 服务文件和 socket 配置文件
  7. 启动 fcgiwrap 服务并设置开机自启
  8. 若启用 SELinux,修改策略允许 Nginx 访问 fcgiwrap 的 socket
  9. 准备测试脚本并添加执行权限
  10. 测试访问 CGI 脚本
7. 部署反向代理
代理服务器配置
  1. 配置域名解析使代理服务器能访问真实服务器
  2. 安装 Nginx 并设置开机自启
  3. 配置防火墙允许 HTTP 服务通过
  4. 配置反向代理规则(设置监听端口、代理相关参数及转发路径)
  5. 重启 Nginx 使配置生效
  6. 若启用 SELinux,允许 Nginx 发起网络连接
真实服务器配置
  1. 安装 Nginx 并设置开机自启
  2. 配置防火墙允许 HTTP 服务通过
  3. 准备测试页
  4. 测试代理效果(客户端访问代理服务器对应路径,验证是否返回真实服务器内容)

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.cloudweb2.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)。

密钥生成相关命令

  1. openssl genrsa(生成 RSA 私钥)
    • 功能:生成 RSA 算法的私钥(私钥是加密通信的核心,必须妥善保管,不能泄露)。
    • 语法:openssl genrsa [选项] 密钥长度
    • 常用选项:
      • -des3:用 3DES 算法加密私钥(使用私钥时需要输入密码,更安全但麻烦)。
      • -aes256:用 AES-256 算法加密私钥(比 3DES 更安全,推荐使用)。
      • 2048/4096:指定密钥长度(单位:位)。2048 位满足基础安全需求,4096 位更安全但加密解密速度稍慢。
      • -out <file>:将生成的私钥保存到指定文件。
  2. openssl ecparam(生成 ECC 椭圆曲线密钥)
    • 功能:生成基于椭圆曲线算法(ECC)的私钥(ECC 比 RSA 更高效,相同安全级别下密钥更短)。
    • 语法:openssl ecparam [选项]
    • 常用选项:
      • -genkey:生成椭圆曲线私钥。
      • -name <curve>:指定椭圆曲线类型(如 secp256r1prime256v1,安全性高且性能好)。

证书签名请求(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:密码文件 从文件读取)。

格式转换命令

  1. 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
      
  2. 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 常用补充命令
  1. 检查配置文件语法是否正确(修改配置后必做,避免配置错误导致服务启动失败):

    nginx -t
    
  2. 平滑重启 Nginx(不中断服务,使配置生效,推荐使用):

    nginx -s reload
    
  3. 停止 Nginx 服务

    systemctl stop nginx
    
  4. 查看 Nginx 版本及编译参数(了解服务器安装的 Nginx 特性):

    nginx -V
    
  5. 查看 Nginx 进程状态(检查服务是否正常运行):

    systemctl status nginx
    
  6. 查看 Nginx 访问日志(分析用户访问情况,默认路径:/var/log/nginx/access.log):

    tail -f /var/log/nginx/access.log  # 实时查看最新日志
    
  7. 查看 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 部署
  1. 安装 Tomcat(会自动安装相关 Java 环境)
  2. 验证 Java 版本
  3. 启动 Tomcat 并设置开机自启
  4. 准备 JSP 测试页面(放在默认发布目录下)
  5. 测试访问 JSP 页面
2. 配置管理界面
  1. 安装管理页面及可选的在线文档
  2. 添加管理员用户(配置 tomcat-users.xml 文件)
  3. 重启 Tomcat 服务器
  4. 从本地访问管理界面
3. 项目实战(Nginx 反向代理 Tomcat)
  1. 在客户端(作为 Nginx 反向代理)安装 Nginx
  2. 配置 Nginx 反向代理规则(设置 upstream 指向 Tomcat 服务器,添加代理相关参数及转发路径)
  3. 重启 Nginx 服务
  4. 准备 Nginx 测试页面
  5. 客户端通过网页浏览测试不同路径的访问效果

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

image-20240807224659327

# 功能:添加管理员用户(用于登录管理界面)
[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)。

image-20250811225051242

image-20250811225059739

image-20250811225105253

项目实战:

# 场景: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

如涉及版权问题请联系作者处理!!!

http://www.xdnf.cn/news/1278415.html

相关文章:

  • docker compose和docker-compose命令的区别
  • Vue2篇——第二章 Vue从指令修饰符到侦听器的全面解析(重点)
  • MATLAB绘制水的蒸汽压曲线(Antoine方程)
  • jdk17下载安装教程【超详细图文】
  • 《设计模式》策略模式
  • vue3-基础语法
  • JUC学习笔记-----ReentrantLock
  • TC39x STM(System Timer)学习记录
  • 机器学习数学基础:46.Mann-Kendall 序贯检验(Sequential MK Test)
  • Spring Boot - 内置的9个过滤器用法
  • Day 9-2: Transformer翻译实例演示 - 翻译的基础设施
  • AI大模型 教师方向应用探索
  • Audio Flamingo
  • 第4章 程序段的反复执行4 多重循环练习(题及答案)
  • Python day40
  • C++ list类
  • 【深度学习新浪潮】遥感图像风格化迁移研究工作介绍
  • JS中typeof与instanceof的区别
  • 腾讯云EdgeOne KV存储在游戏资源发布中的技术实践与架构解析
  • 数学建模——回归分析
  • 【GPT入门】第44课 检查 LlamaFactory微调Llama3的效果
  • 集成电路学习:什么是Parameter Server参数服务器
  • 机器学习-增加样本、精确率与召回率
  • Java开源代码源码研究:我的成长之路与实战心得分享
  • 学习分库分表的前置知识:高可用系统架构理论与实践
  • 构建企业级Odoo 18 WMS——功能、架构与拓展蓝图
  • LeetCode每日一题,2025-8-10
  • 《C语言》结构体和联合体练习题--2
  • 前端学习日记 - 前端函数防抖详解
  • 无人机集群协同三维路径规划,采用梦境优化算法(DOA)实现,Matlab代码