0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Nginx实战全攻略

马哥Linux运维 ? 来源:CSDN技术社区 ? 2025-03-31 10:44 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3 代理服务器。它以其高并发处理能力、稳定性、丰富的功能模块和低内存消耗而闻名。

一. Nginx简介

● Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
● 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好
● Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。
● Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。

二. Nginx作用

2.1 代理

- 正向代理:代理是代理客户端的
客户端 <一> 代理 一>服务端

9becef28-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述
正向代理是一个位于客户端和原始服务器之间的服务器,所有客户端的请求都首先发送到正向代理服务器,然后由代理服务器将请求转发到原始服务器。正向代理的目的是为了隐藏客户端的信息。

Nginx不是默认的正向代理服务器,但可以通过配置来实现正向代理的功能。

通常某些服务因为安全问题,限制固定访问,因此可以通过正向代理解决
访问某些国外的服务访问慢,可以通过正向代理中继缓解丢包和延迟高的问题

例如:VPN



http {
    resolver 8.8.8.8;
    server {
        listen 8088;
        location / {
            proxy_pass http://$http_host$request_uri;
        }
    }
}





AI写代码

反向代理:

反向代理,客户端对代理是无感知的,客户端不需要任何配置就可以访问,客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

Nginx是默认的反向代理服务器。以下是一个简单的Nginx配置示例,用于设置Nginx作为反向代理服务器:

9bf9a718-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述
比如:百度的服务器是在不同的服务器上,我们只需要搜索baidu.com就行

2.2 负载均衡

如果请求数过大,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为请求分发到多个服务器上,就是负载均衡。

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。

轮询:

9c0dcc48-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

加权轮询

9c23ff7c-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

iphash

对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。

9c399bd4-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

2.3 动静分离

在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。

9c5158e6-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

三. 安装

下载地址:https://nginx.org/en/download.html

下载

9c6484e8-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

解压至任意非中文路径下:

9c75cff0-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

运行
直接双击nginx.exe 即可(一闪而过),或者进入cmd 输入nginx.exe

9c833bc2-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

检测
浏览器输入:http://localhost:80 浏览器默认端口就是80 所以80端口可以不写

9c8b3336-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

配置监听
nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可



  server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
...




当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload 即可让改动生效

关闭nginx
如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx
(1) 输入nginx命令 nginx -s stop(快速停止nginx) 或 nginx -s quit(完整有序的停止nginx)
(2) 使用taskkill taskkill /f /t /im nginx.exe
taskkill是用来终止进程的,
/f是强制终止 .
/t终止指定的进程和任何由此启动的子进程。
/im示指定的进程名称 .

3.2 Linux

1.安装gcc(已经安装的可以忽略这个步骤)安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装



yum install gcc-c++






2.PCRE pcre-devel安装(已经安装的可以忽略这个步骤)PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:



yum install -y pcre pcre-devel





AI写代码

3.zlib安装(已经安装的可以忽略这个步骤)zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。



yum install -y zlib zlib-devel





AI写代码

4.openssl安装(已经安装的可以忽略这个步骤)OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库



yum install -y openssl openssl-devel





AI写代码

5.下载linux的nginx安装包

9c987e74-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

6.上传到linux上

7.解压缩



tar -zxvf nginx-1.26.0.tar.gz
cd nginx-1.26.0/





AI写代码

8.顺序执行下面三个命令



./configure
make
make install





AI写代码

9.查看安装路径 whereis nginx

9caeb284-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

10.nginx常用命令



# cd /usr/local/nginx/sbin/
# ./nginx  //启动
# ./nginx -s stop  //停止
# ./nginx -s quit  //安全退出
# ./nginx -s reload  //重新加载配置文件
# ps aux|grep nginx  //查看nginx进程





AI写代码

确认开放了80端口



# 开发端口命令
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重新加载
firewall-cmd --reload
# 查看已开放的端口
firewall-cmd --zone=public --list-ports






启动成功访问 http://ip:80

9cc04c7e-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

3.3 Docker

1.拉取镜像



docker pull nginx






2.查看镜像



[root@iZf8z89pv77t13an9qqmcrZ ~]# systemctl start docker
[root@iZf8z89pv77t13an9qqmcrZ ~]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED       SIZE
1panel/maxkb         latest    c023f10d7cab   2 weeks ago   2.66GB
nginx                latest    605c77e624dd   2 years ago   141MB
redis                latest    7614ae9453d1   2 years ago   113MB
mysql                latest    3218b38490ce   2 years ago   516MB
nacos/nacos-server   latest    bdf60dc2ada3   2 years ago   1.05GB





AI写代码

3.运行镜像



[root@iZwz96byk26u1sns4xp7giZ ~]# docker run --name mn -d -p 80:80 nginx
49c02ef7c18facc452762fa7e722720235290df28fce39b6aebb8b024ae21d70






4.检测

9cd10244-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

挂载
简单启动nginx



docker run --name mn -d -p 80:80 nginx





AI写代码

创建配置文件夹



mkdir -p /opt/nginx





AI写代码

复制文件



docker cp mn:/usr/share/nginx/html /opt/mount/nginx/
docker cp mn:/etc/nginx/nginx.conf /opt/mount//nginx/
docker cp mn:/etc/nginx/conf.d /opt/mount/nginx/





AI写代码

删除原有的Nginx容器



docker rm -f mn





AI写代码

创建容器



docker run --name nginx -d 
-p 80:80 -p 81:81 
-v /opt/mount/nginx/html:/usr/share/nginx/html 
-v /opt/mount/nginx/nginx.conf:/etc/nginx/nginx.conf:ro 
-v /opt/mount/nginx/conf.d:/etc/nginx/conf.d 
nginx:1.26.0





AI写代码

修改配置

9ce252b0-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

把端口改为81

9cf4f5c8-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

四. 实战

1.将某个现有的项目打包

9da0f72e-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述
2.运行jar项目
打开window命令窗口,启动服务java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar
9dc69984-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述
3.在打开另外一个窗口,启动一个8081的服务
java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar --server.port=8081
9dd5c74c-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述
4.启动nginx服务. ginx.exe
9de34926-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述
5.修改nginx配置



upstream zyy {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
      proxy_pass  http://zyy;

        }
        ##....
}


9df1efe4-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

五. 配置详解

https://blog.csdn.net/weixin_43239880/article/details/130841067

5.1原本配置到解释

我们把其中的注释都删掉,除掉了注释之后的nginx代码,现在只有22行了



worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}


注解版本



#nginx进程数,建议设置为等于CPU总核心数。
worker_processes  1;
# 事件区块开始
events {
    #单个进程最大连接数(最大连接数=连接数*进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
    worker_connections  1024;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #include:导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中
    include       mime.types;
     #默认文件类型
    default_type  application/octet-stream;
    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    sendfile        on;
      #长连接超时时间,单位是秒
    keepalive_timeout  65;
    # 第一个Server区块开始,表示一个独立的虚拟主机站点
    server {
        # 提供服务的端口,默认80
        listen       80;
        # 提供服务的域名主机名
        server_name  localhost;
        #对 "/" 启用反向代理,第一个location区块开始
        location / {
            root   html;  #服务默认启动目录
            index  index.html index.htm; # 默认的首页文件,多个用空格分开
        }
         # 错误页面路由
        error_page   500 502 503 504  /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html { # location区块开始,访问50x.html
            root   html;  # 指定对应的站点目录为html
        }
    }
}

5.2 整体基本理解

虽然上面有了注解,但是看起来还是很迷糊。接着解释:我们可以把nginx.conf分为三个部分进行理解:
第一部分:全局块
第二部分:events块
第三部分:http块

9e057604-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述

六. Nginx与网关的区别

本质上API网关也是做了请求的转发,那既然Nginx也可以做请求转发,那这两者有什么区别?

9e179424-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述
在具体架构设计时Nginx做负载均衡时,考虑到API网关在系统中不止一个(以集群的方式做高可用),通常可以将Nginx至于API网关前,负责对API网关的负载均衡,然后再由网关决定进入根据判定到哪个真实的web 服务器。让两者的分工更加明确,也就是:API网关聚合服务,Nginx请求转发

业务网关(gateway):对于具体的后端业务应用或者是服务和业务有一定关联性的策略网关。业务网关针对具体的业务需要提供特定的流控策略、缓存策略、鉴权认证策略

流量网关(Nginx):与业务网关相反,定义全局性的、跟具体的后端业务应用和服务完全无关的策略网关。流量网关通常只专注于全局的Api管理策略,比如全局流量监控、日志记录、全局限流、黑白名单控制、接入请求到业务系统的负载均衡等

业务网关一般部署在流量网关之后、业务系统之前,比流量网关更靠近业务系统。通常API网指的是业务网关。有时候我们也会模糊流量网关和业务网关,让一个网关承担所有的工作,所以这两者之间并没有严格的界线。

9e2bb8c8-0aef-11f0-9310-92fbcf53809c.png在这里插入图片描述
nginx与gateway的区别:

编写语言:
○ Nginx是用C语言编写的,这使得它在处理高并发连接时表现出色,但它的配置和扩展相对有限。
○ Gateway(如Spring Cloud Gateway)通常使用Java编写,提供了更丰富的服务治理和路由转发功能,使得在微服务架构中更容易实现扩展功能。

功能特性:
○ Nginx更侧重于反向代理和负载均衡功能,如HTTP代理、TCP代理、HTTP缓存、SSL加密等。
○ Gateway(如Spring Cloud Gateway)提供了丰富的服务治理和路由转发功能,如服务注册和发现、熔断降级、限流等。

部署方式:
○ Nginx通常部署在传统的Web服务器架构中,可以作为流量入口,处理大量的并发连接。
○ Gateway(如Spring Cloud Gateway)通常部署在微服务架构中,与Spring Cloud的其他组件(如Eureka、Zuul等)进行无缝集成,提供统一的API路由管理。

扩展性:
○ 对于Nginx的扩展,通常需要结合Lua等脚本语言,这可能需要额外的学习成本。
○ Gateway(如Spring Cloud Gateway)由于使用Java编写,可以更容易地集成到微服务的扩展功能中,利用Java生态系统的丰富资源。

总结来说,Nginx和Gateway在微服务架构中都发挥着重要的作用,但它们的设计目标、功能特性和扩展方式有所不同。选择哪种作为网关取决于具体的项目需求和技术栈。

Nginx在其中扮演的角色是什么?
● 反向代理
● 负载均衡
SpringGateway在其中扮演的角色是什么?
● 统一鉴权
● 负载均衡
● 服务发现

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网关
    +关注

    关注

    9

    文章

    5744

    浏览量

    53111
  • 服务器
    +关注

    关注

    13

    文章

    9816

    浏览量

    88139
  • HTTP
    +关注

    关注

    0

    文章

    526

    浏览量

    33610
  • nginx
    +关注

    关注

    0

    文章

    171

    浏览量

    12645

原文标题:Nginx实战全攻略:从安装配置到反向代理,详解与网关的差异及性能优化技巧

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    GPS 设计全攻略

    GPS 设计全攻略
    发表于 09-25 14:11

    LED技术全攻略

    LED技术全攻略
    发表于 09-25 14:16

    GPS 设计全攻略

    GPS 设计全攻略
    发表于 12-05 12:08

    GPS设计全攻略

    本帖最后由 zgzzlt 于 2012-8-16 13:58 编辑 GPS设计全攻略
    发表于 08-06 12:56

    LED技术全攻略

    本帖最后由 zgzzlt 于 2012-8-16 13:56 编辑 LED技术全攻略
    发表于 08-06 12:59

    MCU解密全攻略

    MCU解密全攻略
    发表于 08-19 14:28

    FPGA开发全攻略

    FPGA开发全攻略
    发表于 05-10 11:40

    FPGA开发全攻略

    FPGA开发全攻略
    发表于 09-27 10:59

    FPGA开发全攻略

    FPGA开发全攻略
    发表于 05-21 09:28

    FPGA开发全攻略

    FPGA开发全攻略
    发表于 03-03 10:30

    FPGA开发全攻略

    FPGA开发全攻略
    发表于 03-07 11:46

    MCU解密全攻略

    本内容介绍了MCU解密的全攻略教程
    发表于 07-11 17:51 ?649次下载
    MCU解密<b class='flag-5'>全攻略</b>

    LED调光技术全攻略

    LED调光技术全攻略
    发表于 02-08 00:50 ?43次下载

    LED驱动电源方案全攻略

    LED驱动电源方案全攻略
    发表于 01-14 12:22 ?43次下载

    智能小车的DIY全攻略

    智能小车的DIY全攻略
    发表于 10-13 09:13 ?28次下载
    智能小车的DIY<b class='flag-5'>全攻略</b>