3.HTTP服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
root e:\wwwroot;
index index.html;
}
}
这样如果访问 http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
3.1.root
root 是指定项目的根目录,适用与server和location。可以指定多个,如果locaiton没有指定,会往其外层的server或http中寻找继承。
nginx中root指令的地址,其实是替换了匹配后的url中的host
server {
listen 80 default_server;
server_name localhost;
access_log /var/log/nginx/pro/access.log;
error_log /var/log/nginx/pro/error.log;
error_page 404 /404.html;
root /vagrant/pro;
index index.html index.htm;
}
当我们访问http://localhost/static/stc.jpg
其实访问的是/vagrant/pro/static/stc.jpg
location ^~ /static {
root /vagrant/pro;
}
当我们访问http://localhost/static/stc.jpg
其实访问的是` /vagrant/pro/static/stc.jpg``
对于root指令,我们可以归纳
- 对于匹配后的url地址,将匹配的location中的root路径替换访问url的host即得到文件的真实地址。(多个斜杠其实等价于一个斜杠)
- 如果不匹配location,则寻找更外层的root做替换。
- root指令最后的斜杠可加可不加。(在*nix系统中, 多个斜杠和一个斜杠是等价的)
3.2.alias
对于root,操作上很简单,只要把root地址替换host后就是文件在硬盘路径(真实地址)。对于alise,它并不是替换匹配后的url地址,而是替换匹配部分的url。alias指令也可以有多个,结尾的/并不是可加可不加
location ^~ /upload {
alias /vagrant/pro/upload;
}
此时访问http://localhost/upload/up.png
其实访问的是/vagrant/pro/upload/up.jpg
总结
nginx的静态文件配置中,root和alias指令都能实现。为了避免混淆,尽量不要写没有根路径的url模式,即避免 static/这样的开头,根路径的斜杠需要保留,没有根路径其实也很奇怪。
root和alias的区别主要在于替换的部分,root模式中,会把root配置的路径替换匹配后的url中的host。alias则把他指定的路径,替换url中匹配的部分。指令中的斜杠对于root指令没有影响,对于alise则按照替换规则匹配即可。
root 指令
location /dir/
root root_path -> http://host/dir/file.txt -> root_path/dir/file.txt
alias 指令
location /dir
alias alias_path -> http://host /dir /file.txt -> alias_path/file.txt
location /dir/
alias alias_path/ -> http://host /dir/ file.txt -> alias_path/file.txt
了解了root和alise之后,通常最佳实际是配置一个项目的根root,其他的文件夹则使用alias,毕竟alias更加灵活。
3.3.antdPro静态项目,用nginx部署在次级域名路径
location /yz/ {
root D:/DevProject/;
index index.html index.htm index.shtml;
try_files $uri $uri/ /yz/index.html;//按顺序检查文件是否存在,返回第一个找到的文件。
//结尾的斜线表示为文件夹 -$uri/。如果所有的文件都找不到,会进行一个内部重定向到最后一个参数。
//务必确认只有最后一个参数可以引起一个内部重定向,如果是最后一个参数是文件,那么这个文件必须存在。
}
对于蚂蚁金服的前端脚手架antdPro
我们如何访问呢?
我们只需要把静态项目antdPro
打包后的内容拷贝至D:/DevProject/
就可以访问静态资源项目了
4.动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
upstream test{
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
expires 30d;#30天之内只要访问过一次就从缓存拿
server_name localhost;
location / {
root e:\wwwroot;
index index.html;
}
# 所有静态请求都由nginx处理,存放目录为html
location ~ \.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
root e:\wwwroot;
}
# 所有动态请求都转发给tomcat处理
location ~ \.(jsp|do)$ {
proxy_pass http://test;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root e:\wwwroot;
}
}
这样我们就可以吧HTML以及图片和css以及js放到wwwroot目录下,而tomcat只负责处理jsp和请求,例如当我们后缀为gif的时候,Nginx默认会从wwwroot获取到当前请求的动态图文件返回,当然这里的静态文件跟Nginx是同一台服务器,我们也可以在另外一台服务器,然后通过反向代理和负载均衡配置过去就好了,只要搞清楚了最基本的流程,很多配置就很简单了,另外localtion后面其实是一个正则表达式,所以非常灵活
4.1 location配置
Nginx location 配置语法(location 是在 server 块中配置)
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
匹配模式及顺序
location = /uri =开头表示精确匹配,只有完全匹配上才能生效。
location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location ~ pattern ~开头表示区分大小写的正则匹配。
location ~* pattern ~*开头表示不区分大小写的正则匹配。
location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
@,nginx内部跳转
location /img/ {
error_page 404 @img_err;
}
location @img_err {
# 规则
}
#以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。
注意点
- 匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。
- 一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。
实验案例
- 测试"^“和”",nginx配置如下。浏览器输入http://localhost/helloworld/test,返回601。如将#1注释,#2打开,浏览器输入http://localhost/helloworld/test,返回603。注:#1和#2不能同时打开,如同时打开,启动nginx会报nginx: [emerg] duplicate location “/helloworld”…,因为这两个都是普通字符串
location ^~ /helloworld { #1
return 601;
}
#location /helloworld { #2
# return 602;
#}
location ~ /helloworld {
return 603;
}
- 测试普通字符串的长短(普通字符串的匹配与顺序无关,与长短有关)。浏览器输入http://localhost/helloworld/test/a.html,返回601。浏览器输入http://localhost/helloworld/a.html,返回602。
location /helloworld/test/ { #1
return 601;
}
location /helloworld/ { #2
return 602;
}
- 测试正则表达式的顺序(正则匹配与顺序相关)。浏览器输入http://localhost/helloworld/test/a.html,返回602;将#2和#3调换顺序,浏览器输入http://localhost/helloworld/test/a.html,返回603
location /helloworld/test/ { #1
return 601;
}
location ~ /helloworld { #2
return 602;
}
location ~ /helloworld/test { #3
return 603;
}
5.正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。当你需要把你的服务器作为代理服务器的时候,可以用Nginx来实现正向代理
如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ(VPN)进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我
正向代理最大的特点: 客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚
来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
正向代理和反向代理一起使用就会像下图这样
resolver 114.114.114.114 8.8.8.8;
server {
resolver_timeout 5s;
listen 81;
access_log e:\wwwroot\proxy.access.log;
error_log e:\wwwroot\proxy.error.log;
location / {
proxy_pass http://$host$request_uri;
}
}
resolver是配置正向代理的DNS服务器,listen 是正向代理的端口,配置好了就可以在ie上面或者其他代理插件上面
使用服务器ip+端口号进行代理了