云计算百科
云计算领域专业知识百科平台

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.html
    alias /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.conf
    server {
    # 监听 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.html
    proxy_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

    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.conf

    http {
    ......
    # 定义上游服务器(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

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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 18.WEB 服务器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!