nginx核心功能

目录

正向代理

编译安装nginx

配置正向代理

反向代理

配置nginx七层代理

配置nginx四层代理

nginx缓存

nginx rewrite和正则


正向代理

正向代理(Forward Proxy)是一种位于客户端和原始服务器之间的代理服
务器,其主要作用是将客户端的请求转发给目标服务器,并将响应返回给客户端
Nginx的正向代理充当客户端的"中间人",代表用户'访问外部资源并隐藏
真实IP。它是企业内网管控、安全审计与加速访问的核心工具。用于场景一般

内网访问控制:限制员工访问特定网站(如社交媒体)
匿名访问:通过代理服务器隐藏用户真实身份。
资源缓存加速:缓存公共资源(如软件包、镜像文件),减少外网带宽消耗

编译安装nginx

安装支持软件

Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软
件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成

[root@localhost ^]# dnf install -y gcc make pcre-deveel zlib-devel
openssl-devel perl-ExtUtils-MakeMaker git wget tar

                创建运行用户,组和日志目录

                  Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以但更
                 更准确地控制其访问权限,增加灵活性、降低安全风险。例如,创建一个名为nginx的
                 用户,不建立宿主文件夹,也禁止登录到Shell环境


[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# mkdir -p /var/log/nginx
[root@localhost ~]# chown -R nginx:nginx /var/log/nginx

 编译安装Nginx

tar zxf nginx-1.26.3_http_proxy.tar.gz 
cd nginx-1.26.3 

 

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx  --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --with-http_gzip_static_module --add-module=./ngx_http_proxy_connect_module
make && make install 

 参数说明

--user=nginx# 指定nginx运行用户
--group=nginx# 指定nginx运行组
--with-http_ssl_module# 支持https://
--with-http_v2_module# 支持http版本2
--with-http_realip_module# 支持ip透传
--with-http_stub_status_module# 支持状态页面
--with-http_gzip_static_module# 支持压缩
--with-pcre# 支持正则
--with-stream# 支持tcp反向代理
--with-stream_ssl_module# 支持tcp的ssl加密
--with-stream_realip_module# 支持tcp的透传ip
--add-module=./ngx_http_proxy_connect_module#支持https转发(默认nginx不支持https转发,需要添加第三方模块)

                为使用nginx服务器方便,为程序nginx创建软连接

                

[root@localhost nginx-1.26.3]# 1n -s /usr/local/nginx/sbin/nginx
/usr/local/sbin/

 添加nginx系统服务

为了使Nginx服务的启动、停止、重载等操作更加方信更,可以编写Nginx服
务脚本,并使用chkconfig和systemctl工具来进行管理

[root@localhost ~]# vi /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
User=root
Group=root
[Instal1]
WantedBy=multi-user.target
[root@localhost ^]# systemctl daemon-reload
[root@localhost ^]# systemctl start nginx
[root@localhost ^]# systemctl enable nginx

配置正向代理

vim /usr/local/nginx/conf/nginx.conf
 server {
        listen       8080;
        resolver 114.114.114.114 8.8.8.8;

        proxy_connect;
        proxy_connect_allow 80 443;
        proxy_connect_connect_timeout 10s;
        proxy_connect_read_timeout 10s;
        proxy_connect_send_timeout 10s;

        server_name  localhost;

   location / {
                #    root   html;
                #    index  index.html index.htm;
        
        proxy_pass $scheme://$http_host$request_uri;
        proxy_set_header Host $http_host;
        proxy_buffers 256 4k;
        proxy_max_temp_file_size 0;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        }

 nginx -t 检测配置文件是否有误

systemctl restart nginx 重启nginx服务

反向代理

Nginx的七层(应用层)反向代理基于HTTP/HTTPS协议,深度解析应用层内容
(如URL、Header、Cookie),将客户端请求精准转发至后端服务器。作为企业
级架构的"智能调度器",它实现了负载均衡、安全隔离上与性能优化的核心能力
应用场景一般是:
1.负载均衡:将流量分发至多台后端服务器,避免单点故障。
2.动静分离:静态资源(图片、CSS/JS)由Nginx直接响应立,动态请求(PHP
API)转发至Apache/Tomcat。
3.SSL终端:统一处理HTTPS加密/解密,降低后端服务器计算压力。
4.灰度发布:根据请求特征(如IP、Header)将部分流量导向新版本服务。

Nginx的四层(网络层)反向代理基于TCP/UDP协议,直接转发原始数据流,
不解析应用层内容。它专为高性能、低延迟的传输层场景设计,是数据库、游戏
服务器等非HTTP服务的理想选择。应用场景一般是:
1.数据库代理:对外暴露统一端口,内部转发至MySQL、Redis集群。
2.游戏服务器:代理UDP协议,实现实时数据包负载均衡。
3.SSH跳板机:通过端口映射安全访问内网服务器。
4.高可用服务:TCP服务(如MQTT)的主备切换与健康检查。

 反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,
只知道去访问代理服务器,代理服务器再通过反向代理+负载均衡实现请求分
发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器代理的对象是应用服务器,也就是对于
浏览器/客户端来说应用服务器是隐藏的。

配置nginx七层代理

vim /usr/local/nginx/conf/nginx.conf

upstream myhttp {
            server 192.168.10.103:80;
            server 192.168.10.104:80;
        }
 location / {
                # root   html;
                # index  index.html index.htm;
        proxy_pass http://myhttp;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        }

 nginx -t 检查配置文件是否有误

systemctl restart nginx 重启nginx服务

配置nginx四层代理

vim /usr/local/nginx/conf/nginx.conf

stream {
        upstream myssh{
                server 192.168.10.102:22;
        }
        server {
                listen 2222;
                proxy_pass myssh;
                proxy_connect_timeout 10s;
                proxy_timeout 1h;

        }
}

 nginx -t 检查配置文件是否有误

systemctl restart nginx 重启nginx服务

nginx缓存

Nginx 缓存是 Nginx 服务器提供的一项重要功能,用于存储经常访问的静态资源和部分动态内容,以提高网站的性能和响应速度。以下是对 Nginx 缓存的详细介绍

缓存原理

Nginx 缓存基于内存或磁盘存储,当客户端请求资源时,Nginx 首先检查缓存中是否存在该资源的副本。如果存在,并且缓存的资源未过期或未被 invalidate,Nginx 直接将缓存的内容返回给客户端,而无需向后端服务器再次请求,从而大大减少了响应时间和服务器负载。

缓存类型

浏览器缓存:通过设置合适的Cache - ControlExpires等响应头字段,告诉浏览器哪些资源可以缓存以及缓存的时长。浏览器会根据这些指令在本地缓存资源,下次访问相同内容时直接从本地加载,减少对服务器的请求。

服务器端缓存:Nginx 可以在服务器端设置缓存,缓存的内容可以是静态文件,如 HTML、CSS、JavaScript、图片等,也可以是经过后端服务器处理后生成的动态内容。

缓存配置

在 Nginx 配置文件中,通过http块中的proxy_cache_path指令来设置缓存区域的路径、大小、缓存级别等参数。例如:

http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;

    server {
        listen       80;
        server_name  example.com;

        location / {
            proxy_cache my_cache;
            proxy_cache_valid 200 302 60m;
            proxy_cache_valid 404 10m;

            proxy_pass http://backend_server;
        }
    }
}

 上述配置中,proxy_cache_path指定了缓存的路径为/data/nginx/cache,定义了一个名为my_cache的缓存区域,使用 10M 内存来存储缓存键值对,缓存文件最大占用 10G 空间,60 分钟内未被访问的缓存将被删除。proxy_cache指令应用了这个缓存区域,proxy_cache_valid指令分别设置了不同状态码的缓存有效时间

缓存更新策略

基于时间的过期策略:根据设置的缓存时间,当缓存的资源超过了指定的有效时间,Nginx 会认为该缓存已过期,下次请求时会向后端服务器重新获取最新的资源,并更新缓存。基于文件变化的更新:对于静态文件缓存,可以通过监控文件的修改时间来判断是否需要更新缓存。当文件发生变化时,Nginx 会自动更新缓存中的对应内容。手动清除缓存:可以通过 Nginx 的命令行工具或第三方模块来手动清除指定的缓存内容。例如,使用nginx -s reload命令重新加载配置文件,或者使用一些专门的缓存管理工具来删除特定的缓存键值对。

缓存的优点

提高性能:避免了重复请求后端服务器,减少了数据传输和处理时间,大大提高了网站的响应速度,改善了用户体验。

减轻服务器负载:减少了后端服务器的请求压力,使得服务器能够处理更多的并发请求,提高了服务器的整体性能和稳定性。

节省带宽:由于缓存的资源可以直接从 Nginx 服务器返回给客户端,减少了对后端服务器的带宽占用,尤其对于静态资源较多的网站,可以显著节省带宽成本。

缓存的局限性

缓存空间限制:内存或磁盘空间是有限的,当缓存内容过多时,可能会导致缓存溢出,需要根据实际情况合理设置缓存大小和更新策略。数据一致性问题:如果后端服务器的数据发生了变化,而缓存中的数据没有及时更新,可能会导致客户端获取到过期或不一致的信息。需要采取合适的缓存更新策略来尽量减少数据不一致的情况。动态内容缓存难度较大:对于一些动态生成的内容,如根据用户身份、实时数据等生成的页面,缓存起来相对复杂,需要仔细考虑缓存的粒度和更新时机,以确保缓存的有效性和数据的准确性。

nginx rewrite和正则

在云计算与分布式架构的时代,Nginx凭借其高性能、高并发处理能力以及
模块化设计,已成为现代Web服务的核心组件之一。它不仅是负载均衡、反向代
理的首选工具,更是实现流量调度、安全防护和动态路由的关键枢纽。而在这其
中,Rewrite模块作为Nginx的"规则引擎",扮演着至关重要的角色--它赋予
开发者精准控制URL的能力,让请求的流转不再受限于物理路径,而是通过逻辑
规则灵活适配业务需求。

Rwerite应用场景

网站迁移与地址变更

当网站的页面结构或目录发生变化时,为了避免旧的 URL 失效,可以使用rewrite将旧的 URL 重定向到新的 URL。例如,将旧的文章链接/article/old-article.html重定向到新的链接/new-articles/2025/05/old-article.html,以保证用户通过旧链接仍能访问到正确的内容,同时也有利于搜索引擎优化(SEO),避免页面权重的丢失。

隐藏真实目录结构   为了增强网站的安全性和维护性,可以通过rewrite隐藏服务器上真实的目录结构。例如,实际的文件存储在/var/www/html/app目录下,但希望用户通过/app访问,就可以使用rewrite规则将/app的请求重写为对/var/www/html/app的内部请求,这样可以防止用户直接访问到服务器上的敏感目录结构,降低潜在的安全风险。

实现伪静态化   对于动态网站,为了提高搜索引擎的收录和用户体验,可以使用rewrite将动态 URL 转换为静态 URL。例如,将/index.php?id=123重写为/article/123.html,这样的静态 URL 更易于搜索引擎抓取和理解,有助于提高网站在搜索结果中的排名。

根据用户代理进行重定向   根据不同的用户代理(User - Agent),即访问网站的设备或浏览器类型,将用户重定向到不同的页面或版本。例如,检测到用户使用的是移动设备,可以将其重定向到专门的移动版网站,提供更好的移动端浏览体验。

访问权限控制与特殊页面重定向

可以利用rewrite结合if条件判断来实现访问权限控制。例如,对于未登录用户访问需要权限的页面,将其重定向到登录页面;或者根据用户的 IP 地址、来源等条件,将特定用户或地区的访问重定向到特殊的提示页面

规范 URL 格式   确保网站的 URL 具有统一的格式和规范。例如,将所有以http://开头的 URL 重写为https://,以强制使用安全的 HTTPS 连接;或者统一去除 URL 中的多余斜杠、空格等不规范字符,使网站的 URL 更加简洁和规范,有利于提高网站的整体质量和用户体验。

一些常见的正则表达式元字符

^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次。如"ol"能匹配"o"及"ol"、""을"
+匹配前面的字符一次或多次。如"ol+"能匹配"ol"及"oll"、"oll",但不能匹配"o"
'"匹配除"n"之外的任何单个字符,若要匹配包括"n"在内的任意字符,请使用诸如【.Vn之类的模式
\将后面接着的字符标记为一个特殊字符或-一个原义字符或一个向后引用。如"In"匹配个换行符,而"IS"则匹配"S"
\b匹配纯数字
{n}重复n次
{n,}重复n次或多次
[c]匹配单个字符c
[a-z]匹配a-z小写字母的任意一个
[a-zA-Z]匹配a-z小写字母或A-Z大写字母的任意一个
?匹配前面的字符零次或一次,例如"do(es)?"能匹配"do"或者"does","?"等效于"{0,1}"
字符描述

                   rewrite指令的基本语法如下

                

rewrite regex replacement [flag];

  regex是一个正则表达式,用于匹配当前的 URL。

replacement 是替换后的 URL

flag 是可选参数,用于指定重写的标志,常见的标志有

last 停止当前location块中的后续rewrite指令,并重新发起一个新的请求

break 停止当前location块中的后续rewrite指令,不再发起新的请求

redirect 返回 302 临时重定向

permanent 返回 301 永久重定向

将所有以/old开头的 URL 重写为/new开头的 URL,并返回 301 永久重定向

server {
    listen 80;
    server_name example.com;

    location / {
        rewrite ^/old(.*)$ /new$1 permanent;
    }
}

在这个例子中,^/old(.*)$是一个正则表达式,^表示字符串的开始,/old是固定的匹配内容,(.*)表示捕获任意数量的任意字符,$表示字符串的结束。/new$1是替换后的 URL,$1表示捕获到的内容

使用last标志
server {
    listen 80;
    server_name example.com;

    location / {
        rewrite ^/blog/(.*)$ /article/$1 last;
        # 其他配置
    }

    location /article/ {
        # 处理 /article/ 开头的URL
    }
}

 在这个例子中,当请求的 URL 以/blog/开头时,会将其重写为/article/开头的 URL,并使用last标志停止当前location块中的后续rewrite指令,然后重新发起一个新的请求,由location /article/块来处理

使用break标志
server {
    listen 80;
    server_name example.com;

    location / {
        rewrite ^/static/(.*)$ /files/$1 break;
        # 其他配置
    }
}

在这个例子中,当请求的 URL 以/static/开头时,会将其重写为/files/开头的 URL,并使用break标志停止当前location块中的后续rewrite指令,不再发起新的请求

注意事项

1.正则表达式的性能可能会受到影响,尤其是在高并发的情况下。因此,尽量避免使用过于复杂的正则表达式

2.rewrite指令的执行顺序很重要,不同的顺序可能会导致不同的结果

3.在使用lastbreak标志时,要清楚它们的区别,避免出现意外的重写行为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值