Nginx 基础用途拾遗(转载)

2024-04-21 19:48
文章标签 基础 nginx 转载 拾遗

本文主要是介绍Nginx 基础用途拾遗(转载),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Nginx 基础用途拾遗
Nginx 是一款大家日常再熟悉不过的软件,稳定高效是这款软件的标签。常见 Nginx 会做为地址转发服务或提供文件托管能力。但是 Nginx 的用法其实不止于此,原生 Nginx 还有许多实用的功能,能够实现一些业务中麻烦的小细节。

本文将介绍三种基础用法,如果你熟悉 Nginx 和容器,阅读时间大概是五分钟。

写在前面
本次使用的示例环境,均使用容器进行模拟。如果你对容器还不是很熟悉,欢迎浏览之前的Docker 相关文章内容。

配合 compose 轻松创建健康检查
一些前端类的容器,本身并没有服务能力,但是为了能够享受容器服务的基础健康检查,以及提供给外部诸如负载均衡等服务使用,我们可能不得不启动一个语言运行时,比如 Node / PHP / Java,不过如果你使用 Nginx 作为前端使用的 Web 服务软件,他本身就自带了基础的路由功能和定制响应码和内容的能量,可以避免我们引入庞大的语言运行时。

我们只需要在配置内添加一个名为 /health 的路由,然后配合 default_type 和 return 指令就可以完成我们想要的“当服务健康时,返回HTTP CODE 200,并输出一些内容”。

server {
listen 80;

location = /health {
access_log off;
default_type text/html;
return 200 ‘alive’;
}
}
1
2
3
4
5
6
7
8
9
你或许会说,我们可以让健康检查软件检查业务路由,但是我想告诉你的是,当我们把路由独立之后,你会发现健康检查的响应时间更快了,除此之外,我们还可以对日志进行丢弃。如果你将健康检查路由和业务路由放在一起,海量的健康检查日志和业务日志在一起,会让你调试的时候痛不欲生。

配合 compose 进行健康检查也很容易:

version: “3.6”

services:

health.test.soulteary.com:
image: nginx:1.18.0-alpine
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf:ro
healthcheck:
# 老版本使用
# test: [“CMD-SHELL”, “wget -q --spider --proxy off localhost:80/health || exit 1”]
test: [“CMD-SHELL”, “curl -f localhost/health || exit 1”]
interval: 3s
retries: 12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
当你使用 docker ps 查看容器进程的时候,你会看到我们的容器会标记为“healthy”,之后可以配合各种策略进行容器服务基础容灾等基本操作。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2afd71cd562e nginx:1.18.0-alpine “nginx -g 'daemon of…” 10 minutes ago Up 3 seconds (healthy) 80/tcp health.test.soulteary.com_1
1
2
使用 Nginx 聚合不同站点内容
日常开发过程中,在遇到“前端跨域”、“短信模版中链接固定”、“既有程序调用来源限制”等场景下,会遇到需要聚合站点域名或路径的情况。

我们知道使用编程语言,可以实现远程内容获取和转写,但是实际上使用 Nginx 的反向代理功能可以更加轻松地做到内容聚合。

比如,在做内容聚合前,我们需要访问的内容在 apple.test.soulteary.com 和 banana.test.soulteary.com ,而我们希望聚合后的内容在 test.soulteary.com 中展示。

为了方便模拟环境,我们先创建一个 compose 配置文件:

version: “3.6”

services:

test.soulteary.com:
image: nginx:1.18.0-alpine
ports:
- 8080:8080
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf:ro

apple.test.soulteary.com:
image: nginx:1.18.0-alpine
volumes:
- ./apple.test.soulteary.com.conf:/etc/nginx/conf.d/default.conf:ro

banana.test.soulteary.com:
image: nginx:1.18.0-alpine
volumes:
- ./banana.test.soulteary.com.conf:/etc/nginx/conf.d/default.conf:ro
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
配置文件中的 services 的三个子项分别代表聚合后的站点,以及两个需要被聚合的站点,可以想象为现实中网络相通的三台服务器。

继续创建 apple.test.soulteary.com.conf 这个 Nginx 配置文件。

server {
listen 80;
server_name apple.test.soulteary.com;
default_type text/html;

location / {return 200 'apple.test.soulteary.com';
}

}
1
2
3
4
5
6
7
8
9
可以看到,站点功能很简单,访问 / 的时候,返回 HTTP CODE 200,并输出文本内容 apple.test.soulteary.com,同理我们创建另外一个站点的 Nginx 配置文件 banana.test.soulteary.com。

最后,创建用于聚合配置文件的 Nginx 配置。

server {
listen 8080;
server_name test.soulteary.com;

location = / {return 302 /apple;
}location /apple {proxy_pass http://apple.test.soulteary.com/;proxy_set_header Host "apple.test.soulteary.com";proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}location /banana {proxy_pass http://banana.test.soulteary.com/;proxy_set_header Host "banana.test.soulteary.com";proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
可以看到配置十分简单,通过 proxy_pass 配合 proxy_set_header 两个指令,我们就将不同站点聚合到了一块。

将 test.soulteary.com 绑定至本地,然后启动服务,使用命令行访问站点,可以看到配置符合预期。

curl http://test.soulteary.com:8080/apple

apple.test.soulteary.com

curl http://test.soulteary.com:8080/banana

banana.test.soulteary.com
1
2
3
4
5
转发 Git SSH 这类 TCP 请求
Nginx 除了能够处理 HTTP 请求外,对于 TCP 类型的数据一样能做到聚合/转发。比如这里我们想将生产环境的某台 GitLab 的访问权限限制到具体的 IP,除了使用云平台的防火墙规则外,使用 Nginx 一样可以做到。

这里要使用的是 Nginx 的 ngx_stream_proxy_module 模块。

Nginx 容器默认配置仅包含了 HTTP 服务模式,所以这次修改不能和上面一样,仅修改 “vhost” 配置,需要修改 nginx.conf 主配置,在修改之前,我们先使用脚本看看默认的配置长什么样。

docker run --rm -it nginx:1.18.0-alpine cat /etc/nginx/nginx.conf
1
执行上面的命令,可以看到默认的配置很简单:

user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;
#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
为了能够让读者轻松验证,我们假设目标仓库是 GitHub,在对配置文件简单修改后:

user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

stream{
server{
listen 2223;
proxy_pass github.com:22;
proxy_connect_timeout 10s;
proxy_timeout 20s;
proxy_buffer_size 512k;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
我们继续创建一个 compose 配置文件:

version: “3.6”

services:

proxy-git.test.soulteary.com:
image: nginx:1.18.0-alpine
ports:
- 2223:2223
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
1
2
3
4
5
6
7
8
9
10
使用 docker-compose up 将服务启动之后,我们使用经典的 Git 测试命令行对服务进行验证:

ssh -T git@127.0.0.1 -p 2223

The authenticity of host ‘[127.0.0.1]:2223 ([127.0.0.1]:2223)’ can’t be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added ‘[127.0.0.1]:2223’ (RSA) to the list of known hosts.

Hi soulteary! You’ve successfully authenticated, but GitHub does not provide shell access.
1
2
3
4
5
6
7
8
你会发现此刻我们想要的目标已经达到了,不信的话,你可以使用相同命令去测试下原始 Git 服务地址。

ssh -T git@github.com

Hi soulteary! You’ve successfully authenticated, but GitHub does not provide shell access.
1
2
3
小节开始前提过,想进行来源限制,可以搭配 Nginx 原生的 allow / deny 指令来完成:

location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
1
2
3
4
5
6
7
最后
Nginx 好玩、实用的用法其实还有不少,时间原因,就不在此展开了。

–EOF

原文链接:https://blog.csdn.net/soulteary/java/article/details/106226562

这篇关于Nginx 基础用途拾遗(转载)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923893

相关文章

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1