一起来学Nginx(三)

前言

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

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

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

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

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

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

示例:

nginx 复制代码
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)

示例

nginx 复制代码
server {

  server_name www.example.com;

  return    301 https://$host$request_uri;
}

使用自定义日志格式

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

示例:

nginx 复制代码
## 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 指令确认文件是否存在

nginx 复制代码
  ...

  root /var/www/example.com;

  location /images {

    try_files $uri =404;

  ...

}

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

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

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

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

使用 HTTP/2

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

示例:

nginx 复制代码
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。

加权轮询策略 配置如下:

nginx 复制代码
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 提供了多种负载均衡策略

轮询

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

加权轮询

nginx 复制代码
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
}

最少连接

nginx 复制代码
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
}

加权最少连接

nginx 复制代码
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

nginx 复制代码
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

nginx 复制代码
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)来进行区分:

css 复制代码
www.xx.com/A/

www.xx.com/B/

www.xx.com/C/

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

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

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

nginx 复制代码
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

nginx 复制代码
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的常用配置就介绍到这里了,它还有一些比较高级的模块,功能也比较强大,感兴趣的小伙伴可以继续研究一下

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

Nginx教程相关文章

往期Docker教程相关文章

往前Shell脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)

相关推荐
m0_569531016 分钟前
Nginx(4)--Nginx与tomcat反向代理和负载均衡
nginx·tomcat·负载均衡
q***71859 分钟前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
大象席地抽烟16 分钟前
使用 Ollama 本地模型与 Spring AI Alibaba
后端
程序员小假19 分钟前
SQL 语句左连接右连接内连接如何使用,区别是什么?
java·后端
小坏讲微服务20 分钟前
Spring Cloud Alibaba Gateway 集成 Redis 限流的完整配置
数据库·redis·分布式·后端·spring cloud·架构·gateway
Fantasydg21 分钟前
Request Response对象
前端
Wect23 分钟前
学习React-DnD:核心组件与Hooks
前端
humors22128 分钟前
前端开发案例(不定期更新)
前端·vue.js·elementui·ruoyi·若依
菠萝+冰30 分钟前
npm中-d -g 和默认安装的区别
前端·npm·node.js
方圆想当图灵1 小时前
Nacos 源码深度畅游:Nacos 配置同步详解(下)
分布式·后端·github