学习过java的同学都知道,将一张本地的图片输出到浏览器展示,需要编写一系列的代码。获取文件流,设置响应头,将响应对象输出等等操作。假如要浏览器要同时获取1000张图片,那么我们的java文件服务器就很变的很慢了,同时1000条线程去处理图片流,当输出完1000张图片时,点击浏览器刷,又会重新从我们的java文件服务器获取图片,浏览器又要经过漫长的等待才能看到图片,太影响用户的体验了。现在我们有一款神器nginx可以完成java文件服务器的功能,而已还能将图片进行缓存。
nginx 安装
基于我们的开发环境是window,我就以windows版本为例讲解。
点击 nginx 点击页面 选择目前windows的稳定版本
下载解压后,我们直接双击nginx.exe就能运行nginx,是不是好简单?在浏览器输入http://localhost/看到如下页面,就表示启动成功了。
如何关闭?在刚刚nginx的目录下打开powershell(shift+右键), .\nginx.exe -s stop 输入这行命令,nginx就关闭了。
nginx 配置文件
刚刚我们只是双击打开了nginx.exe,就能直接访问了,那我们怎么修改配置?nginx的配置就在conf/nginx.conf
#号是一行注释
我们来尝试下修改端口,将80端口修改为8100,然后在powershell中输入 .\nginx.exe -s reload ,在浏览器输入http://localhost:8100/,就能重新访问到nginx的欢迎页面了,同时旧的端80将废弃。
简单解析下改代码块:
- server 开始配置一个域名,一个 server 配置段一般对应一个域名
- listen 监控端口
- server_name 域名
- location 按照规则配置,执行不同的代码块
nginx 静态文件服务器
location / {
#过期时间 -1表示永远不过时
expires -1;
#静态文件路径
root D:\demo;
index index.html index.htm;
}
在原配置文件的基础上,我们修改根路径规则,root 表示文件存放的根路径。nginx.exe -s reload ,在浏览器输入http://localhost:8100/imag.png imag.png为D:\demo下的图片文件。
如此简单我们就完成了nginx 静态文件服务器。
location 规则
语法规则: location [=|~|~*|^~] /uri/ { … }
- = 表示精确匹配,这个优先级也是最高的
- ^~ 表示 uri 以某个常规字符串开头,理解为匹配 url 路径即可。nginx 不对 url 做编码,因此请求为 /static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)。
- ~ 表示区分大小写的正则匹配
- ~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)
- !
和!*分别为区分大小写不匹配及不区分大小写不匹配的正则 - / 通用匹配,任何请求都会匹配到,默认匹配.
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
nginx 反向代理
server {
listen 8100;
server_name localhost;
location / {
#proxy_redirect off;
proxy_pass http://www.baidu.com;
}
error_page 404 /404.html;
}
修改为以上配置,当我们访问 http://localhost:8100/ 浏览器就会跳转到百度首页了。
补充下正向代理与反向代理
- 正向代理,目标server不知道client,例如小马向小红借跑车,但是小马跟小红不熟,于是小马找小红的基友小明帮忙向小红借跑车,小明很快就借来的跑车,把跑车给了小马。
- 反向代理,client不知道目标server,例如小马开下跑车,但是不知道找谁借,于是找到万事通小明,很快小明弄来辆跑车给小马开了。
当我们请求http://localhost:8100/,去不知道为我们提供服务的是百度,所以nginx为我们做了反向代理到百度。
location / {
proxy_redirect off;
#设置代理头 host,代理服务器可以Host中获取到正式的请求host
proxy_set_header Host $host;
#设置代理头 X-Real-IP,代理服务器可以Host中获取到正式的请求ip
proxy_set_header X-Real-IP $remote_addr;
#设置代理头 X-Forwarded-For,代理服务器可以X-Forwarded-For中获取转发ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://www.baidu.com;
}
nginx 重新规则
当前我们有一个app已经上线发布了,app中所有api都是以http://api.appgg.com/v1/开头,但是服务器的api已经升级为v2版本,也就是app需要重新提交一个版本才行,提交后又要重新审核,耗时太长了,所以我们需要用到nginx uri的重新功能。
语法:rewrite regex replacement flag
flag
- last – 停止处理重写模块指令,之后搜索 location 与更改后的 URI 匹配。
- break – 完成重写指令。
- redirect – 返回 302 临时重定向,如果替换字段用 http://开头则被使用。
- permanent – 返回 301 永久重定向。
例子:
location ~ /v1/ {
rewrite ^/v1/(.*)$ /v2/$1 break;
proxy_pass http://api.appgg.com;
}
用百度做例子:
location ~ /v1/ {
rewrite ^/v1/(.*)$ /s?wd=$1 break;
proxy_pass https://www.baidu.com;
}
当浏览器输入http://localhost:8100/v1/pig,根据规则重写为/s?wd=pig,在做反向代理,就变成http://www.baidu.com/s?wd=pig搜索pig
总结
nginx在web开发中为我们提供了很大的便利,我们要多多学习,以后可以在web部署上大大提高工作效率。