何时部署要启动lua nginx

何时部署要启动lua nginx,第1张

Lua是一个可以嵌入到Nginx配置文件中的动态脚本语言,从而可以在Nginx请求处理的任何阶段执行各种Lua代码。刚开始我们只是用Lua 把请求路由到后端服务器,但是它对我们架构的作用超出了我们的预期。下面就讲讲我们所做的工作。

强制搜索引擎只索引mixlr.com

Google把子域名当作完全独立的网站,我们不希望爬虫抓取子域名的页面,降低我们的Page rank

location /robots.txt {

rewrite_by_lua '

if ngx.var.http_host ~= "mixlr.com" then

return ngx.exec("/robots_disallow.txt")

end

'

}

如果对robots.txt的请求不是mixlr.com域名的话,则内部重写到robots_diallow.txt,虽然标准的重写指令也可以实现这个需求,但是 Lua的实现更容易理解和维护。

根据程序逻辑设置响应头

Lua提供了比Nginx默认配置规则更加灵活的设置方式。 在下面的例子中,我们要保证正确设置响应头,这样浏览器如果发送了指定请求头后,就可以 无限期缓存静态文件,是的用户只需下载一次即可。

这个重写规则使得任何静态文件,如果请求参数中包含时间戳值,那么就设置相应的Expires和Cache-Control响应头。

location / {

header_filter_by_lua '

if ngx.var.query_string and ngx.re.match( ngx.var.query_string, "^([0-9]{10})$" ) then

ngx.header["Expires"] = ngx.http_time( ngx.time() + 31536000 )

ngx.header["Cache-Control"] = "max-age=31536000"

end

'

try_files $uri @dynamic}

删除jQuery JSONP请求的时间戳参数

很多外部客户端请求JSONP接口时,都会包含一个时间戳类似的参数,从而导致Nginx proxy缓存无法命中(因为无法忽略指定的HTTP参数)。下面的 规则删除了时间戳参数,使得Nginx可以缓存upstream server的响应内容,减轻后端服务器的负载。

location / {

rewrite_by_lua '

if ngx.var.args ~= nil then

-- /some_request?_=1346491660 becomes /some_request

local fixed_args, count = ngx.re.sub( ngx.var.args, "&?_=[0-9]+", "" )

if count >0 then

return ngx.exec(ngx.var.uri, fixed_args)

end

end

'}

把后端的慢请求日志记录到Nginx的错误日志

如果后端请求响应很慢,可以把它记录到Nginx的错误日志,以备后续追查。

location / {

log_by_lua '

if tonumber(ngx.var.upstream_response_time) >= 1 then

ngx.log(ngx.WARN, "[SLOW] Ngx upstream response time: " .. ngx.var.upstream_response_time .. "s from " .. ngx.var.upstream_addr)

end

'}

基于Redis的实时IP封禁

某些情况下,需要阻止流氓爬虫的抓取,这可以通过专门的封禁设备去做,但是通过Lua,也可以实现简单版本的封禁。

lua_shared_dict banned_ips 1m

location / {

access_by_lua '

local banned_ips = ngx.shared.banned_ips

local updated_at = banned_ips:get("updated_at")

-- only update banned_ips from Redis once every ten seconds:

if updated_at == nil or updated_at <( ngx.now() - 10 ) then

local redis = require "resty.redis"

local red = redis:new()

red:set_timeout(200)

local ok, err = red:connect("your-redis-hostname", 6379)

if not ok then

ngx.log(ngx.WARN, "Redis connection error retrieving banned_ips: " .. err)

else

local updated_banned_ips, err = red:smembers("banned_ips")

if err then

ngx.log(ngx.WARN, "Redis read error retrieving banned_ips: " .. err)

else

-- replace the locally stored banned_ips with the updated values:

banned_ips:flush_all()

for index, banned_ip in ipairs(updated_banned_ips) do

banned_ips:set(banned_ip, true)

end

banned_ips:set("updated_at", ngx.now())

end

end

end

if banned_ips:get(ngx.var.remote_addr) then

ngx.log(ngx.WARN, "Banned IP detected and refused access: " .. ngx.var.remote_addr)

return ngx.exit(ngx.HTTP_FORBIDDEN)

end

'}

现在就可以阻止特定IP的访问:

1

ruby>$redis.sadd("banned_ips", "200.1.35.4")

Nginx进程每隔10秒从Redis获取一次最新的禁止IP名单。需要注意的是,如果架构中使用了Haproxy这样类似的负载均衡服务器时, 需要把$remote_addr设置为正确的远端IP地址。

这个方法还可以用于HTTP User-Agent字段的检查,要求满足指定条件。

使用Nginx输出CSRF(form_authenticity_token)

Mixlr大量使用页面缓存,由此引入的一个问题是如何给每个页面输出会话级别的CSRF token。我们通过Nginx的子请求,从upstream web server 获取token,然后利用Nginx的SSI(server-side include)功能输出到页面中。这样既解决了CSRF攻击问题,也保证了cache能被正常利用。

location /csrf_token_endpoint {

internal

include /opt/nginx/conf/proxy.conf

proxy_pass "http://upstream"}

location @dynamic {

ssi on

set $csrf_token ''

rewrite_by_lua '

-- Using a subrequest, we our upstream servers for the CSRF token for this session:

local csrf_capture = ngx.location.capture("/csrf_token_endpoint")

if csrf_capture.status == 200 then

ngx.var.csrf_token = csrf_capture.body

-- if this is a new session, ensure it sticks by passing through the new session_id

-- to both the subsequent upstream request, and the response:

if not ngx.var.cookie_session then

local match = ngx.re.match(csrf_capture.header["Set-Cookie"], "session=([a-zA-Z0-9_+=/+]+)")

if match then

ngx.req.set_header("Cookie", "session=" .. match[1])

ngx.header["Set-Cookie"] = csrf_capture.header["Set-Cookie"]

end

end

else

ngx.log(ngx.WARN, "No CSRF token returned from upstream, ignoring.")

end

'

try_files /maintenance.html /rails_cache$uri @thin}

CSRF token生成 app/metal/csrf_token_endpoint.rb:

class CsrfTokenEndpoint

def self.call(env)

if env["PATH_INFO"] =~ /^\/csrf_token_endpoint/

session = env["rack.session"] || {}

token = session[:_csrf_token]

if token.nil?

token = SecureRandom.base64(32)

session[:_csrf_token] = token

end

[ 200, { "Content-Type" =>"text/plain" }, [ token ] ]

else

[404, {"Content-Type" =>"text/html"}, ["Not Found"]]

end

endend

我们的模版文件示例:

<meta name="csrf-param" value="authenticity_token"/>

<meta name="csrf-token" value="<!--# echo var="csrf_token" default="" encoding="none" -->"/>

Again you could make use of lua_shared_dict to store in memory the CSRF token for a particular session. This minimises the number of trips made to /csrf_token_endpoint.

Python有很多用途,Python主要有以下主要应用:Web开发、数据科学、自动化运维,让运维工作变得简单、快速、准确等,若想学习Python,推荐选择达内教育,python教程,为零基础量身打造的python课程,从入门到精通,轻松入门,利用自己的碎片时间学习python。

达内教育该机构是引领行业的职业教育公司,致力于面向IT互联网行业,培养软件开发工程师、会计等职场人才,拥有强大的师资力量,实战讲师对实战经验倾囊相授,部分讲师曾就职于IBM、微软、Oracle-Sun等企业,其教研团队更是有独家26大课程体系,助力学生系统化学习,同时还与各大高校进行合作,助力学生职业方向的发展。秉承“名师出高徒、高徒拿高薪”的教学理念,是达内公司确保教学质量的重要环节。作为美国上市职业教育公司,诚信经营,拒绝虚假宣传是该机构集团的经营理念。该机构在学员报名之前完全公开所有授课讲师的授课安排及背景资料,并与学员签订《指定授课讲师承诺书》,确保学员利益。

想了解更多有关Python的相关信息,推荐咨询达内教育。该机构已从事多年IT技术培训,累计培养100万学员,并且独创TTS8.0教学系统,1v1督学,跟踪式学习,有疑问随时沟通。该机构26大课程体系紧跟企业需求,企业级项目,课程穿插大厂真实项目讲解,对标企业人才标准,制定专业学习计划,囊括主流热点技术。

1、Web开发:结合python、html、css、javascript、数据库等开发一个网站。

2、数据科学

数据科学,包括了机器学习,数据分析和数据可视化。

将Python用于机器学习:可以研究人工智能、机器人、语言识别、图像识别、自然语言处理和专家系统等

将Python用于数据分析/可视化:大数据分析等等

3、网络爬虫

网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序。众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容。

在爬虫领域,Python是必不可少的一部分。将网络一切数据作为资源,通过自动化程序进行有针对性的数据采集以及处理。

4、自动化运维

随着技术的进步、业务需求的快速增长,一个运维人员通常要管理上百、上千台服务器,运维工作也变的重复、繁杂。把运维工作自动化,能够把运维人员从服务器的管理中解放出来,让运维工作变得简单、快速、准确。

5、嵌入式应用开发

6、游戏开发

7、桌面应用开发


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6174522.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-17
下一篇 2023-03-17

发表评论

登录后才能评论

评论列表(0条)

保存