文章目录
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
指定负载均衡模块以使用。
如果觉有收获,欢迎点赞👍/评论💬/收藏⭐️/关注👀~
如有错误欢迎指正👆,共同进步~