一、HTTP服务器
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; } }}
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
http { server { listen 80; server_name localhost; set $doc_root /usr/local/var/www; # 默认location location / { root /usr/local/var/www/html; index index.html index.htm; } location ^~ /images/ { root $doc_root; } location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ { root $doc_root/img; } }}
自定义变量应用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值的表达式类型无关,和在配置文件中的先后顺序无关。雷同类型的表达式,字符串长的会优先匹配。举荐:Java面试题大全
以下是按优先级排列阐明:
- 等号类型(=)的优先级最高。一旦匹配胜利,则不再查找其余匹配项,进行搜寻。
^~
类型表达式,不属于正则表达式。一旦匹配胜利,则不再查找其余匹配项,进行搜寻。- 正则表达式类型(
~ ~*
)的优先级次之。如果有多个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;}
留神:location的优先级与location配置的地位无关
三、反向代理
反向代理应该是Nginx应用最多的性能了,反向代理(Reverse Proxy)形式是指以代理服务器来承受internet上的连贯申请,而后将申请转发给外部网络上的服务器,并将从服务器上失去的后果返回给internet上申请连贯的客户端,此时代理服务器对外就体现为一个反向代理服务器。
简略来说就是实在的服务器不能间接被内部网络拜访,所以须要一台代理服务器,而代理服务器能被内部网络拜访的同时又跟实在服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
反向代理通过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; }}
当咱们拜访localhost的时候,就相当于拜访 localhost:8081
了
四、负载平衡
负载平衡也是Nginx罕用的一个性能,负载平衡其意思就是摊派到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业要害应用服务器和其它要害工作服务器等,从而共同完成工作工作。
简略而言就是当有2台或以上服务器时,依据规定随机的将申请散发到指定的服务器上解决,负载平衡配置个别都须要同时配置反向代理,通过反向代理跳转到负载平衡。而Nginx目前反对自带3种负载平衡策略,还有2种罕用的第三方策略。
负载平衡通过upstream指令来实现。
1. RR(round robin :轮询 默认)
每个申请按工夫程序逐个调配到不同的后端服务器,也就是说第一次申请调配到第一台服务器上,第二次申请调配到第二台服务器上,如果只有两台服务器,第三次申请持续调配到第一台上,这样循环轮询上来,也就是服务器接管申请的比例是 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; } }
拜访地址依然能够取得响应 http://localhost/api/user/login?username=zhangsan&password=111111
,这种形式是轮询的
2. 权重
指定轮询几率,weight和拜访比率成正比, 也就是服务器接管申请的比例就是各自配置的weight的比例,用于后端服务器性能不均的状况,比方服务器性能差点就少接收点申请,服务器性能好点就多解决点申请。
upstream test { server localhost:8081 weight=1; server localhost:8082 weight=3; server localhost:8083 weight=4 backup;}
示例是4次申请只有一次被调配到8081上,其余3次调配到8082上。backup是指热备,只有当8081和8082都宕机的状况下才走8083
3. ip_hash
下面的2种形式都有一个问题,那就是下一个申请来的时候申请可能散发到另外一个服务器,当咱们的程序不是无状态的时候(采纳了session保留数据),这时候就有一个很大的很问题了,比方把登录信息保留到了session中,那么跳转到另外一台服务器的时候就须要从新登录了,所以很多时候咱们须要一个客户只拜访一个服务器,那么就须要用iphash了,iphash的每个申请按拜访ip的hash后果调配,这样每个访客固定拜访一个后端服务器,能够解决session的问题。
upstream test { ip_hash; server localhost:8080; server localhost:8081;}
4. fair(第三方)
按后端服务器的响应工夫来调配申请,响应工夫短的优先调配。这个配置是为了更快的给用户响应
upstream backend { fair; server localhost:8080; server localhost:8081;}
5. url_hash(第三方)
按拜访url的hash后果来调配申请,使每个url定向到同一个后端服务器,后端服务器为缓存时比拟无效。在upstream中退出hash语句,server语句中不能写入weight等其余的参数,hash_method
是应用的hash算法
upstream backend { hash $request_uri; hash_method crc32; server localhost:8080; server localhost:8081;}
以上5种负载平衡各自实用不同状况下应用,所以能够依据理论状况抉择应用哪种策略模式,不过fair和url_hash须要装置第三方模块能力应用。
五、动静拆散
动静拆散是让动静网站里的动静网页依据肯定规定把不变的资源和常常变的资源辨别开来,动静资源做好了拆分当前,咱们就能够依据动态资源的特点将其做缓存操作,这就是网站动态化解决的外围思路。
upstream web_servers { server localhost:8081; server localhost:8082; }server { listen 80; server_name localhost; set $doc_root /usr/local/var/www; location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ { root $doc_root/img; } location / { proxy_pass http://web_servers; # 必须指定Header Host proxy_set_header Host $host:$server_port; } error_page 500 502 503 504 /50x.html; location = /50x.html { root $doc_root; } }
六、其余
1.return指令
返回http状态码 和 可选的第二个参数能够是重定向的URL
location /permanently/moved/url { return 301 http://www.example.com/moved/here;}
2. rewrite指令
重写URI申请 rewrite,通过应用rewrite指令在申请解决期间屡次批改申请URI,该指令具备一个可选参数和两个必须参数。
第一个(必须)参数是申请URI必须匹配的正则表达式。
第二个参数是用于替换匹配URI的URI。
可选的第三个参数是能够进行进一步重写指令的解决或发送重定向(代码301或302)的标记
location /users/ { rewrite ^/users/(.*)$ /show?user=$1 break;}
3. error_page指令
应用error_page指令,您能够配置NGINX返回自定义页面以及错误代码,替换响应中的其余错误代码,或将浏览器重定向到其余URI。在以下示例中,error_page
指令指定要返回404页面错误代码的页面(/404.html)。
error_page 404 /404.html;
4. 日志
拜访日志:须要开启压缩 gzip on; 否则不生成日志文件,关上log_format
、access_log
正文
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';access_log /usr/local/etc/nginx/logs/host.access.log main;gzip on;
5. deny 指令
# 禁止拜访某个目录location ~* \.(txt|doc)${ root $doc_root; deny all;}
6. 内置变量
nginx的配置文件中能够应用的内置变量以美元符$
开始,也有人叫全局变量。其中,局部预约义的变量的值是能够扭转的。
$args
:#
这个变量等于申请行中的参数,同$query_string
$content_length
:申请头中的Content-length字段。$content_type
:申请头中的Content-Type字段。$document_root
:以后申请在root指令中指定的值。$host
:申请主机头字段,否则为服务器名称。$http_user_agent
:客户端agent信息$http_cookie
:客户端cookie信息$limit_rate
:这个变量能够限度连贯速率。$request_method
:客户端申请的动作,通常为GET或POST。$remote_addr
:客户端的IP地址。$remote_port
:客户端的端口。$remote_user
:曾经通过Auth Basic Module验证的用户名。$request_filename
:以后申请的文件门路,由root或alias指令与URI申请生成。$scheme
:HTTP办法(如http,https)。$server_protocol
:申请应用的协定,通常是HTTP/1.0或HTTP/1.1。$server_addr
:服务器地址,在实现一次零碎调用后能够确定这个值。$server_name
:服务器名称。$server_port
:申请达到服务器的端口号。$request_uri
:蕴含申请参数的原始URI,不蕴含主机名,如:”/foo/bar.php?arg=baz
”。$uri
:不带申请参数的以后URI,$uri
不蕴含主机名,如”/foo/bar.html
”。$document_uri
:与$uri
雷同
原文链接:https://blog.csdn.net/vbirdbe...
版权申明:本文为CSDN博主「vbirdbest」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。
近期热文举荐:
1.1,000+ 道 Java面试题及答案整顿(2021最新版)
2.别在再满屏的 if/ else 了,试试策略模式,真香!!
3.卧槽!Java 中的 xx ≠ null 是什么新语法?
4.Spring Boot 2.5 重磅公布,光明模式太炸了!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!