前两天区听了一堂Nginx的课,然后翻了一下自己之前的Nginx的笔记,做了一个简单的小结。

全局变量

$args : 这个变量等于请求行中的参数,同$query_string

$content_length : 请求头中的Content-length字段

$content_type : 请求头中的Content-Type字段

$document_root : 当前请求在root指令中指定的值

$host : 请求主机头字段,否则为服务器名称

$http_user_agent : 客户端agent信息

$http_cookie : 客户端cookie信息

$limit_rate : 这个变量可以限制连接速率

$request_method : 客户端请求的动作,通常为GETPOST

$remote_addr : 客户端的IP地址

$remote_port : 客户端的端口

$remote_user : 已经经过Auth Basic Module验证的用户名

$request_filename : 当前请求的文件路径,由rootalias指令与URI请求生成

$scheme : HTTP方法(如httphttps

$server_protocol : 请求使用的协议,通常是HTTP/1.0HTTP/1.1

$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值

$server_name : 服务器名称

$server_port : 请求到达服务器的端口号

$request_uri : 包含请求参数的原始URI,不包含主机名,如/foo/bar.php?arg=baz

$uri : 不带请求参数的当前URI$uri不包含主机名,如/foo/bar.html

$document_uri : 与$uri相同

假设请求为http://www.qq.com:8080/a/b/c.php,则

$host:www.qq.com

$server_port:8080

$request_uri:http://www.qq.com:8080/a/b/c.php

$document_uri:/a/b/c.php

$document_root:/var/www/html

$request_filename:/var/www/html/a/b/c.php

主机名(server_name)匹配

从上到下的优先级为从高到低

  1. 明确的server_name名称,如www.qq.com
  2. 前缀通配符,如*.qq.com. qq.com
  3. 后缀通配符,如www.qq.*
  4. 正则表达式,如~[a-z]+\.qq\.com

Location查找规则

从上到下的优先级为从高到低

  1. 等号类型,精确匹配,如location = / {}
  2. ^~类型,前缀匹配,不支持正则,如location ^~ /user {}
  3. ~~*类型,正则匹配,~区分大小写,~*不区分大小写,如location ~ ^/user {}
  4. 常规字符串匹配类型,如location / {}location /user {}

Try_files规则

try_files $uri $uri/ /index.php

假设请求为http://www.qq.com/test,则$uritest

  1. 查找/$root/test文件
  2. 查找/$root/test/目录
  3. 发起/index.php的内部“子请求”

Rewrite规则

rewrite ^/images/(.*).(png|jpg|gif)$ /images?name=$1.$4 last;

上面的rewrite规则会将文件名改写到参数中

last : 相当于Apache的[L]标记,表示完成rewrite

break : 停止执行当前虚拟主机的后续rewrite指令集

redirect : 返回302临时重定向,地址栏会显示跳转后的地址

permanent : 返回301永久重定向,地址栏会显示跳转后的地址

负载均衡

例子如下

upstream backend1 {
server backend1.qq.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3 backup;
} upstream backend2 {
ip_hash;
server backend1.qq.com;
server backend2.qq.com;
server backend3.qq.com down;
server backend4.qq.com;
} server {
location / {
proxy_pass http://backend1;
} location /api {
proxy_pass http://backend2;
}
}

查看一个实例

下面是一个 laravel框架Nginx配置的例子,听过这堂课终于了解了下面的原理。

server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on; # 设定网站根目录
root /var/www/laravel/public;
# 网站默认首页
index index.php index.html index.htm; # 服务器名称,server_domain_or_IP 请替换为自己设置的名称或者 IP 地址
server_name server_domain_or_IP; # 修改为 Laravel 转发规则,否则PHP无法获取$_GET信息,提示404错误
location / {
try_files $uri $uri/ /index.php?$query_string;
} # PHP 支持
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

我们主要关注两个location,假设地址是http://www.qq.com/user/info,会匹配到如下location

    location / {
try_files $uri $uri/ /index.php?$query_string;
}

由于$uri$uri/是不存在的,所以会走/index.php?$query_string,这时候会发起一个内部“子请求”,“子请求”会重新匹配location,然后匹配到如下location

    location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

这样请求就会发送到fastcgi去做处理。

Nginx配置小结的更多相关文章

  1. Nginx 配置简述

    不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...

  2. 【nginx配置】nginx做非80端口转发

    一个场景 最近在使用PHP重写一个使用JAVA写的项目,因为需要查看之前的项目,所以要在本地搭建一个Tomcat来跑JAVA的项目.搭建成功后,因为Tomcat监听的端口是8080,因此,访问的URL ...

  3. [转帖]nginx配置ssl加密(单/双向认证、部分https)

    nginx配置ssl加密(单/双向认证.部分https) https://segmentfault.com/a/1190000002866627   nginx下配置ssl本来是很简单的,无论是去认证 ...

  4. Nginx配置信息损毁又无备份时如何恢复

    worker_processes *; 本文介绍在Nginx配置信息出现问题后,在没有备份的情况下,如何利用Nginx进程的虚拟内存恢复配置信息. 问题背景 假设 /etc/nginx/site-av ...

  5. 基于HTTPS的接口测试——nginx配置SSL

    目录 基于HTTPS的接口测试--nginx配置SSL 1. 背景 2. 所需环境与域名备案解析 2.1 云服务器 2.2 域名 2.3 SSL证书 2.4 网站备案 2.5 域名解析 3.nginx ...

  6. nginx配置反向代理或跳转出现400问题处理记录

    午休完上班后,同事说测试站点访问接口出现400 Bad Request  Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...

  7. Windos环境用Nginx配置反向代理和负载均衡

    Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...

  8. Windows下Nginx配置SSL实现Https访问(包含证书生成)

    Vincent.李   Windows下Nginx配置SSL实现Https访问(包含证书生成) Windows下Nginx配置SSL实现Https访问(包含证书生成) 首先要说明为什么要实现https ...

  9. Nginx配置详解

    序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也 ...

随机推荐

  1. 【Spring源码分析】Bean加载流程概览

    代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事 ...

  2. 【noip模拟】tree

    000 ms        Memory Limit: 128 MB [吐槽] 点分治点分治点分治 嗯..场上思考树状数组的时候好像傻掉了..反正就是挂了就是了.. [题解] 首先如果没有环的话就是一 ...

  3. c#多线程同步之EventWaitHandle使用

    有这么一个场景,我需要借助windows剪贴板把数据插入到word域中. 实现步骤: 1.把剪贴板数据保存到变量. 2.使用剪贴板实现我们的业务. 3.把变量里的数据存回剪贴板. 但是结果却令人诧异, ...

  4. ------ 开源软件 Tor(洋葱路由器,构建匿名网络的方案之一)源码分析——主程序入口点(二)------

    ---------------------------------------------------------- 第二部分仅考察下图所示的代码片段--configure_backtrace_han ...

  5. 我的C++学习之旅

    说在前面:1.学习缘由及学习途径: 在学了Python,c#(自认为未精通)之后,我决定学一下C++. 于是去网上找视频教程,发现都不适合我这种有一定基础的自学者,要么是不完整的高级教程,要么是零基础 ...

  6. c++标准头文件

    C++标准库的所有头文件都没有扩展名.C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能. <cname>形式的标准头文件[ <complex>例外]其 ...

  7. VM及centOS系统安装

    虚拟机安装linux及配置

  8. Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)

    因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧. 一.加密原理 记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这 ...

  9. ES6的generator函数

    generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...

  10. Intellij idea操作maven时控制台中文乱码

    只留存记录 windows环境下,Intellij idea12中maven操作时,控制台中文乱码问题(编译报错或者clean install时出现的其他错误描述乱码) 在cmd中mvn中文正常显示, ...