Web服务器——————nginx篇

一.What is Web服务器 

Web服务器介绍 

Web服务器(Web Server)是指驻留于因特网上某种类型计算机的程序,该程序可以向Web浏览器(如Chrome、Firefox、Safari等)等客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。Web服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。

Web服务器的工作原理可以简单概括为:客户端(如浏览器)通过HTTP(超文本传输协议)向服务器发送请求,服务器接收到请求后,根据请求的内容进行相应的处理(如读取文件、执行程序等),然后将处理结果(如HTML页面、图片、视频等)通过HTTP响应发送给客户端。

Web服务器的主要功能包括:

  1. 提供网页服务:Web服务器最基本的功能就是提供网页服务,即当用户通过浏览器访问网站时,Web服务器会返回相应的HTML页面给浏览器进行展示。

  2. 处理HTTP请求:Web服务器能够解析HTTP请求,并根据请求的内容进行相应的处理。例如,当用户请求一个网页时,Web服务器会找到对应的HTML文件并发送给客户端;当用户请求一个图片时,Web服务器会找到对应的图片文件并发送给客户端。

  3. 管理网站资源:Web服务器负责管理网站上的各种资源,如HTML文件、CSS文件、JavaScript文件、图片、视频等。它可以根据请求的内容,从服务器上找到对应的资源并发送给客户端。

  4. 支持动态内容:除了静态内容(如HTML文件、图片等)外,Web服务器还可以支持动态内容(如PHP、ASP.NET、JSP等脚本语言生成的页面)。当客户端请求动态内容时,Web服务器会执行相应的脚本程序,并将生成的页面发送给客户端。

  5. 支持多种协议:除了HTTP协议外,Web服务器还可以支持其他协议,如HTTPS(安全的HTTP)、FTP(文件传输协议)等。这些协议可以提供更安全或更灵活的数据传输方式。

  6. 负载均衡和集群:在高并发场景下,单个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的特点
  1. 高性能:Nginx可以处理大量的并发请求,官方测试表明其能够支持高达5万个并发连接,这得益于其高效的内存管理和缓存机制。
  2. 轻量级:Nginx的安装包较小,运行时占用的系统资源也非常少,适合在资源有限的服务器上部署。
  3. 高并发:Nginx采用事件驱动的异步架构,能够处理大量并发连接,特别适合处理高并发访问的场景。
  4. 稳定性:Nginx的运行非常稳定,即使在长时间高负载运行的情况下,也很少出现宕机的情况。
  5. 可扩展性:Nginx支持模块化架构,用户可以根据需要安装和管理自定义模块,以实现特定的功能和性能优化。
  6. 配置灵活:Nginx的配置文件非常灵活,用户可以根据需要定制许多方面,如代理、负载均衡、缓存、日志记录等。
二、Nginx的功能
  1. HTTP服务器:Nginx可以作为独立的HTTP服务器,提供静态文件服务、动态内容处理和索引文件等功能。
  2. 反向代理:Nginx支持反向代理功能,可以将请求转发到后端服务器,并处理中间代理和缓存等操作。
  3. 负载均衡:Nginx可以作为负载均衡器使用,将请求分发到多个后端服务器上,从而实现高可用性和可扩展性。
  4. 邮件代理:Nginx同时也是一个非常优秀的邮件代理服务器,支持IMAP/POP3/SMTP服务。
三、Nginx的应用场景
  1. 静态资源服务器:Nginx可以部署为静态资源服务器,提供图片、视频、CSS、JS等静态文件的访问服务。
  2. 负载均衡器:在分布式系统中,Nginx可以作为负载均衡器,将用户请求分发到多个后端服务器上,以提高系统的可用性和扩展性。
  3. 反向代理:Nginx可以作为反向代理服务器,将用户请求转发到内部网络中的Web服务器上,同时提供缓存、压缩等优化功能。
  4. 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下载地址icon-default.png?t=N7T8https://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.实验准备 

准备一台初始化的虚拟机

localhostRocky_linux9.4192.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官网icon-default.png?t=N7T8https://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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值