文章目录
0. 前言
早闻nginx大名,前来学习记录。
nginx (engine x) 是一个高性能的HTTP和反向代理 WEB 服务器。
可能会有人只知道它能反向代理、负载均衡(比如笔者?),但它其实还可以作为网络服务器。
反向代理的浅显解释:小明访问了某个网站,但它把请求转发到别的网站去了,而他啥也不知道。
负载均衡的浅显解释:小明访问了某个网站999次,它把其中222次转发到了A网站,333次转发到B网站,444次转发到了C网站,而他啥也不知道。
所以大概有个概念:(小明啥也不知道?)反向代理和负载均衡都是服务器端的操作,对于访问者/客户端是无感知的。
1. 安装与命令行使用
官方下载地址:nginx
下载Stable version版本即可:
Windows下载后解压就能用,在解压目录下使用命令行进行启动、退出、重载配置文件等操作:
Windows 10系统可以在目录下Shift+右键-->在此处打开 PowerShell 窗口。
# 在解压目录下打开命令行
# 启动nginx
./nginx.exe
# 退出
./nginx.exe -s stop
# 安全退出
./nginx.exe -s quit
# 重载配置文件,很常用
./nginx.exe -s reload
以上列出了最常用的内容,其它支持可以使用./nginx.exe -h查看帮助❓,毕竟授人以鱼?不如授人以渔⛵️~
验证一下Nginx服务器是否已经运行,从浏览器输入localhost,出现Welcome to nginx!页面即可:
2. 配置文件
2.1 概述
配置文件是nginx的主战场。默认配置文件在nginx解压目录下的conf/nginx.conf文件。
配置文件是通过一个个⚙️模块组织起来的,模块可以嵌套。可以按照作用域来理解,常用模块关系如下:
main # 文件所有内容在main模块中
|---event # 事件模块
|---http # 网络模块
|---|---server # 服务器
|---|---|---location # 资源定位
|---|---upstream # 负载均衡
最外层是main模块,不用声明,其它模块可以用模块名+参数+大括号来声明:
#最外层的main模块不用声明
worker_processes 1;
http {
server {
listen 80;
location / {
root html;
index index.html index.htm;
}
}
}
本小节不介绍具体用法,只明白其组织形式:
❗️
nginx的配置文件通过模块来组织,模块的声明方法是模块名+参数+大括号,最外层的main模块不用声明;❗️❗️ 模块中可以有语句,也可以嵌套其它模块;
❗️❗️❗️ 模块中的语句都需要使用分号结尾;
❗️❗️❗️❗️ 可以采用
nginx.exe -t来测试配置文件是否存在语法错误。
2.2 http模块
http模块负责处理各种http请求,可以在其中添加很多服务器,对服务器请求进行反向代理、负载均衡,对文件传输进行类型控制、压缩传输等。
2.2.1 server模块
server模块定义了一个服务器,指定?监听IP地址:端口,如http://localhost:9090,常用指令如下:
# 服务器
server {
# 监听9096端口
listen 9096;
# 监听localhost网址,也可以改成如192.168.1.100类似,只要本机上存在
server_name localhost;
# 指定字符集,中文乱码时或使用utf-8解决
charset utf-8;
# 匹配根目录
location / {
# 表明网页中载入文件时,对应到本机的某个目录下去定位
# 如请求文件为 /js/xxx.js , root目录下要有 /js/xxx.js 文件
root D:/WebServer/;
# 表明访问localhost:9096时显示的html文件,在root目录下需要有test.html文件
index test.html;
}
# 开启目录索引,开启后可以访问目录(如:localhost:9096/js)
# autoindex on;
}
其中的location模块在下面具体说明一下。
2.2.2 location匹配请求
location模块位于server模块中,用于配置服务器对不同请求执行不同处理。
1️⃣ 如
server监听了localhost:9096,在浏览器中输入localhost:9096/somedir/somefile.txt将向服务器请求/somedir/somefile.txt;
2️⃣ 如在html文件中指定src=/pic/1.jpg,将向服务器请求/pic/1.jpg。
模块的使用方法如下:
# 一个server模块中可以有多个location模块
location [修饰符] 定位符 {
# location可以嵌套
location [修饰符] 定位符{
}
}
其中修饰符可以不加,或者常用的有如下几种:
=精确匹配,uri要完全一致才行;~正则匹配,大小写敏感;~*正则匹配,忽略大小写;^~前缀匹配,当前缀匹配成功时,将屏蔽正则匹配。
其中正则匹配可以稍微介绍一下:
- 典型例子:匹配多种图片文件:
~* \.(jpg|png|gif)$☀️
~*表明使用正则匹配
?\.匹配.,不转义将被匹配为当前目录的.
?(a|b|c)表示挑一个
☁️$表示匹配结尾,^表示匹配开头 - 正则匹配容易疏忽的点:比如请求的
uri为0.jpg、/jpg/1.jpg、/png/2.jpg都将通过匹配,如果是请求静态文件,目录组织不好(如0.jpg 1.jpg 2.jpg其实放在了同一个文件夹中),稍不注意就容易404 Not Found。
匹配完成后,不同的请求将使用location中定义的处理方法进行处理。
2.2.3 location处理配置
上一小节介绍了location模块如何匹配请求,本小节介绍对于匹配好的请求,具体如何处理。
由于是入门介绍,只挑几个基本操作(复杂的笔者也不会?):
location /file/ {
# 指定根目录,从该目录下取文件
root D:/WebServer/;
# 将请求转发给另一个服务器地址
# proxy_pass http://192.168.1.100:9096;
# 将请求进行负载均衡,见下一小节
# proxy_pass http://upstream_name;
# 默认打开网页文件files.html或files.htm,前者找不到则找后者
index files.html files.htm;
# 允许 192.168.1.123 访问
allow 192.168.1.123;
# 其余都不允许访问,将出现 403 Forbbiden
deny all;
}
主要有:
☀️ root指定根目录,用于读取静态文件由其好用;
? proxy_pass指定转发地址,或者负载均衡配置地址;
? allow指定允许访问的IP;
☁️ deny指定禁止访问的IP,访问将出现403 Forbbiden。
其中proxy_pass值得注意,后面的IP地址可有如下几种变化:(此处以请求/pic/1.jpg为例,location匹配了/pic/)
1️⃣ 纯地址+端口,有无
/对比:
?http://localhost:9000请求http://localhost:9000/pic/1.jpg
?http://localhost:9000/请求http://localhost:9000/1.jpg
2️⃣ 地址+端口+目录,有无/对比
?http://localhost:9000/test请求http://localhost:9000/test1.jpg
?http://localhost:9000/test/请求http://localhost:9000/test/1.jpg
对于location请求服务器静态资源(如图片、html、js、css文件等)时,以下思路可供参考:
1️⃣ 只使用根目录匹配,指定root目录,即
location / {
root D:/WebServer/;
index index.html index.htm;
}
2️⃣ 将文件按目录组织好,如css文件单独存放在文件夹,最后统一放到root文件夹下;
3️⃣ 在html中引用静态文件时,统一采用folder/filename定位,如:
<script src="js/test.js"></script>
静态资源文件使用正则匹配这些感觉有些花里胡哨,杀鸡?牛?刀?;
官方文档可参考:location
2.2.4 upstream负载均衡
典型upstream模块使用例子:
# 给这个负载均衡方案取名 backend
upstream backend {
# 声明ip_hash;后,对不同ip地址进行hash映射,保证同一个ip地址多次连接,服务器不变
# ip_hash; # 不声明时默认按权重轮询
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
# 处理该请求时使用声明的负载均衡方案
proxy_pass http://backend;
}
}
要点如下:
1️⃣ 给负载均衡模块起名,在upstream后添加名称;
2️⃣ server声明要转发的服务器地址,后面添加weight权重,权重越大,转发到该服务器的请求越多;
3️⃣ 在location模块中,使用proxy_pass指定负载均衡模块以使用。
如果觉有收获,欢迎点赞?/评论?/收藏⭐️/关注?~
如有错误欢迎指正?,共同进步~