2

私は OpenResty Nginx を使用しており、Nginx conf に Lua スクリプトのスニペットがあります。(以下のサンプルですが、簡潔にするために切り捨てられています)。nginx.conf ファイルにある場合、これは正常に機能します。

rewrite_by_lua '

    -- Load Memcached module
    local memcached = require "resty.memcached"
    local memc, err = memcached:new()
    if not memc then
        ngx.log(ngx.ERR, "Failed to instantiate memc: ", err)
        return
    end
'

ただし、このスクリプトをファイルに抽出memcached.luaして nginx 構成に含めると、nginxrewrite_by_lua_fileを再起動できず、次のような構文エラーに関する通知を受け取ることができません。

unexpected "," in /etc/nginx/sites-enabled/memcached.lua

unknown directive "--" in /etc/nginx/sites-enabled/memcached.lua

ngx.log 行を完全に削除すると、構文エラーは消えます。

nginx conf では構文が有効であるのに、別のファイルに抽出すると無効になるのはなぜですか? バイトコードについてどこかで読んだことがありますが、それが関連しているかどうかわかりませんか?

編集

.lua ファイルの完全な出力を次に示します。この正確なコードは、nginx.conf ファイルに直接埋め込まれている場合に機能します。rewrite_by_lua

cat /etc/nginx/sites-enabled/memcached.lua

-- Define Memcached key
local memcached_key = "saas_" .. ngx.var.host

-- Load Memcached module
local memcached = require "resty.memcached"
local memc, err = memcached:new()
if not memc then
    ngx.log(ngx.ERR, "Failed to instantiate memc: ")
end

-- Set Memcached timeout
memc:set_timeout(1000)

-- Connect to Memcached daemon
local ok, err = memc:connect("127.0.0.1", 11211)
if not ok then
    ngx.log(ngx.ALERT, "Failed to connect to Memcached: ", err)
end

-- Query for branch name in Memcached
local branch, flags, err = memc:get(memcached_key)
if err then
    ngx.log(ngx.NOTICE, "Failed to get account from Memcached: ", err)
end

-- If branch not found in Memcached, ask MySQL instead
if not branch then

    -- Load MySQL module
    local mysql = require "resty.mysql"
    local db, err = mysql:new()
    if not db then
        ngx.log(ngx.ALERT, "Failed to instantiate MySQL: ", err)
        return
    end

    -- Set MySQL timeout
    db:set_timeout(1000) -- 1 sec

    -- Connect to MySQL daemon
    local ok, err, errno, sqlstate = db:connect{
        path = "/var/run/mysqld/mysqld.sock",
        database = "dbname",
        user = "dbuser",
        password = "dbpass" }
    if not ok then
        ngx.log(ngx.ALERT, "Failed to connect to DB: ", err, ": ", errno, " ", sqlstate)
        return
    end

    -- Define subdomain string by extracting it from the http hostname
    local subdomain = string.match(ngx.var.host, "([%w-]+).")
    local quoted_subdomain = ngx.quote_sql_str(subdomain)

    -- Execute an SQL query to get the branch name based on the subdomain
    local sql = "SELECT branch FROM saas_account WHERE account = " .. quoted_subdomain
    local res, err, errno, sqlstate = db:query(sql, 1)
    if not res then
        ngx.log(ngx.ALERT, "Bad result from DB: ", err, ": ", errno, ": ", sqlstate, ".")
        return
    end

    -- Check we got a result
    if not res[1] then
        ngx.log(ngx.NOTICE, "No docroot was returned for subdomain: ", subdomain)
        ngx.var.branch = "chaletops"
    -- Assign the result from MySQL to the Nginx variable
    else
        ngx.var.branch = res[1].branch

        -- Store the result from MySQL back in to Memcached with a lifetime of 1 hour (3600 seconds)
        local ok, err = memc:set(memcached_key, ngx.var.branch, 3600)
        if not ok then
            ngx.log(ngx.WARN, "Failed to set branch in Memcached: ", err)
            -- return
        end
    end

    -- Save MySQL KeepAlive connection
    local ok, err = db:set_keepalive(10000, 100)
    if not ok then
        ngx.log(ngx.ALERT, "Cannot set MySQL keepalive: ", err)
        return
    end

    ngx.log(ngx.NOTICE, "Loading branch from MySQL: ", ngx.var.branch)

-- Else we did get a result from Memcached
else

    -- Assign the result from Memcached to the Nginx variable
    ngx.var.branch = branch

    ngx.log(ngx.NOTICE, "Loading branch from Memcached: ", ngx.var.branch)

end

-- Save Memcached KeepAlive connection
local ok, err = memc:set_keepalive(10000, 100)
if not ok then
    ngx.log(ngx.ALERT, "Cannot set Memcached keepalive: ", err)
    -- return
end

解決

TL:DR - .lua ファイルを Nginx 構成ディレクトリの外に置きます。

正確なエラー メッセージを投稿するよう求められた後、問題を再現する必要がありました。参照および Google 検索者向けに、エラー メッセージは次のようになります。

2015/12/17 10:04:02 [emerg] 6903#0: unexpected "," in /etc/nginx/sites-enabled/memcached.lua:18

今回は nginx.conf から Lua のコードをコピーして というファイルに入れmemcached.lua、プロジェクト ディレクトリに保存しました。次に、Lua スクリプトの代わりに、nginx.conf に次のインクルードを追加しました。

rewrite_by_lua_file /path/to/my/project/memcached.lua;

すぐにそれは働き始めます!

以前は、プロジェクト ディレクトリから にシンボリック リンクして/etc/nginx/sites-enabled/memcached.lua(それを含む .conf と一緒に実際に存在する方がよいと仮定して) それをインクルードしrewrite_by_lua_file memcached.lua;、.conf ファイルに対して相対的に使用していました。

だから私は最初、rewrite_by_lua_file関数がシンボリックリンクなどをたどることができなかったのではないかと思っていましたが、Luaのインクルードステートメントとは何の関係もないことに気づきましたが、シンボリックリンクが含まれている/etc/nginx/sites-enabledため、Nginxは明らかに(今!)通常のNginx構成ファイルであるかのように、ファイルを自動的にロードしようとします。

これは、Nginx (Ubuntu/Linux Mint 上) が/etc/nginx/sites-enabled/*メイン構成へのパスを使用してすべての構成ファイルをインポートするように構成されているためです。

私がこの単純なエラーを作成した理由は、Apache を使用した後のバージョンの Ubuntu で同様のプロセスが発生するためだと思いますが、Apache (私ははるかに慣れています) ではインクルード パスがあります。/etc/nginx/sites-enabled/*.confつまり、具体的には .conf ファイルが必要です。これが、Nginx が私の .lua ファイルをインクルードしようとしないと誤って想定した理由です。

4

0 に答える 0