官网地址:NGINX - 免费试用、软件下载、产品定价 (nginx-cn.net)
我这边选择NGINX 开源版 nginx: download
配置文件语法
配置文件组成:注释行,指令块配置项和一系列指令配置项组成。
单个指令组成:配置项名称和值参数,值参数可以是一个或多个附加参数,取决于解析该条指令的模块。
# user nobody;
worker_processes 4;
events {
worker_connections 1024;
}
块配置项组成:一个块配置顶名和一对大括号组成。 块配置后面是否带有参数,如location /webstatic {},取决于解析该配置块的模块。
指令特点
指令值的单位
可以使用下面单位来指定配置文件所在上下文中指令值的单位。
字符串值
注意:如果指令值中包含空格、分号或者是大括号等特殊字符,需要使用单引号或双引号将其括起。
nginx基本模块
nginx是由一系列模块组成的,大致可以分为核心模块、Http核心模块和其他模块。其中核心模块在编译时不能被禁用。核心模块包含main模块、events模块和include包含指令。
main模块重要指令
main模块位于配置文件根部。提供如进程管理和安全的能力。
daemon on; #启用或禁用守护进程模式。
user nobody; #worker进程运行的用户和组,如果没有提供则使用nginx的master进程的用户和用户组。
worker_processes 4;#定义worker进程数量一般和cpu核数一致。
#错误日志,这里的级别由debug,info,notice,warn,error和crit(debug记录了全部日志,crit仅报告关键错误)
#作用域:main, http, mail, stream, server, location
error_log logs/error.log error;
pid logs/nginx.pid; #存放nginx守护进程的pid文件路径。
log_not_found on; #开启或禁用记录404错误。
...
#除上面指令外还有worker_rlimit_core、worker_rlimit_nofile、worker_cpu_affinity、worker_priority等。
events模块
事件模块提供的指令可以用来配置网络机制
accept_mutex:on; #默认值on,启用或禁用使用一个接受互斥锁来打开套接字监听。
use epoll; #指定nginx所使用的网络事件模型,可选值有/dev/poll,epoll,kqueue等,通常不需要显式指定它,默认情况下nginx将使用最有效方法。
worker_connections 1024; #定义一个worker进程能够同时连接的数量。
configuration模块
提供的include 指令能够将其他文件包含在nginx配置文件中。在配置文件的任何地方均可插入该指令。注意如果没有指定绝对路径,那么文件路径将和配置文件的目录相关。
include /file/path.conf;
include sites/*.conf;
HTTP 核心模块是Nginx中最大的一个模块,它包含了所有的基本的区段、指令和变量。
区段结构
通过下面的例子,来认识http模块的区段结构。
http {
#在http区段中启用gzip压缩
gzip on;
server {
server_name localhost;
listen 80;
location /downloads/ {
#在此location区段禁用gzip压缩
gzip off;
}
}
}
模块指令
在http/server/location三个层次的每个层次都可以插入指令,下面介绍的指令都主要由http模块引入,对于每条指令都有它的使用环境。指令对应的级别包括http块、server块、location块,另外还有rewrite模块的if块。注意:一些指令不能用于某些级别。
下面介绍一些常见指令,如无特殊说明作用域为http,server,location。
套接字和主机配置指令
下表指令可以根据主机名或IP地址和端口的组合创建一个server区段。并通过一些指令来配置TCP套接字选项,以便调整网络设置。
server_name www.website.com website.com;
server_name *.website.com;
server_name *.website.*;
另外还有sendfile_max_chunk、send_lowat等指令。
路径和文档
下表指令用来设置根目录、主页、错误页等。
location /i/ {
alias /spool/w3/images/;
}
#例如:请求"/i/top.gif",将返回这个文件: "/spool/w3/images/top.gif"。
#正如你所看到的,uri中location后面的部分会追加到这个目录后面,而location自身指定的uri路径是"丢弃的"
error_page 404 html/404/html;
error_page 500 502 503 504 html/5x.html;
#跳转到命名的location区段。
error_page 404 @notfound;
#在出现404错误时 ,内部重定向到index.html,并且返回200 OK响应码。
error_page 404 =200/index/html;
语法:index file1 [file2...]
#例如:
index index.php index.html index.htm;
#例如
location / {
try_files $uri $uri.php @proxy;
}
location @proxy {
proxy_pass 127.0.0.1:8080;
}
客户端请求
下面描述的是nginx处理客户端请求机制,如配置keepalive、客户端缓冲区设置等。
MIME类型
MIME类型会在HTTP响应头中Content-Type中发送,这个头通常影响浏览器对文件的处理,如MIME类型是application/octet-stream,那么浏览器会下载该文件,而非显示;如果MEMEE类型是text/plain,那么该文件在浏览器中会作为纯文本而不用html解释提供。
Nginx提供了两个配置MINE类型的指令。分别是types和default_types;
http {
include mime.types;
location /downloads/ {
#移除所有的MIME类型
types {};
default_type application/octet-stream.
}
}
记录相关
其他
除了以上介绍的指令外,还有限制和约束以及文件处理和缓存相关指令,需要时可查阅相关文档。 但这里有必要介绍下internal指令。
#internal:该指令指定location区段只能用于内部访问。内部重定向参考Rewrite模块。
server {
server_name *.website.com;
location /admin/ {
internal;
}
}
模块变量
HTTP核心模块引入了大量的变量,可以使用这些变量应用到配置文件中。nginx的变量分为请求头变量、响应头变量和Nginx产生的各种变量。
客户端请求头变量
nginx允许你可以访问客户端请求头,以$http_为前缀的格式访问,如下表。
响应头变量
这类变量发生在响应发送后,nginx允许你访问客户端响应头。以$send_http...为前缀,如下表。
nginx产生的变量
nginx location区段可以通过指定的模式与客户端请求URI相匹配,location区段语法如下:
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
注意:location只是对URI进行匹配,不管查询字符串参数。
# uri必须与/abcd精确匹配(优先级最高),如:
# http://www.website.com/abcd 可用
location = /abcd {
...
}
#uri必须与指定模式开始,以下uri可用:
# http://www.website.com/abcd
# http://www.website.com/abcd/
# http://www.website.com/abcde
location /abcd {
...
}
#正则表达式^/abcd$,指定模式必须以/开始,后根abc,以d字符结尾。如:
http://website.com/abcd 可用
http://website.com/abcd?param1¶m2 可用
location ~ ^/abcd$ {
...
}
主要有关Rewrite模块及可能会用到的其他模块。
Rewrite模块
nginx rewrite模块使用Perl兼容正则表达式库,在安装nginx时需要预先安装perl和perl-dev。
正则表达式
元字符
量词
使用量词可以扩展实体匹配次数。
捕获
正则表达式最后一个功能是能够捕获自表达式,放在“( )”之间的任何文本,在被捕获后都能用于后面的处理。 例如:
server {
server_name website.com;
location ~* ^/(downloads|files)/(.*)$ {
add_header capture1 $1;
add_header capture2 $2;
}
}
关于内部请求
nginx有两种类型的内部请求:
注意:error_log 日志级别设置为debug时能够捕获到内部请求日志,详情可参阅error_log指令。
rewrite模块指令
条件结构
Rewrite模块引入了if条件结构。
语法:if (condition) { ... }
作用域:server, location
条件运算符说明:
例如:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
注意:if和location都能实现类似的效果,它们的不同之处在于能够在这两个区段使用的指令不同。换句话说就是有些指令可以用在if区段,有的则不可以,但几乎所有指令都可以在location中使用。比较常见的是在if区段中使用rewrite指令。
rewrite
语法:rewrite regex replacement [flag];
如果指定的正则表达式与URI匹配,则URI将按照replacement指定的字符串进行更改。该rewrite指令将按其在配置文件中出现的顺序执行。可以使用flag终止指令的进一步处理。如果replacement以“http://”、“https://”或“$scheme”开头,则处理将停止并将重定向返回给客户端。 flag标志说明:
server {
...
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
# 如上配置,如果放到location区块中,则last标志应该替换称break,否则nginx将执行10次循环,并返回500错误。
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
注意:
break
停止处理后面的rewrite指令集,阻止进一步改写请求URI。
if (-e $request_filename) {
break;
}
//因为break指令,后面的指令集不会执行
if ($uri ~ ^/search/(.*)$){
rewrite ^/search.php?q=$1;
}
return
中断请求处理过程,并返回一个指定的HTTP状态码。
语法:return code [text] | [codURL] ; return URL;
if ($uri ~ ^/admin/) {
return 403;
#因为已经完成了请求,此条指令不会执行。
rewrite ^ http://website.com;
}
set
初始化或重定义一个变量。注意有些变量不能修改,如$uri。
语法:set $variable value;
rewrite_log
如果设置为on,nginx将在“notice”错误级别对rewrite引擎处理的每个操作记录日志。
默认值:off
Log模块
该模块指令作用域:http,server,location
access_log:设置日志写入的路径,格式。
语法:access_log path [format [buffer=size] | off;
log_format:定义一个模版,用于表述日志中一个条目包含的内容。 语法:log_format template_name format_string; 默认的模版为combined。定义为:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
变量
Log模块除了可以使用公用变量之外,也带来了下面一些新的变量,但这些变量只能在写日志条目时使用。
该模块允许将“ Expires”和“ Cache-Control”头字段以及任意添加响应头字段。主要有两个指令:
该模块有一个简单的指令:valid_referers。它的目的是检查来自客户端请求的referer HTTP头。如果referer被认为无效,则$invalid_referer设置为1。
语法:valid_referers none | blocked | server_names | string ...;
例如:
valid_referers none blocked server_names
*.example.com example.* www.example.org/galleries/
~\.google\.;
if ($invalid_referer) {
return 403;
}
注意:可以使用该模块实现网站防盗链功能,对其他网站链接的图片禁止访问。
该模块与SSL模块无关,对访问的链接提供了基本的保护。该模块提供两种模式:
该模块提供图像处理功能,通过GD Graphics Library(gdlib)来实现。默认编译的Nginx不包含这个模块
除此之外比较重要的还有Index模块、gzip模块、realip模块、ssl模块等。另外在有特殊需要时还有 AutoIndex模块、auth_basic模块、Limit zone模块、Limit request模块,Empty GIF模块、Addtion模块、Gzip模块、Charset模块、Browser模块、GeoIp模块等等。其他模块根据需要查阅nginx文档。
基本概念:
默认情况下fastcgi模块默认是启用的,通过该模块提供的指令,能够使nginx将请求传递给FastCGI程序。
注意:nginx配置目录下的fastcgi.conf,包含了fastcgi预定义的一些参数。对所有fastcgi来说,有两个参数是必须的SCRIPT_FILENAME和QUERY_STRING。 例如:
#/etc/nginx/fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
....
#示例
location ~ \.php($|/) {
fastcgi_pass unix:/dev/shm/php.sock;
fastcgi_index index.php;
# 根据正则表达式分割为$fastcgi_script_name和$fastcgi_path_info两个变量。
# 比如请求/show.php/article/0001,被分割为/show.php和/article/0001
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 设置PATH_INFO SEVER变量
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param APP_ENV 'production';
include fastcgi.conf;
}
模块指令
下面简要介绍几个主要指令,其他指令用是可以查看官方文档。注意:如无特殊说明该模块指令作用域为:http、server、location
变量
upstream模块用来定义一组服务器,从而可以由proxy_pass,fastcgi_pass等指令引用。在upstream模块中,默认的方法是轮询,这种方法会带来Session会话问题,会出现同一个访问者的两个请求可能会被不同的两个服务器处理。
模块指令(整理自 nginx.org upstream模块 )
upstream:定义一组服务器,服务器可以监听不同端口,另外,可以混合监听TCP和UNIX域套接字。
语法:upstream name { ... }
作用域:http
注意:默认情况下,使用加权轮询均衡方法。在下面例子中,每7个请求,将有5个分配给172.16.0.50,第2和第3个服务器各一个请求。如果服务器通信期间发生错误,该请求将被传递到下一个服务器。依此类推,直到尝试所有正常运行的服务器为止,如果无法从任何一台服务器获得成功响应,则客户端收到最后一台服务器的响应结果。
示例:
upstream backend {
server 172.16.0.50 weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server 172.16.0.49 backup;
}
除upstream指令外,其他指令的作用域是:upstream
server指令:定义后端服务器的地址和参数,这些参数将影响nginx对后端服务器的选择。
语法:server address [parameters];
参数说明:
hash
语法:hash key [consitent]; 指定服务器组的负载均衡方法。客户端-服务器的映射是基于散列key值。key中可以使用nginx变量。如果指定consistent将使用一致性hash方法,可确保将服务器添加到组中或从组中删除服务器时,只有少量的key被重新映射到不同服务器。
注意:从组中添加或删除服务器,可能会导致key值重新映射到其他服务器。
ip_hash
语法:ip_hash;
指定服务器组的负载均衡方法,它是基于客户端ip在服务器间分配请求。注意:1.如果其中一台服务器需要临时删除,需使用down参数标记该服务器,以保留客户端ip地址的当前哈希值。2.在运营商移动网络下,ip经常是会变化的。
keepalive指令
语法:keepalive connections;
每个 worker 进程连接上游服务器的最大长连接数(默认情况下是短连接)。超过此数量时,将关闭最近最少使用的连接。
对于HTTP,应将 proxy_http_version指令设置为“1.1”,并清除 “Connection” 头字段:
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
location /api/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
#即使客户端和代理服务器使用的是短链接,代理服务器和上游服务器之间也将使用长连接。
proxy_set_header Connection "";
...
}
}
和它一起使用的还有两个参数,分别是:
注意:对于fastcgi服务器,需要开启fastcgi_keep_conn才能使keepalive连接正常工作。
last_conn
指定服务器组的负载均衡方法,将请求传递到活动连接数最少的服务器,同时需要考虑权重。如果有多个这样的服务器,就使用轮询的方法。
random
语法:random [two [method]]; 指定服务器组的负载均衡方法,其中将请求随机传递到选择的服务器,同时需要考虑服务器权重。
resolver
语法:resolver address ... [valid=time] [ipv6=on|off] [status_zone=zone]; 配置用于解析上游服务器名的域名解析服务器。
upstream模块支持以下变量:
默认情况下proxy模块默认是启用的,通过该模块能够将客户端的HTTP请求转发到后端服务器。 注意:如无特殊说明,指令的作用域都为:http,server,location。
示例:
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
模块指令
下面简要介绍几个主要指令,其他指令用是可以查看官方文档。注意:如无特殊说明该模块指令作用域为:http、server、location
主要指令
proxy_pass:指定转发给后端服务器的协议和地址。
语法:proxy_pass 协议://地址[/URI];
协议可以是http或https。地址可以是TCP套接字(域名或者ip地址+port)、UNIX域套接字,还可以指向upstream区段。URI是可选部分,如果指定了URI,location 后面指定的路径将被替换。
作用域:location, location中的if
proxy_pass http://localhost:8080;
proxy_pass http://127.0.0.1:8080;
proxy_pass http://unix:/tmp/backend.sock;
proxy_pass https://192.168.0.1;
proxy_pass http://localhost:8080/uri/;
proxy_pass http://unix:/tmp/backend.sock:/uri/:
# URL中还可以使用变量
proxy_pass http://$server_name:8080;
#指向upstream区段
#格式:proxy_pass http://myblock;
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
location ~ \.php($|/) {
fastcgi_pass http://backend;
}
注意:如果proxy_pass指定了URI,那么location匹配不能使用正则表达式。如果代理的URI需要使用正则表达式,则可以使用rewrite和proxy_pass结合的方式来定义转发路径。此时proxy_pass 后面定义的URL不再生效。
location /static_js/ {
rewrite /static_js/(._)$ /$1 break;
proxy_pass http://js.test.com;
}
proxy_next_upstream:指定哪种情况将请求传递到下一个服务器。
语法:proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
默认:proxy_next_upstream error timeout;
参数说明:
proxy_next_upstream error timeout http_504;
proxy_ignore_headers:禁用来自后端服务器的某些响应头字段。可以忽略以下字段:X-Accel-Redirect、Expires、Cache-Control、Set-Cookie和Vary。
proxy_set_body:用于重新定义传递给后端服务器的请求正文,一般用于调试目的。
proxy_set_header:用于重新定义或增加传递给后端服务器的请求头字段。 语法:proxy_set_header field value; 默认值:proxy_set_header Host $proxy_host; proxy_set_header Connection close;
除以上外还有proxy_method、proxy_hide_header、proxy_pass_header、proxy_pass_request_body、proxy_pass_request_header、proxy_redirect等指令。
缓冲、缓存和临时文件
proxy_buffer_size:设置缓冲区大小,该缓冲区用于存放来自后端服务器响应数据的开始不分。默认情况下,缓冲区的大小等于一个内存页(根据平台不同,4k或8k)
porxy_buffering:定义是否缓冲后端服务器的响应,如果禁用,响应就直接转发给客户端。
语法:proxy_buffering on | off;
默认:proxy_buffering on;
proxy_buffers :设置缓冲区数量和大小,用于存放从后端服务器读取的响应数据。默认情况下,缓冲区的大小等于一个内存页。
语法:proxy_buffers number size;
默认:proxy_buffers 8 4k | 8k;
proxy_busy_buffers_size:在缓冲区中,收到后端服务器数据总大小超过该指令指定大小时,缓冲区就会被刷新,并且数据被发送到客户端。默认为2*proxy_buffer_size。
默认值:proxy_busy_buffers_size 8k | 16k;
proxy_cache_前缀开头的指令:用于定义存放缓存文件目录等。
例如:proxy_cache、proxy_cache_key、proxy_cache_path等。
超时、错误及限制
proxy_connect_timeout:定义连接到后端服务器的超时时间。
默认:proxy_connect_timeout 60s;
proxy_read_timeout:定义从后端服务器读取数据的超时时间,超时设置仅表示在两个连续的读操作之间,而不是整个响应的传输。如果上游服务器未传输任何内容,则连接被关闭。
默认:proxy_read_timeout 60s;
proxy_send_timeout:定义从发送数据到后端服务器的超时时间,超时设置仅表示在两个连续写操作之间,而不是整个请求的传输。如果后端服务器在这期间未收到任何数据,则连接被关闭。
默认:proxy_send_timeout 60s;
proxy_ignore_client_abort:确定当客户端关闭和代理服务器间的连接时,是否关闭与后端服务器的连接。 默认值:proxy_ignore_client_abort off;
除此之外还有proxy_intercept_errors、proxy_send_lowat、 proxy_headers_hash_max_size、proxy_headers_hash_bucket_size、proxy_store、proxy_store_access等指令等指令。
变量
nginx 官方文档:https://nginx.org/en/docs/
nginx全面配置 包括实例:Nginx全面配置 - 知乎 (zhihu.com)
Nginx配置文件_nginx 配置文件-CSDN博客