在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
由于当前很多应该都是前后端分离了,同时大量的基于http的分布式和微服务架构,使得很多时候应用和不同项目组之间的系统相互来回调用,关系复杂。如果使用传统的做法,都在应用中进行各种处理和判断,不仅维护复杂、容易出错,还大大增加开发、调试的工作量,在nginx中,有不少的非功能类其实是可以帮我们处理掉的,所以,对于现代开发人员来说,有必要对nginx的location比较熟悉,以便达到事半功倍的效果,比如说,日常的图片上传就是个例子,我们可以将图片上传到特定的目录,然后配置nginx对于用户上传的图片,都转发到特定的目录,该目录不一定是nginx的html目录,甚至是挂载的盘,这样对于一般的应用来说,既可以按应用规划设置文件服务器,也避免了需要安装和维护ftp服务器软件的工作。 nginx配置因为Nginx是模块化架构,每个模块都会有一系列自己引入的指令,这些指令通常包含在指令块中,比如events模块,就有一个events块。如下所示: events { worker_connections 1024; } 对于最常用的部分,指令块通常层层嵌套。例如: http { server { listen 80; server_name example.com; access_log /var/log/nginx/example.com.log; location ^~ /admin/ { index index.php; } } } 默认情况下,之块会继承父块中声明的设置,除非明确覆盖。 在nginx的配置中,语法比较复杂,而且不同的指令,可能规则完全不同。 比如root仅接受一个字符,声明服务于网站的文件的根路径。 模块中通常定义了可以用于指令中的变量,变量以$开头。某些指令中不允许使用变量,比如error_log,此时它会被当做字面量处理。 指令的值可以带双引号、带单引号、不带引号,除非使用了特殊符号,此时需要用引号括起来以避免nginx解析误解,对于特殊符号需要当做字面量使用的,需要用\,比如$。
nginx的基本模块包括Core、Events(主要是声明网络机制,某些参数对系统的性能影响较大)、Configuration,这三个模块提供了整个基础架构。 nginx使用多进程架构。 核心模块的主要指令:
events模块的主要指令包括(这些指令必须声明在events块中):
配置模块的主要指令包括:
HTTP Core模块HTTP Core模块包含了HTTP服务器的所有基础块、指令以及变量,其默认启用,实际上它也是最重要的一个模块。它包含三个主要的块:http,server,location。
一个典型的http配置结构如下: 主要指令包括:
路径相关指令包括:
客户端请求相关的指令包括:
限制相关的指令包括:
location /admin/ { limit_except GET { allow 192.168.1.0/24; deny all; } } 格式为: limit_except METHOD1 [METHOD2…] { allow | deny | auth_basic | auth_basic_user_file | proxy_pass | perl; }
文件和缓存相关的指令:
其他指令:
模块变量HTTP Core模块包含了很多的变量,分为三类:第一类是在Http请求头中传递的,第二类是http响应头中的,第三类是完全nginx生成的。参考nginx http server第三版 90页。 nginx允许用户声明样式匹配指定的uri,location的语法为:
server { server_name website.com; location ~ ^/abcd$ { […] } }
搜索顺序和location匹配优先级很多时候,我们定义的不止一个location,通常至少会有两个,一个是根本身,一个指向后端服务。所以我们需要理解nginx接收到一个请求之后,它如何确定匹配的location。定义在配置文件中的location顺序对于一个请求是否优先匹配没有关系,nginx搜索匹配的样式的顺序如下:
Rewrite模块这个模块的目的就是为了URL重写,URL重写是SEO的关键元素之一。URL重写由rewrite指令执行,它接收一个样式和一个替换URI。 正则表达式规则参考nginx http server第三版P103。 server { server_name website.com; location ~* ^/(downloads|files)/(.*)$ { add_header Capture1 $1; add_header Capture2 $2; } } nginx区分内外部请求,内部请求由error_page, index, rewrite,try_files, add_before_body, add_after_body生成。内部请求还分两类:
简单的重定向如下: server { server_name website.com; root /var/www/vhosts/website.com/httpdocs/; location /storage/ { internal; alias /var/www/storage/; } location /documents/ { rewrite ^/documents/(.*)$ /storage/$1; } } Rewrite模块的指令包括:
如果声明的URI以http://开头,nginx自动使用redirect标志。 可应用于server,location,if。
upstream模块任何以_pass结尾的指令都接受到一组服务器的引用。声明一组服务器的第一步是在http的upstream块内声明一个或多个server指令,如下: http { upstream MyUpstream { server 10.0.0.201; server 10.0.0.202; server 10.0.0.203; } […] } 然后在server块内引用声明的upstream,如下: server { server_name example.com; listen 80; root /home/example.com/www; # Proxy all requests to the MyUpstream server group proxy_pass http://MyUpstream; […] } nginx提供多种负载均衡机制,P248。从Nginx 1.9.0开始,新增的Stream模块支持TCP负载均衡,这意味原来必须使用LVS或者HAPROXY作为负载均衡机制的模式可以采用NGINX了。 location /downloads/ { aio threads; directio 8k; sendfile on; }
ngx_http_log_module模块负责以声明的格式记录请求日志。
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off; 默认为access_log logs/access.log combined; nginx获取环境变量的值首先参考centos下nginx安装与配置安装所需模块。 代理(Proxy)相关命令待补充。。。 Lua开发If you are using Openresty, or have the You first need to declare what variables you'll be needing somewhere in your env API_KEY; After that, when you want to access the environment variable, you can use a combination of http { ... server { location / { set_by_lua $api_key 'return os.getenv("API_KEY")'; ... } } } In this example we are assigning the environment variable to one of Nginx variables; we can use nginx+lua入门学习参见:跟我学Nginx+Lua开发 lua程序设计 第四版 https://segmentfault.com/a/1190000018430640 Perl开发(不推荐)Using Lua was our preferred approach, since we have OpenResty. If you can't use Lua, a second solution involves using Perl. The first part is similar; you must declare the variables he uses using env API_KEY; After that, you can combine http { ... server { location / { perl_set $api_key 'sub { return $ENV{"API_KEY"}; }'; ... } } } You will need to have the
|
请发表评论