以前以为是运维的事所以就草草看了一遍就完事了,真开发的时候不懂多一点和运维沟通那是真有点折磨啊,故重新捡起来学一遍。

一、Nginx 是什么?

Nginx 是一个高性能的 Web 服务器,也可以作为反向代理服务器、负载均衡器、静态资源服务器使用。

可以先把 Nginx 理解成一个“请求入口”。用户访问网站时,请求先到 Nginx,然后 Nginx 决定:

  • 直接返回 HTML、CSS、JS、图片等静态文件
  • 把请求转发给后端服务,比如 Java、Node.js、Python、Go
  • 把 HTTP 请求重定向到 HTTPS
  • 根据域名或路径分发到不同服务

常见请求链路:
image

二、Nginx 的基本配置结构

一个最基础的 Nginx 配置大致长这样:

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;
        }
    }
}

1. 全局块

worker_processes 1;

用于配置 Nginx 的整体运行参数。

worker_processes 表示 worker 进程数量。简单理解,worker 是真正处理请求的进程。

生产环境常见写法是:

worker_processes auto;

2. events 块

events {
    worker_connections 1024;
}

用于配置连接处理能力。

worker_connections 1024;

表示每个 worker 最多可以处理多少连接。

3. http 块

http {
    ...
}

HTTP 相关配置都写在这里。

include mime.types;

表示引入 MIME 类型配置,让 Nginx 知道 .html.css.js.png 等文件应该用什么类型返回给浏览器。

default_type application/octet-stream;

表示如果 Nginx 不认识某种文件类型,就按二进制文件处理。

4. server 块

server {
    listen 80;
    server_name localhost;
}

server 可以理解成一个“虚拟主机”或“站点”。

listen 80;

表示监听 80 端口。HTTP 默认端口就是 80,所以访问:

http://localhost

其实就是访问:

http://localhost:80

其中:

server_name localhost;

表示这个站点处理 localhost 这个域名的请求。

5. location 块

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

location 用来匹配请求路径。

root html;

表示静态文件目录。

index index.html;

表示默认首页文件。

当用户访问:

http://localhost/

Nginx 会尝试返回:

html/index.html

三、静态站点配置

所谓“静态站点”,就是 Nginx 直接从磁盘读取文件并返回给浏览器,不需要后端程序参与。

常见静态资源包括:

index.html
style.css
main.js
logo.png
favicon.ico

示例配置:

server {
    listen 80;
    server_name localhost;

    location / {
        root /tmp/demo-site;
        index index.html;
    }
}

如果你的文件是:

/tmp/demo-site/index.html

那么访问:

http://localhost/

Nginx 就会返回这个文件。

可以用下面命令创建一个测试页面:

mkdir -p /tmp/demo-site

cat > /tmp/demo-site/index.html << 'EOF'



    
    Nginx Demo


    

我是 Nginx 静态站点

部署成功!!!

EOF

然后配置 Nginx:

cat > /etc/nginx/sites-enabled/demo << 'NGX'
server {
    listen 8081;
    server_name localhost;

    root /tmp/demo-site;
    index index.html;
}
NGX

检查配置:

nginx -t

重新加载:

nginx -s reload

访问测试:

curl http://localhost:8081

四、Nginx 命令常用操作

1. 检查配置是否正确

nginx -t

改完配置后,建议先执行这个命令。如果配置语法有问题,Nginx 会提示错误。

2. 重新加载配置

nginx -s reload

-ssignal 的意思,表示给正在运行的 Nginx 发送一个信号。
意思是告诉 Nginx:重新读取配置文件。

推荐流程:

nginx -t
nginx -s reload

3. 停止 Nginx

快速停止:

nginx -s stop

优雅停止:

nginx -s quit

quit 会等待正在处理的请求结束后再退出。


五、反向代理是什么?

反向代理是 Nginx 最常见的用途之一。

简单说:

用户访问 Nginx,Nginx 再把请求转发给后端服务。

例如后端服务运行在:

127.0.0.1:8080

但用户访问的是:

http://localhost/api/

请求链路是:

    浏览器 / curl
        |
        v
    Nginx :80
        |
        v
    后端服务 :8080

Nginx 配置:

server {
    listen 80;
    server_name localhost;

    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
    }
}

这样用户访问:

http://localhost/api/

会被 Nginx 转发到:

http://127.0.0.1:8080/

六、upstream 是什么?

如果后端服务器比较多,可以用 upstream 定义一个后端服务组。

upstream backend {
    server 127.0.0.1:8080;
}

这里表示定义了一个名为 backend 的后端服务组。

然后在 location 里使用:

server {
    listen 80;
    server_name localhost;

    location /api/ {
        proxy_pass http://backend/;
    }
}

完整配置:

upstream backend {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name localhost;

    location /api/ {
        proxy_pass http://backend/;
    }
}

如果有多个后端:

upstream backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

Nginx 会在这些后端之间分发请求,这就是简单的负载均衡。


七、location 和 proxy_pass 结尾的 /

这是 Nginx 里非常容易混的地方。

1. 保留 /api 前缀

location /api {
    proxy_pass http://backend;
}

请求:

/api/user

转发到:

http://backend/api/user

也就是最后请求的路径保留 /api

2. 去掉 /api 前缀

location /api/ {
    proxy_pass http://backend/;
}

请求:

/api/user

转发到:

http://backend/user

也就是去掉 /api/

3. 怎么选择?

A、如果后端接口本身就是:

/api/user

那么使用:

location /api {
    proxy_pass http://backend;
}

B、如果后端接口是:

/user

但前端希望统一请求:

/api/user

那么使用:

location /api/ {
    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;

1. Host

proxy_set_header Host $host;

表示把用户原本访问的域名传给后端。

例如用户访问:

http://example.com/api/user

那么后端收到:

Host: example.com

2. X-Real-IP

proxy_set_header X-Real-IP $remote_addr;

表示把真实客户端 IP 传给后端。

因为后端看到的请求来源可能是 Nginx,而不是用户浏览器,所以需要 Nginx 告诉后端:

X-Real-IP: 用户真实 IP

3. X-Forwarded-For

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

表示记录完整代理链路中的 IP。如果请求经过多层代理,这个头会保留更完整的路径。

4. X-Forwarded-Proto

proxy_set_header X-Forwarded-Proto $scheme;

表示告诉后端,用户最初是通过 HTTP 还是 HTTPS 访问的。

如果用户访问:

https://example.com

那么后端可以知道原始协议是:

https

这对登录跳转、生成链接、设置 Cookie 很重要。


九、前后端分离项目怎么配?

前后端分离项目一般是:

  • 前端:Vue / React / Vite 打包后的 dist 静态文件
  • 后端:Java / Node / Python / Go API 服务

常见部署方式是:

/       -> 返回前端静态页面
/api/   -> 转发给后端接口服务

示例:

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/frontend/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
        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;
    }
}

这里:

location / {
    root /var/www/frontend/dist;
    index index.html;
    try_files $uri $uri/ /index.html;
}

负责前端页面。

try_files 很重要,尤其是 Vue Router、React Router 使用 history 模式时。

例如用户直接访问:

https://example.com/user/profile

磁盘上可能没有 /user/profile 这个文件。

所以需要:

try_files $uri $uri/ /index.html;

意思是:

先找真实文件
找不到再找目录
还找不到就返回 index.html

然后交给前端路由处理。


十、HTTPS 配置

HTTP 是明文传输,HTTPS 是加密传输。生产环境通常应该使用 HTTPS。
Nginx HTTPS 配置示例:

server {
    listen 443 ssl;
    server_name secure.example.com;

    ssl_certificate      /etc/nginx/certs/server.crt;
    ssl_certificate_key  /etc/nginx/certs/server.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
    }
}

HTTP 自动跳转 HTTPS:

server {
    listen 80;
    server_name secure.example.com;

    return 301 https://$host$request_uri;
}

整体逻辑:

    用户访问 http://secure.example.com
            |
            v
    Nginx 80
            |
            v
    跳转到 https://secure.example.com
    用户访问 https://secure.example.com
            |
            v
    Nginx 443 ssl
            |
            v
    Nginx 解密 HTTPS
            |
            v
    转发给后端服务

简单说:

  • 80 端口:负责把 HTTP 跳到 HTTPS
  • 443 端口:真正处理 HTTPS 请求

十一、初学者推荐配置模板

1. 静态站点模板

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html;
    }
}

2. 反向代理模板

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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. 前后端分离模板

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/frontend/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
        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;
    }
}

原文地址: https://www.cveoy.top/t/topic/qHms 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录