Nginx学习与安装

一、nginx概述

nginx是高性能的开源HTTP服务器。反向代理服务器、负载均衡器和HTTP缓存

典型的应用场景为:

(1)作为静态资源服务器(部署HTML、CSS、JS、图片等)

(2)作为 反向代理服务器,转发请求到后端应用服务器(如Tomcat、node.js)

(3) 实现负载均衡,分发请求到多个后端节点

(4) 作为API网关,处理请求过滤、认证、限流等功能。

(5)部署SSL/TLS证书,实现HTTPS加密传输

二、什么是反向代理

当我们部署项目的时候,突然就接触到了nginx,然后又提到了反向代理,所以反向代理到底是什么

首先说一下正向代理:

代理客户端帮助客户端访问目标目标服务器就是正向代理(如VPN访问境外网站),目标服务器不知道实际客户是谁

反向代理:

代理客户端代理目标服务器,客户端请求先发送到反向代理服务器,再由反向代理转

转发到后端真实服务器。所以客户端不知道实际处理请求的服务器是谁

两者逻辑正好相反

三、反向代理的流程

  1. 客户端向反向代理服务器(Nginx)发送请求(如 http://example.com/api)。
  2. Nginx 根据配置的规则(如 URL 路径、域名)判断请求应转发到哪个后端服务器(如 192.168.1.100:8080)。
  3. Nginx 将请求转发给后端服务器,并等待后端返回响应。
  4. 后端服务器处理请求后,将响应返回给 Nginx。
  5. Nginx 将响应转发给客户端,客户端感知不到后端服务器的存在。

四、Nginx反向代理配置示例+分析

php 复制代码
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       82;
        server_name  118.170.91.230;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root usr/local/myLibrary/dist;
            try_files $uri $uri /index.html;
            index index.html ie.html;

            # 禁用缓存确保获取最新HTML
            add_header Cache-Control "no-cache, no-store, must-revalidate";
            add_header Pragma "no-cache";
                                                                                                        34,0-1        Top
1.全局配置:
php 复制代码
worker_processes 1;
events {
    worker_connections 1024;
}

(1)指定了Nginx使用1个工作进程

(2)每个工作进行最多处理1024个链接

2.HTTP块配置
php 复制代码
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
3.服务器代理配置
3.1 服务器静态资源服务
php 复制代码
server {
    listen 82;
    server_name 118.178.91.230;

    location / {
        root /usr/local/myLibrary/dist;
        try_files $uri $uri/ /index.html;
        index index.html ie.html;
        
        add_header Cache-Control "no-cache, no-store, must-revalidate";
        add_header Pragma "no-cache";
        add_header Expires 0;
    }
}

(1)监听端口:82

(2)服务器名:118.178.91.230

(3)location / 处理所有请求:

  • root 指定静态文件根目录为 /usr/local/myLibrary/dist

  • try_files 尝试按顺序查找文件:先找请求的URI,再找目录,最后回退到index.html(支持前端路由)

  • index 指定默认索引文件

  • 添加了禁用缓存的HTTP头,确保客户端总是获取最新HTML

3.2 后端API代理(核心代理配置)
php 复制代码
location /prod-api/ {
    proxy_pass http://118.178.91.230:8082/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

(1)匹配规则:所有以/prod-api/开通的请求都会被代理

(2)代理目标:

  • proxy_pass http://118.178.91.230:8082/ 将请求转发到后端服务器 118.178.91.230:8082

  • 注意结尾的 / 很重要,它会将 /prod-api/xxx 转换为 http://后端服务器/xxx(去掉 /prod-api 前缀)

(3)请求头处理:

  • proxy_set_header Host $host:保持原始请求的Host头

  • X-Real-IP:传递客户端真实IP

  • X-Forwarded-For:追加代理链信息

4.梳理代理的流程:

1.当请求到达Nginx(端口号82):

如果是/prod-api/开头的请求->转发到后端 http://118.178.91.230:8082/

其他请求->尝试从/usr/local/myLibrary/dist提供静态文件

2.代理转发时:

  • 例如请求 http://118.178.91.230:82/prod-api/user

  • Nginx会将其转发到 http://118.178.91.230:8082/user

  • 后端响应后,Nginx再将响应返回给客户端

3.静态文件服务:

  • 当请求前端资源时,Nginx直接返回文件系统中的文件

  • 对于前端路由(如React/Vue的单页应用),通过 try_files 回退到 index.html

你有没有一个疑问,为什么再配置后端api代理时为什么要使用/prod-api/作为api请求前缀

由你的前端开发时设计决定的(我这里是基于若依框架开发的)

php 复制代码
# 页面标题
VUE_APP_TITLE = 若依管理系统

# 生产环境配置
ENV = 'production'

# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'

五、Nginx的安装

(1)创建路径

(2)解压

(3)配置编译编译方法

./configure

可以看到配置编译后的结果信息:

(4)编译nginx

在nginx源文件目录中直接运行 make指令

(5)安装nginx

(6)安装nginx

ok,nginx的工作区形成了

(7)更改nginx.conf配置文件

相关推荐
Python私教44 分钟前
Docker in Test:用一次性的真实环境,终结“测试永远跑不通”魔咒
运维·docker·容器
张3蜂1 小时前
深度解读 Browser-Use:让 AI 驱动浏览器自动化成为可能
运维·人工智能·自动化
reduceanxiety1 小时前
第四章 Linux实用操作
linux·运维·服务器
破刺不会编程5 小时前
socket编程UDP
linux·运维·服务器·网络·c++·网络协议·udp
ayaya_mana6 小时前
Nginx性能优化与安全配置:打造高性能Web服务器
运维·nginx·安全·性能优化
我不要放纵12 小时前
docker
运维·docker·容器
morliz子轩12 小时前
基于WSL搭建Ubuntu 22.04.x LTS开发环境
linux·运维·ubuntu
BJ_Bonree13 小时前
数智先锋 | 告别运维黑盒!豪鹏科技×Bonree ONE构建全栈智能可观测体系
运维·科技
Janspran13 小时前
嵌入式linux学习 -- 进程和线程
linux·运维·学习