nginx简单使用与配置

news2025/1/19 11:31:00

nginx简单使用与配置

Nginx 是一个高性能的HTTP和反向代理web服务器、一个邮件代理服务器,一个通用的 TCP/UDP 代理服务器。支持FastCGISSLVirtual HostURL RewriteGzip等功能。并且支持很多第三方的模块扩展。

前端可以通过nginx实现以下功能:

  • 搭建静态资源服务器
  • 反向代理分发后端服务(可以和nodejs搭配实现前后端分离)和跨域问题
  • 多域名配置
  • 根据User Agent选择站点
  • url重写,使用rewrie规则本地映射
  • 获取cookie做分流
  • 资源合并
  • gzip压缩
  • 压缩图片
  • sourceMap调试

下面便介绍一下一些功能的具体实现方式:

本地部署nginx

在官网上下载nginx

请添加图片描述

官网上提供了多个版本的nginx压缩包,选择最新稳定版(其他也可以)下载,解压到任意位置。在演示中安装在D盘,通过命令提示符进入nginx根目录,执行start nginx命令启动服务(访问localhost80如果失败这种情况是80端口被其他应用占用了,此时可以更改conf/nginx.conf文件中的监听端口)。

请添加图片描述

将端口改成8080保存后再次执行start nginx

注意最好不要直接点击根目录下的nginx.exe启动,这样会导致当再次点击时启动多个nginx服务,最好使用命令行运行,这样在关闭的时候执行nginx -s stop即可

搭建静态资源服务器

nginx.conf文件上指定路径对应目录,比如

location /images/ {
	root usr/local/static/;
	autoindex on;
}

autoindex用来开启浏览目录权限,默认为off

nginx的根目录下创建一个usr/local/static/images目录,将图片资源放在该目录下,然后启动nginx服务,通过localhost:8080/images/xxx访问图片。

root的值替换成具体盘里的资源目录也可以实现映射。

location /images/ {
	root D:/pictures/;
	autoindex on;
}

反向代理分发后端服务解决跨域问题

与反向代理相关的配置说明:

  • proxy_pass: 设置要代理的 uri,注意最后的 /。可以是 Unix 域套接字路径或者正则表达式。
  • proxy_redirect off:设置后端服务器Location响应头和Refresh响应头的替换文本
  • proxy_set_header X-Real-IP $remote_addr;: 获取用户的真实 IP 地址
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 后端的Web服务器可以通过 X-Forwarded-For 获取用户真实IP,多个 nginx 反代的情况下,例如 CDN。
  • proxy_set_header Host $host;:允许重新定义或者添加发往后端服务器的请求头。
  • client_max_body_size 10m;:允许客户端请求的最大单文件字节数
  • client_body_buffer_size 128k;:缓冲区代理缓冲用户端请求的最大字节数,
  • proxy_connect_timeout 90;nginx跟后端服务器连接超时时间(代理连接超时)
  • proxy_send_timeout 90;:后端服务器数据回传时间(代理发送超时)
  • proxy_read_timeout 90;: 连接成功后,后端服务器响应时间(代理接收超时)
  • proxy_buffer_size 4k;:设置代理服务器(nginx)保存用户头信息的缓冲区大小
  • proxy_buffers 4 32k;proxy_buffers缓冲区,网页平均在32k以下的设置
  • proxy_busy_buffers_size 64k;:高负荷下缓冲大小(proxy_buffers*2
  • proxy_temp_file_write_size 64k;: 设定缓存文件夹大小,大于这个值,将从upstream服务器获取

不过对于简单的代理只需要配置proxy_pass即可。

比如:

server {
	listen       80;
	server_name  localhost;

	location / {
		proxy_pass  http://test.com:8080
	}
}

上面的配置启动后,访问域名为localhost,会跳转到 http://test.com:8080 路径上。

除此之外还可以根据访问路径跳转到不同服务中:

server {
	listen       80;
	server_name  localhost;

	location ~ /server1 {
		proxy_pass  http://test.com:8080
	}

  location ~ /server2 {
		proxy_pass  http://example.com:8081
	}
}

上面配置会根据路径进行跳转,比如localhost/server1会跳转到http://test.com:8080localhost/server2会跳转到http://example.com:8081

由于浏览器存在跨域问题,当需要访问其他服务上的资源,会报错,因此可以通过反向代理来解决该问题。

多域名配置

由于在域名管理的控制面板设置域名对应ip只能设置到ip,不能详细设置到端口。如果一台服务器部署了多个web应用,使用的不同端口启动的,那么就可以nginx做映射。

比如有两个域名test.comexample.com都想指向同一个服务器,这时test.comexample.com的域名映射都默认对应到端口80的服务。如果访问其他端口就需要在域名后面带上端口号(如test.com:8080

通过nginx配置可以把其他端口都映射到80端口。

server
{
    listen 80;
    server_name test.com;
    location / {
        proxy_pass http://localhost:8880;
    }
}
server
{
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://localhost:8881;
    }
}

这样,当访问test.com的时候就会代理到http://localhost:8880的服务,example.com会代理到http://localhost:8881

根据User Agent选择站点

nginx可实现根据访问源的设备类型进行判断并跳转到不同的服务或其它项目中。

upstream mobileserver {
    server localhost:8080;
}
upstream computerserver {
    server localhost:8081;
}
server {
    listen       80;
    server_name  localhost;
    rewrite_log     on;
    location / {
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr; 
    access_log  /data/logs/nginx/mobile.access.log  main;
    error_log  /data/logs/nginx/mobile.error.log;
    # 设置一个变量来控制代理
    set $client    "";
    
    #如果是IPhone设备、iPad设备、iPod设备、苹果其它非PC设备、苹果PC设备
    if ( $http_user_agent ~* "(iPhone|iPad|iPod|iOS|Android|Mobile|nokia|samsung|htc|blackberry)") {
      set $client "1";
    }        
    if ($client = '1') {
      proxy_pass http://mobileserver;
      break;
    }
    proxy_pass http://computerserver;
}

同时,通过判断user agent,在nginx中禁用一下爬虫,也可以防止一些恶意的访问。

#禁止Scrapy等爬虫工具的抓取
if ($http_user_agent ~* "Scrapy|Sogou web spider|Baiduspider") {
  return 403;
}
#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{
  return 403;
}
#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
  return 403;
}

url重写(重定向)

web 服务中,通常会通过重定向功能,将一个域名的请求转发到另一个域名上。

nginx中可在server中配置,也可以通过location中的rewrite来配置。

在server中配置

server {
    listen 80;
    server_name oldSite.com;
    # 301 指定为临时重定向,也可设置成301 永久重定向
    return 302 http://newSite.com;
}

将域名 oldSite.com 的所有请求,重定向到新网址newSite.com上。

在浏览器的network中可以看到在请求oldSite.com(本文是localhost:8081)时返回的状态码是302,在响应头上还携带上重定向的地址(Location字段),浏览器会根据新地址重新发送请求来获取资源。
在这里插入图片描述
在这里插入图片描述

上面的设置有点问题,就是当访问的域名后边带有资源路径时同样会定位到http://newSite.com,并不会携带路径,需要进行配置。

server {
    listen 80;
    server_name oldSite.com;
    return 302 http://newSite.com$request_uri;
}

除了重定向域名外,还可以指定重定向到 httphttps 协议,也可通过 $scheme 参数继承用户来访时使用的协议类型。

server {
    listen 80;
    server_name oldSite.com;
    return 302 $scheme://newSite.com;
}

也可以使用rewrite关键字

server {
    listen 80;
    server_name oldSite.com;
    rewrite ^ http://newSite.com redirect;
}

301与302状态的区别:

  • 301 永久跳转,当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息中的状态码的一种,表示本网页永久性转移到另一个地址。
  • 302 临时跳转,也是状态码的一种,意义是暂时转向到另外一个网址

在location中配置

rewrite只能在serverlocationif块中使用。

rewrite语法: rewrite regex replacement [flag];

flag有以下几个值:

  • last: 完成重写指令,之后搜索相应的URIlocation
  • break: 完成重写指令
  • redirect: 返回302临时重定向,地址栏会显示跳转后的地址
  • permanent: 返回301永久重定向,地址栏会显示跳转后的地址
 location ~ .* {
	rewrite $(.*) http://newSite.com$1 redirect; 
}

将所有的访问资源重定向到newSite.com中。

gzip压缩

启用gzip压缩功能, 可以使网站的cssjshtml 等静态资源在传输时进行压缩,经过gzip压缩后资源可以变为原来的30%甚至更小,尽管这样会消耗一定的cpu资源,但是会节约大量的出口带宽来提高访问速度。

gzip 的压缩页面需要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后解压并解析。浏览器那里不需要我们担心,因为目前的大多数浏览器都支持解析gzip
注意:不建议压缩图片和大文件,图片文件本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费CPU资源。

#开启gzip
gzip  on;  
#低于1kb的资源不压缩 
gzip_min_length 1k;
#压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。 
gzip_comp_level 5; 
#需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;  
#配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_disable "MSIE [1-6]\.";  
#是否添加“Vary: Accept-Encoding”响应头
gzip_vary on;

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

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

相关文章

【项目实战课】基于Pytorch的YOLOv3工业缺陷检测实战

欢迎大家来到我们的项目实战课,本期内容是《基于Pytorch的YOLOv3工业缺陷检测实战》。所谓项目课,就是以简单的原理回顾详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解。 本次主题 目标检测是最基础的计算机视觉…

利用Resource Hacker简单去除WinRar广告-boldiy

利用Resource Hacker简单去除WinRar广告-boldiy boldiy关注IP属地: 江苏 2022.04.26 18:43:27字数 114阅读 315 下载 Resource Hacker 用软件打开WinRAR.exe 点击展开String Table image.png 打开80:2052 删除1277所在整行,并点击运行&#xff0…

百度地图开发者账号申请

本篇文章要完成的效果 一、百度地图开发者账号申请 官网 : 百度地图开放平台 | 百度地图API SDK | 地图开发 (baidu.com) 没有的话注册一下 一般来说使用过百度云 就有百度账号 点击【控制台】——【我是个人爱好者/学生】 完善个人信息 —— 实名认证 再次返回首…

【逆天应用】如何用Python实现检测和识别车牌号?(详细教程)

文章目录 前言一、创建Python环境二、如何在您的计算机上安装Tesseract OCR?1.导入库2.获取输入2.获取输入3.在输入端检测车牌4.筛选轮廓5.遍历前30个轮廓5.识别检测到的车牌 三,显示输出总结 前言 车牌检测与识别技术用途广泛,可以用于道路系统、无票停…

ChatGPT 速通手册——连续提问和重新生成的作用

连续提问和重新生成的作用 和 ChatGPT 聊天,也是有套路的。我们把给 ChatGPT 输入的问题文本,叫 Prompt,提示词。实际上,传统搜索引擎也有比较相类似的功能。 在 Prompt Learning 提示学习之后,又总结出一种更好的聊…

【虚幻引擎UE】UE4/UE5 新人科普向

一、前言 Unreal Engine是当前最为流行的游戏引擎之一,具有丰富的游戏开发功能和强大的游戏引擎渲染能力。 二、基础 UE5官方文档:UE5官方文档非常详细,介绍了UE5的各个功能和应用,适合入门学习和深入探究。链接:htt…

Pytorch基础 - 0. Tensor数据类型与存储结构

目录 1. Tensor数据类型 2. Tensor存储结构 在讲PyTorch这个系列之前,先讲一下pytorch中最常见的tensor张量,包括数据类型,创建类型,类型转换,以及存储方式和数据结构。 1. Tensor数据类型 (1) 一共包括9种数据类型…

深度学习基础入门篇[六]:模型调优,学习率设置(Warm Up、loss自适应衰减等),batch size调优技巧,基于方差放缩初始化方法。

【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…

HIve安装配置(超详细)

文章目录 Hive安装配置一、Hive安装地址二、Hive安装部署1. 把 apache-hive-3.1.2-bin.tar.gz上传到Linux的/export/software目录下2. 解压apache-hive-3.1.2-bin.tar.gz到/export/servers/目录下面3. 修改apache-hive-3.1.2-bin.tar.gz的名称为hive4. 修改/etc/profile&#x…

如何用四元数表示姿态差

在机器人控制中,经常需要控制末端工具的姿态,如果用欧拉角表示姿态,会出现万向锁的问题,而使用四元数就不会有这个问题,此外四元数求出的姿态差为一个标量,更容易在RL算法中使用。 首先,假设末端…

初始化一个Vue3+TS项目

目录 一.创建基本的项目结构: 二. 项目搭建规范: 集成editorconfig配置: 使用prettier工具: 使用ESLint检测 : 项目目录结构划分: CSS样式的重置: 全家桶 – 路由配置: 全家桶 – 状态管理: 网络请求封装axios: 区分 development和production 环境: Element-Plus集成…

第1章、C++基础

第1章、C基础 1.1 命名空间 1.1.1 命名空间的含义 在使用C进行大规模程序设计时,开发过程往往是团队合作,各个程序员命名和各种C库,对标识符的命名可能发生冲突,从而引进命名空间(一种特殊的域)的概念&a…

MIPI D-PHYv2.5笔记(19) -- Fault Detection

声明:作者是做嵌入式软件开发的,并非专业的硬件设计人员,笔记内容根据自己的经验和对协议的理解输出,肯定存在有些理解和翻译不到位的地方,有疑问请参考原始规范看 检测链路的故障有三种不同的机制。总线冲突&#xff…

10.1 二重积分的概念与性质

学习目标: 学习二重积分,我会采取以下几个步骤: 了解基本概念:首先我会学习二重积分的定义及其意义,了解二重积分的性质和特点,以及二重积分的计算方法。 理解二重积分的几何意义:我会通过画图…

Window10 源码编译UE4-27

Window10 源码编译UE4-27 文章目录 Window10 源码编译UE4-27一、查看官方软件软件环境配置([https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/DevelopmentSetup/VisualStudioSetup/](https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/…

编写高质量代码:改善Java程序的151个建议(数组和集合)

集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法有关系吗?有关系,在compareTo的返回为0时,它表示的是 进行比较的两个元素时相等…

SRv6项目实践(三):P4Runtime基础以及交换机控制

在正式介绍P4runtime基础之前,先说一说P4的编译和实现的过程 bmv2.json:p4文件经过编译器编译以后会生成bmv2.json文件,此文件以JSON格式定义BMv2 simple_switch目标的配置。当simple_switch接收到新的数据包时,它使用此配置以与…

24.Spring练习(spring、springMVC)

目录 一、Spring练习环境搭建。 (1)设置服务器启动的展示页面。 (2)创建工程步骤。 (3)applicationContext.xml配置文件。 (4)spring-mvc.xml配置文件。 (5&…

新建论文三线表模板,一键格式刷

论文三线表模板 写在最前面①表设计,新建表格样式②三线表上下线③三线表标题线④设置表格居中⑤设置表头格式容易出错的步骤 写在最前面 论文写完啦,准备调整格式 之前建模也是三线表,但只能基于该文档模板,所以重新设置一下。 …

linux speedtest-cli工具测试网络带宽、测试网速(下载速度、上传速度和延迟等信息)

speedtest-cli是一个命令行工具,用于测试网络的带宽。它可以在Linux、macOS和Windows等操作系统上运行。下面是使用speedtest-cli测试网络带宽的步骤: 安装speedtest-cli。在Linux系统上,可以使用以下命令安装: sudo apt-get in…