大前端化趋势已经越来越明显了,作为前端人需要具备的知识倒是越来越全面,最近刚好看到关于nginx相关的知识点,整理一下最基本的概念和配置文件,方便以后翻看。
nginx学习目录
1、基本概念
- nginx是什么,能做什么事情
- 反向代理
- 负载均衡
- 动静分离
2、nginx安装、常用命令和配置文件
-
linux安装
-
nginx常用命令
-
nginx配置文件
3、nginx 配置实例
- 反向代理实例
- 负载均衡实例
- 动静分离实例
1.基本概念
1.1 基本概念
nginx是一个高性能的HTTP和反向代理的web服务器,有占用内存少、性能稳定、并发能力强等优点,可支持高并发。
1.2 反向代理
先说什么是正向代理,即客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问(vpn)
反向代理,客户点对代理无感,只需要将请求发送到反向代理服务器,由==反向代理服务器去选择目标服务器==获取数据后,再返回给客户端。反向代理服务器和目标服务器对外就是一个服务器,暴露的只是代理服务器的地址,隐藏了真实的服务器IP地址。
1.3 负载均衡
简单来说就是将原先请求集中到单个服务器的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,这就是我们常说的负载均衡。
1.4 动静分离
简单的说就是把动态资源和静态资源分开部署,当客户端请求静态资源的时候,通过nginx去指向对应的静态资源服务器
2.nginx安装
2.1、nginx安装
现在演示的是window安装
先去下载window版本的nginx,nginx.org/en/download… 下载稳定版本,以nginx/Windows-1.12.2为例,直接下载 nginx-1.12.2.zip,然后解压。
2.2、nginx常用命令
启动nginx的方法
-
1、直接双击nginx.exe
-
2、打开cmd命令直接到目录下,使用start nginx / nginx.exe
-
3、检查是否启动成功
在浏览器地址输入http://localhost:80,出现页面说明则启动成功
或者 cmd命令行输入
tasklist /fi "imagename eq nginx.exe
就能看到启动的nginx服务器
-
4、配置启动端口,在config/nginx.conf文件里面修改
ps: 默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可
- 5、重启nginx服务器
nginx -s reload
- 6、关闭nginx
cmd命令输入
nginx -s stop
或者 用管理员身份
taskkill /im nginx.exe -f(推荐用这个)
2.3、nginx配置文件
ngnix 配置文件有三部分组成,分别是全局块,events块,http块
全局块
worker_processes 1;
//这是nginx服务器并发处理服务的关键配置,值越大,可支持的并发处理量越多,但是会受到硬件软件的制约
events块
主要涉及的指令影响nginx服务器和用户的网络连接
worker_connections 1024; //支持的最大连接数
http块
这是服务器配置中改动最频繁的部分,又可以分为http全局块,server块
- http全局块
包含文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单连接请求数上限等
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
- server
每个http块可以包括多个server块,每个server块相当于一个虚拟主机,可以同时包含多个location块。
server {
# 监听的端口号
listen 80;
# 服务名称 生产环境要修改成 公网ip 如 47.105.134.120
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 配置根目录的地址是以 nginx 下的 html 文件夹为根目录来查找的
# root html;
#配置默认的主页显示
location / {
root html;
index index.html index.htm;
}
# 配置跨域
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Header X-Request-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
# 配置访问别名
location /static {
alias D:/nginx-1.12.2/static;
autoindex on;
}
# 配置本地文件夹访问路径
location ~ .*\.(gif|jpg|jpeg|png)$ {
root D:/nginx-1.12.2/static/; #指定图片存放路径
proxy_temp_path D:/nginx-1.12.2/static/;#图片访问路径
proxy_redirect off;
}
# 错误匹配
#error_page 404 /404.html;
}
- location
匹配语法详解
语法规则: location [=||*|^~] /uri/ { … }
-
= 开头表示精确匹配
-
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头
-
~ 开头表示区分大小写的正则匹配 以xx结尾
-
~* 开头表示不区分大小写的正则匹配 以xx结尾
-
!~ 和 !~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
-
/ 通用匹配,任何请求都会匹配到。
location = / {
#规则A
}
location = /login { //精确匹配
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
#规则D,注意:是根据括号内的大小写进行匹配。括号内全是小写,只匹配小写
}
location ~* \.png$ {
#规则E
}
location !~ \.xhtml$ {
#规则F
}
location !~* \.xhtml$ {
#规则G
}
location / {
#规则H
}
3、nginx 配置实例
3.1、反向代理
配置请求转发的配置
server {
listen 80;
server_name 192.168.197.48;
#配置默认的主页显示
location / {
root html;
proxy_pass http://127.0.0.1:3000;
index index.html index.htm;
}
location ~ .*\.(gif|jpg|jpeg|png)$ {
root D:/nginx-1.12.2/static/; #指定图片存放路径
proxy_redirect off;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
最终呈现的效果就是,访问 localhost:80端口,则会反向代理到localhost:3000端口上
反向代理实例2
服务器我用的是express做启动,可以同时启动两个项目来做下面的例子。
访问http://127.0.0.1:80/edu/ 直接跳转到127.0.0.1:3000
访问http://127.0.0.1:80/vod/ 直接跳转到127.0.0.1:3001
server{
listen 80
server_name localhost
location ~ /edu/{
proxy_pass http://127.0.0.1:3000;
}
location ~ /vod/{
proxy_pass http://127.0.0.1:3001;
}
}
3.2、负载均衡
其实可以简单理解有多台服务器,配置代理后,nginx负载均衡算法采用轮询或者权重的策略去分配
- 1.轮询(默认)
按照访问时间顺序逐一轮流分配到不同的后端服务器,如果服务器不能访问,会自动剔除
- 2.权重weight
按照比例去分配访问权重,数值越大,占比越大,权重越高,默认是1
- 3.ip_hash
每个请求按照访问ip的hash结果分配,这样每个访客固定访问一个服务器,即第一次访问a,则后面一直分配是a
- 4.fair(第三方)
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver{
#ip_hash
server : 192.168.197.48:3000;
server : 192.168.197.48:3001;
#fair
}
server{
listen 80
server_name 192.168.197.48
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
3.3、动静分离
简单来说就是把动态资源请求和静态资源请求分开,可以通过nginx配置location指定不同的后缀名实现不同的请求转发。
server{
listen 80
server_name 192.168.197.48
location /images/ {
//可以访问到根目录下的static目录
root /static/;
autoindex on;
}
location ~ .*\.(gif|jpg|jpeg|png)$ {
root D:/nginx-1.12.2/static/; #指定图片存放路径
proxy_redirect off;
}
}