海运的博客

Nginx/PHP的SERVER_NAME和HTTP_HOST

发布时间:May 1, 2014 // 分类:Nginx,PHP // No Comments

SERVER_NAME对应Nginx配置文件中的server_name,通过fastcgi_param设置,如域名指向到IP而不在nginx中设置对应的server_name,PHP取SERVER_NAME为空,如果有多个server_name,取第一个。

server_name   www.haiyun.me;
fastcgi_param  SERVER_NAME        $server_name;

HTTP_HOST包含在HTTP请求信息中,即请求的域名或IP,Nginx内为host。

Nginx rewrite 指令last break区别

发布时间:February 8, 2014 // 分类:Nginx // No Comments

nginx 的官方注释是这样的:

last
   stops processing the current set of ngx_http_rewrite_module directives followed by a search for a new location matching the changed URI;

break
   stops processing the current set of ngx_http_rewrite_module directives;

我们知道nginx运行分十一个执行阶段,上面说提到的ngx_http_rewrite_mode,可以理解为其中一个阶段-rewrite阶段。​

typedef enum {
    NGX_HTTP_POST_READ_PHASE = 0,
    NGX_HTTP_SERVER_REWRITE_PHASE,
    NGX_HTTP_FIND_CONFIG_PHASE,
    NGX_HTTP_REWRITE_PHASE,           //rewrite阶段在这里
    NGX_HTTP_POST_REWRITE_PHASE,
    NGX_HTTP_PREACCESS_PHASE,
    NGX_HTTP_ACCESS_PHASE,
    NGX_HTTP_POST_ACCESS_PHASE,
    NGX_HTTP_TRY_FILES_PHASE,
    NGX_HTTP_CONTENT_PHASE,
    NGX_HTTP_LOG_PHASE
} ngx_http_phases;

所以我们再来理解last与break的区别:
last: 停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一阶段开始执行…
break:相对last,break并不会重新发起一个请求,只是跳过当前的rewrite阶段,并执行本请求后续的执行阶段…
我们来看一个例子:

server {
    listen 80 default_server;
    server_name dcshi.com;
    root www;

    location /break/ {
        rewrite ^/break/(.*) /test/$1 break;
        echo "break page";
    } 

    location /last/ {
         rewrite ^/last/(.*) /test/$1 last;
         echo "last page";
    }    

    location /test/ {
       echo "test page";
    }
}

请求:http://dcshi.com/break/*
输出: break page
分析:正如上面讨论所说,break是跳过当前请求的rewrite阶段,并继续执行本请求的其他阶段,很明显,对于/foo 对应的content阶段的输出为 echo “break page”; (content阶段,可以简单理解为产生数据输出的阶段,如返回静态页面内容也是在content阶段;echo指令也是运行在content阶段,一般情况下content阶段只能对应一个输出指令,如同一个location配置两个echo,最终只会有一个echo指令被执行);当然如果你把/break/里的echo 指令注释,然后再次访问/break/xx会报404,这也跟我们预期一样:虽然/break/xx被重定向到/test/xx,但是break指令不会重新开启一个新的请求继续匹配,所以nginx是不会匹配到下面的/test/这个location;在echo指令被注释的情况下,/break/ 这location里只能执行nginx默认的content指令,即尝试找/test/xx这个html页面并输出起内容,事实上,这个页面不存在,所以会报404的错误。

请求: http://dcshi.com/last/*
输出: test page
分析: last与break最大的不同是,last会重新发起一个新请求,并重新匹配location,所以对于/last,重新匹配请求以后会匹配到/test/,所以最终对应的content阶段的输出是test page;

假设你对nginx的运行阶段有一个大概的理解,对理解last与break就没有问题了。

原文:http://www.dcshi.com/?p=172

Nginx Proxy细节问题

发布时间:January 18, 2014 // 分类:Nginx // No Comments

1.rewrite使用break结,使用last会对server标签重新发起请求

location /a/ {
    rewrite ^/a/(.*)$ /b/$1 break;
    proxy_pass http://www.haiyun.me;
}

2.proxy_pass结尾添加/会丢弃路径目录,如下访问/a/test.html会代理到/test.html

location /a/ {
    rewrite ^/a/(.*)$ /b/$1 break;
    proxy_pass http://www.haiyun.me/;
}

3.代理访问重定向的网址:

proxy_redirect http://www.haiyun.me/ http://$host/;

Nginx Lua Proxy

发布时间:January 12, 2014 // 分类:Nginx // No Comments

location / {
    set $bindip '';
    content_by_lua_file '/usr/local/nginx/lua/proxy.lua';
} 
location /proxy {
    proxy_pass       "http://$host$request_uri";
    proxy_bind       $bindip;
}
local action = ngx.var.request_method
if action == "POST" then
    method = ngx.HTTP_POST
else
    method = ngx.HTTP_GET
end
res = ngx.location.capture(
    '/proxy', { method = method, always_forward_body = true, copy_all_vars = true }
    )
ngx.print(res.body)
ngx.print(res.status)

Nginx Lua HTTP客户端

发布时间:January 12, 2014 // 分类:Nginx // No Comments

git clone https://github.com/liseen/lua-resty-http.git

Nginx配置:

http
{
    llua_package_path "/path/to/lua-resty-http/lib/?.lua;;";
    server {
        location /test {
            content_by_lua_file '/usr/local/nginx/conf/lua/proxy.lua';
        }
}

Proxy.lua内容:

local http = require "resty.http"
local hc = http:new()
local url = "http://"
if ngx.var.http_host then
    url = url .. ngx.var.http_host 
end
url = url .. ngx.var.request_uri  -- 拼接完整的URL
if ngx.var.args then
    url = url .. "?" .. ngx.var.args
end
--[[
local ok, code, headers, status, body = hc:proxy_pass {
url = url,
proxy = "http://192.168.1.5:8118",
timeout = 3000,
headers = ngx.req.get_headers(), -- 传递客户端HEAD
method = ngx.var.request_method, -- 传递客户端method
method = "GET",
}
]]
local ok, code, headers, status, body = hc:request {
    url = url,
    proxy = "http://192.168.1.5:8118",
    timeout = 3000,
    headers = {UserAgent = "Mozilla/5.0"},
    headers = ngx.req.get_headers(), 
    method = ngx.var.request_method,
}
ngx.say(ok)
ngx.say(code)
ngx.say(body)
ngx.say(url)

更多:http://wendal.net/422.html

分类
最新文章
最近回复
  • 海运: 正常情况下编译整个内核执行make menuconfig后就不会出现此提示,当单独编译单个模块...
  • oijq: 就是用的armbian的配置文件哈,按你的教程做的,在执行make LOCALVERSION=...
  • 海运: 使用armbian的配置文件,其它添加或修改自己懂的部分,不懂的就不要碰了。
  • oijq: 编译时这些选项全部选Y吗?Actions Semi Platforms (ARCH_ACTIO...
  • 海运: n1编译bbr内核模块参考这个:https://www.haiyun.me/archives/...
  • jiqz: make M=net/ipv4/ CONFIG_TCP_CONG_BBR=m modules编...
  • ruralhunter: 哦,文档里应该是对的,是.config
  • ruralhunter: cp /mnt/boot/config-4.18.7-aml-s9xxx .config这里应...
  • 海运: 你是编译不成功呢?还是编译后不能运行呢?还是运行后不能访问web界面呢?
  • 白墨: 可能不清楚就是编译安装后启动后访问不了web界面