Nginx本身也是必备一个静态资源的服务器,当只有静态资源的应用时候,就可以使用Nginx来做服务器 ,场景如果一个网站只是全解静态页面的话,那么就可以通过这种方式来实现部署 。实用
1 、必备 首先在文档根目录Docroot(/usr/local/var/www)下创建html目录,应用 然后在html中放一个test.html;
图片
2 、 配置nginx.conf中的场景server;
复制user mengday staff; http { server { listen 80; server_name localhost; client_max_body_size 1024M; # 默认location location / { root /usr/local/var/www/html; index index.html index.htm; } } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.3、访问测试;
http://localhost/ 指向/usr/local/var/www/index.html,全解 index.html是安装nginx自带的高防服务器htmlhttp://localhost/test.html 指向/usr/local/var/www/html/test.html注意:如果访问图片出现403 Forbidden错误 ,可能是实用因为nginx.conf 的第一行user配置不对 ,默认是必备#user nobody;是注释的,linux下改成user root; macos下改成user 用户名 所在组; 然后重新加载配置文件或者重启,应用再试一下就可以了 ,场景 用户名可以通过who am i 命令来查看。全解
4 、指令简介;
server : 用于定义服务,http中可以有多个server块 。listen : 指定服务器侦听请求的IP地址和端口 ,源码下载如果省略地址 ,服务器将侦听所有地址,如果省略端口 ,则使用标准端口。server_name : 服务名称,用于配置域名。location : 用于配置映射路径uri对应的配置 ,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码。root : 根路径 ,当访问http://localhost/test.html ,“/test.html”会匹配到”/”uri, 找到root为/usr/local/var/www/html,用户访问的免费模板资源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html。index : 设置首页,当只访问server_name时后面不跟任何路径是不走root直接走index指令的;如果访问路径中没有指定具体的文件 ,则返回index设置的资源,如果访问http://localhost/html/ 则默认返回index.html。5 、location uri正则表达式;
. :匹配除换行符以外的任意字符? :重复0次或1次+ :重复1次或更多次* :重复0次或更多次\d :匹配数字^ :匹配字符串的开始$ :匹配字符串的结束{ n} :重复n次{ n,} :重复n次或更多次[c] :匹配单个字符c[a-z] :匹配a-z小写字母的任意一个(a|b|c) : 竖线表示匹配任意一种情况 ,每种情况使用竖线分隔 ,香港云服务器一般使用小括号括括住 ,匹配符合a字符 或是b字符 或是c字符的字符串\ 反斜杠:用于转义特殊字符小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容 。正则里面容易让人困惑的是\转义特殊字符 。
1、在/usr/local/var/www 下分别创建images和img目录,分别在每个目录下放一张test.jpg;
图片
自定义变量使用set指令 ,语法 set 变量名值;引用使用变量名值;引用使用变量名; 这里自定义了doc_root变量。
静态服务器location的映射一般有两种方式:
使用路径 ,如 /images/ 一般图片都会放在某个图片目录下 。使用后缀,如 .jpg、.png 等后缀匹配模式。访问http://localhost/test.jpg 会映射到 $doc_root/img。
访问http://localhost/images/test.jpg 当同一个路径满足多个location时,优先匹配优先级高的亿华云location ,由于^~ 的优先级大于 ~, 所以会走/images/对应的location 。
常见的location路径映射路径有以下几种:
= 进行普通字符精确匹配。也就是完全匹配 。^~ 前缀匹配。如果匹配成功,则不再匹配其他location。~ 表示执行一个正则匹配 ,区分大小写 。~* 表示执行一个正则匹配,不区分大小写。/xxx/ 常规字符串路径匹配 。/ 通用匹配,任何请求都会匹配到 。location优先级当一个路径匹配多个location时究竟哪个location能匹配到 ,是有优先级顺序的 ,而优先级的顺序与location值的表达式类型有关 ,和在配置文件中的先后顺序无关。相同类型的表达式 ,字符串长的会优先匹配。
以下是按优先级排列说明 :
等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项 ,停止搜索 。^~类型表达式 ,不属于正则表达式 。一旦匹配成功,则不再查找其他匹配项,停止搜索。正则表达式类型(~ ~*)的优先级次之 。如果有多个location的正则能匹配的话 ,则使用正则表达式最长的那个 。常规字符串匹配类型 。按前缀匹配。/ 通用匹配 ,如果没有匹配到,就匹配通用的优先级搜索问题:不同类型的location映射决定是否继续向下搜索 :
等号类型、^~类型:一旦匹配上就停止搜索了,不会再匹配其他location了;正则表达式类型(~ ~*),常规字符串匹配类型/xxx/ : 匹配到之后,还会继续搜索其他其它location,直到找到优先级最高的,或者找到第一种情况而停止搜索;location优先级从高到低:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
复制location = / { # 精确匹配/ ,主机名后面不能带任何字符串 / [ configuration A ] } location / { # 匹配所有以 / 开头的请求。 # 但是如果有更长的同类型的表达式,则选择更长的表达式。 # 如果有正则表达式可以匹配,则优先匹配正则表达式 。 [ configuration B ] } location /documents/ { # 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。 # 但是如果有更长的同类型的表达式 ,则选择更长的表达式。 # 如果有正则表达式可以匹配,则优先匹配正则表达式。 [ configuration C ] } location ^~ /images/ { # 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索 。 # 所以,即便有符合的正则表达式location,也不会被使用 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif jpg jpeg结尾的请求。 # 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级 [ configuration E ] } location /images/ { # 字符匹配到 /images/ ,还会继续往下搜索 [ configuration F ] } location = /test.htm { root /usr/local/var/www/htm; index index.htm; }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.注意:location的优先级与location配置的位置无关
简单来说就是真实的服务器不能直接被外部网络访问 ,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
反向代理通过proxy_pass指令来实现。
启动一个Java Web项目 ,端口号为8081 。
复制server { listen 80; server_name localhost; location / { proxy_pass http://localhost:8081; proxy_set_header Host $host:$server_port; # 设置用户ip地址 proxy_set_header X-Forwarded-For $remote_addr; # 当请求服务器出错去寻找其他服务器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.当我们访问localhost的时候 ,就相当于访问 localhost:8081了
负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器 、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单而言就是当有2台或以上服务器时 ,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理 ,通过反向代理跳转到负载均衡 。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略 。
负载均衡通过upstream指令来实现。
每个请求按时间顺序逐一分配到不同的后端服务器,也就是说第一次请求分配到第一台服务器上,第二次请求分配到第二台服务器上 ,如果只有两台服务器 ,第三次请求继续分配到第一台上,这样循环轮询下去 ,也就是服务器接收请求的比例是 1:1 , 如果后端服务器down掉,能自动剔除 。轮询是默认配置 ,不需要太多的配置
同一个项目分别使用8081和8082端口启动项目
复制upstream web_servers { server localhost:8081; server localhost:8082; } server { listen 80; server_name localhost; #access_log logs/host.access.log main; location / { proxy_pass http://web_servers; # 必须指定Header Host proxy_set_header Host $host:$server_port; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.访问地址仍然可以获得响应 http://localhost/api/user/login?username=zhangsan&password=111111