摘要: nginx的配置文件类似于一门优雅的编程语言,弄懂了它的规范就可以自定义配置文件了,这个很重要~

1,结构分析

nginx配置文件中主要包括六块:main,events,http,server,location,upstream

结构如下图:

main块:主要控制nginx子进程的所属用户/用户组、派生子进程数、错误日志位置/级别、pid位置、子进程优先级、进程对应cpu、进程能够打开的文件描述符数目等

events块:控制nginx处理连接的方式

http块:是nginx处理http请求的主要配置模块,大多数配置都在这里面进行

server块:是nginx中主机的配置块,可以配置多个虚拟主机

location块:是server中对应的目录级别的控制块,可以有多个

upstream块:是nginx做反向代理和负载均衡的配置块,可以有多个

2,配置命令解释

nginx中每条配置命令都必须要以分号“;”结束!

user  nobody;  //配置nginx 子进程使用的用户和组

worker_processes  1; //配置nginx衍生的工作进程数,一般值为CPU总核数或者总核数的两倍

error_log  logs/error.log   notice; //配置错误日志的存放位置,错误日志的级别有:debug,info,notice,warn,error,crit

pid  logs/nginx.pid;  //指定nginx  pid的存放路径

worker_rlimit_nofile   51200; //配置文件描述符数量

events {

use  epoll; //使用网络I/O模型,linux系统推荐使用epoll,FreeBSD推荐使用kqueue

worker_connections  1024; //允许并发连接的最大请求数

#multi_accept on;  //暂时还没了解其作用

}

http {

include       mime.types; //包含指定的文件(可以含路径)

default_type  application/octet-stream;

#charset   utf-8;  //默认的字符编码集

client_max_body_size  8m; //配置客户端能够上传的文件大小

keepalive_timeout  65;  //连接超时时间

#gzip  on; //是否开启gzip压缩(还需要和其它配置项共同起作用)

//配置访问日志格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

access_log  logs/host.access.log  main;  //启用访问日志,并且指定日志采用的格式

server {

listen       80; //主机监听端口(可以是ip:port格式,默认监听127.0.0.1)

server_name  localhost; //主机域名

index  index.php  index.html; //默认索引文件

root  /html; //主机站点跟目录地址

#error_page   404    /404.html;  //404页面地址(可以配置其它错误页面地址如500等,格式一样)

location / {

}

location ~ .*\.(js|css)?$ {

expires   1h;  //配置所有的js,css文件缓存1小时

}

}

}

以上为Nginx配置文件中基本的配置命令说明,下面对常见的nginx配置做详细的案例解释和说明。上面的部分只是对nginx配置文件的一个大概的认识,使得自己对nginx的配置文件不再陌生!

3,nginx Rewrite 语法分析

nginx Rewrite 相关的指令有:if,rewrite,set,return,break,uninitalized_variable_warn等。

4.1 break指令:

语法:break;

默认值:none

使用范围:if,server,location

作用:完成当前的规则集,不再处理rewrite指令,需要和last加以区分

4.2 if指令:

语法:if ( condition ) { ... }

默认值:none

使用范围:server,location

作用:用于检测一个条件是否符合,符合则执行大括号内的语句。不支持嵌套,不支持多个条件&&或||处理

condition的范围:

4.2.1 变量名,但是不包括空字符串“”,或者任何以0开始的字符串

4.2.2 变量可以比较,用“=”或者“!=”

4.2.3 变量可以匹配正则表达式,用“~*”(不区分大小写)或者“~”(区分大小写),可以采用“!”来表示取反,如“!~”或者“!~*”

4.2.4 “!-f”和“-f”用来判断文件是否存在

4.2.5 “-e”和“!-e”用来文件或者目录是否存在

4.2.6 “-d”和“!-d”用来判断目录是否存在

4.2.7 “-x”和“!-x”用来判断文件是否可执行

4.2.8  正则表达式中支持“()”分组,分组的值在后面可以通过$1~$9来引用

4.3 return指令:

语法:return code;

默认值:none

使用范围:server,if,location

作用:用于结束规则的执行和返回状态码给客户端。状态码的值可以是:204,400,402~406,408,410,411,413,416以及500~504,另外非标准状态码444,表示以不发送任何的Header头来结束连接。

状态码解释,如下图:

4.4 rewrite指令:

语法:rewrite  regex  replacement  flag;

默认值:none

使用范围:server,if,location

作用:该指令用于重定向URI或者更改字符串的内容,指令根据配置文件中的顺序来执行。注意:rewrite只针对相对路径,即匹配的是URL地址中主机名之后的内容。如果你想匹配主机名,则需要使用 if 语句。

flag标记:

last --- 相当于Apache中的[L]标记,表示该条是最后一条规则,后面的规则不继续匹配,但是要重新发起请求

break --- 本条规则匹配完成后,终止匹配,不再匹配后面的规则

redirect --- 返回302重定向地址,浏览器地址栏会显示跳转后的地址

premanent --- 返回301永久重定向,浏览器地址栏会显示跳转后的地址

说明:last 和 break 作用类似,但是它们之间有一定的区别。在使用 alias 指令时必须要用 last 标记,在使用 proxy_pass 指令时则要使用 break 标记。last 标记表示,在本条rewrite规则执行完成之后需要对其所在的 server 段重新发起请求,而 break 则在本条规则匹配完成之后,终止匹配,不再对后面的的规则匹配。通常情况下,在“根location”中,如:location / { ... }  或者在 server 中直接编写的 rewrite 指令,推荐使用 last ,而在其它块儿中则推荐使用 break。

最后:如果匹配到的URI中含有参数即类似于/app/test.php?id=5之类,默认情况下,rewrite之后参数会被附加到替换串的后面,那么你可以通过在替换串的后面增加“?”来取消这个动作!

4.5 set指令:

语法:set  variable  value;

默认值:none

使用范围:server,location,if

作用:该指令用于定义一个变量,并且给变量进行赋值。变量的值可以是文本、一个变量或者变量和文本的联合,文本需要用引号引起来。

4.6 uninitalized_variable_warn指令:

语法:uninitalized_variable_warn   on|off;

默认值: on

使用范围:http,server,location,if

作用:用于开启或者关闭记录关于未初始化变量的警告信息

nginx Rewrite 中可以使用的全局变量:$args,$content_lenght,$content_type,$document_root,$document_uri,$host,$http_user_agent,$http_cookie,$limit_rate,$request_body_file,$request_method,$remote_addr,$remote_port,$remote_user,$request_filename,$request_uri,$query_string,$scheme,$server_protocol,$server_addr,$server_name,$server_port,$uri。

nginx Rewrite 中遵循PCRE的正则表达式规范,这个可以自行去参照PHP中的正则表达式规范。

4,虚拟主机配置

nginx虚拟机的配置和apache虚拟主机配置方式类似,只是个人感觉还稍简单一些,不像apache那么“抽”。

首先在nginx.conf的http端中增加一个server段,因为在nginx的配置文件中每一个server段都是一个虚拟机,我们配置的是“基于域名的虚拟主机”,增加的server段如下:

server {

listen  80; //配置虚拟机监听的端口,默认ip为127.0.0.1,也可以写成ip:port格式来显式指定

server_name  www.test.com;  //配置虚拟机的server name 可以指定多个,用空格隔开

root  /var/www/test; //配置虚拟机的根目录

index  index.php  index.html; //配置默认的索引文件

access_log   logs/test.access.log  main;  //配置虚拟机的访问日志并指定日志格式采用“main”

error_page  404  /404.html; //配置虚拟机的404页面

location ~ .+\.php($|/) {  //用来支持解析php页面

fastcgi_pass  127.0.0.1:9000;

fastcgi_index  index.php?IF_REWRITE=1;

include fastcgi_params;

set $script $uri;

set $path_info  "/";

if ($uri ~ "^(.+\.php)(/.+)") {

set $script     $1;

set $path_info  $2;

}

fastcgi_param PATH_INFO $path_info;

fastcgi_param SCRIPT_FILENAME  $document_root/$script;

fastcgi_param SCRIPT_NAME $script;

access_log off;

}

}

修改好nginx的配置文件之后,接着修改hosts文件,增加如下一行:

127.0.0.1   www.test.com

然后重启 nginx 和 php-fpm 之后,在浏览器中输入www.test.com查看到对应的内容就表示配置成功!

5,Rewrite实例解析

6,日志文件配置与切割

7,压缩输出配置

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

配置指令如上,查看是否起作用,请查看http的响应头信息查看是否含有Accept-Encoding: gzip; 也可以通过比较Content-Length 来对比。

8,自动列目录配置

9,nginx缓存配置

10,nginx负载均衡和反向代理配置与优化

nginx配置文件结构,语法,配置命令解释的更多相关文章

  1. nginx 之 https 证书配置

    HTTPS原理和作用 为什么需要HTTPS 原因:HTTP不安全 传输数据被中间人盗用.信息泄露 数据内容劫持.篡改 HTTPS协议的实现 对传输内容进行加密以及身份验证 对称加密:加密秘钥和解密秘钥 ...

  2. nginx配置文件结构及location块语法规则

    一. nginx配置文件结构介绍 二. location语法规则: 用法示例: location [=|~|~*|^~] /uri/ { … } # 讲解如下: 1.  = 开头表示精确匹配 2.  ...

  3. 【nginx】nginx配置文件结构,内置变量及参数调优

    Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的.每个block一般以一个大括号“{”来表示.block 可以分为几个层次,整 ...

  4. nginx模型概念和配置文件结构

    一. nginx模型概念: Nginx会按需同时运行多个进程: 一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程( ...

  5. nginx配置文件结构

    nginx配置文件结构   全局参数 配置系统全局参数如:worker_processes 工作子进程数量.error_log 错误日志路径.pid 进程IDEvent一般是配置nginx工作模式及连 ...

  6. Nginx教程(四) Location配置与ReWrite语法

    Nginx教程(四) Location配置与ReWrite语法 1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {- } ...

  7. centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB 注意down掉网卡的方法 nginx效率没有LVS高 ipvsadm命令集 测试LVS方法 第三十三节课

    centos   LB负载均衡集群 三种模式区别 LVS/NAT 配置  LVS/DR 配置  LVS/DR + keepalived配置  nginx ip_hash 实现长连接  LVS是四层LB ...

  8. nginx的配置和基本使用命令

    配置文件基本说明 配置文件位置:/usr/local/nginx/conf/nginx.conf #设置用户群,nobody代表低权限用户 #user nobody; #工作衍生进程数,通常代表CPU ...

  9. Nginx教程(四) Location配置与ReWrite语法 (转)

    Nginx教程(四) Location配置与ReWrite语法 1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {… } ...

随机推荐

  1. python 爬虫随机获取User-Agent

    可以有两种方法: 1.随机生成 首先安装 pip install fake-useragent import random from fake_useragent import UserAgent d ...

  2. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(七)针对hadoop2.9.0启动DataManager失败问题

    DataManager启动失败 启动过程中发现一个问题:slave1,slave2,slave3都是只启动了DataNode,而DataManager并没有启动: [spark@slave1 hado ...

  3. PostgreSQL入门教程

    一.安装 首先,安装PostgreSQL客户端. sudo apt-get install postgresql-client 然后,安装PostgreSQL服务器. sudo apt-get ins ...

  4. ASP.NET Hashtable输出JSON格式数据

    最近在开发Windows8 Metro App,使用JavaScript和HTML开发环境.所以操作数据绑定都是使用JSON格式数据.后台使用的是ASP.NET,因为项目相对较小,所有后台没有使用数据 ...

  5. 微信小程序 - 怎样合理设计小程序

    假如我们无意中,把腾讯地图或者高德地图的管理Key删了! 关于定位的一切相关模块就都会报废! 接着呢?客户会找你,对你公司信任感下降,一系列问题接踵而来 最好的办法就是先预留key后台管理 “随时可以 ...

  6. spring Ioc 实践

    了解过IoC的概念,没有真正实践,感觉还是会比较模糊.自己的实践虽然简单,但还是记录下呀~ 1. 通过注解的方式注入service 1.1 controller中创建对象 @Controller @R ...

  7. 《React-Native系列》44、基于多个TextInput的键盘遮挡处理方案优化

    曾经写过两篇关于在ReactNative上处理键盘遮挡输入表单TextInput的情况.建议读者能够先看看 1.<React-Native系列>33. 键盘遮挡问题处理 2.<Rea ...

  8. C++库研究笔记--用__attribute__((deprecated)) 管理过时代码

    用__attribute__((deprecated)) 管理过时代码.同一时候保留兼容的接口 Linux下: #define DEPR_AFTER __attribute__((deprecated ...

  9. 事件响应的优先级、stopProgapation禁止下层组件响应

    cocos2d-js没有完整的鼠标事件处理,这点比js/flash的要差一些,不过凑合着也可以用了. 一般界面编程,可以用显示列表的Node作为监听器的优先级,在上方的会比下方的高优先级. 而coco ...

  10. Flash:TextField字体不显示/文字不显示/文字丢失

    节约大家时间,先说结论: 1.是否文字中包含了\r\n等字符,flash中,\r和\n都会换行.需要过滤掉其中1个   2.是否文本框大小不够,文字被挤到下一行了.设置单行.多行   3.TextFi ...