Nginx配置详解

1. Nginx安装

进入到/usr/local目录下,执行命令:

yum install -y nginx

通过如下命令启动nginx服务

systemctl start nginx

通过如下命令,设置nginx开启自启动

systemctl enable nginx

nginx默认占用80端口。

访问ip:80,可以看到如下页面

image-20240725113008420

这个页面默认目录为/usr/share/nginx/html


2. Nginx配置

2.1 配置文件简介

修改配置之前,一般我们都需要备份一下我们的配置文件,以防改错了。

nginx的配置文件在/etc/nginx目录下,配置文件名称为nginx.confnginx.conf.default为nginx的默认配置文件,相当于一个初始文件的备份文件。

可以通过如下命令,删除配置文件中的注释以及换行。

grep -Ev '#|^$' nginx.conf > nginx.conf

去除多余内容后,剩下的内容如下:

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

目前我们可以删除第8行、第9行、17-20行的内容,只保留如下:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

这就是nginx的最小配置项。

修改保存配置文件后,我们想让配置文件生效,需要重启nginx服务。

systemctl restart nginx
ps -ef|grep nginx # 查看nginx进程

nginx -t # 检测配置文件是否存在错误

image-20240725140842175

当工作进程出现问题或者被杀死后,nginx管理进程会自动创建新的工作进程。如果杀死nginx管理进程,相当于停止了nginx服务。

2.2 配置文件详解

  • worker_processes:表示只启动几个工作进程,具体值为多少,一般根据CPU核数来定,如果CPU为八核,那么此处值就填8。

  • events

    • worker_connections:连接数量,每个进程可以处理多少连接。一般就保持默认,1024。
  • http

    • include:nginx能够识别出的文件类型,指定一个文件,这个文件中存储了nginx能够识别出的文件类型,默认为nginx.conf同一目录下的mime.types文件。

      如果nginx不能够识别A文件,那么nginx也会将A文件返回给浏览器,浏览器如果可以识别便会解析,如果浏览器也无法识别,则会让用户下载文件。

      如果B文件类型是nginx能够识别的,但是浏览器无法识别,浏览器就会尝试以txt文档的格式进行展示该文件。

    • default_type:如果文件无法被nginx识别出,也就是文件类型没有在include指定的文件中定义指定,那么nginx就会以default_type指定的类型返回数据。application/octet-stream指nginx以8进制数据流的方式将数据返回给浏览器。一般默认即可。

    • server 该部分就是针对网站代码的配置,如果我们需要配置多个网站,可以复制配置多个server。

      • listen:指定访问该网站的端口号,默认为80。
      • server_name:配置域名。
      • location:匹配以什么开头的URI,默认为/,表示匹配所有请求。如配置了/user,那么请求ip:端口/user/xx就会匹配到该路由。
        • root:指定项目的目录。可以填写绝对路径,也可以填写相对路径。填写相对路径是,默认根路径为/usr/share/nginx。
        • index:指定了当请求是一个目录时,Nginx应该返回哪个文件作为默认文件。
        • proxy_pass:指定请求转发到后端的路径。

image-20240726090927623

2.3 路由匹配问题

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

当我们按照如上配置时。当请求 http://ip:81/api 时,Nginx会做以下几件事:

  1. 匹配到location /api块。
  2. 根据root指令,知道应该在文件系统的/codewei目录下查找文件。
  3. 因为请求的是/api,所以Nginx会在/codewei目录下查找名为api的文件或目录。如果找到名为api的目录,Nginx会进一步在这个目录中查找index指令指定的文件(index.htmlindex.htm)。

如果我们的意图是让http://ip:81/api直接访问/codewei目录下的index.html文件,而不是/codewei/api/index.html,我们应该使用alias指令而不是root指令,如下所示:

location /api {  
    alias   /codewei/;  # 注意这里的斜杠,它表示/codewei目录  
    index   index.html index.htm;  
}

使用alias指令后,Nginx就会知道/api请求实际上应该对应到文件系统中的/codewei/目录,而不是/codewei/api目录。这样,当你访问http://ip:81/api时,Nginx就会提供/codewei/目录下的index.html文件。

2.4 对于 root后的路径是否要以/结尾的问题

在Nginx的配置中,使用root指令时,目录路径的末尾是否加/(斜杠)是有区别的。这主要影响到Nginx如何拼接请求的路径和root指定的目录路径。

如果你的root指令后面没有加/,Nginx会将其视为一个相对路径的起点,并将请求的URI路径完整地附加在这个起点后面。例如:

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

对于请求http://ip:81/api/some/path,Nginx会在/codewei目录下查找api/some/path这个路径。注意,这里包括了api部分,因为root后面没有加/

然而,如果你的root指令后面加了/,Nginx会将其视为一个绝对路径的起点,并且只会将请求URI中location匹配之后的部分附加在这个起点后面。例如:

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

对于同样的请求http://ip:81/api/some/path,Nginx现在会在/codewei/目录下查找some/path这个路径。注意,这里不包括api部分,因为root后面加了/


3. 部署SpringBoot+Vue

3.1 后端项目

后端仅一个Controller,无其他内容。

@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "*")
public class NginxController {

    @GetMapping("/getName")
    public String getName(){
        return "小明";
    }

    @GetMapping("/getAgeById/{id}")
    public String getAgeById(@PathVariable("id") Integer id){
        return String.valueOf(id);
    }
}

后端配置文件application.yaml

server:
  port: 8080

使用maven build进行打包。

将打包好的jar包上传到服务器,使用nohup java -jar xxx.jar &运行项目。

3.2 前端项目

前端页面

<template>
  <div>
    <button @click="getName">获取名字</button>
    <button @click="getAgeById">根据ID获取年龄</button>
    <div style="text-align: center;font-weight: 600;" v-cloak>{{result}}</div>
  </div>
</template>

<script>
import {getAgeById, getName} from "@/api/user";

export default {
  data() {
    return {
      result:""
    }
  },
  methods: {
    getName(){
      getName().then((response) => {
        this.result = response.data;
      })
    },
    getAgeById(){
      getAgeById(23).then((response) => {
        this.result = response.data;
      })
    }
  }
}
</script>

axios配置

import axios from "axios";

const request = (option) => {
    const instance = axios.create({
        baseURL: "/api",    // 注意此处!
    });
    return instance(option);
};
export default request;

请求api

import request from '@/util/request'

export function getName() {
    return request({
        url: '/user/getName',
        method: 'get'
    })
}

export function getAgeById(id) {
    return request({
        url: '/user/getAgeById/'+ id,
        method: 'get'
    })
}

vue.config.js配置

module.exports = {
  publicPath: '/',
  outputDir: "dist",
  devServer: {
    port: 80,
    proxy: {
      '/api': {
        target: "http://localhost:8080",
        changOrigin: true,
        ws: true,
        secure: false,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
}

使用npm run build进行打包。会生出一个dist目录。

3.3 nginx配置

将前端打包好的dist目录上传到服务器。

image-20240726091631531

如上图,我上传到了/home目录下。注意该地址,配置nginx时需要使用。

nginx配置

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen       80;   # 访问 ip:80 即可访问
        server_name  localhost;
        location / {
            root /home/dist;   # 刚刚打包好的dist的目录
            index index.html index.htm;
        }
        location /api/ {   # 注意 / 结尾
            proxy_pass http://localhost:8080/;  # 引文后端项目跑在同一个主机上,所以使用lcoalhost 注意 / 结尾
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-real-ip $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         }
    }
}

此时,我们访问http://ip:80即可访问到前端项目。


4. Nginx各种代理配置

来源:https://blog.csdn.net/mingongge/article/details/139364019

4.1 基础配置说明

# 进程数量
worker_processes 1;
 
events {
  # 最大连接数量
  worker_connections 1024;
}
 
http {
  include mime.types;
  default_type application/octet-stream;
  sendfile on;
  keepalive_timeout 65;

4.2 演示如何强制http跳转https

server {
  listen 80;
  server_name test.com;
 
  # http强制跳转到https
  rewrite ^(.*)$ https://$server_name$1 permanent;
}

4.3 演示如何配置微信支付的校验文件

server {
  listen 80;
  server_name localhost;
 
  # 默认根路径
  location / {
    root index.html;
  }
  # 微信支付校验文件,可以直接配置访问名称
  location ^~/MP_verify_2g3uEjrB5B2LIbNl.txt {
    alias /home/MP_verify_2g3uEjrB5B2LIbNl.txt;
  }
  # 微信支付校验文件,也可以通过正则配置
  location ~^/MP_verify_[a-zA-Z0-9]*\.(txt)$ {
    root /home/;
    rewrite ^/home/(.txt)$ /home/$1 last;
  }
}

4.4 演示root和alias两种配置静态资源的区别

server {
  listen 80;
  server_name localhost;
 
  # 用root方式,location中的路径会拼加到root的地址后面
  # 请求路径为:http://localhost:8080/files/index.jpg    实际访问为:/home/files/index.jpg
  location ~^/files/ {
    root /home/;
    index index.html index.htm;
  }
  # 用alias方式,location中的路径不会拼加到alias的地址后面
  # 这请求路径为:http://localhost:8080/files/index.jpg    实际访问为:/home/index.jpg
  location ~^/files/ {
    alias /home/;
    index index.html index.htm;
  }
}

4.5 演示请求后台接口代理配置

server {
  listen 8080;
  server_name localhost;
 
#################### 第一种场景(代理地址不加斜杠) ####################
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/api/getUser
  location ^~/api/ {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际指向为:http://127.0.0.1:8000/api/getUser
  location ^~/api {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
 
#################### 第二种场景(代理地址+斜杠) ####################
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/getUser
  location ^~/api/ {
    proxy_pass http://127.0.0.1:8000/;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000//getUser
  location ^~/api {
    proxy_pass http://127.0.0.1:8000/;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
 
#################### 第三种场景(代理地址+后缀) ####################
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user/getUser
  location ^~/api {
    proxy_pass http://127.0.0.1:8000/user;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/usergetUser
  location ^~/api/ {
    proxy_pass http://127.0.0.1:8000/user;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
 
#################### 第四种场景(代理地址+后缀+斜杠) ####################
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user/getUser
  location ^~/api/ {
    proxy_pass http://127.0.0.1:8000/user/;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
  # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user//getUser
  location ^~/api {
    proxy_pass http://127.0.0.1:8000/user/;
    proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
    proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
  }
}

4.6 演示前端项目如何部署nginx

server {
  listen 8090;
  server_name localhost;
 
  # 默认访问
  # 部署路径:/home/web/my_demo
  # 访问路径为:http://localhost:8090/
  location / {
    try_files $uri $uri/ /index.html;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    root /home/web/my_demo/;
    index index.html index.htm;
  }
 
  # 带前缀的访问
  # 部署路径:/home/web/my_demo
  # 访问路径为:http://localhost:8090/my_demo/
  # 如果location路径最后没有配置斜杠,则浏览器输入访问地址后,路径最后会自动拼一个斜杠
  location ^~/my_demo/ {
    try_files $uri $uri/ /my_demo/index.html;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    root /home/web/;
    index index.html index.htm;
  }
}
}

5. 总结

image-20240726092756194

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Nginx 是一个高性能的开源 Web 服务器和反向代理服务器。它的配置文件是一个重要的部分,影响着服务器的行为和性能。下面是对 Nginx 配置文件的详细解释: 1. 配置文件位置: Nginx配置文件通常位于 /etc/nginx/nginx.conf。此外,可以通过 include 语句包含其他配置文件,使配置更加模块化。 2. 基本结构: Nginx配置文件由多个指令和块组成。指令是配置文件的最小单位,而块是由一对花括号括起来的指令集合。配置文件从上到下按顺序解析,遇到块会进一步解析块内的指令。 3. 主要指令: - worker_processes:指定 Nginx 创建的进程数。通常设置为 CPU 核心数的倍数。 - events:配置 Nginx 处理连接和请求的事件模型。 - http:定义 HTTP 服务器的全局配置。 - server:定义一个虚拟主机(或称为 server block),可以包含多个 location 块。 - location:根据请求的 URI 匹配规则,定义不同的请求处理方式。 4. 常用配置选项: - listen:指定监听的 IP 地址和端口。 - server_name:指定虚拟主机的域名。 - root:指定网站根目录。 - index:指定默认的索引文件。 - location:根据匹配规则指定不同的处理方式,如代理、重定向、静态文件处理等。 5. 变量和指令: Nginx 支持一些内置变量和指令,用于实现动态的配置和请求处理。常见的变量包括 $uri、$args 和 $http_user_agent,常见的指令包括 if、rewrite 和 return。 6. 配置文件的重载: 在修改配置文件后,可以通过发送信号给 Nginx 进程来重新加载配置,而无需停止服务器。常用的信号有 HUP(重新加载配置)和 TERM(停止服务器)。 这些是 Nginx 配置文件的一些基本概念和常用指令。具体的配置方式和使用方法可以根据实际需求进行深入学习和探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mango1698

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值