本文最后更新于 2023-09-19,文章内容可能已经过时。

1. Nginx配置和应用场景

1.1 最小配置【即默认开启的配置 去除注释的自定义配置】

1.1.1. worker_processes

worker_processes 1;

默认为1,表示开启一个业务进程。一般一个cpu核心对应一个woker进程,如果设置多了就只能分时调度,效率并不高

1.1.2. worker_connections

events{
	worker_connections 1024;
}

单个业务进程可接受连接数

1.1.3. include mime.types;

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

引入http mime类型,这个文件里面其实指明了各种文件类型和后缀名的对应关系,我们在网络上传输数据是二进制流的形式,需要在hhtp请求头写名文件的类型,这样接收端才能正常解码文件,正常读取传输的文件。

后面我们也会使用include命令引入多个配置文件,多人开发配置也是这么配置的,自己配置自己的配置文件,这样就不会出现同时打开一个配置文件,一个人打开另一个就不能打开了【竞争锁】。

1.1.4. default_type application/octet-stream

如果mime类型没匹配上,默认使用二进制流的方式传输。

1.1.5. sendfifile on

使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。0拷贝是指DMI,数据不需要从内存到CPU到内存,而是直接从内存再到内存。

未开启sendfifile的情况下,会多出数据从服务器磁盘读到服务器内存,然后再写给网络接口缓存,再通过复杂的中间操作,通过字节流传给请求端,然后请求端再获取。

image-20230713004838262

开启之后,nginx直接给网络接口缓存发送一个信号,由网络接口缓存直接发送给用户端。磁盘数据直接到内核缓冲区 而减少一次到应用程序内存的拷贝。

1.1.6. keepalive_timeout 65;

这里可以理解为保持长连接的时间,其实即有对客户端,也有对服务端的含义。反向代理会深入讲解配置和具体含义。

1.1.7. server

虚拟主机配置 vhost【virtual host】,一个nginx可以配置多个主机,一个server就对应一个主机

server {
        listen 80; 监听端口号
        server_name localhost; 主机名 域名
        
        
        location -> 可以当作子目录 -> uri 后续章节讲解
        URI 统一资源定位器 唯一  url里面包含多个uri 即资源路径
       
        location / { 匹配路径
        	root html; 文件根目录
        	index index.html index.htm; 默认页名称
		} 
        
        error_page 500 502 503 504 /50x.html; 
        报错编码对应页面-> 但这里没有对应文件 -> 所以写了一个location
        location = /50x.html {
        	root html;
        }
	}

1.2. 虚拟主机与域名解析

tcp/ip -> 以二进制流的形式约定进行数据传输

http -> 有很多对发收双方的约束,请求报文的头信息会携带本次发送的信息的内容的一些信息

https -> 在http协议之上,加了一层ssl证书,保障数据的安全

原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务

1.2.1 servername 匹配规则

我们需要注意的是servername匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。且通配符匹配的顺序要优于静态域名匹配的顺序,而正则匹配的优先级最高。当都无法匹配,而在外网的dns域名解析我们的设置的域名映射是通配符开头,nginx没有设置对应的,nginx会把它分配给第一个vhost

1.2.2 完整匹配

我们可以在同一servername中匹配多个域名

server_name vod.mmban.com www1.mmban.com;

1.2.3 通配符匹配

server_name *.mmban.com

1.2.4 通配符结束匹配

server_name vod.*;

1.2.5 正则匹配

波浪号代表接下来要使用正则匹配了

server_name ~^[0-9]+\.mmban\.com$;

1.2.6 实战配置

在根目录下创建www文件夹,然后在内部创建两个文件夹www和vod,同时在他们内部创建两个测试用的index.html文件。并改写配置文件如下。

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
   
    # 虚拟主机 vhost
    server {
        listen       80;
        server_name  localhost;

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

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       88;
        server_name  localhost;

        location / {
            root   /www/vod;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

此时需要重启nginx服务器,我们使用之前学过的命令进行操作。

systemctl restart nginx
systemctl reload nginx

因为之前将nginx配置成服务了,所以就可以用systemctl的方式开启、关闭nginx服务。也可以到对应sbin目录下使用下面的命令。

nginx -t  
nginx -s reload

然后我们访问 http://192.168.110.100:88/http://192.168.110.100 即可完成访问我们写的欢迎页

同时我们也可以都设置成80端口,但设置不同的域名或者主机名,仍能访问。即可以通过相同端口不同域名,或相同域名,不同端口进行虚拟主机分配。这两者的集合构成一个唯一标识,不能配置域名和端口号都相同的不同虚拟主机。

1.2.7 域名解析相关企业项目实战技术架构

1. 多用户二级域名:可以基于DB或者写上面的vh配置文件

二级域名

2. 短网址

短网址

短网址是通过将长网址转换为短字符串来实现的,这样可以缩短URL长度,方便用户记忆和分享。在Nginx中,可以通过使用ngx_http_rewrite_module模块来实现短网址的转换。

具体实现方式如下:

首先需要在Nginx配置文件中定义一个location,用于接收短网址的请求。
在该location中,可以使用rewrite指令来将短网址转换为长网址。例如,可以使用正则表达式来匹配短网址,并将其转换为对应的长网址。
如果需要将长网址转换为短网址,可以使用Nginx的变量和自定义函数来生成短字符串,并将其与长网址进行映射。
最后,可以将映射关系存储在Nginx的缓存中,以提高性能和减轻数据库负担。
需要注意的是,在实现短网址时,需要考虑到安全性和唯一性。为了防止恶意用户生成重复的短字符串,可以使用随机数或时间戳等方式来生成唯一的短字符串。同时,也需要对短网址进行访问权限控制,以避免被非法访问或滥用。同时为了防止Nginx缓存过多,可以像上图一样使用数据库进行存储KV,每次接受查询进行数据库查询。

3. HTTPDNS

httpdns

HTTPDNS是一种将域名解析请求通过HTTP协议进行转发的方式,以解决DNS污染等问题。与传统DNS不同的是,HTTPDNS的解析结果并非通过UDP或TCP协议返回,而是通过HTTP协议返回。

在Nginx中,可以通过HTTP模块中的resolver指令来指定DNS服务器地址。在resolver指令中,可以指定多个DNS服务器地址,它们会按照顺序逐个进行解析,直到解析成功。如果所有的DNS服务器都无法解析成功,则会返回解析失败的响应。

当使用HTTPDNS时,可以将HTTP请求发送到指定的HTTPDNS服务器,该服务器会返回解析结果。在Nginx中,可以通过ngx_http_upstream_module模块来实现将HTTP请求发送到指定的HTTPDNS服务器,并将结果缓存起来以提高性能。同时,也可以通过设置TTL(Time To Live)来控制缓存时间,以避免缓存过期导致的问题。