wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
tar -zxf openresty-1.15.8.2.tar.gz
mysql을 운영하기 위해 nginx와 lua를 통합하는 방법
구현 아이디어
nginx에서 직접 블랙리스트를 구성하고 논리 블록을 작성하여 구현합니다.
서버(Java)에서 필터를 작성하고 필터에서 균일하게 차단합니다.
서버에서 인터셉터를 작성합니다. (Java) 인터셉터에서 균일하게 가로채기
여기에 3가지 구현 아이디어가 있습니다. 구현 솔루션에 관해서는 더 있을 수 있지만 생각해 보면 nginx에서 논리 블록을 작성하는 것은 그렇게 많은 사람들이 아닌 것처럼 보입니다. 코드 수준에서 수행하는 것이 불가능하지는 않지만 이러한 방식으로 높은 동시성을 수반하는 비즈니스 피크 기간에는 필연적으로 백엔드 서비스에 더 큰 압력이 가해질 것입니다. 해결책?
이것은 Lua에 관한 것입니다. 즉, nginx는 게이트웨이 역할을 하고 여전히 프록시 서버 역할을 합니다. nginx는 Lua를 통합할 수 있으므로 Lua는 위 비즈니스 구현의 설계를 완료하는 데 사용됩니다
ngx_lua 모듈 개념;
- ngx_lua 모듈 Lua 인터프리터를 Nginx에 통합하여 Taobao 기술팀에서 개발했습니다.
- Lua 스크립트는 비즈니스 로직을 구현하는 데 사용할 수 있습니다. Lua는 작고 빠르며 내장된 코루틴을 가지고 있기 때문에 크게 향상됩니다. 높은 동시성 서비스 성능을 보장하면서 비즈니스 로직 구현 비용 절감
- OpenRestry
- OpenResty는 수많은 정교한 Lua 라이브러리를 통합하는 Nginx 및 Lua 기반의 고성능 웹 플랫폼입니다. 타사 모듈 및 대부분의 종속성 사용 초고동시성과 높은 확장성을 처리할 수 있는 동적 웹 애플리케이션, 웹 서비스 및 동적 게이트웨이를 쉽게 구축하는 데 사용됩니다.
- OpenResty는 내부적으로 Nginx와 Lua를 통합했습니다.
wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
로그인 후 복사
2를 다운로드합니다. 구성을 수행하려면 OpenResty 디렉토리에 들어가세요이 단계는 nginx 소스 코드 설치와 다소 유사합니다. 환경 변수 구성의 경우 여기서 기본 변수를 사용하세요. wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
tar -zxf openresty-1.15.8.2.tar.gz
로그인 후 복사
tar -zxf openresty-1.15.8.2.tar.gz
4. make && make install
5. nginx를 구성하기 위해 OpenResty 디렉토리에 들어갑니다
nginx 디렉토리에 들어가 보면 설치 후 nginx 자체의 구성과 거의 동일하다는 것을 알 수 있습니다. nginx.conf 구성 파일을 찾아 다음 내용을 추가합니다.
./configure
6. nginx 및 Test를 시작합니다
설정된 Lua 주소에 접속한 후 정상적으로 접속이 가능한 것으로 확인되는데, 이는 OpenResty 모듈이 접속되었음을 나타냅니다.
ngx_lua 공통 지침
1. init_by_lua*
2. init_worker_by_lua*
이 명령은 하트비트 확인, 예약된 풀 서버 구성 등과 같은 일부 예약된 작업을 시작하는 데 사용됩니다.
3. set_by_lua*
이 명령만 사용해야 합니다. 변수에 값을 할당하는 명령입니다. 이 명령은 한 번에 하나의 값만 반환할 수 있으며 결과 값은 Nginx
4에서 지정된 변수에 제공됩니다. rewrite_by_lua*
는 내부 URL을 수행하는 데 사용됩니다. 의사 정적 URL 재작성과 같은 일반적인 재작성 또는 외부 리디렉션, 이 단계는 재작성 처리 단계가 끝날 때 기본적으로 실행됩니다(nginx의 자체 재작성 기능과 유사)
5, access_by_lua*
该指令用于访问控制,例如,只允许内网IP访问
6、content_by_lua*
该指令是使用最多的指令,大部分任务是在这个阶段完成的,其他过程往往为这个阶段准备数据,正式处理往往都在本阶段执行
7、header_filter_by_lua*
用于设置应答消息的头部信息
8、body_filter_by_lua*
该指令对响应数据进行过滤,如截断、替换
9、log_by_lua*
该指令用于log请求处理阶段,用Lua代码处理日志,但并不替换原有 log处理
10、balancer_by_lua*
该指令主要作用是用来实现上游服务器的负载均衡器算法
11、ssl_certificate_by_*
该指令作用在Nginx和下游服务开始一个SSL握手操作时将允许本配置项的Lua代码
一个使用指令的需求
接下来针对上面提到的各种指令,来做一个简单的需求
nginx接收到请求后,根据参数中gender传入的值,如果gender传入的是1 则在页面上展示 “先生” , 如果gender传入的是0,则在页面上展示“女士”
代码实现
注意:使用指令编写的基本步骤是,在nginx.conf模块中,自定义localtion块中编写lua的相关代码即可
location /getByGender { default_type 'text/html'; set_by_lua $param " local uri_args = ngx.req.get_uri_args() local gender = uri_args['gender'] local name = uri_args['name'] if gender =='1' then return name..':先生' elseif gender=='0' then return name..':女士' else return name end "; charset utf-8; return 200 $param; }
然后启动nginx做一下测试
1)访问服务,不携带任何参数
这时候无任何返回信息
2)访问服务,携带name参数
3)访问服务,携带name和gender参数
更多的指令可以参照此类方式编写,但是前提需要掌握一点lua的基本语法
lua操作redis
Redis在系统中经常作为数据缓存、内存数据库使用,在各类互联网项目中扮演着非常重要的作用;
Lua-resty-redis库是OpenResty提供的一个操作Redis的接口库,可根据自己的业务情况做一些逻辑处理,适合做复杂的业务逻辑。所以下面将以Lua-resty-redis来进行说明。
lua-resty-redis环境准备
1、提前安装好redis并启动服务
2、测试下redis客户端
lua-resty-redis提供了访问Redis的详细API,包括创建对接、连 接、操作、数据处理等。这些API基本上与Redis的操作是对应起来的
lua-resty-redis常用API
1、lua中导入redis依赖
redis = require "resty.redis"
2、new,创建一个Redis对象
redis,err = redis:new()
3、创建redis连接
ok:连接成功返回 1,连接失败返回nil;
err:返回对应的错误信息;
ok,err=redis:connect(host,port[,options_table])
4、设置请求操作Redis的超时时间
redis:set_timeout(time)
5、close,关闭连接
关闭当前连接,成功返回1;
失败返回nil和错误信息;
ok,err = redis:close()
补充说明:
在lua-resty-redis中,所有的Redis命令都有自己的方法;方法名字和命令名字相同,只是全部为小写;
具体实现效果展示
在nginx.conf模块下,添加如下的location内容
location /redis { default_type "text/html"; content_by_lua_block { local redis = require "resty.redis" -- 引入 Redis local redisObj = redis:new() --创建Redis对象 redisObj:set_timeout(3000) --设置超时数据为3s local ok,err = redisObj:connect("IP",6379) --设置redis连接信息 if not ok then --判断是否连接成功 ngx.say("failed to connection redis",err) return end ok,err = redisObj:set("username","TOM") --存入 数据 if not ok then --判断是否存入成功 ngx.say("failed to set username",err) return end local res,err = redisObj:get("username") --从 redis中获取数据 ngx.say(res) --将数据写会消息体中 redisObj:close() } }
重启nginx,进行测试,直接在浏览器访问一下如下地址,可以看到数据成功写入到redis
ngx_lua操作Mysql
MySQL是一个使用广泛的关系型数据库。在ngx_lua中,MySQL有两种访问模式,分别是
用ngx_lua模块和lua-resty-mysql模块: 这两个模块是安装OpenResty时默认安装的;
使用drizzle_nginx_module(HttpDrizzleModule)模块:需要单独
安装,这个库现不在OpenResty中
lua-resty-mysql
lua-resty-mysql是OpenResty开发的模块,使用灵活、功能强大,适合复杂的业务场景,同时支持存储过程访问;
lua-resty-mysql实现数据库查询
1、准备好mysql服务
2、提前创建一张表
CREATE TABLE `users` ( `id` int(10) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `birthday` date DEFAULT NULL, `salary` double(10,2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
并提前准备几条数据
INSERT INTO `mydb`.`users` (`id`, `username`, `birthday`, `salary`) VALUES ('1', 'xiaowang', '1991-03-15', '9000.00'); INSERT INTO `mydb`.`users` (`id`, `username`, `birthday`, `salary`) VALUES ('2', 'xiaoma', '1992-07-15', '8000.00');
lua-resty-mysql API说明
1、引入"resty.mysql"模块
local mysql = require "resty.mysql"
2、创建MySQL连接对象
遇到错误时,db为nil,err为错误描 述信息
db,err = mysql:new()
3、创建连接对象
ok,err=db:connect(options)
options是一个参数的 Lua表结构,里面包含数据库连接的相关信息
host:服务器主机名或IP地址
port:服务器监听端口,默认为3306
user:登录的用户名
password:登录密码
database:使用的数据库名
4、设置子请求的超时时间(ms)
包括connect方法
db:set_timeout(time)
5、关闭当前MySQL连接并返回状态
如果成功,则返回1;如果出现任 何错误,则将返回nil和错误描述
db:close()
6、异步向远程MySQL发送一个查询
如果成功则返回成功发送的字节 数;如果错误,则返回nil和错误描述
bytes,err=db:send_query(sql)
7、从MySQL服务器返回结果中读取一行数据
res返回一个描述OK包 或结果集包的Lua表
rows指定返回结果集的最大值,默认为4
如果是查询,则返回一个容纳多行的数组。每行是一个数据列的 key-value对
res, err, errcode, sqlstate = db:read_result() res, err, errcode, sqlstate = db:read_result(rows)
返回结果类似下面这样
{ {id=1,username="TOM",birthday="1988-11- 11",salary=10000.0}, {id=2,username="JERRY",birthday="1989-11- 11",salary=20000.0} }
如果是增删改,则返回类似如下数据
{ insert_id = 0, server_status=2, warning_count=1, affected_rows=2, message=nil }
返回值说明:
res:操作的结果集
err:错误信息
errcode:MySQL的错误码,比如1064
sqlstate:返回由5个字符组成的标准SQL错误码,比如 42000
具体操作案例
将下面的内容添加到server块,然后重启nginx
location /mysql { content_by_lua_block{ default_type "text/html"; local mysql = require "resty.mysql" local db = mysql:new() local ok,err = db:connect{ host="127.0.0.1", port=3306, user="root", password="123456", database="mydb" } db:set_timeout(3000) db:send_query("select * from users where id =1") local res,err,errcode,sqlstate = db:read_result() ngx.say(res[1].id..","..res[1].username..","..res[1]. birthday..","..res[1].salary) db:close() } }
可以看到,通过访问mysql这个路径,成功查询到数据库中ID为1的这条数据
使用cjson对查询结果进行格式化
从上面的返回结果来看,这种形式的返回数据在解析的时候其实并不是很友好,于是可以使用lua-cjson处理查询结果
使用步骤
步骤一:引入cjson
local cjson = require “cjson”
步骤二:调用cjson的encode方法进行类型转换
cjson.encode(res)
下面对上面程序模块做简单的改造
location /mysql-cjson { default_type "text/html"; content_by_lua_block{ local cjson = require "cjson" local mysql = require "resty.mysql" local db = mysql:new() local ok,err = db:connect{ host="127.0.0.1", port=3306, user="root", password="123456", database="mydb" } db:set_timeout(3000) db:send_query("select * from users") local res,err,errcode,sqlstate = db:read_result() ngx.say(cjson.encode(res)) for i,v in ipairs(res) do ngx.say(v.id..","..v.username..","..v.birthday..",".. v.salary) end db:close() } }
然后再次进行测试,这时候就以json的格式对数据进行了展现
增删改操作
location /mysql-cjson { default_type "text/html"; content_by_lua_block{ local cjson = require "cjson" local mysql = require "resty.mysql" local db = mysql:new() local ok,err = db:connect{ host="127.0.0.1", port=3306, user="root", password="123456", database="mydb" } db:set_timeout(3000) -- 查询操作 db:send_query("select * from users where id=1") -- 插入数据 --local res,err,errcode,sqlstate = db:query("insert into users(id,username,birthday,salary) values(3,'lifei','1995-10-17',3000)") -- 修改数据 --local res,err,errcode,sqlstate = db:query("update users set username='lisi' where id = 1") -- 删除数据 --local res,err,errcode,sqlstate = db:query("delete from users where id = 2") db:close() } }
위 내용은 mysql을 운영하기 위해 nginx와 lua를 통합하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Linux에서 Nginx를 시작하는 단계 : Nginx가 설치되어 있는지 확인하십시오. systemctl start nginx를 사용하여 nginx 서비스를 시작하십시오. SystemCTL을 사용하여 NGINX를 사용하여 시스템 시작시 NGINX의 자동 시작을 활성화하십시오. SystemCTL 상태 nginx를 사용하여 시작이 성공했는지 확인하십시오. 기본 환영 페이지를 보려면 웹 브라우저의 http : // localhost를 방문하십시오.

Windows에서 Nginx를 구성하는 방법은 무엇입니까? nginx를 설치하고 가상 호스트 구성을 만듭니다. 기본 구성 파일을 수정하고 가상 호스트 구성을 포함하십시오. 시작 또는 새로 고침 Nginx. 구성을 테스트하고 웹 사이트를보십시오. SSL을 선택적으로 활성화하고 SSL 인증서를 구성하십시오. 포트 80 및 443 트래픽을 허용하도록 방화벽을 선택적으로 설정하십시오.

nginx가 시작되었는지 확인하는 방법 : 1. 명령 줄을 사용하십시오 : SystemCTL 상태 nginx (linux/unix), netstat -ano | Findstr 80 (Windows); 2. 포트 80이 열려 있는지 확인하십시오. 3. 시스템 로그에서 nginx 시작 메시지를 확인하십시오. 4. Nagios, Zabbix 및 Icinga와 같은 타사 도구를 사용하십시오.

Nginx 서버를 시작하려면 다른 운영 체제에 따라 다른 단계가 필요합니다. Linux/Unix System : Nginx 패키지 설치 (예 : APT-Get 또는 Yum 사용). SystemCTL을 사용하여 nginx 서비스를 시작하십시오 (예 : Sudo SystemCtl start nginx). Windows 시스템 : Windows 바이너리 파일을 다운로드하여 설치합니다. nginx.exe 실행 파일을 사용하여 nginx를 시작하십시오 (예 : nginx.exe -c conf \ nginx.conf). 어떤 운영 체제를 사용하든 서버 IP에 액세스 할 수 있습니다.

서버는 요청 된 리소스에 액세스 할 수있는 권한이 없으므로 Nginx 403 오류가 발생합니다. 솔루션에는 다음이 포함됩니다. 파일 권한 확인 권한을 확인하십시오. .htaccess 구성을 확인하십시오. nginx 구성을 확인하십시오. Selinux 권한을 구성하십시오. 방화벽 규칙을 확인하십시오. 브라우저 문제, 서버 장애 또는 기타 가능한 오류와 같은 다른 원인을 해결하십시오.

Nginx 403 금지 된 오류를 수정하는 방법은 무엇입니까? 파일 또는 디렉토리 권한을 확인합니다. 2. 확인 파일을 확인하십시오. 3. nginx 구성 파일 확인; 4. nginx를 다시 시작하십시오. 다른 가능한 원인으로는 방화벽 규칙, Selinux 설정 또는 응용 프로그램 문제가 있습니다.

질문에 대한 답변 : 304 수정되지 않은 오류는 브라우저가 클라이언트 요청의 최신 리소스 버전을 캐시했음을 나타냅니다. 솔루션 : 1. 브라우저 캐시를 지우십시오. 2. 브라우저 캐시를 비활성화합니다. 3. 클라이언트 캐시를 허용하도록 nginx를 구성합니다. 4. 파일 권한을 확인하십시오. 5. 파일 해시를 확인하십시오. 6. CDN 또는 리버스 프록시 캐시를 비활성화합니다. 7. nginx를 다시 시작하십시오.

Linux에서는 다음 명령을 사용하여 nginx가 시작되었는지 확인하십시오. SystemCTL 상태 Nginx 판사 명령 출력에 따라 : "active : running"이 표시되면 Nginx가 시작됩니다. "Active : 비활성 (죽음)"이 표시되면 Nginx가 중지됩니다.
