nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > 使用Nginx实现反向代理、配置负载均衡

使用Nginx实现反向代理、配置负载均衡详解

作者:吞吞吐吐大魔王

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,文章详细介绍了Nginx的安装、配置、命令、静态资源部署、反向代理和负载均衡等具体应用

1. Nginx 概述

1.1 Nginx 介绍

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,实际上 Nginx 的并发能力在同类型的网页服务器中表现较好,国内使用 Nginx 的网站有:百度、京东、淘宝、腾讯等。

Nginx 官网:https://nginx.org/

1.2 Nginx 下载和安装

Nginx 官网下载地址:https://nginx.org/en/download.html

Linux 安装 Nginx 过程:

安装依赖包

yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

下载 Nginx 安装包

wget https://nginx.org/download/nginx-1.16.1.tar.gz

# 如果未安装 wget 命令,则可以通过以下命令进行安装
yum install wget

解压

tar -zxvf nginx-1.16.1.tar.gz

配置 Nginx 安装目录为 /usr/local/nginx

# 先创建安装的目录
mkdir -p /usr/local/nginx

# 配置安装目录
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx

如果不配置安装的路径,那么安装后可执行文件默认存放在 /usr/local/bin,库文件默认存放在 /usr/local/lib,配置文件默认存放在 /usr/local/etc,其他的资源文件存放在 /usr/local/share

编译和安装 Nginx

make && make install

通过以上步骤,Nginx 就已经安装好了,切换到其安装目录我们就能看到以下几个目录

1.3 Nginx 目录结构

安装完 Nginx 后,我们就能看到以下几个目录:

目录说明
conf存放配置文件
html存放静态文件(html、css、js)
logs存放日志文件
sbin存放脚本文件

在这些目录中还有几个重要的文件:

文件说明
conf/nginx.confNginx 配置文件
sbin/nginx二进制文件,用于启动、停止 Nginx 服务

Nginx 目录和文件总览:

2. Nginx 命令

命令说明
./nginx -v查看 Nginx 版本
./nginx -t检查配置文件正确性
./nginx启动 Nginx 服务
./nginx -s stop停止 Nginx 服务
./nginx -s reload重新加载配置文件(当修改 Nginx 配置文件后,需要重新加载才能生效)

以上命令都需要进入 Nginx 的安装目录的 sbin 目录才能执行,因此执行这些命令的时候其实是有点麻烦的。

为了解决这个问题,能够在任何路径都能执行这些命令,可以将 Nginx 的二进制文件的路径配置到系统的环境变量中。

配置方式:

进入 /etc/profile 文件进行编辑

vim /etc/profile

在 Path 变量后面追加 nginx 的 sbin 路径

让修改后的 /etc/profile 立即生效

source /etc/profile

3. Nginx 配置文件结构

Nginx 配置文件(conf/nginx.conf)整体分为三部分:

全局块:和 Nginx 运行相关的全局配置

events 块:和网络连接相关的配置

http 块:代理、缓存、日志记录、虚拟主机配置

4. Nginx 具体应用

4.1 部署静态资源

Nginx 可以作为静态 web 服务器来部署静态资源。静态资源指在服务端真实存在并且能够直接展示的一些文件,比如 html、css、hs、图片、视频等资源。

相对于 Tomcat,Nginx 处理静态资源的能力更加高效,所以在生产环境下,一般都会将静态资源部署到 Nginx 中。将静态资源部署到 Nginx 非常简单,只需要将文件复制到 Nginx 安装目录的 html 目录即可。

除此之外,如果有需要还可以对 Nginx 的配置文件的 http 块的 server 块的参数进行指定的修改,参数说明如下:

4.2 反向代理

4.2.1 介绍

代理就像是我们去购买海外的东西,找了个中间人帮我们去买物品并且带了回来。

从系统的角度来说,直接访问就是浏览器的请求直接到了最终的服务器,中间没有经过任何的代理服务器,否则就是通过了代理的形式去访问了服务器。

代理(proxy)又分为正向代理(forward proxy)和反向代理(reverse proxy)。

正向代理(forward proxy):

是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

一个正向代理服务器并没有直接响应请求的能力,就像商店不生产方便面一样,它不过是把请求转发到最终的网页服务器上,再把后者的响应再转发给请求者。

正向代理的典型用途是为在防火墙内的局域网客户端提供访问 Internet 的途径。

反向代理(reverse proxy):

反向代理服务器位于用户于目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器。

用户不需要知道目标服务器的地址,也无须在用户端做任何设定。

反向代理与正向代理的一个很大区别就是,它不需要客户端去做什么配置,并没有什么配置代理服务器的操作。

如果说正向代理是主动配置,主动走代理,那么反向代理则是”被代理“。从这点上看,反向代理有时又称为“透明代理”,也即是浏览器都不知道自己被代理了,浏览器以为发给它响应的就是最终的网页服务器,其实不过是个“代理”。

4.2.2 配置反向代理

配置反向代理只需要修改 nginx.conf 配置文件即可,需要配置的参数如下:

server {
    listen 81;	# 监听端口
    server_name localhost;	# 服务器名称
    location / {
        proxy_pass http://目标服务器IP:端口号; #反向代理配置,将请求转发到指定服务
    }
}

配置后记得重新加载配置文件。

4.3 负载均衡

4.3.1 介绍

早期的网站流量和业务功能都比较简单,单台服务器就可以满足基本需求,但是随着互连网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群,进行性能的水平扩展以及避免单点故障出现。

4.3.2 配置负载均衡

配置负载均衡只需要修改 nginx.conf 配置文件即可,需要配置的参数如下:

upstream targetserver {		# upstream 指令可以定义一组服务器
    server 服务器1IP:端口号;
    server 服务器2IP:端口号;
}

server {
    listen 8080;	# 监听端口
    server_name localhost;	# 服务器名称
    location / {
        proxy_pass http://targetserver;	# 请求转发的一组服务器的名称
    }
}

配置后记得重新加载配置文件。

4.3.3 负载均衡策略

名称说明
轮询默认方式
weight权重方式,权重越大分配的机率越高
ip_hash依据 ip 分配方式
least_conn依据最少连接方式
url_hash依据 url 分配方式
fair依据响应时间方式

轮询:默认方式,当刷新浏览器时,会发现目标服务器是被轮流着访问。

upstream targetserver {		# upstream 指令可以定义一组服务器
    server 服务器1IP:端口号;
    server 服务器2IP:端口号;
}

weight:通过分配权重的方式,权重越大分配的机率越高。

upstream targetserver {		# upstream 指令可以定义一组服务器
    server 服务器1IP:端口号 weight=10;
    server 服务器2IP:端口号 weight=5;
}

ip_hash:通过客户端的 ip 地址经过哈希算法来分配到一个服务器上,之后同一个 ip 访问时都会固定的访问一个服务器。

通过 ip_hash 能够解决 Session 丢失的问题,即用户第一次在A服务器登陆后,如果下次请求访问到B服务器的话,那么登录信息则会丢失。

upstream targetserver {		# upstream 指令可以定义一组服务器
	ip_hash;
    server 服务器1IP:端口号;
    server 服务器2IP:端口号;
}

least_conn:分配服务器中最少连接的那个。

upstream targetserver {		# upstream 指令可以定义一组服务器
	least_conn;
    server 服务器1IP:端口号;
    server 服务器2IP:端口号;
}

url_hash:按照访问的 url 经过哈希算法来分配到一个服务器上,之后同一个 url 访问都会访问到固定的一个服务器。

适合后端服务器作为缓存时使用。

upstream targetserver {		# upstream 指令可以定义一组服务器
	hash $request_uri;
	hash_methond cr32;	# hash 算法
    server 服务器1IP:端口号;
    server 服务器2IP:端口号;
}

fair:根据后端服务器的响应时间来分配请求,响应时间短的分配优先。

upstream targetserver {		# upstream 指令可以定义一组服务器
	fair;
    server 服务器1IP:端口号;
    server 服务器2IP:端口号;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文