一起来学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⭐️)

博客(阅读体验较佳)

相关推荐
颜淡慕潇28 分钟前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
熊的猫42 分钟前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
瑶琴AI前端1 小时前
uniapp组件实现省市区三级联动选择
java·前端·uni-app
会发光的猪。1 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
尘浮生1 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
尚学教辅学习资料2 小时前
基于SpringBoot的医药管理系统+LW示例参考
java·spring boot·后端·java毕业设计·医药管理
我要洋人死2 小时前
导航栏及下拉菜单的实现
前端·css·css3
科技探秘人3 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
monkey_meng3 小时前
【Rust中的迭代器】
开发语言·后端·rust
科技探秘人3 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome