nginx web开发利器

221 阅读4分钟

学习过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部署上大大提高工作效率。