Skip to content

重生之我在摸鱼学Nginx

About 2500 wordsAbout 8 min

nginx

2024-01-31

一、为啥需要 nginx?

nginx 是一个 web 服务器,能做反向代理、负载均衡这些功能; 另外一个原因就是 nginx 免费呀。

二、什么是正方向代理?

正向代理,就是需要一个服务给你代理你才能访问上目标服务器,像是 vpn。 反向代理,就是你没有感觉,你访问目标服务器,但是你不知道目标服务器具体是走的那个地址的服务。

三、Nginx 配置文件详解

nginx 的配置文件一般都是在/etc/nginx/nginx.conf 里面,mac 的话是放到/usr/local/etc/nginx/nginx.conf 里面。

nginx 里面#代表注释。

1、全局块

work_process 1;
从配置文件开始到 events 块之间的内容,主要设置一些影响 nginx 服务器整体运行的配置指令,主要包括:配置运行 nginx 服务器的用户(组)、允许生成的 worker process 数、进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。 上面配置 worker_processes,这是 nginx 服务器并发处理服务的关键配置,该值越大,可以支持的并发处理量就越多,但是会受硬件制约。

2、event 块

events{
    worker_connections 1024;
}

event 块设计的指令主要影响 nginx 服务器与用户的网络连接,常用的设置包括:是否开启多个 work process 下的网络连接进行序列化,是否运行同时接受多个网络连接,选取那种驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。 上面设置 worker_processes 支持的最大连接数为 1024。

http 块

这部分是 nginx 服务器配置中最频繁的部分,代理缓存和日志定义等绝多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。下面的反向代理、动静分离、负载均衡都是在这部分里面配置。

① http 全局块

http 全局块配置的指令包括:文件引入、mime-type 定义、日志自定义、连接超时时间、单链接请求数上线等。

② server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分全局 server 块,以及可以同时包含多个 location 块

全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称和 IP 配置。

location 块

一个 server 块里面可以配置多个 location 块。 这块主要作用是基于 nginx 服务器接受到的请求字符串,例如 server_name/uri_string, 对虚拟主机名称之外的字符串/uri_string 进行配置, 对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

四、反向代理

1、反向代理实例一

server{
    listen 80;
    server_name 192.168.31.134;
    location / {
        root html;
        index index.html index.htm;
        proxy_pass http://127.0.0.1: 8081;
    }
}

这个配置的意思就是:nginx 反向代理服务监听 192.168.31.134:80,如果有请求过来,则转到 proxy_pass 配置的对应服务器上,仅此而已。

2、反向代理实例二

server{
    listen 9001;
    server_name 192.168.31.134;
    location ~ /edu/ {
        proxy_pass http://127.0.0.1:8080;
    }
    location ~ /vod/ {
        proxy_pass http://127.0.0.1:8081;
    }
}

访问 192.168.31.134:9001/edu/ 直接跳转到 127.0.0.1::8081 访问 192.168.31.134:9001/vod/ 直接跳转到 127.0.0.1::8082

补充: location 指令说明 该指令用于匹配 url,语法如下:

location [ = | ~ | ~* | ^~ ] url {

}
  • = 用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理改请求。
  • ~ 用于表示 uri 包含正则表达式,并区分大小写
  • ~* 用于表示 uri 包含正则表达式,并且不区分大小写
  • ^~ 用于不含正则表达式的 uri 前,要求 nginx 服务器找到标识 uri 和请求

重点知识点

1、加/与不加/的区别

加/

在配置 proxy_pass 代理转发的时候,如果后面的 url 加/,表示绝对根路径;如果没有/,表示相对路径,例如:

server{
    server_name wiki.dengcong.com.cn;
    location /data/ {
        proxy_pass http://127.0.0.1/;
    }
}

访问 wiki.dengcong.com.cn/data/index.html 会转发到http://127.0.0.1/index.html

不加/

server{
    server_name wiki.dengcong.com.cn;
    location /data/ {
        proxy_pass http://127.0.0.1;
    }
}

访问 wiki.dengcong.com.cn/data/index.html 会转发到http://127.0.0.1/data/index.html;

补充

autoindex on

autoindex是nginx配置的一个指令,可以控制nginx是否允许浏览器中显示一个目录内容,当autoindex被设置成on的时候,nginx将展示一个包含该目录所有文件和子目录链接的html界面。

简单来说就是将服务的目录在html页面中呈现。

增加代理路径

今天学到一点nginx的知识,下面我简单说一说。

第一个就是代理路径的问题,前端给到我一个静态文件夹,我需要对这个目录进行代理,开始的代理路径如下:

location / {
		# app的root不要到index.html目录
		root /home/cmes/project/nginx/app;  // 因为给的是一个h5的应用,项目里面默认有一个h5的路径
		index  index.html index.htm;
		try_files $uri $uri/ /index.html /index.htm; # 为了处理前端路由
}

我把文件放到了app下面,是一个h5的文件夹,后面访问的路径是 http://localhost:8080/h5/,但是在集成企业微信的时候,这个h5的路径重复了,被别人提前使用了, 所以只有调整成其他路径。

后面就修改了h5文件夹的存放目录,在/home/cmes/project/nginx/app目录下创建了一个resolve的目录,将h5放到了resolve下面,nginx也没有改,后面访问的路径就是 http://localhost:8080/resolve/h5/,这样实现了不同的前缀路径。

但是会遇到一个问题,就是会找不到项目里面的js文件,因为js请求的路径还是 http://localhost:8080/h5/xxx.js

第二个就是代理后端路径,开始使用的api来做转发,api也重复了,所以需要另外的代理路径,后面改成了resolveApi,这样的话前端的请求路径就需要改一下。

location ^~ /resolveApi/ {
	  proxy_pass http://127.0.0.1:8481/;
}

include server/*;

对于nginx的配置文件,可以进行拆分,拆分成多个文件。

http {
	include server/*;  // 这句话的意思就是将 server目录下的所有文件拼接在一起
}

下面是server下面的一个文件的内容。

dengcong@iZ2vc34h4mxsxearc36g2yZ:/etc/nginx$ ls server/
bj.conf
dengcong@iZ2vc34h4mxsxearc36g2yZ:/etc/nginx$ cat server/bj.conf 
server {
    listen 8085;
    server_name 8.137.xxx.xx;
    location / {
        proxy_pass http://localhost:8090;
        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;
    }
}

rewrite

rewrite是nginx里面一个重要功能,实现url重定向功能。

地址转发和地址重写

地址重写是为了实现地址的标准化,比如在地址栏里面输入www.baidu.com,也可以输入www.baidu.cn都会显示www.baidu.com

地址转发是指在网络数据传输过程中数据分组到达路由器后,改设备通过检查分组地址并将数据转发到最近的局域网的过程。

地址转发和地址重写的不同点:

1、地址重写会改变浏览器中的地址,使之变成重写浏览器最新的地址。而地址转发他是不会改变浏览器的地址。

2、地址重写会产生两次请求,而地址转发只会有一次请求。

3、地址转发一般发生在同一站点项目内部,而地址重写不受限制。

4、地址转发的速度比地址重定向快。

rewrite用法

Nginx中Rewrite的重定向配置与实践

rewrite regex replacement [flag];
  • regex:用于匹配url的正则表达式
  • replacement:将regex正则表达式的内容替换成replacement
  • flag:flag标记,有四个选项。
    • last:本条规则匹配完之后,继续向下匹配(不常用)
    • break:本条规则匹配完之后,不再匹配后面的任何规则(不常用)
    • redirect:返回302临时重定向,浏览器会显示跳转的新的url。当第一个请求的服务器宕机,没办法访问第二个请求地址
    • permanent:返回301永久重定向,浏览器会显示跳转的新的url。当第一个请求的服务器宕机,在不刷新页面,可以跳转到第二个请求地址。

例如:

rewrite ^/(.*) http://www.baidu.com/$1 permanent;
  • ^/(.*) 表示匹配完整的域名和后面的路径地址
  • http://www.baidu.com/$1 其中1是取regex部分()里面的内容
server{
  location ^~/api {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header ...;
    proxy_buffering off;
    rewrite ^/api/(.*)$ /$1 break;  # 这句配置的含义就是去掉url里面的api
    proxy_pass http://192.168.0.1;
  }
}

防盗链及nginx配置

**什么是防盗链?**盗链可以理解盗图链接,也就是说把别人的图片偷过来用在自己的服务器上,那么防盗链可以理解为防止其他人把我的图片盗取过去。防盗链远离就是客户端请求服务端资源,服务端资源不一次性全部给你,当客户端解析文本发现图片没有再次请求的时候,就会判断是不是指定服务器请求的图片,如果是就返回,否则就不返回。

server {
				# bing 每日壁纸
				location /bingWallpaper_hud {
				valid_referers none blocked  *.baidu.com  *.taobao.org;
								if ($invalid_referer) {
										rewrite ^/ https://bing.img.run/rand_uhd.php;
								}
				}
}

访问控制

server {
  listen 80;
  server_name loclhost;
  location / {
    # 拒接指定ip
    deny 127.x.x.x;
    # 除了写具体ip 还可以写网段
    deny 192.168.1.0/24;
    # 允许所有其他ip
    allow all;
    proxy_pass http://localhost:8081;
  }
}

限流

虚拟主机

Changelog

Last Updated: View All Changelog
  • feat(wiki): algo: 算法总结

    On 3/30/25

求求了,快滚去学习!!!

求求了求求了,快去学习吧!

【题单】贪心算法

不知道方向的时候,可以多看看书,书会给你指明下一步该干什么,加油!