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 基础安装与配置
2. 启用 UserDir 功能
3. 虚拟主机配置
根据名称(域名)区分虚拟主机
根据端口区分虚拟主机
4. 配置 SSL/TLS
5. 配置 Nginx 基本认证(密码保护特定目录)
6. 支持动态脚本
使用 PHP
使用 FastCGI
7. 部署反向代理
代理服务器配置
真实服务器配置
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)。
密钥生成相关命令
- 功能:生成 RSA 算法的私钥(私钥是加密通信的核心,必须妥善保管,不能泄露)。
- 语法:openssl genrsa [选项] 密钥长度
- 常用选项:
- -des3:用 3DES 算法加密私钥(使用私钥时需要输入密码,更安全但麻烦)。
- -aes256:用 AES-256 算法加密私钥(比 3DES 更安全,推荐使用)。
- 2048/4096:指定密钥长度(单位:位)。2048 位满足基础安全需求,4096 位更安全但加密解密速度稍慢。
- -out <file>:将生成的私钥保存到指定文件。
- 功能:生成基于椭圆曲线算法(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 部署
2. 配置管理界面
3. 项目实战(Nginx 反向代理 Tomcat)
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.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
如涉及版权问题请联系作者处理!!!
评论前必须登录!
注册