云计算day15

⼀、web基本概念和常识
Web:为⽤户提供的⼀种在互联⽹上浏览信息的服务,Web 服
务是动态的、可交
互的、跨平台的和图形化的。
Web 服务为⽤户提供各种互联⽹服务,这些服务包括信息浏览
服务,以及各种交互式服务,包括聊天、购物、学习等等内容。
Web 应⽤开发也经过了⼏代技术的不断发展,⽬前 Web 开发依
然是最重要的开发内容之⼀。Web 基础的技术包括超⽂本标记
语⾔(HTML)和 HTTP 协议,HTML 是⼀种呈现数据的⽅式
(给⼈看的),⽽ HTTP 则是⼀组通信的标准(语法、语义、
时许),可以简单的理解为 HTTP 携带 HTML。

  1. web 应⽤:⽹站(⼴义上的PC,⼿机app)
  2. 浏览器(Browser):也称⽤户代理,web客户端,主要有IE、
    Edge、Chrome、Firefox、腾讯浏览器,360浏览器等。
  3. web服务器(web server):也称HTTP服务器(HTTP
    server),主要有 Nginx、Apache、Tomcat 等。
    ⼆、⽹站基础1、域名
    域名是⼀个IP地址的"⾯具" ,⽬的是便于记忆和访问⼀个或⼀
    组服务器的地址(⽹站,电⼦邮件,FTP 等)。
    2、域名解析
    本地HOSTS解析
    DNS服务器解析
    3、⽹站的基本概念
    ⽹站、⽹⻚、主⻚;
    HTTP、URL、HTML、超链接
    4、web ⽹站
    web1.0(以编辑为特征)
    web2.0(侧重⽤户交互)
    5、动态⻚⾯与静态⻚⾯的差别(1)URL不同
    静态⻚⾯链接⾥没有"?"
    动态⻚⾯链接⾥包含"?"
    (2)后缀不同 (开发语⾔不同)
    静态⻚⾯⼀般以 .html .htm .xml 为后缀
    动态⻚⾯⼀般以 .php .jsp .py等为后缀(3)内容不同
    静态⻚⾯的内容是固定的
    动态⻚⾯的内容会因⽤户、浏览器、时间、地点等⽽发⽣变化。
    6、域名格式
    http://(协议头)www.bing.com(域名)/(URI资源:路径/⽂
    件名)
    示例:https://www.bilibili.com/v/game/?spm_id_from=333.85
    1.b_7072696d6172794368616e6e656c4d656e75.21
    三、HTTP 协议
    HTTP协议是超⽂本传输协议的缩写,英⽂是Hyper Text
    Transfer Protocol。它是从WEB服务器传输超⽂本标记语⾔
    (HTML) 到本地浏览器的传送协议。
    1、HTTP 原理
    HTTP是⼀个基于TCP/IP通信协议来传递数据的协议,传输的数
    据类型为HTML ⽂件,图⽚⽂件,查询结果等。
    HTTP协议⼀般⽤于B/S架构。浏览器作为HTTP客户端通过URL
    向HTTP服务端即web服务器发送所有请求,web服务器收到客
    户端请求后进⾏响应。2、HTTP 特点
  4. http协议⽀持客户端/服务端模式,也是⼀种请求/响应模式的协
    议。
  5. 简单快速:客户向服务器请求服务时,只需传送请求⽅法和路
    径。请求⽅法常⽤的有GET、HEAD、POST。
  6. 灵活:HTTP 允许传输任意类型的数据对象。传输的类型由
    Content-Type 加以标记。除开可以响应字符串之外,还可以上
    传和下载⼆进制⽂件
  7. ⽆连接:限制每次连接只处理⼀个请求。服务器处理完请求,并
    收到客户的应答后,即断开连接,但是却不利于客户端与服务器
    保持会话连接,为了弥补这种不⾜,产⽣了两项记录 http 状态
    的技术,⼀个叫做 Cookie,⼀个叫做 Session。
  8. ⽆状态:⽆状态是指协议对于事务处理没有记忆,后续处理需要
    前⾯的信息,则必须重传。
    3、URI 和 URL 的区别
    (1)HTTP使⽤统⼀资源标识符(Uniform Resource Identifiers,
    URI)来传输数据和建⽴连接。
    URI:Uniform Resource Identifier 统⼀资源标识符
    URL:Uniform Resource Location 统⼀资源定位符(2)URI 是⽤来标识⼀个具体的资源的,我们可以通过 URI 知道⼀
    个资源是什么,使⽤它就能够唯⼀地标记互联⽹上资源。
    (3)URL 则是⽤来定位具体的资源的,标识了⼀个具体的资源位
    置。互联⽹上的每个⽂件都有⼀个唯⼀的。
    (4)URL,也就是我们俗称的⽹址,它实际上是 URI 的⼀个⼦集。
    (5)URI 不仅包括 URL,还包括 URN(统⼀资源名称),它们之
    间的关系如下:
    4、HTTP 报⽂组成
    (1)客户端发出请求
    GET /index.php HTTP/1.5/ Host:zgod.cn**(2)客户端浏览器发送出来的请求格式:**
    GET:这个部分只声明了请求⽅式,除了get ⽅式可能还有 post
    等⽅式。GET 表示请求,POST 表示邮寄。
    /index.php:这⾥是⼀个URL,表示了我们要访问的资源是哪
    个。
    HTTP/1.5/:这⾥表示的是客户端浏览器使⽤的协议版本是1.5。
    Host:zgod.cn:这是请求是交给主机zgod.cn的。
    (3)服务器反馈的响应:
    (4)服务器反馈的响应报⽂的具体含义:
    HTTP/1.5:部分表示服务器回馈的对应http版本 (刚才客户端的
    请求⾥⾯带有版本号,对⽅使⽤的1.5,服务器回馈的也是1.5)
    200 ok:这⾥表示的是处理结果的状态码和状态的简单描述(ok)
    Date:Mon,5 sep 2022 08:49:45 GMT:响应的具体时间
    Content-Length:254:响应内容的⻓度
    Content-Type:text/html:响应内容的类型
    响应报⽂中打了⼀个空⾏(换⾏),当看到响应报⽂中有换⾏时,
    它的下⾯开始就是客户机要访问的具体资源了。5、HTTP 状态码
    2xx:成功,200成功、201已经创建
    3xx:重定向,304未修改
    4xx:请求错误,404未找到⽂件、408请求超时
    5xx:服务器错,500服务器内部错误、502⽹关错误
    6、HTTP 报⽂格式
    ⼀个完整的http访问包含请求(request)和响应(response)
    (1)请求报⽂
    客户端发出的报⽂:包含了请求⾏,请求头部字段,通⽤头部字
    段,实体头部字段及报⽂主体。
    请求⾏:客户端使⽤的请求⽅法,⽐如 GET,POST等等。同时
    也包含了URL信息和HTTP的版本号。
    请求头部字段:它包含了请求的符加信息,⽐如客户端的信息,
    响应的优先级等等。
    通⽤头部字段:是请求报⽂和响应报⽂都会使⽤的报⽂内容。实体头部字段:跟实体有关的资源信息,⽐如请求的实体更新时
    间等。
    报⽂主体:⼀般来所,请求报⽂在使⽤GET ⽅法时,没有报⽂
    主体,使⽤ POTS ⽅法时,就会有。
    (2)常⻅请求⽅法
    Ⅰ. 客户端向服务器提出请求的⽅法
  9. GET: 去向服务器获取资源。即请求指定的⻚⾯信息,并返回
    实体主体。1. POST:⽤来传输请求的实体主体。向指定资源提交数据进⾏处
    理请求。数据被包含在请求体中。POST请求可能会导致新的资
    源建⽴或已有资源修改。
  10. PUT:从客户端向服务器传送的数据取代指定的⽂档内容。
  11. HEAD:从服务器端获取报⽂⾸部信息,确定客户端输⼊的 URL
    有效性和资源的更新⽇期。类似于get请求,只不过返回的响应
    没有具体内容,只⽤于获取头部1. OPTIONS:⽤来询问服务器⽀持哪些⽅法。即获取服务器⽀持
    的请求⽅法
  12. DELETE:⽤来删除⽂件的。请求服务器删除指定的⻚⾯
    Ⅱ. 服务器回应报⽂7、HTTP协议缺点
    HTTP协议不会保存状态信息。
    ⽐如说:客户机对服务器说,请你把之前给我的响应再给我⼀次。
    那么这个时候服务器端是不会记录之前给了客户机什么东⻄的。它
    会说,我TM哪⼉记得之前给了你什么啊!?
    所以我们说HTTP是⽆状态协议。
    ⽆状态协议不会去保存任何的响应记录,所以服务器的CPU以及
    MEM等等资源的消耗上更⼩⼀些。
    试想,如果我们的服务器要去记录给每个客户机回馈了什么响应,
    是不是会消耗⾮常⼤的资源。
    我们说⽆状态协议也是有缺点的,虽然它节省了服务器端的资源,
    但是因为不能记录客户机的状态信息(⽐如某些站点的登录状态),会
    对⽤户造成不太⽅便的使⽤体验。
    那么由此⼀来,我们就要去说⼀说⼤家都听说过的⼀个技术,叫做
    cookie。 实际上COOKIE本身就是针对了HTTP⽆状态协议的弊端⽽
    出现的。
    它可以通过在请求和响应报⽂当中写⼊cookie 信息来控制/记录客户
    端的状态。⾸先,客户端对服务器发出访问请求,服务器会通过 cookie 技术在
    返回给客户端的报⽂当中加⼊⼀个叫做 set-cookie 的⾸部字段信
    息。告知客户端你要保存cookie。
    然后,客户端再次向服务器端发送访问请求的时候,客户端会在访
    问请求的报⽂当中加⼊它存储的 cookie。然后再发送。
    这个时候,服务器端在接收到请求之后,会检查客户端它发送的请
    求当中有没有夹着cookie值,再跟以前的记录进⾏⽐对,然后确认
    ⼀下发送请求的客户端是谁,它之前有什么状态。
    四、HTTPS 协议
    HTTP⼀般是明⽂传输,很容易被攻击者窃取重要信息,鉴于
    此,HTTPS应运⽽⽣。
    HTTPS 的全称为
    (HyperTextTransferProtocoloverSecureSocketLayer),
    HTTPS 和 HTTP 有很⼤的不同在于 HTTPS 是以安全为⽬标的
    HTTP通道,在HTTP 的基础上通过传输加密和身份认证保证了
    传输过程的安全性。
    HTTPS 在 HTTP 的基础上增加了 SSL 层,也就是说
    HTTPS=HTTP+SSL。
    HTTP使⽤明⽂传播,有三⼤⻛险(1)窃听⻛险(eavesdropping):第三⽅可以获知通信内容。
    (2)篡改⻛险(tampering):第三⽅可以修改通信内容。
    (3)冒充⻛险(pretending):第三⽅可以冒充他⼈身份参与通
    信。
    SSL/TLS协议是为了解决这三⼤⻛险⽽设计的,希望达到:
    (1)所有信息都是加密传播,第三⽅⽆法窃听。
    (2)具有校验机制,⼀旦被篡改,通信双⽅会⽴刻发现。
    (3)配备身份证书,防⽌⽌身份被冒充。
    1、SSL层
    SSL层(SecureSocketsLayer安全套接字协议),现在也被称为
    TLS。
    我们都知道SSL中的保证安全的加密通信是⼀次对称加密和⾮对称加
    密的结果,但是客户端与服务端建⽴通信的前提就是服务端是否能
    够被证书发型机构CA授予证书,那证书是怎么样的呢?
    以下是证书类型介绍:SSL:SecureSocketLayer,安全套接字层,http层下新增加的这
    ⼀层构成了https。
    TLS:TransportLayerSecurity,同样是为了保证数据安全的加
    密协议层,是SSL的增强版, SSL 有1.0,2.0,3.0版本,TLS
    ⽬前 1.0,1.1,1.2,1.3,TLS 的 1.0 版本就是 SSL 的 3.0。
    Key:https 中有公钥和私钥,⽤公钥加密的内容,可以使⽤私
    钥解密,反之亦然,不过我们平常所说的key⽂件是指私钥⽂
    件。
    CSR:CertificateSigningRequest 证书签名请求,⾥⾯包含公钥
    等个体信息,这个发给公证机构作为申请,通过这个公证机构颁
    发证书给你。
    CRT:certificate 证书⽂件,是证书机构颁发的保证安全通信的
    ⽂件,由域名、公司信息、序列号和签名信息等组成。
    CER:也是证书⽂件,和CRT相⽐只是缩写不同,CRT缩写常⻅
    于类uninx系统,CER缩写常⻅于 Windows 系统。
    X.509:这⾥特指颁发的证书的格式,⽽其根据不同的编码格式
    分为PEM和DER。
    a. PEM-PrivacyEnhancedMail,打开看⽂本格式,以"-----
    BEGIN "开头,"----- END"结尾,内容是 BASE64 编码。
    Apache 和 NGINX 服务器偏向于使⽤这种编码 格式,这种也是
    我们所常⻅的。
    b. DER-DistinguishedEncodingRules,打开是⼆进制格式,不
    可读。Java和Windows服务器偏向于使⽤这种编码格式。CA:CatificateAuthority证书颁发机构,它的作⽤就是给各个⽤
    户签发证书等,⽐如说 Symantec、Comodo、Godaddy、
    GolbalSign和Digicert等。
    openssl:相当于SSL的⼀个实现,如果把SSL规范看成OO中的
    接⼝,那么OpenSSL则认为是接⼝的实现,个⼈理解openssl是
    作为针对SSL/TLS的⼀个⼯具,包括对证书的解析,个⼈颁发,
    证书编码转化等。
    2、HTTPS 安全通信的四⼤原则
    (1)机密性
    就是对数据的加密,在传输数据的过程当中,如果被⼈劫持了数
    据,那么这个加密的数据对⽅不能轻易获得。
    (2)完整性
    是指数据在发送到接收的过程当中没有被篡改,从⽽接收到的数据
    是⼀个完整的数据内容。
    (3)身份认证
    数据传输的过程当中对于身份的验证,确认对⽅是传送数据过来的
    ⼈。可以解决冒充这样的⻛险。(4)不可否认性
    不能否认已经发⽣的⾏为。⽐如刚才举例双⽅借钱需要有借据并且
    签名按⼿印,如此⼀来就不能抵赖。
    3、通信原理
    (1)对称加密
    对称加密:通信双⽅都使⽤同⼀把密钥给报⽂进⾏加密和解密。
    (密码验证)
    对称加密具备速度快,性能⾼的特点。是HTTPS的最终采⽤的加密
    ⽅式。 对称加密的通信过程中双⽅都需要同样的密钥。
    (2)⾮对称加密
    ⾮对称加密:解决单项对称密钥的传输问题。就是加密和解密的
    双⽅使⽤不同的密钥。(密钥对验证)
    公钥, 是可以公开的。私钥,不能公开。
    公钥加密的内容只有私钥可以解密,私钥加密的内容只有公钥可
    以解密。
    (3)对称加密和⾮对称加密的综合版本
  13. 某⽹站拥有⽤于⾮对称加密的公钥A、私钥A。2. 浏览器向⽹站服务器请求,服务器把公钥A明⽂给传输浏览器。
  14. 浏览器随机⽣成⼀个⽤于对称加密的密钥X,⽤公钥A加密后传
    给服务器。
  15. 服务器拿到后⽤私钥A解密得到密钥X。
  16. 这样双⽅就都拥有密钥X了,且别⼈⽆法知道它。之后双⽅所有
    数据都通过密钥X加密解密即
    可。
    成功!HTTPS基本就是采⽤了这种⽅案。
    还有⼀个问题,公钥在传输过程中,也有可能被劫持替换,解决办
    法是数字证书。
    (3)CA
    认证机构,称为CA。服务端可以向CA申请认证证书,在证书上附加
    公钥信息,然后发布给客户端。服务端在申请证书的过程中,会提
    交⽐如DNS主机名等⽹站信息,CA会根据这些信息⽣成证书。
    (4)证书
    如此⼀来,客户端拿到证书之后,就可以获得证书上⾯我们附带的
    公钥,再⽤这个公钥加密'对称加密的密钥'传递给服务端。(5)数字签名
    证书的真假可以通过数字签名来验证。数字签名就相当于学历证书
    上的证书编号。
    jdk下载⻚⾯
    https://www.oracle.com/cn/java/technologies/downloads/
    https://download.oracle.com/java/22/latest/jdk-22_linux-x64_bin.t
    ar.gz
    ⼀、Apache 概念
    1、概述
    最早的 web 服务程序,基于 http 协议提供⽹⻚浏览服务。
    2、特点
    模块化设置、开放源代码、跨平台应⽤、⽀持多种 web 编程语
    ⾔、运⾏稳定。
    3、⼯作模式
    (1)Prefork:使⽤进程处理请求,在该模式中⽐较消耗内存,但稳
    定性⾼,如某个进程出现问题,不会影响其他请求。
    (2)Worker:属于多进程模式,每个进程⽣成多个进程;在该模式下
    消耗的资源⽐较⼩,适合⾼并发请求,但稳定性没有 Prefork 模式稳
    定。
    (3)Event:该模式与 Worker 模式较为相似,不同之处在于在该模
    式下可以解决keepalive ⻓连接时占⽤线程资源导致浪费的问题。(4)keep-alive ⻓连接:TCP连接在发送后将仍然保持打开状态,
    于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为
    每个请求建⽴新连接所需的时间,还节约了带宽。实现⻓连接要客户
    端和服务端都⽀持⻓连接。
    ⼆、搭建 apache 服务器
    1、安装并设置防⽕墙序

    指令
    作⽤
    说明
    1
    yum -y install
    httpd
    安装httpd
    服务应⽤
    httpd服务和nginx服务都是使
    ⽤80端⼝
    2
    systemctl start
    httpd
    启动httpd
    服务
    如果有其他占⽤80端⼝的应
    ⽤需要停⽤
    3
    netstat -
    anpt|grep httpd
    查看端⼝使
    ⽤情况
    确认开启端⼝的是http服务以
    及端⼝号是多少
    4
    systemctl
    status firewalld
    检查防⽕墙
    是否打开
    如果防⽕墙没有打开,使⽤
    filewalld-cmd指令就会报错
    5
    filewall-cmd -
    add
    service=http
    防⽕墙开放
    http服务
    这个⽐开端⼝会好很多
    6
    filewall-cmd --
    list-all
    查看防⽕墙
    的所有规则
    发现ssh服务和http的服务都
    打开了
    7
    firewall-cmd --
    reload
    重载防⽕墙
    规则
    重载之后前⾯的设置才会⽣

    [root@server2 ~]# yum -y install httpd
    上次元数据过期检查:6:39:47 前,执⾏于 2023年08⽉31⽇ 星
    期四 15时10分42秒。
    依赖关系解决。
    ===================================================
    ===========软件包 架构 版本 仓库
    ⼤⼩
    ===================================================
    ===========
    安装:
    httpd x86_64 2.4.37-
    51.module+el8.7.0+1059+126e9251
    ......省略部分安装信息......
    [root@server2 ~]# systemctl start httpd #启
    动apache
    [root@server2 ~]# netstat -anpt | grep httpd #查
    看端⼝确认apache已启⽤
    tcp6 0 0 :::80 :::*
    LISTEN 3512/httpd
    [root@server2 ~]# systemctl status
    firewalld.service #查看防⽕墙是否启⽤,若启⽤则设置
    apache服务可通⾏规则
    ● firewalld.service - firewalld - dynamic firewall
    daemon
    Loaded: loaded
    (/usr/lib/systemd/system/firewalld.service;>
    Active: active (running) since Thu 2023-08-31
    21:49:59 CST>
    ......省略部分状态信息......
    [root@server2 ~]# firewall-cmd --permanent --add
    service=http #设置防⽕墙放⾏apache
    success2、apache 配置⽂件
    yum 安装的 apache,配置⽂件在 /etc/httpd/conf/httpd.conf
    如果是编译安装的 apache,那么配置⽂件在⾃⼰编译安装的安
    装⽬录下
    [root@server2 ~]# firewall-cmd --reload #重载防
    ⽕墙规则
    success
    [root@server2 ~]# firewall-cmd --list-all #查看当
    前区域下防⽕墙所有规则
    public (active)
    target: default
    icmp-block-inversion: no
    interfaces: ens32 ens34 ens35
    sources:
    services: cockpit dhcpv6-client http ssh
    #apache(http)已放⾏
    ports: 873/tcp
    protocols:
    forward: no
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:

    指令
    作⽤
    说明
    1
    vim
    /etc/httpd/conf/httd.conf
    使⽤
    vim⼯
    具编

    httpd
    配置
    ⽂件
    没有安装vim,使⽤
    yum安装,也可以下
    载到window上使⽤记
    事本修改,都可以,
    注意要备份
    2
    Listen 80
    找到

    ⾏,
    可以
    设置
    80端

    80附近的端⼝不要随
    便修改,使⽤1023之
    后的端⼝
    [root@server2 ~]# vim /etc/httpd/conf/httpd.conf
    37 # Listen: Allows you to bind Apache to specific
    IP addresses and/or38 # ports, instead of the default. See also the
    <VirtualHost>
    39 # directive.
    40 #
    41 # Change this to Listen on specific IP addresses
    as shown below to
    42 # prevent Apache from glomming onto all bound IP
    addresses.
    43 #
    44 #Listen 12.34.56.78:80
    45 Listen 80 #默认的httpd监听端⼝,可在下⾯添加其他⾃
    设端⼝
    46
    47 #
    48 # Dynamic Shared Object (DSO) Support
    ......省略部分内容
    92 # ServerName gives the name and port that the
    server uses to identify itself.
    93 # This can often be determined automatically,
    but we recom mend you specify
    94 # it explicitly to prevent problems during
    startup.
    95 #
    96 # If your host doesn't have a registered DNS
    name, enter i ts IP address here.
    97 #3、apache 索引⽂件
    在⼀般的前段服务器中http nginx tomcat,在没有指定⽂件路径的时
    候,默认先访问资源⽂件夹中的index.xxx
    ./html/index.html
    httpd 使⽤ yum 安装时,默认的站html⽂件在
    /var/www/html/index.html,如果 index.html ⽂件不存在,需要
    ⼿动创建
    在⽹站⽅⾯,index通常是指主⽬录的意思,index.html是⽬录下
    默认打开的⻚⾯。
    ⽐如,⽹站的域名是www.abc.com,如果设置了 index.html 是
    默认主⻚,那么打开 http://www.abc.com 和打开⻚⾯ http://ww
    w.abc.com/index.html 就是⼀样的。他们打开的都是⽹站⾸⻚,
    因为index.html是⽹站默认的主⻚。
    在 index.html 写⼊如下内容,可以让主⻚显示⼀个圆形,圆⼼处
    显示⽂字"这就是主⻚"
    98 ServerName www.example.com:80 #指定httpd服务域
    名和该域名的端⼝,可以⼿动修改其他域名
    99
    100 #
    101 # Deny access to the entirety of your server's
    filesystem. You must[root@server2 ~]# vim /var/www/html/index.html
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>ssjie's page</title>
    <style type="text/css">
    .bigMom{
    margin:0 auto;
    width:600px;
    #圆的半径宽度
    height:600px;
    #圆的半径⾼度
    line-height:600px;
    #⾏间距
    text-align:center;
    #⽂字位置:居中
    color:black;
    #⽂字颜⾊:⿊⾊
    border-radius:50%;
    #圆⻆率,50%是圆
    background
    color:cyan; #圆的颜⾊:⻘⾊
    }
    </style>
    </head>4、服务器访问测试
    浏览器内输⼊搭建好的 httpd 服务器 IP 地址或域名(当前服务
    器地址为 192.168.33.110)
    <body>
    <div class="bigMom">
    欢迎来到主⻚!
    </div>
    </body>
    </html>
    :wq #保存并退出
    [root@server2 ~]# systemctl reload httpd #重载配
    置单5、IP 不同,域名相同的虚拟主机
    (1)修改主配置
    设置 IP 相同,域名不同的虚拟主机,配置⽂件在
    /etc/httpd/conf/httpd.conf
    .htaccess ⽂件:可以实现,⽂件夹密码保护、⽤户⾃动重定
    向、⾃定义错误⻚⾯、改变你的⽂件扩展名、封禁特定IP地址的
    ⽤户、只允许特定IP地址的⽤户、禁⽌⽬录列表,以及使⽤其他
    ⽂件作为index⽂件等⼀些功能。
    [root@server2 ~]# vim /etc/httpd/conf/httpd.conf
    45 Listen 80
    46
    47 ServerName www.yh666.com:80 #添加
    如下内容,域名⾃起,IP地址为⾃⼰的主机
    48
    49 NameVirtualHost 192.168.33.110
    50 <VirtualHost 192.168.33.110>
    51 DocumentRoot /var/www/html/yang #标明
    索引⽂件路径,所以还需⾃⼰在该路径创建新的索引⽂件
    52 ServerName www.yh666.com #域名
    ⾃起
    53 <directory /var/www/html/yang>(2)创建索引⽂件
    索引⽂件:index.html,⼀般为⽹站的⾸⻚。
    54 allowoverride None #确定
    是否被允许读取.htaccess⽂件内容
    55 require all granted #允许
    所有⽤户访问指定的(/var/www/html)⽂档或⽬录
    56 </directory>
    57 </virtualhost>
    58
    59 <virtualhost 192.168.33.110>
    60 documentroot /var/www/html/hong #同上
    61 servername www.hong777.com
    62 <directory /var/www/html/hong>
    63 allowoverride none
    64 require all granted
    65 </directory>
    66 </virtualhost>
    :wq #保存并退出
    [root@server2 html]# systemctl reload httpd.service
    #重载服务
    [root@server2 ~]# cd /var/www/html/ #移动
    到索引⽂件所在位置
    [root@server2 html]# ls #当前
    ⽬录下有个索引⽂件模板**(3)修改本地 hosts**
    index.html
    [root@server2 html]# mkdir yang #创建
    与上⾯主配置对应的索引⽬录 yang
    [root@server2 html]# cp -p index.html yang/ #将索
    引⽂件的模板复制到新建的yang⽬录下
    [root@server2 html]# mkdir hong #创建
    与上⾯主配置对应的索引⽬录 hong
    [root@server2 html]# cp -p index.html hong/ #复制
    索引⽂件到hong⽬录下
    [root@server2 ~]# vim /var/www/html/yang/index.html
    #第⼀个域名的索引⽂件
    [root@server2 ~]# vim /var/www/html/hong/index.html
    #第⼆个域名的索引⽂件
    #修改⽅式如下:
    19 <body>
    20 <div class="bigMom">
    21 这⾥是www.yh666.com
    #仅测试情况下,修改此处即可
    22 </div>
    #两个⽂件都改,避免测试⽆效
    23 </body>
    :wq #保存并退出本地 hosts:将⼀些常⽤的⽹址域名与其对应的IP地址建⽴⼀个
    关联"数据库",当⽤户在浏览器中输⼊⼀个需要登录的⽹址时,
    系统会⾸先⾃动从Hosts⽂件中寻找对应的IP地址,⼀旦找到,
    系统会⽴即打开对应⽹⻚,如果没有找到,则系统会再将⽹址提
    交DNS域名解析服务器进⾏IP地址的解析。
    如果该⽂件需要权限,那么右键该⽂件,进⼊"属性",点击"安
    全"选项卡,找到⾃⼰电脑的主⽤户,点编辑,然后再根据图示
    给予⽤户权限。以记事本或 notepad ⽅式打开本地 hosts ⽂件,最下⾏输⼊ IP
    和域名,记得要与 httpd 的配置⽂件内的对应。(4)域名访问测试
    Ⅰ. 浏览器输⼊配置好的域名 www.yh666.comⅡ. 浏览器输⼊ www.hong777.com
    6、IP 相同,端⼝不同的虚拟主机6、IP 相同,端⼝不同的虚拟主机
    (1)修改主配置
    编辑 /etc/httpd/conf/httpd.conf 配置⽂件
    [root@server2 ~]# vim /etc/httpd/conf/httpd.conf
    45 Listen 80
    46 Listen 88 #添加⼀个88端⼝
    47
    48 ServerName www.yh666.com:80
    49
    50 NameVirtualHost 192.168.33.110
    51 <VirtualHost 192.168.33.110:80>
    52 DocumentRoot /var/www/html/yang
    53 ServerName www.yh666.com
    54 <directory /var/www/html/yang>
    55 allowoverride None
    56 require all granted
    57 </directory>
    58 </virtualhost>
    59
    60 <virtualhost 192.168.33.110:88> #修改
    hong777.com的虚拟主机端⼝为88,其余内容不变
    61 documentroot /var/www/html/hong
    62 servername www.hong777.com**(2)访问测试**
    浏览器内分别输⼊ 192.168.33.110:80 和 192.168.33.110:88
    在访问时记得关闭防⽕墙或者修改防⽕墙放⾏端⼝规则。
    63 <directory /var/www/html/hong>
    64 allowoverride none
    65 require all granted
    66 </directory>
    67 </virtualhost>
    :wq #保存并退出
    [root@server2 html]# systemctl reload httpd.service
    #重载服务
    [root@server2 ~]# firewall-cmd --add-port=88/tcp
    #添加tcp协议的88端⼝防⽕墙放⾏服务
    success
    [root@server2 ~]# firewall-cmd --list-all
    public (active)
    target: default
    icmp-block-inversion: no
    interfaces: ens32 ens34 ens35
    sources:
    services: cockpit dhcpv6-client http ssh
    ports: 873/tcp 88/tcp #添加成功
    protocols:
    forward: no7、域名相同,IP 不同的虚拟主机
    (1)添加⽹络⼦接⼝
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
    [root@server2 ~]# ifconfig ens32:0
    192.168.33.120/24 #添加⽹卡虚拟⼦接⼝命令格式
    [root@server2 ~]# ifconfig #查询当前系统存在的⽹卡信

    ......省略部分⽹卡信息......
    ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>
    mtu 1500
    inet 192.168.33.120 netmask 255.255.255.0
    broadcast 192.168.33.255
    ether 00:0c:29:bd:1a:25 txqueuelen 1000
    (Ethernet)
    ......省略部分⽹卡信息......(2)修改主配置
    [root@server2 ~]# vim /etc/httpd/conf/httpd.conf
    45 Listen 80
    46 Listen 88
    47
    48 ServerName www.yh666.com:80
    49
    50 NameVirtualHost 192.168.33.110
    51 <VirtualHost 192.168.33.110:80>
    52 DocumentRoot /var/www/html/yang
    53 ServerName www.yh666.com
    54 <directory /var/www/html/yang>
    55 allowoverride None
    56 require all granted
    57 </directory>
    58 </virtualhost>
    59
    60 <virtualhost 192.168.33.120:88> #修改此处IP
    地址为虚拟⼦接⼝,其余不变
    61 documentroot /var/www/html/hong
    62 servername www.hong777.com
    63 <directory /var/www/html/hong>
    64 allowoverride none
    65 require all granted
    66 </directory>(3)访问测试
    浏览器输⼊分别 192.168.33.110 和 192.168.33.120
    67 </virtualhost>
    :wq #保存并退出
    [root@server2 html]# systemctl reload httpd.service
    #重载服务
    ⼀、Nginx
    1、Nginx 简介
    Nginx(engine X):开源、轻量级、⾼性能的 HTTP 和反向代
    理服务器,可以代理 HTTP、IMAP/POP3/SMTP 和 TCP/UDP
    协议。
    基本特点:占⽤内存少、并发能⼒强,采⽤ C 语⾔编写,在性
    能⽅⾯有⼀定保证。
    Nginx 可以⽤来做负载均衡及反向代理使⽤,⽬前使⽤最多的是
    负载均衡。
    与 Nginx 同类的 Web 服务有 Apache、Tomcat 等。
    官⽅⽹站:http://nginx.org/
    2、Nginx 服务器特点
    (1)模块化设计
    Nginx 将模块分为核⼼模块、HTTP 模块、事件模块和邮件模块
    四类。每个模块都有特定的职责,从⽽实现了整个 Web 服务器
    的功能。(2)低内存消耗,⾼并发
    Nginx 使⽤ epoll and kqueue 作为开发⼯具,能够⽀持最⼤
    50000 个并发连接数的响应;不论是系统资源开销还是 CPU 使
    ⽤效率都很优秀。
    (3)事件驱动
    nginx 采⽤异步⽅式处理请求。
    同步:指在发送⽅发出消息后,需要等待接收到接收⽅发回的响
    应,或者通过回调函数来接收到对⽅响应信息。
    异步:指在发送⽅发出请求后,接收⽅不需要返回消息或者不等
    待返回消息,直接提供响应请求机制。
    (4)⾼可靠性,master 与 worker 架构
    ⼀个主进程和多个⼯作进程。⼯作进程是单线程的,且不需要特
    殊授权即可运⾏;
    master进程:主要⽤来监控worker进程⼯作状态进⾏相应重
    启、停⽌等操作。
    worker进程:进⾏具体提供服务,接受请求和处理请求。
    (5)⽀持热更新配置、⽇志⽂件滚动、平滑升级
    /usr/local/nginx/sbin/nginx -s reloadhtml⽬录中的⽂件发上修改之后,不需要nginx服务
    可向 master 发送 USR1、QUIT 等信号,⽆需强制停⽌服务即
    可完成热更新。
    向 master 发送的 USR1,可实现⽇志⽂件滚动。
    向 master 发送的 USR2,可实现平滑升级。
    (6)丰富的扩展模块
    可在编译安装 nginx 时指定拓展模块,例如:nginx-sticky
    module 模块(基于 cookie 来进⾏负载转发)。
    3、Nginx 和 Apache 区别
    (1)架构
    Apache 采⽤多进程架构,每个请求都由⼀个独⽴的进程处理;
    ⽽Nginx采⽤异步事件驱动的架构,可以处理更多的并发连接。
    (2)性能
    由于Nginx的架构设计,它可以处理更多的并发连接,⽽且在⾼
    负载情况下表现更加稳定和可靠。因此,Nginx通常被认为是⽐
    Apache更⾼效的Web服务器。(3)配置
    Apache 的配置⽂件⽐较复杂,需要⼀定的学习和经验才能正确
    配置;⽽ Nginx 的配置⽂件⽐较简洁和可读性强,更容易理解
    和配置。
    (4)功能
    ngin x有许多模块可以扩展其功能,例如 mod_rewrite ⽤于
    URL 重写,mod_ssl⽤于 SSL 加密等;⽽apach 的功能⽐较简
    单,但是可以通过第三⽅模块扩展其功能。
    4、Nginx 基本功能
    (1)静态资源 Web 服务器
    nginx 可实现动静资源分离
    动态资源:需要程序处理或者从数据库中读数据,能根据不同的
    条件在⻚⾯显示不同的数据。
    静态资源:前端的固定⻚⾯,这⾥⾯包含HTML、CSS、JS、图
    ⽚、⾳乐等等,不需要查数据库也不需要程序处理,直接就能够
    显示的⻚⾯。
    动静分离:当使⽤ nginx 处理静态⻚⾯时,可将⽤户的动态请求
    转发给后端的 tomcat 或 PHP 处理动态⻚⾯。
    前后端,前端就是完全的静态资源,(2)基于域名/IP/端⼝的虚拟主机
    虚拟主机:在Web服务⾥就是⼀个独⽴的⽹站站点,这个站点对
    应独⽴的域名(也可能是IP或端⼝),具有独⽴的程序及资源⽬
    录,可以独⽴地对外提供服务供⽤户访问。
    ⼀个 nginx 主进程,指定⼀个配置⽂件,配置⽂件内有多个虚拟
    主机。如果不⽤虚拟机,⼀个域名就要对应⼀个服务器,浪费资
    源。
    Ⅰ.基于域名的虚拟主机
    以不同的多个域名区分不同的虚拟主机(IP 相同),放在⼀个
    nginx服务上,能够让⽤户有序访问⽣产⽤途,例如:www.jd.c
    om 和 diannao.jd.comchannel.jd.com
    Ⅱ.基于端⼝的虚拟主机
    以不同的端⼝,来区分多个虚拟主机,也是放在⼀个nginx服务
    上,能够让⽤户有序访问,例如:192.168.33.110:8080、www.
    baidu.com:8080.
    Ⅲ.基于 IP 的虚拟主机
    以不同 IP 区分不同的虚拟主机。(3)HTTP/HTTPS、SMTP、POP3 和 TCP/UDP 反向代理
    客户端代理,增强客户端的作⽤
    反向代理是保护服务器
    反向代理是⼀种代理服务器的配置模式,它代表服务器向客户端
    提供服务。
    客户端发送请求到反向代理服务器,然后代理服务器将请求转发
    到后端的真实服务器上,并将响应返回给客户端。
    简单理解为⽤户直接访问反向代理服务器就可以获得⽬标服务器
    的资源。
    (4)负载均衡
    所谓负载均衡,就是 Nginx 把请求均匀的分摊给上游的应⽤服
    务器,这样即使某⼀个服务器宕机也不会影响请求的处理,或者
    当应⽤服务器扛不住了,可以随时进⾏扩容。(5)⻚⾯缓存
    Nginx 不仅仅是⼀个 Web 服务器,它还可以作为⼀个缓存服务
    器使⽤。
    通过 Nginx 缓存,可以对⼀些静态资源或者数据更新频率较低
    的后端服务做缓存,降低静态资源或后端服务的响应时间,同时
    也会降低后端的负载。
    ⽐如对⼀些图⽚,css或js做⼀些缓存,那么在每次刷新浏览器
    的时候,就不会重新请求了,⽽是从缓存⾥⾯读取。这样就可以
    减轻服务器的压⼒。
    (6)⽀持代理 FastCGI、uWSGI 等应⽤服务器CGI:描述了服务器(nginx,apache)和请求处理程序
    (django,flask,springboot web框架)之间传输数据的⼀种标
    准。定义了客户端与服务器之间如何传输数据。
    FastCGI:快速通⽤⽹关接⼝(Fast Common Gateway
    Interface/FastCGI)是⼀种让交互程序与Web服务器通信的协
    议。FastCGI是早期通⽤⽹关接⼝(CGI)的增强版本。
    WSGI:为Python定义的 web 服务器和 web 框架之间的接⼝标
    准。
    uwsgi:uWSGI 服务器实现的独有的协议,定义传输信息的类
    型,是⽤于前端服务器与 uwsgi 的通信规范(uWSGI 服务器⾃
    由的⼀个协议)。
    uWSGI:⼀个Web Server(web服务器),即⼀个实现了WSGI
    协议的服务器,处理发来的请求及返回响应。
    web 服务器:
    客户端(浏览器,app)跟服务器(web框架)之间的东⻄,服务器
    中间件

nginx apache 是⼀类东⻄,就是做请求转

发,符合fastcgi服务器

uWSGI,gunicorn 只针对于python的web框架

tomcat,jboss,weblogic 只针对java的web框架

php-fpm 针对于php的框架(7)⽀持 gzip、expires

当运维⼈员将要锁包放到html中,会⾃动部署
nginx ⽀持资源压缩和缓存控制。
(8)URL Rewrite
192.168.1.3/abc
192.168.1.3/a/b/c/
Rewrite 主要实现url地址重写,以及重定向,就是把传⼊web的
请求重定向到其他 url的过程。
(9)路径别名
资源路径的别名(root 和 alias)。
(10)基于 IP、⽤户的访问控制
nginx 可对指定 IP ⽹段或某个特定 IP 做访问控制(allow:允
许;deny:拒绝)。
(11)⽀持访问速率、并发限制5、Nginx 架构
(1)主进程(master process)
主要与外界通信和⼯作进程管理。
读取 nginx 配置⽂件并验证有效性。
建⽴、绑定和关闭 socket(套接字,IP地址:端⼝号)。
按照配置⽂件⽣成、管理和结束⼯作进程。nginx 重启、停⽌、重载配置⽂件、平滑升级、管理⽇志⽂件
等。
(2)⼯作进程(worker process)
接受客户端请求,将请求交给各个功能模块处理。
接收主进程的指令并执⾏。
与后端服务器通信,接收后端服务器处理的结果,发送结果给客
户端。
数据缓存管理。
访问缓存索引、重建、查询和调⽤缓存数据。cache 模块,主要
由缓存索引重建和缓存索引管理两个进程完成,缓存索引重建进
程是在进程 nginx 服务启动⼀段时间之后,由主进程⽣成,对本
地磁盘的索引⽂件在内存中建⽴元数据库,包括扫描、过期更新
等操作,完成后退出。
系统 IO 调⽤,获取响应数据,发送响应给客户端。
⼆、Nginx ⽀持⾼并发的原因
1、 事件驱动模型
Nginx采⽤了异步事件驱动模型,它使⽤⼀个单独的⼯作进程来
处理多个连接,每个连接都是异步的,不会阻塞其他连接。这种
模型使得Nginx能够处理⼤量并发连接,⽽不会消耗过多的系统
资源。2、 ⾼效的内存管理
Nginx使⽤内存池来管理内存分配,避免了频繁的内存分配和释
放操作,从⽽提⾼了效率。此外,Nginx还采⽤了零拷⻉技术,
减少了数据在内存和磁盘之间的复制次数,进⼀步提⾼了性能。
3、 负载均衡
Nginx可以作为反向代理,将请求分发给多个后端服务器,从⽽
实现负载均衡。这样⼀来,每个后端服务器只需要处理部分请
求,整个系统的负载得到了均衡,提⾼了系统的并发能⼒。
4、⾼度可定制化
Nginx⽀持动态模块加载,⽤户可以根据⾃⼰的需求选择需要的
模块进⾏编译和加载,从⽽提⾼了灵活性和可扩展性。
三、Nginx 的 I/O 模型
1、阻塞 I/O 模型
简介:进程会⼀直阻塞,直到数据拷⻉完成
应⽤程序调⽤⼀个I/O函数,导致应⽤程序阻塞,等待数据准备
好,如果数据没有准备好,⼀直等待......
当数据准备好,从内核拷⻉到⽤户空间,I/O函数返回成功。阻塞I/O模型图:在调⽤recvfrom,发⽣在内核中等待数据和复
制数据过程:
当调⽤recv()函数时,系统⾸先检查是否有准备好的数据,如果
数据没有准备好,那么系统就处于等待状态,当数据准备好后,
将数据从系统缓冲区复制到⽤户空间,然后函数返回。
2、⾮阻塞 I/O 模型
简介:我们把**⼀个套接⼝设置为⾮阻塞** 就是告诉内存,当所请求
的I/O操作⽆法完成时,不要惊扰进程睡眠,⽽是返回⼀个错误
,这样I/O函数会不断的测试数据是否准备好,没有准备好,
继续测试,直到数据准备好为⽌。在测试的过程中会占⽤⼤量的
CPU时间。3、I/O 复⽤模型
简介:主要是 select 和 epoll;对于⼀个 I/O 端⼝,两次调⽤,
两次返回,⽐阻塞I/O并没有什么优势,只是能实现同时对多个
I/O 端⼝进⾏监听。
I/O 复⽤模型会调⽤selectpoll函数,这⼏个函数也会使进程
阻塞,但是和阻塞I/O不同的,这个函数可以同时阻塞多个 I/O
操作,⽽且可以同时对多个读操作,多个写操作的 I/O 函数进⾏
检测,直到有数据可读或可写时,才真正调⽤I/O操作函数。4、信号驱动 I/O
简介:两次调⽤,两次返回。
⾸先允许套接⼝进⾏信号驱动 I/O,并安装⼀个信号处理函数,
进程继续运⾏并不阻塞。等数据准备好时,进程会收到⼀个
SIGIO信号,可以在信号处理函数中调⽤I/O操作函数处理数
据。
5、异步I/O模型
简介:数据拷⻉的时候进程⽆需阻塞当⼀个异步过程调⽤发出后,调⽤者不能⽴刻得到结果。实际处
理这个调⽤的部件在完成后,通过状态,通知和回调通知调⽤者
输⼊输出操作。
同步 I/O 引起进程阻塞,直到 I/O 操作完成。
异步 I/O 不会引起进程阻塞。
I/O 复⽤先通过select调⽤阻塞。
四、Nginx ⽀持的并发模型
1、select 模型
IO多路复⽤、标准并发模型。在编译 nginx 时,如果所使⽤的系
统平台没有更⾼效的并发模型,select 模块将被⾃动编译。
configure 脚本的选项:--with-select_module 和 --without
select_module (可被⽤来强制性地开启或禁⽌ select 模块的编
译)。2、poll 模型
IO多路复⽤、标准并发模型。与 select 类似,在编译 nginx
时,如果所使⽤的系统平台没有更⾼效的并发模型,poll 模块将
被⾃动编译。
configure 脚本的选项:--with-poll_module 和 --without
poll_module 可⽤于强制性地开启或禁⽌ poll 模块的编译
3、epoll 模型
IO多路复⽤、⾼效并发模型,可在 Linux 2.6+ 及以上内核可以
使⽤
4、kqueue 模型
IO多路复⽤、⾼效并发模型,可在 FreeBSD 4.1+, OpenBSD
2.9+, NetBSD 2.0, and Mac OS X 平台中使⽤
5、/dev/poll 模型
⾼效并发模型,可在 Solaris 7 11/99+, HP/UX 11.22+
(eventport), IRIX 6.5.15+, and Tru64 UNIX 5.1A+ 平台使⽤
6、eventport 模型
⾼效并发模型,可⽤于 Solaris 10 平台,PS:由于⼀些已知的
问题,建议 使⽤/dev/poll替代。五、select 模型与 epoll 模型⽐较
Apache 常⽤ select 模型
Nginx 常⽤的 epoll 模型
1、select
最⼤并发数限制,因为⼀个进程所打开的 FD (⽂件描述符)是
有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048,因此
Select 模型的最⼤并发数就被相应限制了。如果改这个
FD_SETSIZE ?想法虽好,可是先看看下⾯吧。
效率问题, select 每次调⽤都会线性扫描全部的 FD 集合,这
样效率就会呈现线性下降,把 FD_SETSIZE 改⼤的后果就是:
等待时间过⻓,容易超时。
内核 / ⽤户空间的内存拷⻉问题,如何让内核把 FD 消息通知给
⽤户空间呢?在这个问题上 select 采取了内存拷⻉⽅法,在FD
⾮常多的时候,⾮常的耗费时间。
总结为:1、连接数受限 2、查找配对速度慢 3、数据由内核拷
⻉到⽤户态消耗时间
2、epoll
Epoll 没有最⼤并发连接的限制,上限是最⼤可以打开⽂件的数
⽬,这个数字⼀般远⼤于 2048,⼀般来说这个数⽬和系统内存
关系很⼤ ,具体数⽬可以 cat /proc/sys/fs/file-max 查看。效率提升, Epoll 最⼤的优点就在于它只管你"活跃"的连接 ,⽽
跟连接总数⽆关,因此在实际的⽹络环境中, Epoll的效率就会
远远⾼于 select 和 poll 。
内存共享, Epoll 在这点上使⽤了"共享内存 ",这个内存拷⻉也
省略了。
六、衡量⽹站⼤⼩和处理能⼒的指标
常⽤的⽹站性能测试指标有:吞吐量、并发数、响应时间、性能
计算等。
⼀个⽹站优化的⽬的即是,最⼤限度的利⽤好服务器硬件资源提
升资源利⽤率,减少⽤户请求的响应时间,提⾼系统吞吐量,提
⾼系统并发数。
Thread.sleep(1500)
1、并发数
12306
并发数是指系统同时能处理的请求数量,这个也是反映了系统的
负载能⼒。2、响应时间
响应时间是指发出⼀个请求时,从开始到最后收到该请求的响应
数据时,所花费的总体时间。响应时间是⼀个系统最重要的指标
之⼀,该数值的⼤⼩直接反映了系统的快慢。作为运维⼈员,要
确保⽹站响应时间在客户可接受的范围内,⼀般在 3~10 秒。
3、吞吐量
吞吐量是指单位时间内系统能处理的请求数量,体现系统处理请
求的能⼒,这是⽬前最常⽤的性能测试指标。
QPS(每秒查询数)、TPS(每秒事务数)是吞吐量的常⽤量化
指标。
还有 HPS(每秒 HTTP 请求数)。
QPS(TPS)、并发数、响应时间三者的关系为:QPS(TPS)
=并发数 ÷ 响应时间。
4、性能计数器
性能计数器是描述服务器或操作系统性能的⼀些数据指标,如使
⽤内存数、进程时间,在性能测试中发挥着"监控和分析"的作
⽤,尤其是在分析系统可扩展性、进⾏新能瓶颈定位时有着⾮常
关键的作⽤。
Linux 中可以使⽤ top 或者 uptime 命令看到当前系统的负载及
资源利⽤率情况。资源利⽤率:指系统各种资源的使⽤情况,如cpu占⽤率为
68%,内存占⽤率为55%,⼀般使⽤"资源实际使⽤/总的资源可
⽤量"形成资源利⽤率。
七、Nginx 安装
1、yum 安装 nginx
[root@server2 ~]# yum -y install nginx #yum安装
nginx
......省略安装过程......
[root@server2 ~]# nginx -v
nginx version: nginx/1.24.0 #nginx版本
[root@server2 ~]# systemctl start nginx #启动
nginx
[root@server2 ~]# ps -ef | grep nginx | grep -v
grep #查看nginx进程
root 1088 1 0 20:22 ?
00:00:00 nginx: master process
/usr/local/nginx/sbin/nginx
nginx 1089 1088 0 20:22 ?
00:00:00 nginx: worker process2、编译安装 nginx
(1)安装 pcre
⾸先安装 pcre。此软件是为了⽀持 rewrite(重写、复写)功能
⽽存在的。rewrite 是实现 url 重定向的重要命令,它会根据正则
表达式来匹配内容,从⽽跳转到⽬标上⾯去。
(2)安装 OpenSSL
当没有使⽤ ssl 证书对服务器数据进⾏加密认证时,⽤户的数据
将会以明⽂的形式进⾏传输,⽽此时,⽤户的数据可以被⼀些抓
包⼯具获取,就容易造成⽤户的信息泄露。
所以为了改善这种情况,作为运维⼈员需要去为⽹站配置 ssl 证
书,实现 https 协议的访问。
(3)编译安装 nginx

  1. 如果之前在系统上有 yum 安装的 nginx,那么在编译安装之前
    需要先卸载掉原来的 nginx。
    [root@server2 ~]# yum -y install pcre-devel
    ......省略安装过程......
    [root@server2 ~]# yum -y install openssl-devel
    ......省略安装过程......[root@server2 ~]# yum -y remove nginx #卸载
    nginx
    ......省略卸载过程......
  2. 在安装之前还要安装⽤来编译的⼯具 gcc、gcc-c++、make;
    lrzsz 是⽤来从 Windows 上直接将⽂件导⼊到 Linux 内的⼯具。
    [root@server2 ~]# yum -y install gcc gcc-c++ make
    lrzsz #安装所需⼯具
    ......省略安装过程......
  3. 将 nginx-1.22.1.tar.gz 包拖进 root ⽬录内。
  4. 解压 nginx-1.22.1.tar.gz 安装包,并 cd 到 nginx 安装包⽬录下(/usr/src/nginx-1.22.1)
    [root@YH2 ~]# tar -xf nginx-1.22.1.tar.gz -C
    /usr/src/ #将安装包解压到⼀个指定路径
    [root@YH2 ~]# cd /usr/src/nginx-1.22.1/ #cd到安装
    包⽬录下
    [root@YH2 nginx-1.22.1]# ls
    auto CHANGES.ru configure html man
    src
    CHANGES conf contrib LICENSE README
  5. configure 预配置需要在安装包⽬录下,也就是 /usr/src/nginx-
    1.22.1[root@YH2 nginx-1.22.1]# ./configure --
    prefix=/usr/local/nginx --user=nginx --group=nginx
    --with-http_ssl_module --with
    http_stub_status_module --with-http_realip_module
    --with-stream
    #命令分步解释:
    ./configure:"./"再需要解释就别学运维了。
    "configure",编译安装前的预配置。
    --prefix=/usr/local/nginx:指定软件的安装路径,注意不
    是安装包⽬录,⽽是软件要安装在哪。
    --user=nginx:程序⽤户为nginx。
    --group=nginx:组为nginx。
    --with-http_ssl_module:提供HTTPS⽀持,ssl证书模块。
    --with-http_stub_status_module:获取nginx⼯作状态模
    块。
    --with-http_realip_module:获取真实客户端IP。
    --with-stream:启⽤TCP/UDP代理模块。
    ......省略预配置过程......
  6. 进⾏编译安装 nginx
    注意:在 make 和 make install 时需要在/usr/src/nginx-1.22.1
    ⽬录下,别在 root ⽬录下了,低级错误别犯了。如果预配置或编译安装失败,要注意好⾃⼰是否已安装之前的软
    件⼯具。
    安装完成有创建⽤户,否则⽆法启动
    3、nginx 常⽤编译参数
    [root@YH2 nginx-1.22.1]# pwd #查看当前所在⽬录的绝
    对路径
    /usr/src/nginx-1.22.1
    [root@YH2 nginx-1.22.1]# make && make install
    ......省略部分编译和编译安装内容.......
    make[1]: 离开⽬录"/usr/src/nginx-1.22.1"
    #编译安装完成
    useradd -s /bin/nologin -M nginx4、nginx 的⽬录结构和构成⽂件
    [root@YH2 nginx-1.22.1]# cd /usr/local/nginx/ #cd
    到nginx软件⽬录下
    [root@YH2 nginx]# ls
    conf html logs sbin #nginx软件构成的⽬录
    #conf:存放nginx配置⽂件的⽬录
    #html:存放资源⽂件也就是⽹站⾸⻚(站点根⽬录)的⽬录
    #logs:存放nginx⽇志的⽬录
    #sbin:存放nginx可执⾏程序的⽬录
    [root@YH2 nginx]# ls ./conf #nginx所有配置⽂件
    fastcgi.conf nginx.conf
    fastcgi.conf.default nginx.conf.default
    fastcgi_params scgi_params
    fastcgi_params.default scgi_params.default
    koi-utf uwsgi_params
    koi-win uwsgi_params.default
    mime.types win-utf
    mime.types.default
    [root@YH2 nginx]# ls ./html/ #⽹站根⽬录
    50x.html index.html #⾸⻚索引⽂件。50x.html:错误
    ⾸⻚;index.html:⽹站⾸⻚
    [root@YH2 nginx]# ls ./sbin
    nginx #nginx可执⾏程序fastcgi.conf:fastcgi 相关参数配置⽂件。
    fastcgi.conf.default:fastcgi.conf 的原始备份⽂件。
    fastcgi_params:fastcgi 的参数⽂件。
    nginx.conf:nginx 默认主配置⽂件。
    ⼋、Nginx 配置⽂件
    1、nginx 主配置⽂件
    nginx.conf 为 nginx 的主配置⽂件,编译安装的配置⽂件在之前
    预配置时指定的软件⽬录下,⼀般为
    /usr/local/nginx/conf/nginx.conf;yum 安装的 nginx,主配置
    ⽂件位于 /etc/nginx/nginx.conf。
    nginx.conf 配置⽂件由指令控制的模块组成。
    指令分为简单指令和块指令,⼀个简单指令由名称和参数组成,
    空格分隔,分号结尾,如:listen 80;。
    块指令与简单指令相同的结构,但不是以分号结尾,⽽是以⼤括
    号包围的组附加指令结束,如:server { }。
    2、 nginx 块指令
    全局块:配置nginx全局的指令events块:配置nginx与⽤户连接
    相关指令events 块:配置 nginx 与⽤户连接的相关指令,如: events {
    }。
    http 块:提供HTTP服务,如:http { }。
    server 块:配置虚拟主机,⼀个http可以有多个server,如:
    server { }。
    location 块:匹配URL后做什么动作或者跳转到⽹⻚的哪⾥,
    如:location { }。
    3、配置⽂件详解
    [root@YH2 nginx]# vim
    /usr/local/nginx/conf/nginx.conf #nginx主配置⽂件
    1
    2 #user nobody; # 配置运⾏
    nginx的⽤户和组,(全局块)
    3 worker_processes 1; # 设置
    worker的进程数量
    4
    5 #error_log logs/error.log; # 错误⽇志
    的路径信息
    6 #error_log logs/error.log notice; # notice
    等级的错误⽇志路径信息(等级可修改或添加)
    7 #error_log logs/error.log info; # info等
    级的错误⽇志路径信息(等级可添加或修改)
    89 #pid logs/nginx.pid; # pid的⽂
    件路径
    10
    11
    12 events { # events块
    13 worker_connections 1024; # 每个进程
    最多能处理多少个连接
    14 }
    15
    16
    17 http { # http块,设定http服务器,利⽤它的反
    向代理功能提供负载均衡⽀持
    18 include mime.types;

指定⽂件拓展名和⽂件类型映射表

19 default_type application/octet-stream;

指定⽂件类型

20
21 #log_format main 'remote_addr - remote_user [ time_local\] "request" '
22 # 'status body_bytes_sent "ht tp_referer" ' 23 # '"http_user_agent"
"$http_x_f orwarded_for"';
24

上⾯注释的三⾏为nginx程序内部变量

25 #access_log logs/access.log main;

设定访问⽇志的路径及格式26

27 sendfile on; # 指定nginx
是否调⽤sendfile函数来输出⽂件,对于普通应⽤必须设定为no
28 #tcp_nopush on; # 放置⽹络阻

29
30 #keepalive_timeout 0; # 连接超过的
时间设置
31 keepalive_timeout 65;
32
33 #gzip on; # 开启gzip
压缩
34
35 server { # server
块,配置各种虚拟主机
36 listen 80; # 设置监听端

37 server_name localhost; # 配置的域名
信息,⼀个server可以对应⼀个域名信息
38
39 #charset koi8-r; # 字符集,
utf-8为中⽂字符集
40
41 #access_log logs/host.access.log
main; # 设定本虚拟主机的访问⽇志和⽇志类型
4243 location / { #
location块,代表url的跳转,"/"后⾯写⼊的内容代表我们在浏览
器地址栏输⼊的域名或IP地址的后续访问路径
44 root html; #
服务器的默认⽹站根⽬录位置
45 index index.html index.htm; #
⾸⻚索引⽂件名称
46 }
48 #error_page 404
/404.html; # 错误提示⻚⾯
49
50 # redirect server error pages to the
static p age /50x.html
51 #
52 error_page 500 502 503 504
/50x.html; # 错误提示⻚⾯
53 location = /50x.html {
54 root html;
55 } # 每个花括号都会与前⾯的对应
......省略部分注释内容.......
79 } # 这个花括号对应的是 server 的
"{"
......省略部分注释内容.......
117 } # 这个花括号对应的是 http 的 "{"
九、优化 nginx 服务控制九、优化 nginx 服务控制
1、直接使⽤ nginx 命令
将软件⽬录下的 /usr/local/nginx/sbin/nginx 可执⾏程序软链接
到/usr/sbin,如果按照 Windows ⽅式来说相当于制作了⼀个
nginx 的快捷⽅式。
[root@YH2 nginx]# ls /usr/local/nginx/sbin
nginx
[root@YH2 nginx]# ln -s
/usr/local/nginx/sbin/nginx /usr/sbin #将软件⽬录
下的nginx可执⾏程序软链接到/usr/sbin
[root@YH2 nginx]# nginx -t #对nginx配置⽂件的语
法和格式进⾏检查
nginx: the configuration file
/usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file
/usr/local/nginx/conf/nginx.conf test is
successful
[root@YH2 nginx]# nginx #启动nginx
[root@YH2 nginx]# nginx -s stop #停⽌nginx
[root@YH2 nginx]# nginx #启动nginx
[root@YH2 nginx]# nginx -s reload #热重启,仅重载
nginx配置⽂件2、以 systemctl 控制 nginx
在 /usr/lib/systemd/system ⽬录下新建⼀个 nginx.service ⾮⼿
动执⾏脚本,并使⽤ vim 命令添加以下内容。
[root@YH2 ~]# vim
/usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=Flase
[Install]
WantedBy=multi-user.target
:wq # 保存并退出
[root@YH2 ~]# systemctl daemon-reload #重
载systemctl的配置⽂件,以便nginx.service⽣效
[root@YH2 ~]# systemctl start nginx.service #启
动nginx3、优化注意事项
如果直接使⽤ nginx 命令对程序进⾏控制,那么不可以再⽤
systemctl 服务控制命令对 nginx 进⾏后续操作。
⽐如:我现在使⽤了 nginx 命令直接启动了 nginx 程序,如果此
时我对 nginx 的主配置⽂件做出了修改想要重新载⼊主配置⽂
件,那么不能使⽤ systemctl reload nginx.service 重载 nginx 配
置,或 systemctl stop nginx.service 停⽌ nginx 程序,只能使
⽤ nginx -s reload 重载配置,或 nginx -s stop 停⽌服务。
⼗、nginx 错误代码
1、302 定义
302 redirect:302 代表暂时性转移(Temporarily Moved )。
意思就是你访问⽹址A,但是⽹址A因为服务器端的拦截器或者
其他后端代码处理的原因,会被重定向到⽹址B。
[root@YH2 ~]# systemctl status nginx.service #查
看nginx状态
● nginx.service - nginx
Loaded: loaded
(/usr/lib/systemd/system/nginx.service>
Active: active (running) since Mon 2023-09-04
23:13:3
......省略部分状态信息.......2、403 定义
403是很常⻅的错误代码,⼀般就是未授权被禁⽌访问的意思。
可能原因:

  1. Nginx 程序⽤户⽆权限访问 web ⽬录⽂件。
  2. Nginx 需要访问⽬录,但是 autoindex 选项被关闭。
    修复⽅法:
  3. 授予 Nginx 程序⽤户权限读取 web ⽬录⽂件。
  4. 设置 autoindex 选项为on。3、413 错误
    在上传时 Nginx 返回了413错误:"413 Request Entity Too
    Large",这⼀般就是上传⽂件⼤⼩超过 Nginx 配置引起。
    修复⽅法:
  5. 在 Nginx.conf 增加 client_max_body_size 的设置,这个值默认
    是1M,可以增加到8M以提⾼⽂件⼤⼩限制;
  6. 如果运⾏的是 php,那么还要检查 php.ini,这个⼤⼩
    client_max body_size 要和 php.ini 中的如下值的最⼤值⼀致或
    者稍⼤,这样就不会因为提交数据⼤⼩不⼀致出现的错误。
    [root@yh2 ~]# vim /usr/local/nginx/conf/nginx.conf
    .......省略部分内容......
    34
    35 server {
    36 listen 80;
    37 server_name localhost;
    38 root /服务器; #该模块将访问本机地址
    时的⻚⾯变成了⽂件⽬录⻚⾯
    39 autoindex on; #修改这个参数即可
    40 autoindex_exact_size off;
    41 autoindex_localtime on;
    42 charset utf-8;4、502 错误
    Nginx 502 Bad Gateway 的含义是请求的 PHP-CGI 已经执⾏,
    但是由于某种原因 (⼀般是读取资源的问题) 没有执⾏完毕,⽽
    导致 PHP-CGI 进程终⽌。
    ⼀般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关。
    修复⽅法:
  7. 查看FastCGI进程是否已经启动
  8. 检查系统Fastcgi进程运⾏情况
    [root@yh2 ~]# vim /usr/local/nginx/conf/nginx.conf
    ......省略部分内容.......
    17 http {
    18 include mime.types;
    19 default_type application/octet-stream;
    20 client_max_body_size 8M; #添加
    该项设置
    21 post_max_size 8M;
    22 upload_max_filesize 2M; #如果
    是php,那么添加21和22⾏这两项参数
    [root@yh2 ~]# ps -auxIgrep php-cgi除了第⼀种情况,fastcgi进程数不够⽤、php执⾏时间⻓、或者
    是php-cgi进程死掉也可能造成Nginx的502错误。
    运⾏以下命令判断是否接近FastCGI进程,如果fastcgi进程数接
    近配置⽂件中设置的数值,表明worker进程数设置太少。
  9. FastCGI执⾏时间过⻓
    根据实际情况调⾼以下参数值
    5、504 错误
    Nginx 504 Gateway Time-out 的含义是所请求的⽹关没有请求
    到,简单来说就是没有请求到可以执⾏的 PHP-CGI。
    [root@yh2 ~]# netstat -anpolgrep"php-cgi"wc-l
    [root@yh2 ~]# vim /usr/local/nginx/conf/nginx.conf
    ......省略部分内容.......
    17 http {
    18 include mime.types;
    19 default_type application/octet-stream;
    20 fastcgi_connect_timeout 300;
    21 fastcgi_send_timeout 300;
    22 fastcgi_read_timeout 300; #调节20~22
    ⾏这⼏项参数值,没有可以⼿动添加Nginx 504 Gateway Time-out⼀般与 Nginx.conf 的设置有关。
    变量名
    描述
    remote_addr 客户端 IP 地址 remote_user
    客户端⽤户名,auth_basic 认证的⽤

    time_local 访问时间和时区 request
    请求的 HTTP ⽅法、url 和协议版本
    status 响应的 HTTP 状态码 body_bytes
    响应客户端⽂件内容⼤⼩
    http_referer 从哪个⻚⾯链接过来的 http_user_agent
    客户端浏览器信息
    http_x_forwarded_for 客户端 IP 地址,只有在配置代理或 负载均衡请求下才添加该项 host
    请求中 host 字段的值
    request_filename 请求路径及⽂件名 request_url
    完整的 uri,包含请求参数
    url 不包含请求参数 http_cookie
    客户端 cookie
    args
    请求中的参数
    server_name nginx 的服务器名称 **⼀、Nginx 的内置变量** 和request_time
    从接受⽤户请求的第⼀个字段到发送
    响应数据时间
    upstream_addr 后端节点 IP upstream_response_time 后端响应时间
    upstream_cache_status 缓存后端节点响应数据状态,有 miss、hit、expried、updating 和 stale **⼆、开启 nginx 状态监听模块** **1、修改配置** 进⼊ nginx 主配置⽂件(yum 和编译安装的⽂件路径不⼀ 样)。 找到"server { }",添加⼀个"location { }",也就是虚拟主机。 \[root@server2 \~\]# vim /usr/local/nginx/conf/nginx.conf ......省略部分内容...... server { listen 80; #监听端⼝ server_name localhost; #服务器名称 charset utf-8; #字符集,utf-8为中⽂ 字符集**2、访问测试** 浏览器访问 192.168.33.110/status,查看 nginx 状态信息。 **三、nginx 虚拟主机配置** #access_log logs/host.access.log main; location /status { #nginx状态的监听模块 stub_status on; access_log off; } } ......省略部分内容...... :wq #保存并退出 \[root@server2 \~\]# systemctl restart nginx.service #重启nginx**三、nginx 虚拟主机配置** ⼀个"location"相当于⼀个虚拟主机,也就是⽤户访问⽹站时, 点击跳转的另⼀个⻚⾯。 location 内可以添加 nginx 各种功能模块。 \[root@server2 \~\]# vim /usr/local/nginx/conf/nginx.conf ......省略部分内容...... server { listen 80; #监听端⼝ server_name localhost; charset utf-8; #access_log logs/host.access.log main; location /status { stub_status on; access_log off; } location / { root html; #⽹站在服务器上的⽬ 录,默认为/usr/local/nginx/html index index.html index.htm; #跳转到 的⽹站⾸⻚**四、nginx 反向代理配置** 反向代理:⽤户直接访问反向代理服务器就可以获得⽬标服务器 (后端服务器)的资源。 **1、 修改配置** } } ......省略部分内容...... :wq \[root@server2 \~\]# systemctl restart nginx.service #重启nginx在配置⽂件中添加⼀⾏反向代理块指令(proxy_pass),表示 当访问本机地址 192.168.33.110 的 80 端⼝时即可跳转到后端 服务器 192.168.33.11 的 80 端⼝上。 \[root@server2 \~\]# vim /usr/local/nginx/conf/nginx.conf ......省略部分内容...... server { listen 80; server_name localhost; charset utf-8; #access_log logs/host.access.log main; location /status { stub_status on; access_log off; } location / { root html; index index.html index.htm; proxy_pass http://192.168.33.11:80; #添加⼀个反向代理模块 } ......省略部分内容......**2、建⽴后端服务器** 使⽤另⼀台虚拟机,安装 nginx ,然后进⼊ /usr/share/nginx/html/ ⽬录,修改其中的 index.html ⽂件,随 便写⼊⼀条内容进⾏测试。 **3、访问测试** 浏览器输⼊本机地址 192.168.33.110,将会⾃动跳转到后端服 务器 192.168.33.11 上。 \[root@server2 \~\]# systemctl reload nginx.service #重载nginx配置 \[root@YH1 \~\]# vim /usr/share/nginx/html/index.html 这⾥是192.168.33.11**五、nginx 访客 IP ⿊名单** **1、修改配置** 作为运维⼈员,我们可以选择允许哪些⽤户 IP 来访问我们的服 务器,也可以选择允许哪个⽹段的⽤户。 allow:允许 deny:拒绝 在 nginx 配置⽂件的 server 模块内可以添加下⾯的内容。 当访问被拒绝时,会显示 403 错误⻚⾯。**2、访问测试** (1)因为当前服务器拒绝了 33.0 ⽹段的⽤户访问,⽽本机浏览器 正是通过 33.1 ⽹关与服务器建⽴连接,所以浏览器被拒绝访问了, 显示 403 错误信息。 \[root@server2 \~\]# vim /usr/local/nginx/conf/nginx.conf ......省略部分内容...... server { listen 80; server_name localhost; charset utf-8; allow 192.168.33.22; #允许192.168.33.22 ⽤户访问 deny 192.168.33.0/24; #拒绝33.0⽹段的⽤户访 问 deny all; #拒绝所有 ......省略部分内容......(2)使⽤也是 192.168.33.0 ⽹段的 33.11 的 YH1 主机访问服务器 进⾏测试。\[root@YH1 \~\]# ip a #查看当前主机的IP 2: ens32: \ mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:72:29:0b brd ff:ff:ff:ff:ff:ff altname enp2s0 inet 192.168.33.11/24 brd 192.168.33.255 scope global noprefixroute ens32 \[root@YH1 \~\]# curl 192.168.33.110 #访问 33.110服务器进⾏测试 \ \\403 Forbidden\\ #可以看 到403错误,说明访问同样被拒 \ \\403 Forbidden\\ \\nginx/1.24.0\ \ \ (3)使⽤之前允许的 192.168.33.22 的 YH2 主机进⾏访问服务器 测试**六、为 server 主机配置访问和错误⽇志** **1、控制⽇志参数** (1)nginx 访问⽇志主要控制参数 log_format:⽤来定义记录⽇志的格式(可以定义多种⽇志格 式,取不同名字即可) access_log:⽤来指定⽇志⽂件的路径及使⽤何种⽇志格式记录 ⽇志 \[root@YH2 \~\]# ip a #查看当前主机的IP 2: ens32: \ mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:10:45:e6 brd ff:ff:ff:ff:ff:ff altname enp2s0 inet 192.168.33.22/24 brd 192.168.33.255 scope global noprefixroute ens32 \[root@YH2 \~\]# curl 192.168.33.110 #访问33.110服务 器进⾏测试 欢迎访问! 这⾥是 192.168.33.110 服务器! #测试成功,可以访问(2)log_format ⽇志格式变量 remote_addr:记录访问⽹站的客户端地址。
    remote_user:远程客户端⽤户名。 time_local:记录访问时间与时区。
    request:⽤户的http请求起始⾏信息。 status:http状态码,记录请求返回的状态码,例如:200、
    301、404等。
    body_bytes_sent:服务器发送给客户端的响应body字节数。 http_referer:记录此次请求是从哪个连接访问过来的,可以根
    据该参数进⾏防盗链设置。
    http_user_agent:记录客户端访问信息,例如:浏览器、⼿机 客户端等。 http_x_forwarded_for:当前端有代理服务器时,设置web节点
    记录客户端地址的配置,此参数⽣效的前提是代理服务器也要进
    ⾏相关的x_forwarded_for设置。(3)access_log 访问⽇志
    (4)error_log 错误⽇志
    [root@server2 ~]# vim
    /usr/local/nginx/conf/nginx.conf
    ......省略部分内容......
    #log_format main 'remote_addr - remote_user [time_local\] "request" '

'$status $body_bytes_sent

"$http_referer" '

'"$http_user_agent"

"http_x_forwarded_for"'; ......省略部分内容...... \[root@server2 \~\]# vim /usr/local/nginx/conf/nginx.conf ......省略部分内容...... #access_log logs/access.log main; #访问⽇志的路径 和格式 ......省略部分内容......错误⽇志:error_log 不能改变. ⽇志⽂件:指定⽇志的存放⽬录 错误⽇志级别:debug、info、notice、warn、error、crit、 alert、emerg,级别越⾼记录的信息越少 ⽣产环境⼀般为 warn、error、crit 这三个级别之⼀。 不要配置 info 等级较低的级别,会造成磁盘消耗。 **七、nginx 错误⻚⾯** nginx 的错误⻚⾯与访问⾸⻚⼀样,都有⾃⼰的索引⽂件,⼀般 ⽤户访问的⽹站都是对应的索引⽂件。 \[root@server2 \~\]# vim /usr/local/nginx/conf/nginx.conf ......省略部分内容...... #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; 错误⽇志 错误⽇志⽂件路径 错误⽇志级别**⼋、location 块的匹配规则和优先级** **1、location⼤致可以分为三类** 精准匹配:location = / {...} 正则匹配:location \~ / {...} ⼀般匹配:location / {...} **2、location常⽤的匹配规则** = :进⾏普通字符精确匹配,也就是完全匹配。 \^\~ :表示普通字符匹配。使⽤前缀匹配。如果匹配成功,则不再匹 配其它 location。 \[root@server2 \~\]# vim /usr/local/nginx/conf/nginx.conf ......省略部分内容...... error_page 500 502 503 504 /50x.html; #500\~504错误代码,不论哪个代码,错误⻚⾯都是50x.html location = /50x.html { #错误⽂件所在路径 root html; #该⽹站的根⽬录 }\~ :区分⼤⼩写的匹配。 \~\* :不区分⼤⼩写的匹配。 !\~ :区分⼤⼩写的匹配取⾮。 !\~\* :不区分⼤⼩写的匹配取⾮。 **3、location优先级** ⾸先精确匹配 = 其次前缀匹配 \^\~ 其次是按⽂件中顺序的正则匹配 或 \* 然后匹配不带任何修饰的前缀匹配 最后是交给 / 通⽤匹配 精确\>前缀\>正则\>⼀般\>通⽤ (location = 完整路径) \> (location \^\~ 完整路径) \> (location \~\* 完 整路径) \> (location \~ 完整路径) \>(location 部分起始路径) \> (location /)**4、location 示例说明** (1)location = / {} = 为精确匹配 / ,主机名后⾯不能带任何字符串,⽐如访问 / 和 /data,则 / 匹配,/data 不匹配 再⽐如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹 配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。 (2)location / {} 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求⽐ 如访问 / 和 /data, 则 / 匹配, /data 也匹配,但若后⾯是正则表 达式会和最⻓字符串优先匹配(最⻓匹配) (3)location /file/ {} 匹配任何以 /file/ 开头的地址,匹配符合以后,还要继续往下搜 索其它 location 只有其它 location后⾯的正则表达式没有匹配到时,才会采⽤这 ⼀条 (4)location /file/abc {} 匹配任何以 /file/abc 开头的地址,匹配符合以后,还要继续往 下搜索其它location只有其它 location后⾯的正则表达式没有匹配到时,才会采⽤这 ⼀条。 (5)location \^\~ /images/ {} 匹配任何以 /images/ 开头的地址,匹配符合以后,停⽌往下搜 索正则,采⽤这⼀条。 (6)location \~ .(gif\|jpg\|jpeg) {}*
匹配所有以 gif、jpg或jpeg 结尾的请求.然⽽,所有请求
/images/ 下的图⽚会被 location ^~ /images/ 处理,因为 ^~ 的
优先级更⾼,所以到达不了这⼀条正则。
(7)location /images/abc {}
最⻓字符匹配到 /images/abc,优先级最低,继续往下搜索其它
location,会发现 ^~ 和 ~ 存在。
(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location
^~ /images/ 才会采⽤这⼀条。
(9)location /images/abc/1.html {}
匹配/images/abc/1.html ⽂件,如果和正则location ~
/images/abc/1.html 相⽐,正则优先级更⾼。九、rewrite 重写和⽹站跳转
1、301 永久跳转
301 永久跳转:当⽤户或搜索引擎向⽹站服务器发起浏览请求
时,服务器返回的 HTTP 数据流中头信息(index.html 等)中的
状态码的⼀种,表示本⽹⻚永久性地转移到了另⼀个地址。
rewrite 重写跳转规则
http://www.yang1314/$1:跳转到的⽬标地址,后⾯的$1代表
链参数也⼀起跳转。
⽐如访问 www.yh666.com/123 就会跳转到
www.yang1314/123 没有的话。就会直接跳转到 www.yang131
4.com
permanent:301 永久跳转
[root@server2 ~]# vim
/usr/local/nginx/conf/nginx.conf
.......省略部分内容.......
server {
listen 80;
server_name www.yh666.com;
charset utf-8;
#access_log logs/host.access.log main;2、302 临时跳转
跟 301 永久跳转相⽐,302 就是⼀个参数的差别。
配置规则按着 301 配置⾛即可找到域名配置⽂件的Server或者
location段,适当位置添加下⾯代码:
rewrite^/(*)
1](http://www.lei
ge.com/1) redirect; location / { root html; index index.html index.htm; rewrite \^/(.\*)
http://www.yang1314.com/$1 permanent; #添加此参数
}
}
[root@server2 ~]# vim
/usr/local/nginx/conf/nginx.conf
.......省略部分内容.......
server {
listen 80;
server_name www.yh666.com;
charset utf-8;⼗、平滑升级
1、原理
(1)启动后完成配置加载和端⼝绑定等动作, 分离出指定数量的⼯
作⼦进程 ,这些⼦进程会持有监听端⼝的⽂件描述符 (fd),并通过
在该描述符上添加监听事件来接受连接。
(2)Nginx 主进程在启动完成后会进⼊等待状态,负责响应各类系
统消息,如 SIGCHLD、SIGHUPSIGUSR2 等。
(3)主进程⽀持的信号
TERM、INT:⽴刻退出
QUIT:等待⼯作进程结束后再退出
KILL:强制终⽌进程;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
rewrite ^/(.*)$
http://www.yang1314.com/$1 redirect;
}
}HUP:重新加载配置⽂件,使⽤新的配置启动⼯作进程,并逐
步关闭旧进程
USR1:重新⽣成⽇志⽂件;
USR2:启动新的主进程,实现热升级
WINCH:逐步关闭⼯作进程及⼯作进程⽀持的信号
2、过程
(1)查看旧版nginx的编译参数;
(2)编译新版本 Nginx 源码包,安装路径需与旧版⼀致,注意: 不
要执⾏ make install;
(3)备份⼆进制可执⾏⽂件,⽤新版本的替换;
(4)确保配置⽂件⽆报错;
(5)发送USR2信号:向主进程(master) 发送USR2信号,Nginx 会
启动⼀个新版本的 master 进程和对应⼯作进程,和旧版⼀起处理请
求;
(6)发送WINCH信号:向旧的 Nginx主进程(master) 发送 WINCH
信号,它会逐步关闭⾃⼰的⼯作进程(主进程不退出),这时所有请求
都会由新版Nginx处理;(7)发送QUIT 信号: 升级完毕,可向旧的 Nginx 主进程(master) 发
送 (QUIT、TERM、或者KILL)信号,使旧的主进程退出;
(8)验证nginx 版本号,并访问测试.
3、配置
(1)准备软件包并查看旧版软件
[root@YH1 ~]# ls
公共 视频 ⽂档 ⾳乐 anaconda-ks.cfg nginx-
1.22.1.tar.gz #旧版nginx
模板 图⽚ 下载 桌⾯ initial-setup-ks.cfg nginx-
1.24.0.tar.gz #新版nginx
[root@YH1 nginx]# nginx -V #查看nginx版本信息及安
装的模块
nginx version: nginx/1.22.1 #当前版本为1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-15)
(GCC)
built with OpenSSL 1.1.1k FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --
user=nginx --group=nginx --with-http_ssl_module --
with-http_stub_status_module --with
http_realip_module --with-stream
[root@YH1 ~]# systemctl start nginx #启动nginx[root@YH1 ~]# tar -xf nginx-1.24.0.tar.gz -C
/usr/src #解压1.24.0版本
[root@YH1 ~]# cd /usr/src/nginx-1.24.0/ #移动到
解压好的1.24.0的nginx安装包⽬录
[root@YH1 nginx-1.24.0]# ls
auto CHANGES.ru configure html man
src
CHANGES conf contrib LICENSE README
[root@YH1 nginx-1.24.0]# ./configure --
prefix=/usr/local/nginx --user=nginx --group=nginx
--with-http_ssl_module --with
http_stub_status_module --with-http_realip_module
--with-stream
......省略部分预配置信息......
[root@YH1 nginx-1.24.0]# make #预配置后进⾏编译,
不要进⾏make install编译安装
......省略部分编译信息......
[root@YH1 nginx-1.24.0]# mv
/usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx.old
#此次mv修改的是1.22.1版本的nginx执⾏程序,将1.22.1nginx
程序修改为nginx.old,以防不与⼀会的新版本重名出现错误,整个
逻辑需要注意
[root@YH1 nginx-1.24.0]# cp /usr/src/nginx-
1.24.0/objs/nginx /usr/local/nginx/sbin
#将1.24.0版本的nginx的可执⾏程序复制到1.22.1版本的nginx
的程序⽬录下(2)向进程发信号实现热升级
虽然主程序完成了升级,但此时正在⼯作的 nginx 进程并未完成
升级,依旧是 1.22.1 ⽼版本的 nginx 在运⾏,所以这⾥要向⽼
版本 nginx 进程发送信号。
[root@YH1 nginx-1.24.0]# nginx -v #查询nginx版本号
nginx version: nginx/1.24.0
[root@YH1 ~]# ps aux | grep nginx | grep -v grep
#查询当前运⾏的nginx的pid号
USER PID %CPU %MEM VSZ RSS TTY
STAT START TIME COMMAND
root 7314 0.0 0.0 26660 736 ?
Ss 22:18 0:00 nginx: master process
/usr/local/nginx/sbin/nginx
nginx 7315 0.0 0.6 58824 4868 ? S
22:18 0:00 nginx: worker process
[root@YH1 ~]# kill -USR2 7314 #发送USR2信号:向⽼
版本的主进程发送该信号,nginx会启动新版本的进程与⽼版本进程
⼀起处理请求
[root@YH1 ~]# ps aux | grep nginx | grep -v grep
#看到⽼版本与新版本nginx的主进程和⼯作进程都在启动中
root 7314 0.0 0.3 26660 2672 ?
Ss 22:18 0:00 nginx: master process
/usr/local/nginx/sbin/nginx**⼗⼀、防盗链**
作⽤:防盗链就是防⽌别⼈盗⽤服务器中的图⽚、⽂件、视频等
相关资源。在 nginx 中,通过 location + return 实现。
nginx 7315 0.0 0.6 58824 4868 ? S
22:18 0:00 nginx: worker process #⽼版本
root 10374 0.0 0.7 26672 5996 ? S
22:34 0:00 nginx: master process
/usr/local/nginx/sbin/nginx
nginx 10375 0.0 0.6 58836 5040 ? S
22:34 0:00 nginx: worker process #新版本
[root@YH1 ~]# kill -WINCH 7314 #发送WINCH信号:向
⽼版本主进程发送该信号,它会逐步关闭⾃⼰的⼯作进程(主进程不
会退出),此时的处理请求全部交与新版本的nginx处理
[root@YH1 ~]# kill -QUIT 7314 #发送QUIT信号:向⽼
版本的主进程发送该信号,让旧版本退出
[root@YH1 ~]# ps aux | grep nginx | grep -v grep
#可以看到⽼版本的nginx已经完全退出,热升级完成
root 10374 0.0 0.7 26672 5996 ? S
22:34 0:00 nginx: master process
/usr/local/nginx/sbin/nginx
nginx 10375 0.0 0.6 58836 5040 ? S
22:34 0:00 nginx: worker process1、搭建 nginx 主服务器
实例操作需要两台主机做防盗链操作,所以这⾥我⽤我的两台主
机(server:192.168.33.100)和(YH1:192.168.33.11)做防
盗链演示操作。
下⾯是 server:192.168.33.100 主机的搭建过程,代码及解释
如下:
[root@server ~]# vim
/usr/local/nginx/conf/nginx.conf #去nginx配置⽂件中
找到nginx存放⾸⻚索引⽂件的根⽬录
43 location / {
44 root html; #nginx⾸⻚索引⽂件的
根⽬录,默认在nginx软件⽬录下,也就
是/usr/local/nginx/html
45 index index.html index.htm;
#nginx索引⽂件的格式
46 }
:q #因为配置⽂件未做修改,只是找需要的⽂件位置,所以q退出
即可,⽆需w再保存
[root@server ~]# vim
/usr/local/nginx/html/index.html #按照如下格式写
内容,什么意思不⽤细究
1 <html>2、测试访问主服务器
浏览器输⼊已经搭好的 nginx 主服务器,192.168.33.100
访问成功,如下图:
2 <head>
3 <title>192.168.33.100</title>
4 </head>
5 <body>
6 192.168.33.100 #我的server
主机IP
7 <img src="./123.jpg">
#./123.jpg表示在/usr/local/nginx/html的123.jpg图⽚⽂
件,随便导⼊⼀张图⽚改成123.jpg即可
8 </body>
9 </html>
:wq
[root@server ~]# cd /usr/local/nginx/html/ #到这
个⽬录下
[root@server html]# ls
50x.html 微信截图_20230915204153.jpg index.html
#⼿动拖⼊⼀张jpg格式的图⽚,注意格式
[root@server html]# mv 微信截图_20230915204153.jpg
123.jpg #将图⽚改名为刚才在index.html中提到的123.jpg
[root@server html]# systemctl reload nginx.service
#重载nginx,尽量以后少重启服务,避免到了企业中养成坏习惯3、搭建模拟"盗图"的服务器
搭建 YH1:192.168.33.11 模拟"盗图"的服务器
此时需要⽤到另⼀台主机,代码及解释如下:4、测试访问"盗图"服务器
浏览器输⼊ IP,如下图:
[root@YH1 ~]# vim /usr/local/nginx/html/index.html
#知道索引⽂件位置,⽆需再去nginx主配置⽂件中查看
1 <html>
2 <head>
3 <title>192.168.33.11</title>
4 </head>
5 <body>
6 192.168.33.11
7 <img
src="http://192.168.33.11/123.jpg">
8 </body>
9 </html>
:wq #保存并退出
[root@server html]# systemctl reload nginx.service
#重载nginx,前提nginx服务已启动5、为主服务器设置防盗链
修改被盗⽤主机(我的是 server:192.168.33.100)的 nginx 配
置⽂件,代码解释如下:
[root@server ~]# vim
/usr/local/nginx/conf/nginx.conf
35 server {
36 listen 80;
37 server_name localhost;
38
39 #charset koi8-r;40
41 #access_log logs/host.access.log
main;
42
43 location / {
44 root html;
45 index index.html index.htm;
46 }
47 #在第⼀个location下⾯添加⼀个location即可,格式如
下:
48 location ~* \.(mp3|jpg|png|gif|rar)$ {
#匹配以mp3、jpg、png、gif、rar格式的⽂件
49 valid_referers none blocked
192.168.33.100; #valid_referers参数⽤于指定允许访
问图⽚的域名,⽽none表示不允许任何外部域名访问,blocked表
示拒绝所有外部域名访问
50 if ($invalid_referer) {
#在blocked后⾯可以添加指定的域名和IP,表示允许某个IP或域名
的主机访问(本机IP为192.168.33.100)
51 return 403;
52 } #表示如果请求的
referer不在valid_referers参数指定的域名列表中,则返回403
错误
53 }
:wq #保存并退出
[root@server ~]# systemctl reload nginx.service6、清理浏览器缓存,再次访问测试
浏览器输⼊两个⽹站,⼀个被盗图的服务器 IP,⼀个盗图的服
务器 IP。
做出对⽐,可以看到 192.168.33.11 图⽚失效,⽽
192.168.33.100 图⽚可显示。
⼗⼆、⽇志分割随着访问量的增⻓,⽇志⽂件会越来越⼤,时间⻓既会影响访问
的速度,也会占⽤⼀部分磁盘空间,下⾯使⽤脚本⽅式,按天切
割 access 和 error ⽇志。
脚本⽅式:

  1. 剪切⽇志后,使⽤ kill -USR1 向 nginx 发送信号重新⽣成⽇志⽂
    件,同时还不影响⽹站请求处理进程
  2. 错误时通过echo命令将错误显示的同时写⼊到⽇志⽂
    件/var/log/messages。
  3. 脚本代码及解释如下:
    [root@server ~]# vim cut_nginx_logs.sh #新建⼀个脚
    本⽂件
    #!/bin/bash
    #脚本所需环境,shell脚本必备语句

获取⽇期

d=$(date +%Y-%m-%d)

定义存储⽬录

dir="/usr/local/nginx/logs"

定义需要分割的源⽇志

logs_file="/usr/local/nginx/logs/access.log"
logs_error="/usr/local/nginx/logs/error.log"# 定义nginx的pid⽂件
pid_file="/usr/local/nginx/logs/nginx.pid"
#如果dir定义的变量⽬录不存在,那么执⾏then后⾯的命令 if \[ ! -d "dir" ]
then
mkdir $dir
fi #if条件结束语

移动⽇志并重命名⽂件

if [ -f pid_file \] #如果pid_file定义的变量⽂件存在
then #那么
mv $logs_file dir/access_d.log
mv $logs_error dir/error_d.log
kill -USR1 $(cat $pid_file) #发送kill -USR1信
号给Nginx的主进程号,让Nginx重新⽣成⼀个新的⽇志⽂件
find dir -mtime +30 \| xargs rm -f #清理dir
定义的变量⽇志⽬录下,30天以上的⽂件
else #否则
echo "Error,nginx is not working!" >>
/var/log/messages #将"nginx未运⾏"这条消息追加到系统
内核⽇志/var/log/messages
fi
:wq
[root@server ~]# chmod +x cut_nginx_logs.sh #给脚
本⼀个可执⾏权限
[root@server ~]# crontab -e**⼗三、反向代理及获取客户端 IP 地址**
反向代理:反向代理服务器位于⽤户与⽬标服务器之间,但是对
于⽤户⽽⾔,反向代理服务器就相当于⽬标服务器,即⽤户直接
访问反向代理服务器就可以获得⽬标服务器的资源。
获取客户端 IP:经过反向代理后,由于在客户端和 web 后端服
务器之间增加了中间层(反向代理服务器),因此 web 后端服
务器⽆法直接拿到客户端的 IP,⽽通过请求获取 IP 等操作后,
即可从后端服务器获得客户端真实 IP。
1、 搭建反向代理服务器
(1)⽤两台主机进⾏反向代理及测试。
⼀台反向代理服务器 server:192.168.33.100,⼀台后端服务器
YH1:192.168.33.11
0 0 * * * /usr/bin/bash /root/cut_nginx_logs.sh
#在每天的0点执⾏该脚本
[root@server ~]# ./cut_nginx_log.sh #启动脚本
[root@server ~]# cd /usr/local/nginx/logs/ #查看
⽇志是否以时间分隔
[root@server logs]# ls
access_2023-09-15.log error_2023-09-15.log
nginx.pid
access.log error.log(2)将 YH1 的 nginx ⾸⻚索引⽂件修改为如下内容:
[root@YH1 ~]# vim /usr/local/nginx/html/index.html
192.168.33.11 这⾥是真实的后端服务器YH1
:wq
(3)配置反向代理服务器 server:192.168.33.100 的 nginx 主配置
⽂件,代码及解释如下:
[root@server ~]# vim
/usr/local/nginx/conf/nginx.conf
......省略部分配置信息.......
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;(4)当浏览器访问代理服务器 server:192.168.33.100 时,其实就
访问到了后端服务器 YH1:192.168.33.11 上,如下图:
2、搭建可获取客户端 IP 的服务器
(1)配置代理服务器 server:192.168.33.100 的 nginx 主配置,使
后端服务器 YH1:192.168.33.11 可获取客户端真实 IP。
proxy_pass http://192.168.33.11:80;
#在location内添加该条参数,表示为将33.100所收到的访问请求
代理转发到33.11的80端⼝
}
:wq
[root@server ~]# systemctl reload nginx.service[root@server ~]# vim
/usr/local/nginx/conf/nginx.conf
......省略部分配置信息......
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.33.11:80;
proxy_set_header X-Real-IP
remote_addr; #代理服务器为后端服务器请求客户端真实IP 地址 proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for;
}
:wq
[root@server ~]# systemctl reload nginx.service
(2)配置后端服务器 YH1:192.168.33.11 的 nginx 主配置**⼗四、Nginx 的 web 缓存服务**
Nginx 作为 Web 缓存服务器,它介于客户端和应⽤服务器之
间,当⽤户通过浏览器访问⼀个 URL 时,Web 缓存服务器会去
应⽤服务器获取要展示给⽤户的内容,将内容缓存到⾃⼰的服务
器上,当下⼀次请求到来时,如果访问的是同⼀个 URL,Web
缓存服务器就会直接将之前缓存的内容返回给客户端,⽽不是向
应⽤服务器再次发送请求。
Web 缓存降低了应⽤服务器、数据库的负载,减少了⽹络延
迟,提⾼了⽤户访问的响应速度,增强了⽤户的体验。
[root@YH1 ~]# vim /usr/local/nginx/conf/nginx.conf
......省略部分配置信息......
location / {
root html;
index index.html index.htm;
set_real_ip_from 192.168.33.100; #获
取客户端的真实IP来源于192.168.33.100,也可写⼀个IP范围
real_ip_header X-Forwarded-For; #⽤
于设置使⽤哪个头来替换IP地址
real_ip_recursive on; #是
否递归解析
}
:wq
[root@YH1 ~]# systemctl reload nginx.service(1)搭建反向代理缓存服务器 server:192.168.33.100
[root@server ~]# vim
/usr/local/nginx/conf/nginx.conf
......省略部分配置信息......
http {
include mime.types;
default_type application/octet-stream;
proxy_cache_path /usr/local/proxy_temp
levels=1:2 keys_zone=cache_item:200m inactive=1d
max_size=20g;
#指定缓冲路径,指定缓存⽬录级别⼆层,指定缓存块名称和⼤
⼩,指定缓存数据存储时间,指定占⽤硬盘最⼤值20g
......省略部分配置信息......
location / {
proxy_cache cache item; #指定缓
冲区
proxy_cache_key
$schemesproxy_hostsrequest_uri; #指定参数key值
proxy_cache_valid 200 5d; #返回值
200缓存5天
proxy_cache_valid 404 30s; #返回值
404缓存30秒
proxy_cache_valid any 1m; #其他的
⼀分钟(2)当反向代理缓存服务器搭建完成后,即使nginx服务关闭也可
以访问⾸⻚。
⼗五、nginx 的 https 协议
1、⽣成密钥⽂件
proxy_pass http://192.168.33.11;
#反向代理,将请求转发给后端web服务器
}
......省略部分配置信息......
:wq
[root@server ~]# systemctl reload nginx.service2、颁发证书3、编辑 nginx 主配置⽂件
4、通过 https 访问⾃⼰的 IP 地址
例如我的服务器 IP:192.168.33.100,那么想要访问就是 https:
//192.168.33.100,当访问上后会显示不安全的连接-----⾼级---
-添加例外-----确认添加。

相关推荐
嘟嘟太菜了1 天前
使用阿里云试用资源快速部署web应用-dofaker为例
阿里云·云计算
冰万森1 天前
亚马逊AI编程工具Amazon Q 和 Amazon CodeWhisperer使用教程
云计算·aws
静听山水3 天前
腾讯云新开端口
云计算·腾讯云
CLOUD ACE3 天前
谷歌地图 | 3D 地图新功能:开发更简单,体验更丰富
云计算·云服务·谷歌云·谷歌地图·3d地图
StevenZeng学堂3 天前
【云原生安全篇】Cosign助力Harbor验证镜像实践
网络·安全·云原生·容器·kubernetes·云计算·go
xybDIY3 天前
解决AWS Organizatiion邀请多个Linker账号数量限额问题
云计算·aws
mqiqe3 天前
云计算Openstack Neutron
云计算·openstack·perl
mqiqe3 天前
云计算Openstack Keystone
数据库·云计算·openstack
小安运维日记4 天前
Linux云计算 |【第四阶段】RDBMS1-DAY3
运维·服务器·sql·mysql·云计算·求职招聘
szqcloud4 天前
腾讯云SDK产品功能
云计算·音视频·腾讯云