Nginx-基础篇-2【基础配置和应用】
本文最后更新于 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的情况下,会多出数据从服务器磁盘读到服务器内存,然后再写给网络接口缓存,再通过复杂的中间操作,通过字节流传给请求端,然后请求端再获取。
开启之后,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是一种将域名解析请求通过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)来控制缓存时间,以避免缓存过期导致的问题。
- 感谢你赐予我前进的力量