VueMastery
![VueMastery](https://sponsors.vuejs.org/images/vuemastery.avif)
推荐教程
Nginx
核心知识:技术蛋老师讲解NginxNginx
工作原理图 本机安装
nginx
基于红帽 Centos 7.6
版本
$ yum -y install nginx
$ systemctl start nginx # 启动nginx
$ systemctl status nginx # 查看nginx状态
$ systemctl restart nginx # 重启nginx
$ nginx -s stop # 快速停止nginx
$ nginx -s quit # 优雅关闭nginx,在退出前完成已经接收的连接请求
$ ngixn -t # 测试配置是否有效
$ nginx -s reload # 重新加载配置文件
$ nginx -t && nginx -s reload # 每次对配置文件进行修改后,需要重新加载配置文件才能生效
$ ps -ef | grep nginx # 查看所有的nginx进程
$ ps -aux | grep "nginx: master process" # 查看nginx主进程
$ kill -9 <pid> # 强制杀死进程
$ systemctl start nginx # 等待半分钟后再启动,遇到的一些问题基本上就能解决
$ systemctl daemon-reload # 重新加载系统服务配置
说明:
yum install
安装的 nginx
的默认配置如下:nginx
配置文件路径: /etc/nginx/nginx.conf
nginx
默认配置的对外共享资源路径:/usr/share/nginx/html/
nginx错误请求日志文件
: cat /var/log/nginx/error.log
nginx成功请求日志文件
: /var/log/nginx/access.log
记录了所有成功的请求日志tail -f /var/log/nginx/error.log
命令实时刷新查看错误日志文件在
C:\\Windows\\System32\\drivers\\etc\\hosts
文件中追加自己想要解析的IP地址
和域名
关系。(也就是追加你本地的ip 和 域名
对应关系,当在浏览器访问时,首先从本地看该域名是否有对应的ip地址
,有的话就会想本地解析出来的ip地址
发起资源访问。没有的话就向DNS
服务器发起请求,请求到对应的ip地址
,再向该ip地址
发起资源访问。)
# other settings
192.168.40.20 nginx.zhouyu2156.com
DNS
域名解析
- 利用云解析
DNS服务器
的方式来解析我们本地的服务器IP
也行,添加一条记录将域名
指向我们的本地的服务器IP
。
events {
# event是用来告诉nginx如何处理连接的,可以为空,但不能没有
}
http {
# 这个块记录http服务配置
include /etc/nginx/mime.types; # 引入mime类型配置文件(这个记录了告诉客户端每种后缀的资源解析(渲染)方式)
include /etc/nginx/conf.d/*.conf; # 引入其他配置文件, 这里引入了我自定义的 default.conf 文件
}
server {
# 这个块记录服务器配置
listen 80; # 监听外部访问的端口
server_name localhost; # 配置匹配外部请求时的域名
root /app/dist/; # 返回的静态资源根目录
index index.html; # 指定默认返回的首页文件, 可以是其他文件名
}
注意事项:
server
块下直接定义的root
表示所有请求默认寻找资源的根路径。location
块中定义的root
表示匹配某个特殊请求路径时寻找资源的根路径。server
块的return
指令返回自定义内容server {
listen 80;
server_name localhost;
# 格式: return 状态码 消息;
return 200 "this is return directive message.\n";
}
server_name
块配置 支持的配置方式
server_name zhouyu2156.cn www.zhouyu2156.cn; # 支持配置多个,以空格分隔开每个域名
server_name *.zhouyu2156.cn;
server_name zhouyu2156.*;
server_name ~^www\.zhouyu2156\.com$; # 使用正则表达式的语法来匹配符合规则的所有域名
location
块配置 注意事项:
/path
表示访问的是 /path
路径对应的文件,也就是访问路径末尾不带/
表示访问的是一个具体的文件/path/
表示访问的是 /path/
路径对应的默认返回文件,也就是访问路径末尾带/
表示访问的是一个目录,而目录是不会直接返回给你的,只能返回一个默认的文件资源咯。(模糊匹配)
指定匹配具有某段字符开头的请求提示:
location
后面定义的一段开头字符,就会匹配成功。比如我们的location
定义为/app
,那么用户可以成功访问至少以/app
字符开头的所有请求,比如/apple/
、/app/Programming
等,只要后面的资源路径能够与root
指令中的路径拼接成功,都会返回资源。解释:
下面这段代码,首先假设我们有个资源的路径资源
/app/apple/Prgramming/index.html
/apple/Programming
路径时,那么location
模糊匹配到了/app
开头的请求,因为请求路径是/apple/Programming
嘛location
块中,将location
块的root
指令中的资源路径与请求路径进行拼接,得到/app/apple/Programming
,当发现末尾没有/
结尾,说明是要返回一个文件资源,经过查找没有Programming
这个文件资源,那么会尝试加一个/
重定向一下找/.../Programming/
资源,这是在请求一个/xxx/Programming/
下的默认文件资源,没有设置默认返回文件资源的话,那么就是返回该目录下的index.html
文件。请求路径
中具有我们location
中写的一段开头的匹配字符,就会匹配成功进入location
块中处理。server {
listen 80;
server_name localhost;
root /app/dist/;
index index.html;
location /app {
root /app/;
}
}
(绝对匹配)
指定完整路径匹配说明
请求路径
完全等于 /Programming/
时才能与location
后面的路径匹配上,从而再拼接location
块的root
指令对应的路径获取资源返回给用户。server {
listen 80;
server_name localhost;
root /app/dist/;
index index.html;
location = /Programming/ {
root /app/;
}
}
(正则匹配)
使用正则表达式匹配请求路径说明
location
块后面使用~
来启用正则表达匹配。~
后面添加*
表示忽略大小写。server {
# ...
location ~* /video/video[0-9].mp4 {
root /app/; # 返回 /app/video/video[0-9].mp4 所有资源。
}
}
模糊匹配
、精确匹配
、优先前缀
、正则匹配
匹配符 | 匹配规则 | 优先级 |
---|---|---|
= | 精确匹配 | 1 |
^~ | 以某个字符串开头(优先前缀) | 2 |
~ | 区分大小写的正则匹配 | 3 |
~* | 不区分大小写的正则匹配 | 4 |
!~ | 区分大小写不匹配的正则 | 5 |
!~* | 不区分大小写不匹配的正则 | 6 |
/ | 通用匹配(模糊匹配),任何请求都会匹配到 | 7 |
307
server {
# ...
location /temp {
return 307 /temp/tmp.html; # 状态码 新的资源路径
}
}
rewrite
指令可以更丝滑的重定向用户请求到新的路径资源。也就是在服务器端改写请求的资源获取路径。location
块的root
指令中的资源路径。如果没有,那么就以loaction / {}
中定义的root
为基础路径进行拼接。比如下面的配置,当我们访问http://域名/tmp
最终就会返回/app/Programming/index.html
资源server {
# ...
rewrite /tmp /Programming/index.html;
location / {
root /app/;
}
}
try_files
指令尝试匹配资源 server {
# ...
location / {
add_header X-debug-uri "$uri"; # add_header指令用于增加自定义响应首部
try_files $uri $uri/ =404; # 尝试匹配用户访问的路径资源,失败的话就再尝试匹配末尾加`/`目录下的资源,如果还是失败的话就返回404。
}
}
error_page
指令可以返回自定义的错误页面。server {
# ...
error_page 404 /app/dist/404.html;
}
proxy_pass
字段定义反向代理的服务器信息。server {
# ...
location / {
proxy_pass 192.168.40.20:3001; # 定义单个反向代理的服务器
# proxy_pass http://192.168.40.20:3001; # 两者都行,加不加http没有关系
}
}
upstream
指令定义反向代理的服务器集群。告诉nginx
把客户端的请求流量导到指定的服务器集群,再通过负载均衡分配到集群里面的服务器。weight
,并且自定义数值表示服务器的权重。weight
数值相对越大,被分配到的次数就会相对越多。upstream backend-servers {
server localhost:3000 weight=2;
server localhost:3001 weight=6;
# 定义反向代理的服务器集群...
}
server {
# ...
location /serve {
proxy_pass http://backend-servers; # 定义了upstream后,可以通过upstream名称来定义反向代理的服务器集群
}
}