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强制跳转到httpsrewrite ^(.*)$ 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.jpglocation ~^/files/ {root /home/;index index.html index.htm;}# 用alias方式,location中的路径不会拼加到alias的地址后面# 这请求路径为:http://localhost:8080/files/index.jpg    实际访问为:/home/index.jpglocation ~^/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/getUserlocation ^~/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/getUserlocation ^~/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/getUserlocation ^~/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//getUserlocation ^~/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/getUserlocation ^~/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/usergetUserlocation ^~/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/getUserlocation ^~/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//getUserlocation ^~/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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open3D 点云按xyz轴等距切片

目录 一、概述 1.1原理 1.2实现步骤 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2按x轴切片 3.3按y轴切片 3.4按z轴切片 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff…

Java中线程池的基本使用

参考这个课程&#xff0c;讲的非常详细 27.线程池使用步骤总结_哔哩哔哩_bilibili 应用场景 商品秒杀 文件上传 订票系统 自定义线程池&#xff08;让我们了解底层逻辑的&#xff09; 构造方法 饱和机制 就是我们的队列饱和后我们该怎么处理 是拒绝这个任务还是啥…

Aria2 任意文件写入漏洞

目录 Aria2介绍漏洞描述漏洞复现 Aria2介绍 Aria2是一个在命令行下运行&#xff0c;多协议&#xff0c;多来源下载工具&#xff08;HTTP / HTTPS&#xff0c;FTP&#xff0c;BitTorrent&#xff0c;Metalink&#xff09;&#xff0c;内建XML-RPC用户界面。Aria提供RPC服务器&a…

流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器

1 安装和测试srs流媒体服务器 服务器&#xff1a;SRS(Simple RTMP Server&#xff0c;⽀持RTMP、HTTP-FLV&#xff0c;HLS) 推流端&#xff1a;ffmpeg OBS 拉流端&#xff1a;ffplay VLC srs播放器 1.1 安装srs流媒体服务器 官网 SRS (Simple Realtime Server) | SRS 码…

18746 逆序数

这个问题可以使用归并排序的思想来解决。在归并排序的过程中&#xff0c;我们可以统计逆序数的数量。当我们合并两个已经排序的数组时&#xff0c;如果左边的数组中的元素&#xfffd;&#xfffd;于右边的数组中的元素&#xff0c;那么就存在逆序&#xff0c;逆序数的数量就是…

IEC104转MQTT网关支持MQTT对接Ignition、阿里云、华为云、亚马逊AWS、ThingsBoard、Zabbix平台助力远程管理

钡铼推出了一款专为电力系统设计的数据采集网关——IEC104转MQTT网关BE113&#xff0c;感兴趣的朋友接着往下看&#xff1a; 一、网关概述 IEC104转MQTT(Ignition)网关BE113是一款专为电力系统设计的数据采集网关&#xff0c;支持DL/T645和IEC104等协议的设备。上行支持MQTT协…

二、3 函数递归

自己间接或直接调用自己&#xff08;可大大减少代码量&#xff09; 1、举例 2、递归必须有停下来的条件 3、举例 普通求解数组长度 递归求解

Java进制,进制的转换

目录 进制 进制介绍 案例演示 进制的图示 进制的转化&#xff08;基本功&#xff09; 二进制转换成十进制 八进制转换成十进制 十六进制转换成十进制 十进制转换成二进制 十进制转换成八进制 十进制转换成十六进制 二进制转换成八进制 二进制转换成十六进制 …

Linux信号上

信号 概念 信号是由于进程产生&#xff0c;但是由内核调度传递给另一个进程&#xff1a; 产生信号 按键产生信号: Ctrc --> 2)SIGINT(终止/中断) Ctrz --> 20)SIGTSTOP(终端暂停) Ctr\ --> 3)SIGQUIT(退出) 系统调用产生: kill(2), raise, abort软件条件产生: 如定…

从与原始的Transformer architecture比较来理解GPT

从与原始的Transformer architecture比较来理解GPT flyfish 一、Transformer architecture 先说名词 不同的文献和资料中有不同的名字&#xff0c;其实是一样的意思 1 编码器-解码器多头注意力机制&#xff08;Encoder-Decoder Multi-Head Attention Mechanism&#xff09; …

爬虫-实战爬取虎扑ACG帖子

要求如下: 爬取虎扑步行街 ACG 版面的数据,要求使用多线程来并发爬取。范围是第一页的所有帖子,每个帖子包含标题、主题内容和第一页的所有回复内容。最后打印出爬到的所有帖子的标题。 网址是:ACG圈 - 虎扑社区。 针对上面的要求,我们进行分析: 首先是要使用多线程范…

韩顺平0基础学java——第39天

p820-841 jdbc和连接池 1.JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 2.Java程序员使用JDBC&#xff0c;可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 3.jdbc原理图 JDBC带来的好处 2.JDBC带来的…

结构体笔记

结构体 C语言中的数据类型&#xff1a; 基本数据类型&#xff1a;char/int/short/double/float/long 构造数据类型&#xff1a;数组&#xff0c;指针&#xff0c;结构体&#xff0c;共用体&#xff0c;枚举 概念&#xff1a; 结构体是用户自定义的一种数据类型&#xff0c…

《Milvus Cloud向量数据库指南》——ChatGLM:从GLM-130B到GLM-4

ChatGLM:从GLM-130B到GLM-4的跨越:智谱AI在通用人工智能领域的深度探索与实践 在人工智能的浩瀚星空中,智谱AI如同一颗璀璨的新星,以其独特的技术视角和坚定的创新步伐,在通用人工智能(AGI)的征途上留下了深刻的足迹。技术生态总监贾伟在近期的一次分享中,不仅为我们描…

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列&#xff0c;存在的问题&#xff1a;如果第一个消息延时时间很长&#xff0c;而第二个消息延时时间很短&#xff0c;第二个消息并不会优先得到执行。 下载插件 地址&#xff1a;https://github.com/rabbitmq/rabbitmq-delayed-message-excha…

49.TFT_LCD液晶屏驱动设计与验证(2)

&#xff08;1&#xff09;Visio视图&#xff1a; &#xff08;2&#xff09;控制模块Verilog代码&#xff1a; module tft_ctrl(input clk_33M ,input reset_n ,input [23:0] data_in ,output [9:0] hang…

PLSQL Developer工具查询数据,报错(动态性能表不可访问)

解决的问题&#xff1a; 解决方案&#xff1a; 在配置-首选项-选项&#xff0c;取消勾选“自动统计”&#xff0c;保存之后即可查询数据

WSL快速入门

1. WSL介绍 WSL文档地址&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl WSL&#xff1a;全称 Windows Subsystem for Linux&#xff0c;即windows上的Linux子系统&#xff08;虚拟机工具&#xff09;。是Win10推出的全新特性&#xff0c;可以更轻量地在Windows系统…

【网络安全】子域名模糊测试实现RCE

未经许可&#xff0c;不得转载。 文章目录 正文总结 正文 在之前测试一个私人项目时&#xff0c;我报告了admin.Target.com上的Auth Bypass漏洞&#xff0c;这将导致SQLI&RCE &#xff0c;该漏洞在报告后仅一天就被修复。 现在重拾该应用程序&#xff0c;对子域进行模糊测…