当前位置:首页 » 网页前端 » nginxluaweb
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

nginxluaweb

发布时间: 2022-09-10 17:02:53

❶ openresty与Nginx有什么关系

OpenResty一个全功能的Web应用服务器,它打包了标准的Nginx核心,很多的常用的第三方模块,以及它们的大多数依赖项。

OpenResty通过汇聚各种设计精良的Nginx模块,从而将Nginx有效的变成一个强大的Web应用服务器,Web开发人员可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任 10K+并发连接响应的超高性能Web 应用系统。

openresty性能内存储器容量:

openresty性能需要执行的程序与需要处理的数据就是存放在主存中的。内存储器容量的大小反映了计算机即时存储信息的能力。随着操作系统的升级,应用软件的不断丰富及其功能的不断扩展,人们对计算机内存容量的需求也不断提高。

openresty性能运行Windows 95或Windows 98操作系统至少需要 16 M的内存容量,Windows XP则需要128 M以上的内存容量。内存容量越大,系统功能就越强大,能处理的数据量就越庞大。

❷ 何时部署要启动lua nginx

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.

❸ Nginx是如何实现轻量级和高并发

源码上,尽可能的使用html,静态页面去完成。 环境上,可以使用nginx+apache+php+mysql 组合。目前大型网站基本都是使用php语言去写。 数据库需要专业优化结果,做好字段索引等 服务器带宽上,也需要非常高的要求。这个不是一下子都能说清楚的。...

❹ Web后台语言的选择

‍‍

php不适合,推荐lua,用openresty,虽然都是高级语言,但lua可以跟nginx无缝结合,lua是跑在nginx进程中的,这样就很有意思了。我写了一个简单的hello world,用ngx_lua跟php_fpm测试,lua每秒1万次,php每秒55次。为什么会如此悬殊?php通过php-fpm跟nginx实现业务功能,之间要通过网络;而lua是内嵌的,嵌入nginx内部,实现业务功能跟c语言掉个函数差不多。php每次执行都要编译。lua只编译一次,就驻内存中了。这个不仅仅是编译的开销,脚本文件本身从硬盘读取就是耗时的操作。当然php有一些优化手段,但无论怎么优化,都没有只加载一次速度快。php每次执行都是这个速度,而lua第一次执行稍慢,以后就快了。php是同步的,长时间的操作很容易耗尽连接数。lua是异步的。php调用mysql,文件读取等,用api调用,这个是同步操作。而lua是通过nginx的子请求实现的,而nginx本身是异步的。不仅仅是mysql这些,业务本身的一些操作也可以分为几个子请求完成。而nginx的子请求非常快,损耗忽略不计,业务代码可以通过划分子请求来实现业务耦合,降低耦合度有很多的帮助,每个子系统也相对简单很多。php,东西多的话,尤其mvc需要有一种熟练的框架,CodeIgniter, Yii, Zend 等等。上手简单,可以直接在页面中通过echo之类的函数加载动态值,做个mvp之类的东西出活快社区强大,各种问题都有现成的解。node比较火,异步很强大,语法和js一样,但个人感觉其实易用性易读性程度不如php。

‍‍

❺ lua 如何应用

作为一名程序员,相信大家在软件架构图上经常见到 “Nginx + Lua” 的字样,但是对于Lua在Web应用中的作用并没有多少了解。
该篇文章对 Lua 的语言特性、优势等方面做介绍,并通过介绍一个天气预报的 Web 应用,让大家对 Lua 在Web应用中充当的角色有一个直观的认识。
什么是 Lua
Lua 是用标准C语言编写的一种小巧的脚本语言,并以源代码形式开放。Lua 并没有提供强大的库,所以我们很少单独使用 Lua 去编写程序,其设计目的是为了嵌入其他应用程序中,比如嵌入 Cocos2d-x 游戏引擎或 Nginx 服务器,从而为应用程序提供灵活的扩展和定制功能。
Lua 的语言特性
Lua 的语法并不复杂,易于上手,而且网上已有大量的语法教程,所以该篇文章不再赘叙,这里介绍几个 Lua 语言相对重要的语言特性。
协程并发
协程相对独立,有自己的上下文,但是其切换由程序自己控制(线程的切换是由操作系统控制,这是协程与线程的重要区别)。
Lua 的协程通过扩展库 coroutine 来实现,通过 create 函数创建一个协程,resume 函数以运行此协程,直到新协程调用 yield 函数,程序才能返回到“主协程”中运行。

❻ web服务器有哪些

目前主流web服务器有三个:apache、IIS、nginx。
其中apache是开源的老牌服务器,多用于传统业务,其优点是系统稳定,扩展模块丰富,各种特性支持完整,并且跨平台。
IIS是微软主力打造的web服务器,目前作为Windows系统组件一部分,和微软上层web开发(asp.net)应用接口紧密。
nginx是开源的后起之秀,是俄罗斯开发的一款用于高并发服务的web服务器,主要应用于高并发网站、静态服务器、下载服务器等,其优点是性能更高,支持负载均衡,反向代理。
国产web服务器主要有:
Tengine:是淘宝开发团队基于nginx修改的,优化了资源请求的web服务器,其特点继承nginx,并针对资源请求做了优化。
数蚕web服务器:是数蚕科技基于c++的Linux下的web服务器,主要用于静态页面和简单的计算型服务网站。其特点是支持高并发,支持多进程,c++/c接口良好,支持直接基于C++模板开发。

❼ 如何在Ubuntu 16.04上使用Nginx的OpenResty Web框架

第1步 - 下载OpenResty的源代码和依赖关系

在本节中,我们将从源代码安装OpenResty。

首先,从OpenResty网站的下载页面找到最新的OpenResty源代码版本。下载tarball,确保如果更改了版本号,请使用最新版本号。

wget https://openresty.org/download/openresty-1.11.2.2.tar.gz
下载PGP密钥文件,以便我们可以验证文件的内容。

wget https://openresty.org/download/openresty-1.11.2.2.tar.gz.asc
接下来,我们需要添加作者的公共密钥,如下载页面上所列。在撰写本文时,这是公钥A0E98066 。但是,请检查它是否已更改;它被列在同一下载页面上。

gpg --keyserver pgpkeys.mit.e --recv-key A0E98066

第2步 - 安装OpenResty

我们将配置OpenResty与PCRE正则表达式和IPv6支持。我们还将通过提供-j2标志来并行化构建过程的一部分,这将告诉make 2个作业可以同时运行。此命令将主要测试所有依赖项是否可用于您的系统,并收集将由构建步骤稍后使用的信息。它也已经构建了一些依赖项,如LuaJIT。./configure -j2 --with-pcre-jit --with-ipv6
然后,您可以通过提供-j2并行度标志来构建OpenResty。这将编译OpenResty本身。make -j2
最后,您可以安装OpenResty。使用sudo确保所有文件可以复制到系统上的正确位置,以便OpenResty可以在运行时找到它们。sudo make install
您需要在防火墙中允许HTTP连接才能使Web服务器正常工作。sudo ufw allow http
您也可以选择允许HTTPS与sudo ufw allow https如果你要使用它。您可以通过检查防火墙的状态来验证防火墙的更改。sudo ufw status
您应该看到显示的输出中允许HTTP流量(端口80 ),以及如果您添加它的HTTPS(端口443 )。

您现在可以检查安装是否有效。首先,启动OpenResty。sudo /usr/local/openresty/bin/openresty
如果命令成功,它将立即完成而不输出文本。在这种情况下,您可以在浏览器中访问http:// your_server_ip 。 你会看到一个页面,说欢迎来到OpenResty!确认它已完全安装和工作。

您现在可以停止OpenResty服务器。sudo /usr/local/openresty/bin/openresty -s quit
OpenResty已安装,但您仍需要配置OpenResty在启动时运行,所以服务器不必手动启动。

第3步 - 将OpenResty设置为服务

在这里,我们将OpenResty设置为一个服务,所以它在启动时自动启动。我们将使用systemd init服务。 您可以阅读此systemd基础教程了解更多信息,以及本单元文件教程 ,了解单元文件的具体信息。

首先使用nano或您喜欢的文本编辑器创建一个新的systemd文件。sudo nano /etc/systemd/system/openresty.service
对于本教程,我们将从全新安装中复制默认的Nginx systemd文件,并针对OpenResty进行修改。

第4步 - 配置OpenResty

要配置OpenResty,我们使用默认的Nginx配置作为参考,以便它大部分匹配你可能会熟悉的。 首先,再次打开OpenResty配置文件: sudo nano /usr/local/openresty/nginx/conf/nginx.conf
这一次,我们将修改http块并将此http块中的server块移动到一个新文件以具有更好的结构。 首先,找到http {行,并删除之后的一切,除了最后一行与对应的} 。

当前/usr/local/openresty/nginx/conf/nginx.conf

user www-data;worker_processes auto;pid /run/openresty.pid;events {
worker_connections 1024;}http {
include mime.types;
default_type application/octet-stream;

. . .}
然后,将以下内容复制到http块中,以便整个文件看起来像这样。我们将一次过一个更改。

/usr/local/openresty/nginx/conf/nginx.conf

user www-data;worker_processes auto;pid /run/openresty.pid;events {
worker_connections 1024;}http {
include mime.types;
default_type application/octet-stream;

sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 65;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

access_log /var/log/openresty/access.log;
error_log /var/log/openresty/error.log;

gzip on;
gzip_disable "msie6";

include ../sites/*;
}
保存并关闭文件。 我们对默认文件所做的更改是:

  • 取消tcp_nopush on; ,它告诉OpenResty只发送完整的数据包。 当使用sendfile选项时,此选项很有用,这将允许OpenResty优化将静态文件发送到客户端。

  • 添加tcp_nodelay on; 。 此选项将尝试尽快发送数据包,这可能看起来与上述选项相反,但它在不同的时间使用。 tcp_nodelay仅在对HTTP请求使用keepalive选项时使用,这是通过Web浏览器连接到Web服务器,这将避免每次请求时启动HTTP连接的开销。

  • 添加和修改ssl_protocols和ssl_prefer_server_ciphers行。这些选项配置OpenResty的SSL选项。我们删除了易受已知的HTTPS攻击的旧协议,例如POODLE攻击。

  • 添加access_log和error_log行,它们配置Web服务器的日志位置。 我们将日志存储在上一步中创建的/var/log/openresty目录中。

  • 取消注释gzip on并添加gzip_disable "msie6" 。这些选项将配置GZIP,这将压缩网页,以便有更少的数据传输。我们还添加了最后一个选项,因为Internet Explorer 6(及更早版本)并不总是正确处理GZIP内容。

  • 添加include ../sites/*; ,它告诉OpenResty在/usr/local/openresty/nginx/sites目录中查找额外的配置文件,稍后我们将创建它。

  • 删除所有server块,我们将在此步骤中稍后重新定位到新文件。

  • 接下来,创建我们在include行中指定的新sites目录。 sudo mkdir /usr/local/openresty/nginx/sites

  • 创建default网站。 sudo nano /usr/local/openresty/nginx/sites/default.conf

  • 在此新文件中添加以下内容。这是从nginx.conf重新定位原始服务器块,但有更多细节的内联注释。
  • /usr/local/openresty/nginx/sites/default.conf

  • server {

  • # Listen on port 80.

  • listen 80 default_server;

  • listen [::]:80 default_server;


  • # The document root.

  • root /usr/local/openresty/nginx/html/default;


  • # Add index.php if you are using PHP.

  • index index.html index.htm;


  • # The server name, which isn't relevant in this case, because we only have one.

  • server_name _;


  • # When we try to access this site...

  • location / {

  • # ... first attempt to serve request as file, then as a directory,

  • # then fall back to displaying a 404.

  • try_files $uri $uri/ =404;

  • }


  • # Redirect server error pages to the static page /50x.html.

  • error_page 500 502 503 504 /50x.html;

  • location = /50x.html {

  • root /usr/local/openresty/nginx/html;

  • }}

  • 保存并关闭文件。 现在,为此网站创建一个新目录。 sudo mkdir /usr/local/openresty/nginx/html/default

  • 然后将原始index.html从其原始位置移动到新目录。 sudo mv /usr/local/openresty/nginx/html/index.html /usr/local/openresty/nginx/html/default

  • 最后,重新启动OpenResty以使用此新站点。 sudo systemctl restart openresty

  • 您现在可以再次访问http:// your_server_ip ,并查看与之前相同的网页。 现在OpenResty是完全配置的,我们可以尝试一些由OpenResty介绍的,在Nginx默认情况下不可用的功能。
  • 第5步 - 使用OpenResty Lua模块

  • 在本节中,我们将看看OpenResty添加的不同模块的组合,这些模块都存在以适应Lua脚本。我们将在整个步骤中/usr/local/openresty/nginx/sites/default.conf /usr/local/openresty/nginx/sites/default.conf,因此首先打开它。 sudo nano /usr/local/openresty/nginx/sites/default.conf

  • 首先,我们将看一下content_by_lua_block配置选项。 从下面的示例配置中复制location块,并将其添加到server块中,位于两个现有location块下面。
  • /usr/local/openresty/nginx/sites/default.conf content_by_lua_block示例

  • server {

  • . . .


  • location /example {

  • default_type 'text/plain';


  • content_by_lua_block {

  • ngx.say('Hello, Sammy!')

  • }

  • }}

  • 保存并关闭文件,然后重新加载配置。 sudo systemctl reload openresty

  • 如果您http:// your_server_ip /example访问http:// your_server_ip /example ,您会看到一个http:// your_server_ip /example 您好,Sammy的页面! 。让我们解释这是如何工作的。 content_by_lua_block配置指令执行其中的所有内容作为Lua代码。 在这里,我们使用Lua函数ngx.say来打印消息Hello,Sammy!到页面。 对于另一个示例,将location /example块的内容替换为:
  • /usr/local/openresty/nginx/sites/default.conf content_by_lua_file示例

  • server {

  • . . .


  • location /example {

  • default_type 'text/plain';


  • content_by_lua_file /usr/local/openresty/nginx/html/default/index.lua;

  • }}

  • content_by_lua_file从外部文件加载Lua内容,所以让我们创建上面指定的内容: /usr/local/openresty/nginx/html/default/index.lua 。 sudo nano /usr/local/openresty/nginx/html/default/index.lua

  • 将以下内容添加到文件,然后保存并将其关闭。
  • /usr/local/openresty/nginx/html/default/index.lua

  • local name = ngx.var.arg_name or "Anonymous"ngx.say("Hello, ", name, "!")

  • 这是一个简单的Lua,它读取URL中的查询参数, name并自定义问候消息。如果没有传递参数,则使用“匿名”。 再次重新加载配置。 sudo systemctl reload openresty

  • 现在,在浏览器中访问http:// your_server_ip /example?name= Sammy 。 这将显示你好,Sammy! 。 您可以更改name查询参数,或完全忽略它。 Hello, Sammy!

  • 您还可以更改name查询参数以显示任何其他名称。 警告:请勿将您要加载的Lua文件从Web访问到的位置。如果这样做,如果有人访问此文件,则可能会包含应用程序代码。将文件放在文档根目录之外,例如,将文档根目录更改为/usr/local/openresty/nginx/html/default/public ,并将Lua文件放在其上一个目录。

如何配置lua的WEB运行环境

有两种方式,一种是apache2.3以上会内置的lua mole,大家可以下载apache httpd 2.3.8的代码,在moles目录下有lua这个目录。
另外一种是今天要介绍的,使用wsapi方式。
我们使用ubuntu服务器,先确保lua5.14以及apache2都安装成功。
然后
sudo apt-get install apache2-mpm-worker liblua5.1-0-dev luarocks
sudo apt-get install libfcgi-dev libapache2-mod-fcgid
sudo luarocks install wsapi-fcgi
然后修改.htaccess或者httpd.conf或者你的vhost配置,添加下面部分。
Options ExecCGI
AddHandler fcgid-script .lua
FCGIWrapper /usr/local/lib/luarocks/bin/wsapi.fcgi .lua
要注意的是wsapi.fcgi也许是在不同目录下,用find自己找吧。
在var/www下你的站点中新建一个luacgi目录,然后建立两个文件。
launcher.fcgi:
#!/usr/bin/env lua
require "wsapi.fastcgi"
require "hello"
wsapi.fastcgi.run(hello.run)
index.lua:
mole(…, package.seeall)
function run(wsapi_env)
local headers = { ["Content-type"] = "text/html" }
local function hello_text()
coroutine.yield("<html><body>")
coroutine.yield("<p>Hello Wsapi!</p>")
coroutine.yield("<p>PATH_INFO: " .. wsapi_env.PATH_INFO .. "</p>")
coroutine.yield("<p>SCRIPT_NAME: " .. wsapi_env.SCRIPT_NAME .. "</p>")
coroutine.yield("</body></html>")
end
return 200, headers, coroutine.wrap(hello_text)
end
然后用chown –R www-data:www-data luacgi修改目录owner。
这时候应该就能用xxx.com/luacgi/index.lua访问了。
如果你用nginx,也有现成的lua mod可以使用(作者是淘宝的程序员),这里就不多说了。