IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Nginx基础 -> 正文阅读

[PHP知识库]Nginx基础

Nginx基础

基本概念

什么是nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强。

正向代理

在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都由代理服务器代替来请求。正向代理代理的对象是客户端

反向代理

客户端不需要任何配置就能访问,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。反向代理隐藏了真实的服务端,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了。反向代理代理的对象是服务端

负载均衡

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?

我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率,加大内存等提高机器的物理性能来解决此问题,但是如果将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?

上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

系统的扩展可以分为纵向扩展横向扩展
纵向扩展是从单机的角度出发,通过增加系统的硬件处理能力来提升服务器的处理能力
横向扩展是通过添加机器来满足大型网站服务的处理能力

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面有不同的服务器来解析,减少服务器压力,加快解析速度。

安装nginx

依赖介绍

gcc

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境

pcre和prce-devel

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。

zlib

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

openssl

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

安装命令

# 下载安装依赖
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 下载nginx
wget -c https://nginx.org/download/nginx-1.20.1.tar.gz
# 解压nginx
tar -zxvf nginx-1.10.1.tar.gz
# 安装nginx
cd nginx-1.20.1/
./configure 
make && make install
# 安装完成后可通过whereis nginx查看安装目录 whereis nginx  ==> nginx: /usr/local/nginx

防火墙放行端口

启动nginx后,在浏览器中输入ip:port发现无法访问,这是因为防火墙拦截了,这时我们需要放行相应端口。

命令列表

# 查看防火墙信息
firewall-cmd --list-all
#添加指定需要开放的端口,permanent表示永久生效
firewall-cmd --add-port=80/tcp --permanent
#重载入添加的端口
firewall-cmd --reload
#查询指定端口是否开启成功
firewall-cmd --query-port=80/tcp

具体操作列表

[root@localhost sbin]# firewall-cmd --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	
[root@localhost sbin]# 
[root@localhost sbin]# 
[root@localhost sbin]# firewall-cmd --add-port=80/tcp --permanent
success
[root@localhost sbin]# firewall-cmd --reload
success
[root@localhost sbin]# firewall-cmd --query-port=80/tcp
yes

设置完防火墙后再次访问就可以了。
在这里插入图片描述

配置环境变量

vim /etc/profile
# 在最后一行添加
export PATH=$PATH:/usr/local/nginx/sbin
# 刷新
source /etc/profile

常用命令

如果不配置环境变量

版本,在/usr/local/nginx/sbin 目录下执行 ./nginx -v
启动,在/usr/local/nginx/sbin 目录下执行 ./nginx
停止,在/usr/local/nginx/sbin 目录下执行 ./nginx -s stop
重启,在/usr/local/nginx/sbin 目录下执行 ./nginx -s reload

配置环境变量后

版本,nginx -v
启动,nginx
停止,nginx -s stop
重启,nginx -s reload

配置文件

nginx的配置文件都在安装目录下的conf中(/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.conf 配置文件分为三部分

全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约

events块

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。上述例子就表示每个 work process 支持的最大连接数为 1024。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

http块

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是:http 块也可以包括 http 全局块、server 块。

http全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等

serve块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及多个 location块。

1、全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

2、location 块

一个 server 块可以配置多个 location 块。 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name),对虚拟主机名称 (也可以是 IP 别名)之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

语法:location [ = | ~ | ~* | ^~ |@ ] uri{...}

uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。

  • 不带符号,要求必须以指定模式开始
server {
    listen 80;
    server_name 127.0.0.1;
    location /abc{
        default_type text/plain;
        return 200 "access success";
    }
}
以下访问都是正确的
http://192.168.200.133/abc
http://192.168.200.133/abc?p1=TOM
http://192.168.200.133/abc/
http://192.168.200.133/abcdef
  • = : 用于不包含正则表达式的uri前,必须与指定的模式精确匹配
server {
    listen 80;
    server_name 127.0.0.1;
    location =/abc{
        default_type text/plain;
        return 200 "access success";
    }
}
可以匹配到
http://192.168.200.133/abc
http://192.168.200.133/abc?p1=TOM
匹配不到
http://192.168.200.133/abc/
http://192.168.200.133/abcdef
  • ~ : 用于表示当前uri中包含了正则表达式,并且区分大小写
  • ~*: 用于表示当前uri中包含了正则表达式,并且不区分大小写
  • ^~: 用于不包含正则表达式的uri前,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。

反向代理实例

实现效果

使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中

nginx 监听端口为 80,

访问 http://ip/one/index.html 直接跳转到 127.0.0.1:8001/one/index.html

访问 http://ip/two/index.html 直接跳转到 127.0.0.1:8002/two/index.html

准备工作

在虚拟机中安装两个tomcat,分别设置端口为8001和8002(其他端口也要不同)。

在8001的tomcat的webapps中创建文件夹one,在其中放置index.html

在8002的tomcat的webapps中创建文件夹two,在其中放置index.html

tomcat访问测试

在这里插入图片描述
在这里插入图片描述

nginx配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWzwtdkp-1630553053115)(Nginx.assets/image-20210818095032819.png)]

nginx反向代理测试

在这里插入图片描述
在这里插入图片描述

负载均衡实例

实现效果

浏览器地址栏输入地址 http://ip/balance/index.html,平均 8080 和 8081 端口中

准备工作

准备两台 tomcat 服务器,一台 8001,一台 8002

在两台 tomcat 里面 webapps 目录中,创建名称是 balance 文件夹,在 ebalance u 文件夹中放置 index.html,用于测试

tomcat访问测试

在这里插入图片描述
在这里插入图片描述

nginx配置

在这里插入图片描述

nginx负载均衡测试

不断刷新页面,发现在8001和8002之间不断切换,说明轮询方式负载均衡配置成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O6Py5L9w-1630553053122)(Nginx.assets/image-20210818102242105.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jL0ewgE-1630553053123)(Nginx.assets/image-20210818102111880.png)]

nginx 分配服务器策略

  • 第一种 轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

  • 第二种 加权轮询

    weight 代表权重,默认为 1,权重越高被分配的客户端越多,可以理解为比例分发。

    upstream myserver {
        server 127.0.0.1:8001 weight=1;
        server 127.0.0.1:8002 weight=4;
    }
    weight=1,weight=4 是表示权重的意思,数字越大,权重越高。
    在该例中 8002 这个端口权重就是 8001 的两倍,比如五次请求,大概就是一次分发给 8001 四次分发给 8002 
    
  • 第三种 ip_hash

    对访问用户的IP进行hash后的结果进行分配,这样每一个用户固定请求同一个后端服务器,能够解决session的问题。使用ip_hash指令无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接收的请求少,而且设置后端服务器权重等方法将不起作用。

    upstream myserver {
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        ip_hash;
    }
    

上面是最基本的三种算法。我们可以通过改变参数来自行配置负载均衡

upstream myserver{   
    # ip_hash;    
    server 127.0.0.1:9090 down;    
    server 127.0.0.1:8080 weight=2;    
    server 127.0.0.1:6060;    
    server 127.0.0.1:7070 backup;    
}
参数含义
down表示当前的server暂时不参与负载
weight默认为1,weight越大,负载的权重就越大
max_fails允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误
fail_timeoutmax_fails次失败后,暂停的时间。
backup其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 11:40:27  更:2021-09-03 11:41:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:39:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码