httpserverupstreamlocationProxy
这四个模块是常用的模块,一般我们有这四个指令就可以将网站文件通过端口映射出来。
# 指令块http {# 指令# mime.type 含有很多的文件后缀名,和文件关系对照表。include mime.types;upstream feup {server 127.0.0.1:3000;}server {listen 80;server_name localhost;location / {root /var/www/html;index index.html index.htm;}}server {listen 3000;server_name localhost;location / {root /var/www/feup;index index.html;try_files $uri /index.html @router;}}server {listen 80;server_name feup.kaikeba.com;location / {proxy_pass http://feup;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;}}}
上面的配置文件包含了一些最简单并常用的访问配置。分别对应下面三个地址:
# nginx的默认访问地址,对应/var/www/html目录http://127.0.0.1# feup打包后的访问地址,对应/var/www/feup目录,而且做了路由重定向http://127.0.0.1:3000# 我们将feup.kaikeba.com映射到了3000端口,接下来做一个本地hosts映射就可以通过这个地址来访问feup了http://feup.kaikeba.com
指令 directive
include mime.types;
指令可以接受多个参数,参数用空格分割。
可以将它看成 js 里的函数一样。
// 伪代码function directive(feature, ...props) {return feature(...props);}
两个指令之间,使用分号作为分隔符。所以也可以像下面这样写
通常不建议这样,因为可读性会变得很差。
location ~* \.(gif|jpeg|png|jpg)$ {expires 3m; proxy_cache my_zone;}
指令块 directiveBlock
后面跟大括号的就是指令块,它的作用就是将多条指令组合在一起。
有些指令块可以有名字,有些是没有名字的。而且指令块内也可以包含其他指令块。
至于什么时候有名字,什么时候不带名字,这个是由提供这个指令块的模块来决定的,可以决定这个指令块有多少个参数。
http {# upstream 把 server指令 放在了 feup 指令块下面。upstream feup {server 127.0.0.1:3000;}}
http 模块
代表在 http 模块内的所有指令和指令块,都是由 http 模块去解析去执行的。
upstream 模块
代表着上游服务,比如我们有个 node 服务、tomcat 服务。需要与这些服务交互的时候可以定义一个 upstream。
# Syntax:upstream name { ... }# 默认情况下,使用加权循环平衡在服务器之间分配请求# 默认顺序轮询# [http]upstream api_server_upstream {server 127.0.0.1:3000;server 127.0.0.1:3001;server 192.168.111.111:80;}# 带权重# [http]upstream api_server_name {# 如果有7个请求,其中5个请求会到这个3000端口中。其余两个会被分配到其他两个,如果有一个服务挂掉了,那么将会向下重新请求,如果所有的都没有得到响应,那么将会返回最后一个服务的请求结果。server 127.0.0.1:3000 weight=5;server 127.0.0.1:3001 weight=1;server 192.168.111.111:80 weight=1;}# ip_hash# 根据用户请求过来的ip,然后映射成hash值,然后分配到一个特定的服务器里面。# 从而保证同一个用户过来的请求,只会进入到同一台特定的服务中,会话不会出现在其他服务中。## 一旦使用了ip_hash,当我们需要移除一台服务器的时候,不能直接删除这个配置项,而是需要在这台服务器配置后面加上关键字down,表示不可用;# 因为如果直接移除配置项,会导致hash算法发生更改,后续所有的请求都会发生混乱;## [http]upstream api_server_upstream {ip_hash;server 127.0.0.1:3000;server 127.0.0.1:3001;server 192.168.111.111:80;}# 设备状态 down/backup# [http]upstream api_server_upstream {ip_hash;server 203.18.225.19:80 down; // 服务器暂时不参与负载server 203.18.225.19:81;server 203.18.225.20:80 backup; // 当其他过于繁忙时,参与负载}# 还有更多用法,可以下去了自己研究研究。
server 模块
用于对应一个域名或者一组域名。
location 模块
url 表达式,针对不同 url 做出不同的指令动作。
语法
# Syntax:# [server]location [ = | ~ | ^~ | ~* ] uri { ... }location @name { ... }
具体使用
# location = // 精准匹配# location ^~ // 前缀匹配# location ~ // 正则匹配# location ~* // 不区分大小写正则匹配# location / // 无修饰符的匹配# 完全匹配location = /a {[ configuration A ]}# 前缀匹配优于正则匹配location ^~ /images/ {[ configuration D ]}# 区分大小写正则匹配location ~ \.(gif|jpg|jpeg)$ {[ configuration E ]}# 不区分大小写正则匹配location ~* \.(gif|jpg|jpeg)$ {[ configuration E ]}# 匹配前缀location /a {[ configuration B ]}
alias 和 root
# [server]location /image {alias /root/html/image/;}# alias: 当请求/image/a.jpg-->替换成 /root/html/image/a.jpg# [server]location /image {root /root/html/image;}# root: 当请求/image/a.jpg-->替换成 /root/html/image/image/a.jpg
- alias 匹配路径全替换
-
Proxy
# 配合location使用。proxy_pass http://xxx;
- 通用代理
实现一个简单的反向代理负载均衡
worker_processes 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;upstream proxyuri {# 被代理的服务器列表server 101.200.110.12:8080 weight=2; # 这个配置比较高,所以让他承担了一半的请求server 101.200.110.13:8080 weight=1;server 101.200.110.14:8080 weight=1;server 101.200.110.15:8080 backup; # 当其他过于繁忙的时候,参与负载}server {listen 80;server_name xx.kaikeba.com;location / {proxy_pass http://proxyuri;}}}
