nginx的使用、f5等


作为coder,不能不知道nginx。

nginx有什么用

1、本身就是个web服务器。可以搭建服务,例如发布静态网页。
2、他是一个反向代理服务器,可以实现负载均衡。
3、邮件服务器。(这个没有实际使用经验)

nginx是模块化的。例如location模块,upstream模块等。
所以在描述的时候,说nginx的常见组件有哪些? 精确的描述是nginx常见的模块有哪些? 一听就让人感觉很专业。

nginx反向代理的过程

通过监听80端口或443端口(https请求),当请求到来时进行代理分发。
可以通过upstream来实现负载均衡。
通过location来实现资源定位。

如何实现所有请求都走nginx

这个除了配置nginx之外,还需要网络配合。
例如对外只开放www.open.com这个域名,直接访问ip是不允许的。
然后在nginx里面,根据www.open.com/user 后缀名进行代理分发。

输入域名直接跳到登录页

指定网址首页,例如www.tiger.com直接跳到登录页,直接写个左斜杠即可:

location / {
  return 301 http://www.test.com/login$request_uri;
}

直接跳转到某个地址

例如:原地址为
http://test.com/crm/sso/login?usercode=123
想要跳转到
http://192.168.0.1/crm/sso/login?usercode=123

location /crm/sso/login {
    rewrite ^/(.*)$ http://192.168.0.1/crm/sso/login?param=$1 permanent;
}

分析:
rewrite 表示重写路径
$1 表示第一个小括号内的内容
param 这里感觉不对,是不是应该和原来一致,写为usercode?
permanent 表示永远都跳转(permanent本来就是永远的意思)

固定路径多台机器代理

某服务路径固定,例如: 必须是 /user。但是有多个节点,这样常规的location转发就无法满足。怎么办呢?

创建多个server,每个server配置单独的域名(域名到机器的映射需要提前配置好)。

配置如下:

server {
    listen 80;
    server_name User1.com;

    location / {
        proxy_pass http://10.192.168.1:9999/user/;
    }
}

server {
    listen 80;
    server_name User2.com;

    location / {
        proxy_pass http://10.192.168.2:9999/user/;
    }
}

没有第一时间想到,说明对nginx理解还远远不够。

搭建服务器

负载均衡

upstream test {
        server localhost:8080;
        server localhost:8081;
}
server {
  listen       81;                                                         
  server_name  localhost;                                               
  client_max_body_size 1024M;

  location / {
    proxy_pass http://test;
    proxy_set_header Host $host:$server_port;
  }
}

autoindex on;

autoindex 设置目录浏览。
on:地址栏到images就会显示文件列表
off:必须要文件全路径,只到目录页面提示403 forbidden

提示 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

说明端口被其他占用

listen 80 default_server;

这个default_server是否去掉有影响吗?

访问ip,不是nginx首页却是centos首页,是说明nginx没有配置成功吧

include 指令的作用

除了/etc/nginx.conf 之外,其他的配置文件地址,可以用通配符
默认是:

include /etc/nginx/default.d/*.conf;

强制指定配置文件

/usr/sbin/nginx -c /etc/nginx/nginx.conf;

除80之外的端口不允许直接访问

这个问题其实比较好解。
nginx直接做个代理即可。
即:用路径来访问,把路径转到端口上即可。# 一开始怎么没想到呢

其他

nginx.conf的默认内容

配置文件为 /etc/nginx/nginx.conf,同目录下有nginx.conf.default,相当于备份。
内容为:

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

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

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}





禁用(屏蔽某个ip地址访问某个请求)

场景:
某个请求地址被安扫出无授权访问。需要屏蔽掉,只允许内网(服务器之间)访问,不允许办公网()访问。

也就是说:
如果不是内网地址,访问此接口时报错403。

解决方案:
直接对具体地址加location,然后判断请求地址,如果不在内网网段,返回403。

配置如下,实测有效:

location = /custom/interface/user/query{
	if ( $remote_addr !~* 10\.12\..*\..*|10\.192\..*\..*|10\.191\..*\..*) {
	    return 403 ;
	}
    proxy_pass http://custom;
}

注:
要用$remote_addr,不要用$http_origin
而且不能在location里面判断$request_uri,加上这个判断nginx检测报错。

真实ip判断

$remote_addr是远程请求地址,但是一般只是最近的一层。那么真实ip呢?
当然是可以的。

x-forward-for就表示真实ip,在location中做如下配置,就会把真实ip往后传。

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

在后续的nginx中,$proxy_add_x_forwarded_for就可以获取到真实的ip。
如果有多个,是个逗号分隔的列表。

日志中也是可以看的(注:默认一般没有$proxy_add_x_forwarded_for,添加上即可):

log_format  main  '$remote_addr $proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/access.log main;

例如,这是一行日志:

100.122.17.0 10.22.128.189, 10.12.129.12, 100.122.17.0 - - [07/Mar/2025:15:27:11 +0800] "POST /jxcustom/api/pcUploadFile HTTP/1.1" 200 73 "-" "Apache-HttpClient/4.5.9 (Java/1.8.0_352)" "10.22.128.189, 10.12.129.12"

echo模块的使用

想要在nginx中使用echo,默认是不支持的,需要安装echo模块。

下载echo模块:
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz

解压:
tar -zcvf echo-nginx-module-0.61.tar.gz;

查看原nginx安装的模块:
nginx -V

再后面添加新模块地址:
–add-module=文件路径/echo-nginx-module-0.61

安装编译环境:
yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++ zlib zlib-devel

然后执行./configure 及后面的一大串内容。

注:如果报错 -bash: configure: command not found
说明没有这个命令,nginx是解压版的还是安装版的呢,如果是解压版的,那么就不好添加模块了,我也不太会。

自定义日志?

待办

nginx和f5的区别

nginxf5
高并发、大流量满足一般流量支持高并发、大流量
安全性没有特殊设置高,有多种配置规则
成本开源工具,无成本付费(按流量)
复杂度相对较低

简言之,nginx简单易用,f5复杂且收费。
一般来说,要求比较高的大厂可能要求使用f5,安全系统更高。

官网文档地址

https://nginx.org/en/docs/

location跳转连接:
https://nginx.org/en/docs/http/ngx_http_core_module.html#location

### Nginx 与 F5 的集成配置概述 Nginx 和 F5 都是常见的负载均衡和反向代理解决方案。在现代 IT 架构中,将 **NGINX** 与 **F5 BIG-IP** 进行集成通常用于实现更高级别的流量管理、SSL 卸载、缓存加速以及微服务架构中的多层负载均衡。 #### 基本集成场景 一种常见的部署方式是使用 **F5 BIG-IP** 作为前端负载均衡器,将请求转发到后端的 NGINX 实例集群。NGINX 可以进一步处理 HTTP 请求、执行基于 URI 的路由、缓存静态内容或作为 Kubernetes Ingress 控制器使用。 #### F5NGINX 配置步骤 1. **F5 虚拟服务器配置** - 创建一个虚拟服务器(Virtual Server),监听标准端口如 80 或 443。 - 设置池(Pool)成员为后端 NGINX 实例的 IP 地址和端口(如 8080)。 - 配置健康检查(Health Monitor)以确保 NGINX 实例可用。 2. **NGINX 配置** - 确保 NGINX 已正确安装并运行,可以通过 `curl localhost:8080` 检查默认页面是否正常显示欢迎信息 [^1]。 - 编辑 `/etc/nginx/nginx.conf` 或站点配置文件,设置反向代理规则: ```nginx http { upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; } server { listen 8080; location / { 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_set_header X-Forwarded-Proto $scheme; } } } ``` 3. **SSL 终止配置** - 在 F5 上配置 SSL 证书并启用 SSL Profile,以便进行 HTTPS 流量卸载。 - NGINX 可继续处理 HTTP 流量,或者根据需要启用 HTTPS 并与 F5 使用信任链证书通信。 4. **日志与监控** - 配置 NGINX 访问日志格式,确保包含来自客户端的真实 IP 地址(通过 `$http_x_forwarded_for` 获取)。 - 利用 F5 提供的 iApp 模板或自定义 iRule 来增强流量控制逻辑。 5. **高可用性与故障转移** - 在 F5 中配置节点优先级和健康检查失败阈值,实现自动故障转移。 - NGINX 可结合 Keepalived 或其他 HA 工具部署双机热备。 #### 示例:F5 iRule 配置(可选) 如果需要对特定路径进行特殊处理,可以在 F5 上编写 iRule: ```tcl when HTTP_REQUEST { if { [HTTP::path] starts_with "/api" } { pool api_servers } } ``` 此 iRule 将所有 `/api` 开头的请求转发到名为 `api_servers` 的池中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值