nginx作为一个web服务器和反向代理服务器,能够使web服务器和逻辑单独分离,也可以作为负载均衡服务器。基于这些优点,可以使用nginx反向代理skynet,即skynet监听本地的一个socket端口,收到请求后处理逻辑,然后返回结果。nginx和skynet可以同一台机器上,也可以在不同的机器上。
新建一个skynet服务并启动起来,当收到请求后简单返回一条信息
local skynet = require "skynet" local socket = require "socket" local httpd = require "http.httpd" local sockethelper = require "http.sockethelper" skynet.start(function() local id = socket.listen("0.0.0.0", 8008) skynet.error("Listen port 8008") socket.start(id , function(id, addr) socket.start(id) httpd.write_response(sockethelper.writefunc(id), 200,"this is a http response"); socket.close(id); end) end)
启动起来后log如下,监听8008端口
[:01000001] LAUNCHlogger [:01000002] LAUNCHsnluabootstrap [:01000003] LAUNCHsnlualauncher [:01000004] LAUNCHsnluacmaster [:01000004] masterlistensocket 0.0.0.0:2013 [:01000005] LAUNCHsnluacslave [:01000005] slaveconnectto master 127.0.0.1:2013 [:01000006] LAUNCHharbor 1 16777221 [:01000004] connectfrom 127.0.0.1:49321 4 [:01000004] Harbor 1 (fd=4) report 127.0.0.1:2526 [:01000005] Waitingfor 0 harbors [:01000005] Shakehandready [:01000007] LAUNCHsnluadatacenterd [:01000008] LAUNCHsnluaservice_mgr [:01000009] LAUNCHsnluamain Serverstart [:0100000a] LAUNCHsnluatestnginx [:0100000a] Listen port 8008 [:01000009] KILLself [:01000002] KILLself
nginx配置
server { listen 8020; server_name localhost; location ~ /server$ { proxy_passhttp://192.168.18.201:8008; proxy_set_header X-Real-IP $remote_addr; } }
将所有以server为uri的请求全部转向skynet的8008端口上。
重新加载nginx,用浏览器打开http://localhost:8020/server会收到一条信息显示在浏览器上。
this is a httpresponse
skynet已经自带了一个simpleweb例子,可以直接使用,还有一些解析header的代码,自己可以修改体验下skynet作为web服务器使用。