一.What is Web服务器
Web服务器介绍
Web服务器(Web Server)是指驻留于因特网上某种类型计算机的程序,该程序可以向Web浏览器(如Chrome、Firefox、Safari等)等客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。
Web服务器的工作原理可以简单概括为:客户端(如浏览器)通过HTTP(超文本传输协议)向服务器发送请求,服务器接收到请求后,根据请求的内容进行相应的处理(如读取文件、执行程序等),然后将处理结果(如HTML页面、图片、视频等)通过HTTP响应发送给客户端。
Web服务器的主要功能包括:
-
提供网页服务:Web服务器最基本的功能就是提供网页服务,即当用户通过浏览器访问网站时,Web服务器会返回相应的HTML页面给浏览器进行展示。
-
处理HTTP请求:Web服务器能够解析HTTP请求,并根据请求的内容进行相应的处理。例如,当用户请求一个网页时,Web服务器会找到对应的HTML文件并发送给客户端;当用户请求一个图片时,Web服务器会找到对应的图片文件并发送给客户端。
-
管理网站资源:Web服务器负责管理网站上的各种资源,如HTML文件、CSS文件、JavaScript文件、图片、视频等。它可以根据请求的内容,从服务器上找到对应的资源并发送给客户端。
-
支持动态内容:除了静态内容(如HTML文件、图片等)外,Web服务器还可以支持动态内容(如PHP、ASP.NET、JSP等脚本语言生成的页面)。当客户端请求动态内容时,Web服务器会执行相应的脚本程序,并将生成的页面发送给客户端。
-
支持多种协议:除了HTTP协议外,Web服务器还可以支持其他协议,如HTTPS(安全的HTTP)、FTP(文件传输协议)等。这些协议可以提供更安全或更灵活的数据传输方式。
-
负载均衡和集群:在高并发场景下,单个Web服务器可能无法处理所有请求。此时,可以通过负载均衡器将请求分发到多个Web服务器上,形成服务器集群。这样可以提高系统的可用性和扩展性。
常见的Web服务器软件包括Apache、Nginx、IIS(Internet Information Services)等。这些软件各有特点,适用于不同的应用场景和需求。例如,Apache是开源的Web服务器软件,具有高度的可配置性和可扩展性;Nginx则以其高性能和轻量级著称,特别适合于处理高并发请求的场景;IIS则是微软开发的Web服务器软件,与Windows操作系统紧密集成。
Web服务器————Nginx
What is Nginx???
Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,由俄罗斯的程序设计师Igor Sysoev使用C语言开发。Nginx以其高效的处理能力、低资源消耗和强大的并发能力而闻名,是许多高流量网站的首选服务器之一。以下是对Nginx的详细介绍:
一、Nginx的特点
- 高性能:Nginx可以处理大量的并发请求,官方测试表明其能够支持高达5万个并发连接,这得益于其高效的内存管理和缓存机制。
- 轻量级:Nginx的安装包较小,运行时占用的系统资源也非常少,适合在资源有限的服务器上部署。
- 高并发:Nginx采用事件驱动的异步架构,能够处理大量并发连接,特别适合处理高并发访问的场景。
- 稳定性:Nginx的运行非常稳定,即使在长时间高负载运行的情况下,也很少出现宕机的情况。
- 可扩展性:Nginx支持模块化架构,用户可以根据需要安装和管理自定义模块,以实现特定的功能和性能优化。
- 配置灵活:Nginx的配置文件非常灵活,用户可以根据需要定制许多方面,如代理、负载均衡、缓存、日志记录等。
二、Nginx的功能
- HTTP服务器:Nginx可以作为独立的HTTP服务器,提供静态文件服务、动态内容处理和索引文件等功能。
- 反向代理:Nginx支持反向代理功能,可以将请求转发到后端服务器,并处理中间代理和缓存等操作。
- 负载均衡:Nginx可以作为负载均衡器使用,将请求分发到多个后端服务器上,从而实现高可用性和可扩展性。
- 邮件代理:Nginx同时也是一个非常优秀的邮件代理服务器,支持IMAP/POP3/SMTP服务。
三、Nginx的应用场景
- 静态资源服务器:Nginx可以部署为静态资源服务器,提供图片、视频、CSS、JS等静态文件的访问服务。
- 负载均衡器:在分布式系统中,Nginx可以作为负载均衡器,将用户请求分发到多个后端服务器上,以提高系统的可用性和扩展性。
- 反向代理:Nginx可以作为反向代理服务器,将用户请求转发到内部网络中的Web服务器上,同时提供缓存、压缩等优化功能。
- API网关:Nginx可以作为API网关,对外部请求进行鉴权、限流、转发等处理,保护内部服务的安全和稳定。
四、Nginx的安装与配置
Nginx可以在大多数Unix、Linux和Windows系统上安装和配置。安装方式包括使用系统的包管理器(如yum、apt等)进行安装,以及从Nginx官网下载源代码进行编译安装。配置Nginx时,用户需要编辑Nginx的配置文件(通常为nginx.conf),设置服务器监听的端口、请求处理的规则、日志记录的方式等。
五、Nginx的版本与更新
Nginx是一个开源项目,其源代码以类BSD许可证的形式发布。Nginx的开发团队会定期发布新的版本,包括稳定版和主线版。对于新建站点,建议使用最新稳定版作为生产版本;对于已有站点,可以根据实际情况选择是否升级到新版本。
综上所述,Nginx是一款功能强大、性能卓越、配置灵活的Web服务器和反向代理服务器,广泛应用于各种高并发、高性能的Web应用场景中。
How to use Nginx??
一.下载安装
1.准备工作
- 打开虚拟机,使用finallshell链接Linux操作系统
nginx下载地址https://nginx.org/点击链接选择版本进行下载
先安装其依赖软件,最后安装nginx。
依赖工具:pcre-8.3.7.tar.gz openssl-1.0.1t.tar.gz zlib-1.2.8.tar.gz nginx-1.11.1.tar.gz
nginx的http模块使用pcre来解析正则表达式,需要在linux上安装pcre库
nginx使用zlib对http包的内容进行gzip,需要在linux上安装安装zlib库
安装openssl库,让 nginx 支持 https(即在ssl协议上传输http)
2.开始安装
安装pcre
方式一、wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz 。
方拾二、上传源码压缩包,解压、编译、安装 三部曲。
1)、解压文件, 进入pcre目录,
2)、./configure 完成后,
3)、执行命令: make && make install
安装 openssl
下载OpenSSL的地址:
http://distfiles.macports.org/openssl/
1)、解压文件, 回到 openssl目录下,
2)、./configure 完成后,
3)、执行命令: make && make install
安装 zlib
1)、解压文件, 回到 zlib 目录下,
2)、./configure 完成后,
3)、执行命令: make && make install
安装 nginx
1)、解压文件, 回到 nginx 目录下,
2)、./configure 完成后,
3)、执行命令: make && make install
3.运行nginx
- 安装完nginx后,会在 路径
/usr/local
下自动生成nginx
文件夹。这是自动生成的。 - 进入这个目录:
cd /usr/local/nginx
- 进入sbin文件夹,里面有两个文件:
nginx
和nginx.old
。 - 执行命令:./nginx 即可执行
- 测试启动: ps -ef | grep nginx
查看nginx默认端口(默认为80),使用网页的形式测试,
进入目录查看端口:cd /usr/local/nginx/conf 下的 nginx.conf文件。这个文件也是nginx的配置文件。vim 下:
4.防火墙
在 windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题 (1)关闭防火墙(2)开放访问的端口号,80 端口
查看开放的端口号
firewall-cmd --list-all
设置开放的端口号
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd –reload
二.nginx的平滑升级
1. 为什么要对 nginx 平滑升级
随着 nginx 越来越流行,并且 nginx 的优势也越来越明显,nginx 的版本迭代也来时加速模式,1.9.0版本的nginx更新了许多新功能,例如 stream 四层代理功能,伴随着 nginx 的广泛应用,版本升级必然越来越快,线上业务不能停,此时 nginx 的升级就是运维的工作了
nginx 方便地帮助我们实现了平滑升级。其原理简单概括,就是: (1)在不停掉老进程的情况下,启动新进程。 (2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。 (3)新进程接受新请求。 (4)老进程处理完所有请求,关闭所有连接后,停止。 这样就很方便地实现了平滑升级。一般有两种情况下需要升级 nginx,一种是确实要升级 nginx 的版本,另一种是要为 nginx 添加新的模块。
2. Nginx 平滑升级原理
多进程模式下的请求分配方式
nginx 默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)。
信号的接收和处理
nginx 主进程在启动完成后会进入等待状态,负责响应各类系统消息,如SIGCHLD、SIGHUP、SIGUSR2等。
Nginx信号简介
主进程支持的信号
- TERM, INT: 立刻退出
- QUIT: 等待工作进程结束后再退出
- KILL: 强制终止进程
- HUP: 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。
- USR1: 重新打开日志文件
- USR2: 启动新的主进程,实现热升级
- WINCH: 逐步关闭工作进程
工作进程支持的信号
- TERM, INT: 立刻退出
- QUIT: 等待请求处理结束后再退出
- USR1: 重新打开日志文件
3.实验准备
准备一台初始化的虚拟机
localhost | Rocky_linux9.4 | 192.168.226.20 |
关闭防火墙和SElinux
虚拟机基础配置脚本如下进行步骤前,先跑一遍
#!/bin/bash
# **********************************************************
# * File Name : rocky_linux
# * Author : Elk
# * Email : zzdict@gmail.com / elk_deer@foxmail.com
# * Create time : 2024-06-15 20:12
# * Description :
# **********************************************************
# 检查是否以 root 用户运行脚本
if [ "$(id -u)" -ne 0 ]; then
tput bold
tput setaf 1
tput setaf 3
echo "请以 root 用户运行此脚本。"
tput sgr0
exit 1
fi
# 启用网络接口
enable_network_interface() {
local interface=$1
if ip link set "$interface" up; then
tput bold
tput setaf 2
echo "网络接口 $interface 已启用。"
tput sgr0
else
tput bold
tput setaf 1
echo "无法启用网络接口 $interface,请检查接口名称。"
tput sgr0
exit 1
fi
}
# 配置 YUM 源
configure_yum_repos() {
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/Rocky-*.repo
tput bold
tput setaf 2
echo "YUM 源配置已更新。"
tput sgr0
dnf makecache
yum -y install epel-release
}
# 停止和禁用防火墙,禁用 SELinux
configure_security() {
systemctl stop firewalld && systemctl disable firewalld
firewall-cmd --reload
tput bold
tput setaf 2
echo "防火墙已停止并禁用。"
tput sgr0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
tput bold
tput setaf 2
echo "SELinux 已禁用。"
tput sgr0
}
# 检查并安装chrony,进行时间同步
function install_and_sync_time_with_chrony() {
# 检查是否已经安装chrony
if ! command -v chronyd &>/dev/null; then
sudo dnf install -y chrony &> /dev/null
# 检查安装是否成功
if ! command -v chronyd &>/dev/null; then
tput bold
tput setaf 1
echo "安装 chrony 失败。请检查您的包管理器并重试。"
tput sgr0
exit 1
else
tput bold
tput setaf 2
echo "chrony 安装成功。"
tput sgr0
fi
else
tput bold
tput setaf 2
echo "chrony 已安装。"
tput sgr0
fi
# 确保安装其他必要的软件包
sudo dnf install -y vim wget unzip tar lrzsz &> /dev/null
if [ $? -eq 0 ]; then
tput bold
tput setaf 2
echo "其他软件包安装成功。"
tput sgr0
else
tput bold
tput setaf 1
echo "安装其他软件包失败。"
tput sgr0
exit 1
fi
}
# 启动 chronyd 服务并启用开机启动
if sudo systemctl start chronyd && sudo systemctl enable chronyd; then
tput bold
tput setaf 2
echo "chronyd 服务已成功启动并设置为开机启动。"
tput sgr0
else
tput bold
tput setaf 1
echo "启动或启用 chronyd 服务失败。请检查 systemctl 状态。"
tput sgr0
exit 1
fi
# 强制同步时间
sudo chronyc -a makestep
tput bold
tput setaf 2
echo "时间同步已成功完成。"
tput sgr0
}
# 自定义 IP 地址
configure_ip_address() {
tput bold
tput blink
tput setaf 1
read -p "******输入你要设置的IP >>> : " ip_a
tput sgr0
tput bold
tput blink
tput setaf 6
read -p "******输入你要设置的网关>>> : " gat
tput sgr0
tput bold
tput blink
tput setaf 3
read -p "******输入你要设置的DNS>>> : " dnns
tput sgr0
# 判断当前连接的名字
connection_name=$(nmcli -t -f NAME,DEVICE con show --active | grep -E "ens33|Wired connection 1" | cut -d: -f1)
if [[ "$connection_name" == "ens33" ]]; then
# 针对 ens33 连接进行配置
nmcli con mod "ens33" ipv4.method manual ipv4.addresses "${ip_a}/24" ipv4.gateway "${gat}" ipv4.dns "${dnns}" autoconnect yes
elif [[ "$connection_name" == "Wired connection 1" ]]; then
# 针对 Wired connection 1 连接进行配置
nmcli con mod "Wired connection 1" ipv4.method manual ipv4.addresses "${ip_a}/24" ipv4.gateway "${gat}" ipv4.dns "${dnns}" autoconnect yes
else
tput bold
tput setaf 1
echo "无法识别的网络连接名称:$connection_name"
tput sgr0
return 1
fi
tput setab 5
tput setaf 15
tput bold
echo "IP 地址配置成功,即将重启系统。"
tput sgr0
nmcli con up "$connection_name"
reboot
}
# 主函数
main() {
local interface="ens33"
enable_network_interface "$interface"
configure_yum_repos
configure_security
install_and_sync_time_with_chrony
configure_ip_address "$interface"
}
# 调用主函数
main
来到官网下载两个不同的版本
nginx官网https://nginx.org/
将下载好的两个安装包上传到虚拟机中
[root@localhost ~]# ll
total 2268
-rw-------. 1 root root 815 Jun 6 14:00 anaconda-ks.cfg
-rw-r--r-- 1 root root 1062124 Jun 22 00:38 nginx-1.20.2.tar.gz
-rw-r--r-- 1 root root 1244738 Jun 21 21:19 nginx-1.26.1.tar.gz
-rw-r--r-- 1 root root 4251 Jun 17 23:50 rocky_linux.sh
4.模拟实验
安装依赖工具
[root@localhost ~]# yum install -y gcc gcc-c++ pcre-devel openssl-devel zlib-devel
解压1.20.2版本安装包
[root@localhost ~]# ls
anaconda-ks.cfg nginx-1.20.2.tar.gz nginx-1.26.1.tar.gz rocky_linux.sh
[root@localhost ~]# tar -zxf nginx-1.20.2.tar.gz
进入解压后的目录
[root@localhost ~]# ls
anaconda-ks.cfg nginx-1.20.2 nginx-1.20.2.tar.gz nginx-1.26.1.tar.gz rocky_linux.sh
[root@localhost ~]# cd nginx-1.20.2
[root@localhost nginx-1.20.2]# ls
CHANGES CHANGES.ru LICENSE README auto conf configure contrib html man src
预编译
在这里面,是少两个模块,没写进代码里,用来模拟这样少模块的场景,便于后面升级来扩展。
[root@localhost nginx-1.20.2]# ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module
编译安装
[root@localhost nginx-1.20.2]# make && make install
创建一个nginx的系统用户
[root@localhost nginx-1.20.2]# useradd --system --no-create-home --shell /sbin/nologin nginx
创建目录用于临时存储客户端请求数据和缓存文件
[root@localhost nginx-1.20.2]# mkdir -p /tmp/nginx/client_body
启动nginx
[root@localhost nginx-1.20.2]# /usr/local/nginx/sbin/nginx
验证nginx正常工作
[root@localhost nginx-1.20.2]# curl -Ik 192.168.226.20
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Sat, 22 Jun 2024 05:16:03 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sat, 22 Jun 2024 01:00:47 GMT
Connection: keep-alive
ETag: "6676223f-264"
Accept-Ranges: bytes
或者浏览器打开访问改主机IP地址
三.nginx的常用命令和配置文件
1. Nginx常用命令
使用nginx操作命令前提:必须进入到nginx的自动生成目录的下/sbin文件夹下。
nginx有两个目录:
第一个:安装目录
/usr/feng/
第二个:自动生成目录:
/usr/local/nginx/
查看 nginx 的版本号
./nginx -v
启动 nginx
./nginx
关闭nginx
./nginx -s stop
重新加载 nginx
在目录:/usr/local/nginx/sbin 下执行命令,不需要重启服务器,自动编译。
./nginx -s reload
其他常用命令
cd /usr/local/nginx/sbin/
./nginx # 启动
# 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
nginx -s stop
# 平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s quit
# 因改变了Nginx相关配置,需要重新加载配置而重载
nginx -s reload
# 重新打开日志文件
nginx -s reopen
# 为 Nginx 指定一个配置文件,来代替缺省的
nginx -c filename
# 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
nginx -t
# 显示 nginx 的版本
nginx -v
# 显示 nginx 的版本,编译器版本和配置参数
nginx -V
# 格式换显示 nginx 配置参数
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua
2. Nginx配置文件
配置文件位置
/usr/local/nginx/conf/nginx.conf
nginx 的组成部分
配置文件中有很多#, 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的 内容如下:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
nginx 配置文件有三部分组成
第一部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
比如上面第一行配置的:
worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。
第二部分:events块
比如上面的配置:
events {
worker_connections 1024;
}
events 块涉及的指令**主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。**
上述例子就表示每个 work process 支持的最大连接数为 1024.
第三部分:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http全局块、server 块。
http全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
四.nginx的反向代理 负载均衡
1. 实现效果
浏览器地址栏输入地址 http://208.208.128.122/edu/a.html,负载均衡效果,平均 8081 和 8082 端口中
2.在 nginx 的配置文件中进行负载均衡的配置
upstream myserver {
server 208.208.128.122:8081;
server 208.208.128.122:8082;
}
server {
listen 80;
server_name 208.208.128.122;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://myserver;
#proxy_pass http://127.0.0.1:8081;
index index.html index.htm;
}
3.最终测试
http://208.208.128.122/edu/a.html