Tianyi's Blog Tianyi's Blog
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)

Tianyi

一直向前,永不停止
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)
  • Nginx

    • nginx概述
    • nginx安装的三种方式
    • nginx配置-基本配置
    • nginx配置-请求定位
    • nginx配置-默认配置
    • nginx配置-最佳实践
      • 最佳实践
        • 静态Http服务器配置
        • 反代配置
        • 反代-负载均衡
        • 反代-虚拟主机
      • 标准模板
    • nginx配置-生产配置
    • nginx常用指令
    • nginx实现原理
    • nginx源码阅读
  • Vue框架

  • 前端环境配置

  • 前端文档

  • 前端
  • Nginx
tianyi
2023-10-28
目录

nginx配置-最佳实践

# 最佳实践

# 静态Http服务器配置

首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。 配置:

server {
    listen 80;   # 端口
    server_name localhost  192.168.1.49;   # 域名,访问俩都行
    location / {             # 代表这是项目根目录
        root /usr/share/nginx/www;   # 虚拟目录
    }
}
1
2
3
4
5
6
7

# 反代配置

既然服务器可以直接HTTP访问,为什么要在中间加上一个反向代理,不是多此一举吗?反向代理有什么作用?继续往下看,下面的负载均衡、虚拟主机,都基于反向代理实现,当然反向代理的功能也不仅仅是这些。

server {
    listen 80;
    location / {
        proxy_pass http://192.168.1.49:15000;   # 应用服务器HTTP地址
    }
}
1
2
3
4
5
6

# 反代-负载均衡

Nginx将用户的请求分配给不同的服务器,确保负载均衡,让网站能够更高效地应对大量用户访问。类似于餐馆前台服务员的作用,他们将点餐分发给不同的厨师,以确保餐厅的服务高效而流畅。

  • 好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
  • 请求分配给多台机器处理,效率提升。
upstream myapp {
   ip_hash;  # 固定访客
    server 192.168.0.1:8080 weight=9;   # 应用服务器1
    server 192.168.0.2:8080 weight=1;   # 应用服务器2
}
1
2
3
4
5

# 反代-虚拟主机

有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。

想象你有一台大型厨房,但你需要同时为两个不同的晚宴准备食物,一个是意大利面宴会,另一个是墨西哥风味晚宴。你可以将一台大型餐桌分成两部分,一部分用于准备意大利面,另一部分用于准备墨西哥风味食物。

尽管你在同一个厨房工作,但你可以根据不同的需求和食谱,为两个晚宴分别准备食物,而不会相互干扰。就像虚拟主机一样,两个域名(意大利面宴会和墨西哥风味晚宴)都指向同一台服务器(厨房),但服务器根据域名的不同,能够提供不同的网站内容,就像在同一个厨房中制作不同的美食一样。这使得你可以在一台服务器上为多个网站提供服务,降低了成本和资源的浪费。

server {  # ----------------------- 这个服务器块的作用是拒绝所有未匹配到其他域名的请求。------------------------
    listen 80 default_server;
    server_name _;
    return 444;   # 过滤其他域名的请求,返回444状态码
}
server {  # ----------------------- 这个服务器块的作用是将请求代理到本地的 localhost 主机的端口 8080 ------------------------
    listen 80;
    server_name www.aaa.com;   # www.aaa.com域名
    location / {
        proxy_pass http://localhost:8080;   # 对应端口号8080
    }
}
server {  # ----------------------- 这个服务器块的作用是将请求代理到本地的 localhost 主机的端口 8081 ------------------------
    listen 80;
    server_name www.bbb.com;   # www.bbb.com域名
    location / {
        proxy_pass http://localhost:8081;   # 对应端口号8081
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。

虚拟主机的原理是通过HTTP请求头中的Host是否匹配server_name来实现的,有兴趣的同学可以研究一下HTTP协议。

另外,server_name配置还可以过滤有人恶意将某些域名指向你的主机服务器。

  • 只有来自 www.example.com 的请求会被Nginx接受和代理到 localhost:8080。
  • 如果其他域名(例如恶意域名)尝试访问该Nginx服务器,Nginx会忽略这些请求或返回默认服务器的响应,这是一种防止未经授权的访问的方法。

# 标准模板

所有自定义的配置都基于下面的来改

注意配置时候,这里有一个小坑就是在写文件路径的时候,如果是绝对路径,要双杠\\。

worker_processes auto; # 根据内核确定工作进程数

events {
    worker_connections 1024;   # 设置每个工作进程的最大连接数
}

http {
    client_max_body_size 10000m;            # 设置客户端请求的最大单个文件字节数(重写之后就会失效)
    include mime.types;                     # 确定文件的MIME类型。这有助于浏览器和其他HTTP客户端正确解释文件,例如将HTML文件识别为HTML、图像文件识别为图像等
    default_type application/octet-stream;  # 默认MIME类型
    # 自定义日志格式
    log_format main escape=json '{ "@timestamp": "$time_iso8601", ' 
                       '"remote_addr": "$remote_addr",'
                       '"costime": "$request_time",'
                       '"realtime": "$upstream_response_time",'
                       '"status": $status,'
                       '"x_forwarded": "$http_x_forwarded_for",'
                       '"referer": "$http_referer",'
                       '"request": "$request",'
                       '"upstr_addr": "$upstream_addr",'
                       '"bytes":$body_bytes_sent,'
                       '"dm":$request_body,'
                       '"agent": "$http_user_agent" }';

    sendfile on;      # 配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
    keepalive_timeout 65; # 给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好 

    server {
        listen 15000;
        server_name localhost;
        client_max_body_size 1024m;
        proxy_buffers 4 1024k;
        proxy_buffer_size 1024k;
        # ------------------- 配置静态资源 -------------------
        location / {
            root html/dist;
            index index.html index.htm;
            try_files $uri $uri/ /index.html;
            error_page 405 =200 $request_uri;
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
            add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        }
        # ------------------- 代理:转发特定的HTTP请求到另一个服务器上 -------------------
        location /api/base {
            rewrite ^/api/base/(.*)$ /$1 break; # 将所有匹配 /api/base/ 后的路径部分捕获((.*)),然后将其重写为根路径(/$1),break 表示停止匹配其他规则并执行代理操作。
            proxy_pass http://127.0.0.1:27405;  # 将所有匹配 /api/base 的请求转发到 http://127.0.0.1:27405
            proxy_connect_timeout 15s;
            proxy_send_timeout 6000s;
            proxy_read_timeout 6000s;
            proxy_set_header X-Forwarded-Proto http;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        # ------------------- 代理:转发特定的HTTP请求到另一个服务器上 -------------------
        location /api/user {
            rewrite ^/api/user/(.*)$ /$1 break;
            proxy_pass http://127.0.0.1:27403;
            proxy_connect_timeout 15s;
            proxy_send_timeout 6000s;
            proxy_read_timeout 6000s;
            proxy_set_header X-Forwarded-Proto http;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /api	{
            proxy_pass http://127.0.0.1:27480;
            proxy_connect_timeout 15s;
            proxy_send_timeout 6000s;
            proxy_read_timeout 6000s;
            proxy_set_header X-Forwarded-Proto http;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /q/swagger-ui {
            proxy_pass http://127.0.0.1:27401/q/swagger-ui;
        }
    }

   # 配置日志反向代理服务
   server {
       listen 15002;
       server_name jenkins_log;
       root D:\APP\script\log;
   
       types { # 以文本形式在浏览器中打开.log后缀的文件
           text/plain log;
       }
   }
   # 配置文档下载服务
    server {
        listen 15003;
        server_name server_name222222222;
        root D:\AAAAAA\\release;
    
        location / {
            autoindex on;
            index index.html;
            try_files $uri $uri/ =404;
        }
    }


}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
完善页面 (opens new window)
nginx配置-默认配置
nginx配置-生产配置

← nginx配置-默认配置 nginx配置-生产配置→

最近更新
01
JDK
02-23
02
BadTasteCode && 优化
09-11
03
Gradle 实践操作指南及最佳实践
09-11
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Tandy | 粤ICP备2023113440号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式