一起来学Nginx(三)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 一起来学Nginx(三)

前言

目前正在出一个Nginx系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

作为服务端开发,Nginx一定都不陌生,在web开发中扮演重要的角色,它能作为反向代理服务器,负载均衡服务器,静态文件服务器等等。

在本系列中将带大家系统性的学习下Nginx,好了, 废话不多说直接开整吧~

显示指定监听的地址和端口

Nginx listen 指令用于监听指定的 IP 地址和端口号,若 IP 地址或端口缺失,Nginx 会以默认值来替换。

而且,仅当需要区分与 listen 指令中的同一级别匹配的服务器块时,才会评估 server_name 指令。

示例:

server {
  listen 192.168.0.1;  # 192.168.0.1:80
  ...
}
server {
  listen 80;  # *:80 --> 0.0.0.0:80
  server_name x.x.com;
  ...
}

使用 return 指令进行 URL 重定向(301、302)

示例

server {
  server_name www.example.com;
  return    301 https://$host$request_uri;
}

使用自定义日志格式

可以在 Nginx 配置中作为变量访问的任何内容都可以记录,包括非标准的 HTTP 标头等。因此,这是一种针对特定情况创建自己的日志格式的简单方法。

示例:

## Default main log format from the Nginx repository:
log_format main
                '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';
## Extended main log format:
log_format main-0
                '$remote_addr - $remote_user [$time_local] '
                '"$request_method $scheme://$host$request_uri '
                '$server_protocol" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" '
                '$request_time';
## Debug log formats:
log_format debug-0
                '$remote_addr - $remote_user [$time_local] '
                '"$request_method $scheme://$host$request_uri '
                '$server_protocol" $status $body_bytes_sent '
                '$request_id $pid $msec $request_time '
                '$upstream_connect_time $upstream_header_time '
                '$upstream_response_time "$request_filename" '
                '$request_completion';

使用 try_files 指令确认文件是否存在

  ...
  root /var/www/example.com;
  location /images {
    try_files $uri =404;
  ...
}

使用 limit_conn 改善对下载速度的限制

Nginx 提供了两个指令来限制下载速度:

limit_rate_after - 设置 limit_rate 指令生效之前传输的数据量limit_rate - 允许您限制单个客户端连接的传输速率

  • 限制传输速度为10k
location / {
  limit_rate 10k;
  root html;
}
  • 限制50m后限制速度
location / {
  limit_rate_after 50m;
  limit_rate 10k;
  root html;
}

使用 HTTP/2

HTTP / 2 将使我们的应用程序更快,更简单且更可靠。 HTTP / 2 的主要目标是通过启用完整的请求和响应多路复用来减少延迟,通过有效压缩 HTTP 标头字段来最小化协议开销,并增加对请求优先级和服务器推送的支持。

示例:

server {
  listen 443 ssl http2;
  ...
}

负载均衡

但是,网站在实际运营过程中,大部分都是以集群的方式运行,这时需要使用负载均衡来分流。

假设这样一个应用场景:将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台服务器上。网站域名叫 www.xx.com,公网 IP 为 192.168.1.11。

加权轮询策略 配置如下:

http {
     #设定mime类型,类型由mime.type文件定义
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #设定日志格式
    access_log    /var/log/nginx/access.log;
    #设定负载均衡的服务器列表
    upstream load_balance_server {
        #weigth参数表示权值,权值越高被分配到的几率越大
        server 192.168.1.11:80   weight=5;
        server 192.168.1.12:80   weight=1;
        server 192.168.1.13:80   weight=6;
    }
   #HTTP服务器
   server {
        #侦听80端口
        listen       80;
        #定义使用www.xx.com访问
        server_name  www.xx.com;
        #对所有请求进行负载均衡请求
        location / {
            root        /root;                 #定义服务器的默认网站根目录位置
            index       index.html index.htm;  #定义首页索引文件的名称
            proxy_pass  http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表
            #以下是一些反向代理的配置(可选择性配置)
            #proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 90;          #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;             #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;             #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;              #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;       #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;    #设定缓存文件夹大小,大于这个值,将从upstream服务器传
            client_max_body_size 10m;          #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;      #缓冲区代理缓冲用户端请求的最大字节数
        }
    }
}

负载均衡策略

Nginx 提供了多种负载均衡策略

轮询

upstream bck_testing_01 {
  # 默认所有服务器权重为 1
  server 192.168.250.220:8080
  server 192.168.250.221:8080
  server 192.168.250.222:8080
}

加权轮询

upstream bck_testing_01 {
  server 192.168.250.220:8080   weight=3
  server 192.168.250.221:8080              # default weight=1
  server 192.168.250.222:8080              # default weight=1
}

最少连接

upstream bck_testing_01 {
  least_conn;
  # with default weight for all (weight=1)
  server 192.168.250.220:8080
  server 192.168.250.221:8080
  server 192.168.250.222:8080
}

加权最少连接

upstream bck_testing_01 {
  least_conn;
  server 192.168.250.220:8080   weight=3
  server 192.168.250.221:8080              # default weight=1
  server 192.168.250.222:8080              # default weight=1
}

IP Hash

upstream bck_testing_01 {
  ip_hash;
  # with default weight for all (weight=1)
  server 192.168.250.220:8080
  server 192.168.250.221:8080
  server 192.168.250.222:8080
}

普通 Hash

upstream bck_testing_01 {
  hash $request_uri;
  # with default weight for all (weight=1)
  server 192.168.250.220:8080
  server 192.168.250.221:8080
  server 192.168.250.222:8080
}

维护多个站点服务

当一个网站功能越来越丰富时,往往需要将一些功能相对独立的模块剥离出来,独立维护。这样的话,通常,会有多个 webapp。

举个例子:假如 www.xx.com 站点有好几个 webapp,A、B、C。访问这些应用的方式通过上下文(context)来进行区分:

www.xx.com/A/
www.xx.com/B/
www.xx.com/C/

我们知道,http 的默认端口号是 80,如果在一台服务器上同时启动这 3 个 webapp 应用,都用 80 端口,肯定是不成的。所以,这三个应用需要分别绑定不同的端口号。

那么,问题来了,用户在实际访问 www.xx.com 站点时,访问不同 webapp,总不会还带着对应的端口号去访问吧。所以,你再次需要用到反向代理来做处理。

配置也不难,来看看怎么做吧:

http {
  ...
  upstream A{
    server www.xx.com:8081;
  }
  upstream B{
    server www.xx.com:8082;
  }
  upstream C{
    server www.xx.com:8083;
  }
  server {
    ...
    #默认指向A的server
    location / {
      proxy_pass http:/A;
    }
    location /a/{
      proxy_pass http://A;
    }
    location /b/ {
      proxy_pass http://B;
    }
    location /c/ {
      proxy_pass http://C;
    }
  }
}

配置websocket

location /ws/ {
       proxy_pass http://backend;
       proxy_set_header       Host $host;
       proxy_set_header  X-Real-IP  $remote_addr;
       proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_http_version 1.1;
       #下面两个必须设置,请求头设置为ws请求方式
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
}

结束语

Nginx的常用配置就介绍到这里了,它还有一些比较高级的模块,功能也比较强大,感兴趣的小伙伴可以继续研究一下

本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注鼓励一下呗~

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5月前
|
缓存 负载均衡 安全
|
6月前
|
缓存 负载均衡 应用服务中间件
2.nginx
2.nginx
46 1
|
6月前
|
缓存 负载均衡 Java
什么是Nginx服务?
Nginx是一个高性能的开源的HTTP和反向代理服务器,以及邮件(IMAP/POP3)代理服务器。它最初由Igor Sysoev创建,并于2004年首次公开发布。Nginx的主要特点包括高性能、低内存占用、高并发处理能力以及高度的可靠性。
76 2
|
负载均衡 应用服务中间件 nginx
五分钟进步系列之nginx(一)
五分钟进步系列之nginx(一)
|
应用服务中间件 网络安全 nginx
nginx应用
nginx应用
117 0
|
应用服务中间件 Apache 开发工具
关于Nginx,你需要知道的!
关于Nginx,你需要知道的!
191 0
|
XML 缓存 应用服务中间件
|
存储 缓存 安全
Nginx基本应用(一)
Nginx基本应用(一)
Nginx基本应用(一)
|
缓存 负载均衡 前端开发
|
应用服务中间件 网络安全 nginx
nginx 502
技巧
127 0