Table des matières
Idée d'implémentation
Concept de module ngx_lua
Étapes d'installation d'OpenRestry
1 Téléchargez OpenRestry
2 Décompressez le fichier
3. configuration
4.
hello,openRestry lua
Entrez le répertoire sbin de nginx et démarrez nginx
Le bloc de base de l'écriture de scripts Nginx à l'aide de Lua est l'instruction L'instruction est utilisée pour spécifier quand exécuter le code Lua de l'utilisateur et comment utiliser les résultats, ci-dessous Un bref. explication de certaines instructions couramment utilisées
代码实现
lua操作redis
lua-resty-redis环境准备
lua-resty-redis常用API
ngx_lua操作Mysql
lua-resty-mysql API说明
Maison Opération et maintenance Nginx Comment intégrer nginx avec Lua pour faire fonctionner MySQL

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

May 16, 2023 pm 10:43 PM
mysql lua nginx

Idée d'implémentation

  • Configurer la liste noire directement dans nginx et l'implémenter en écrivant des blocs logiques ;

  • Écrire des filtres dans le serveur (Java) et intercepter uniformément dans les filtres 

  • Sur le serveur Écrire des intercepteurs dans ; (Java) et intercepter uniformément dans les intercepteurs ;

Voici 3 idées d'implémentation, il y en a peut-être plus, mais si on y réfléchit, écrire des blocs logiques dans nginx ressemble à ce n'est pas quelque chose de si commun. les gens sont bons ; il n'est pas impossible de le faire au niveau du code, mais de cette façon, pendant les périodes de pointe où la concurrence est élevée, cela mettra inévitablement une plus grande pression sur le service back-end. Alors, quoi de mieux ? à propos de la solution ?

Il s'agit de Lua, c'est-à-dire que nginx agit comme une passerelle et agit toujours comme un serveur proxy. Puisque nginx peut intégrer Lua, Lua est utilisé pour coopérer pour compléter la conception de l'implémentation commerciale ci-dessus

Concept de module ngx_lua

 ;
  • Module ngx_lua Développé par l'équipe technique de Taobao, en intégrant l'interpréteur Lua dans Nginx ;

  • Les scripts Lua peuvent être utilisés pour implémenter la logique métier. En raison de la compacité, de la vitesse et des coroutines intégrées de Lua, il s'améliore considérablement. assurer des capacités de service de concurrence élevée. Réduit le coût de mise en œuvre de la logique métier.

  • OpenRestry

  • OpenResty est une plateforme Web hautes performances basée sur Nginx et Lua, qui intègre un grand nombre de bibliothèques Lua sophistiquées, tierces. modules et la plupart des dépendances ; utilisation Pour créer facilement des applications Web dynamiques, des services Web et des passerelles dynamiques capables de gérer une concurrence ultra-élevée et une évolutivité élevée

  • OpenResty a intégré Nginx et Lua en interne, il sera donc plus pratique à utiliser ;

Simple Par exemple, en installant et en utilisant directement OpenRestry, vous pouvez obtenir l'effet d'utiliser Nginx et Lua en même temps, sur la base d'OpenRestry, vous pouvez également utiliser d'autres middlewares en interne, tels que MySQL. , redis, kafka, etc., afin que l'architecture métier soit conçue avec une plus grande flexibilité ;

Étapes d'installation d'OpenRestry

1 Téléchargez OpenRestry

wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
Copier après la connexion

2 Décompressez le fichier

tar -zxf openresty-1.15.8.2.tar.gz
Copier après la connexion

3. configuration

Cette étape est quelque peu similaire à l'installation du code source nginx, liée Pour la configuration des variables d'environnement, utilisez simplement celles par défaut ici

./configure
Copier après la connexion

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

4.

Comment intégrer nginx avec Lua pour faire fonctionner MySQL5. Entrez dans le répertoire OpenResty pour configurer nginx

Comment intégrer nginx avec Lua pour faire fonctionner MySQL Entrez dans le répertoire nginx, et vous pouvez voir que le répertoire à l'intérieur est presque le même que la configuration de nginx lui-même après l'installation

Comment intégrer nginx avec Lua pour faire fonctionner MySQLEntrez conf, recherchez le fichier de configuration nginx.conf et ajoutez le contenu suivant :

location /lua { 
    default_type 'text/html'; 
    content_by_lua &#39;ngx.say(" <h2 id="hello-openRestry-nbsp-lua">hello,openRestry lua</h2>")&#39;; 
}
Copier après la connexion

Comment intégrer nginx avec Lua pour faire fonctionner MySQL6. Démarrez nginx et Test

Entrez le répertoire sbin de nginx et démarrez nginx

Comment intégrer nginx avec Lua pour faire fonctionner MySQLUne fois le démarrage terminé, vous pouvez accédez au serveur avec le navigateur. Vous pouvez voir que le service nginx lui-même a été démarré

Comment intégrer nginx avec Lua pour faire fonctionner MySQLAprès avoir accédé à l'adresse Lua configurée, vous pouvez On constate qu'elle est accessible normalement, ce qui indique que le module OpenResty a été installé avec succès.

Comment intégrer nginx avec Lua pour faire fonctionner MySQLngx_lua Common Instructions

Le bloc de base de l'écriture de scripts Nginx à l'aide de Lua est l'instruction L'instruction est utilisée pour spécifier quand exécuter le code Lua de l'utilisateur et comment utiliser les résultats, ci-dessous Un bref. explication de certaines instructions couramment utilisées

1. init_by_lua

*

Cette instruction est exécutée à chaque fois que Nginx recharge la configuration et est utilisée pour effectuer un chargement de module d'opération fastidieux ou initialiser certaines configurations globales

2. init_worker_by_lua

*

Cette commande est utilisée pour démarrer certaines tâches planifiées, telles que la vérification du rythme cardiaque, la configuration planifiée du serveur pull, etc.

3. set_by_lua

*

Cette commande ne doit être utilisée que pour attribuer des valeurs aux variables. Cette instruction ne peut renvoyer qu'une seule valeur à la fois, et la valeur du résultat est donnée à la variable spécifiée dans Nginx

4 rewrite_by_lua

*

est utilisée pour effectuer une réécriture d'URL interne. ou redirection externe, typique comme la réécriture d'URL pseudo-statique, cette étape est exécutée par défaut à la fin de l'étape de traitement de réécriture (similaire à la propre fonction de réécriture de 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 &#39;text/html&#39;;
          set_by_lua $param "

                local uri_args = ngx.req.get_uri_args()
                local gender = uri_args[&#39;gender&#39;]
                local name = uri_args[&#39;name&#39;]
                if gender ==&#39;1&#39; then
                       return name..&#39;:先生&#39;
                elseif gender==&#39;0&#39; then
                       return name..&#39;:女士&#39;
                else
                       return name
                end
          ";
          charset utf-8;
          return 200 $param;
 }
Copier après la connexion

然后启动nginx做一下测试

1)访问服务,不携带任何参数

这时候无任何返回信息

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

2)访问服务,携带name参数

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

3)访问服务,携带name和gender参数

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

更多的指令可以参照此类方式编写,但是前提需要掌握一点lua的基本语法

lua操作redis

Redis在系统中经常作为数据缓存、内存数据库使用,在各类互联网项目中扮演着非常重要的作用;

Lua-resty-redis库是OpenResty提供的一个操作Redis的接口库,可根据自己的业务情况做一些逻辑处理,适合做复杂的业务逻辑。所以下面将以Lua-resty-redis来进行说明。

lua-resty-redis环境准备

1、提前安装好redis并启动服务

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

2、测试下redis客户端

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

lua-resty-redis提供了访问Redis的详细API,包括创建对接、连 接、操作、数据处理等。这些API基本上与Redis的操作是对应起来的

lua-resty-redis常用API

1、lua中导入redis依赖

redis = require "resty.redis"
Copier après la connexion

2、new,创建一个Redis对象

redis,err = redis:new()
Copier après la connexion

3、创建redis连接

  • ok:连接成功返回 1,连接失败返回nil;

  • err:返回对应的错误信息;

ok,err=redis:connect(host,port[,options_table])

4、设置请求操作Redis的超时时间

redis:set_timeout(time)
Copier après la connexion

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()
    }
}
Copier après la connexion

重启nginx,进行测试,直接在浏览器访问一下如下地址,可以看到数据成功写入到redis

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

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服务

Comment intégrer nginx avec Lua pour faire fonctionner 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;
Copier après la connexion

并提前准备几条数据

INSERT INTO `mydb`.`users` (`id`, `username`, `birthday`, `salary`) VALUES (&#39;1&#39;, &#39;xiaowang&#39;, &#39;1991-03-15&#39;, &#39;9000.00&#39;);
INSERT INTO `mydb`.`users` (`id`, `username`, `birthday`, `salary`) VALUES (&#39;2&#39;, &#39;xiaoma&#39;, &#39;1992-07-15&#39;, &#39;8000.00&#39;);
Copier après la connexion

lua-resty-mysql API说明

1、引入"resty.mysql"模块

local mysql = require "resty.mysql"
Copier après la connexion

2、创建MySQL连接对象

遇到错误时,db为nil,err为错误描 述信息

db,err = mysql:new()
Copier après la connexion

3、创建连接对象

ok,err=db:connect(options)
Copier après la connexion

options是一个参数的 Lua表结构,里面包含数据库连接的相关信息

  • host:服务器主机名或IP地址

  • port:服务器监听端口,默认为3306

  • user:登录的用户名

  • password:登录密码

  • database:使用的数据库名

4、设置子请求的超时时间(ms)

包括connect方法

db:set_timeout(time)
Copier après la connexion

5、关闭当前MySQL连接并返回状态

如果成功,则返回1;如果出现任 何错误,则将返回nil和错误描述

db:close()
Copier après la connexion

6、异步向远程MySQL发送一个查询

如果成功则返回成功发送的字节 数;如果错误,则返回nil和错误描述

bytes,err=db:send_query(sql)
Copier après la connexion

7、从MySQL服务器返回结果中读取一行数据

  • res返回一个描述OK包 或结果集包的Lua表

  • rows指定返回结果集的最大值,默认为4

  • 如果是查询,则返回一个容纳多行的数组。每行是一个数据列的 key-value对

res, err, errcode, sqlstate = db:read_result() res, err, errcode, sqlstate = db:read_result(rows)
Copier après la connexion

返回结果类似下面这样

{ 
{id=1,username="TOM",birthday="1988-11- 11",salary=10000.0}, {id=2,username="JERRY",birthday="1989-11- 11",salary=20000.0} 
}
Copier après la connexion

如果是增删改,则返回类似如下数据

{ 
	insert_id = 0, 
	server_status=2, 
	warning_count=1, 
	affected_rows=2, 
	message=nil 
}
Copier après la connexion

返回值说明:

  • 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()
    } 
}
Copier après la connexion

可以看到,通过访问mysql这个路径,成功查询到数据库中ID为1的这条数据

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

使用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()
    } 
}
Copier après la connexion

然后再次进行测试,这时候就以json的格式对数据进行了展现

Comment intégrer nginx avec Lua pour faire fonctionner MySQL

增删改操作

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()
    } 
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment démarrer Nginx dans Linux Comment démarrer Nginx dans Linux Apr 14, 2025 pm 12:51 PM

Étapes pour démarrer Nginx dans Linux: Vérifiez si Nginx est installé. Utilisez SystemCTL Start Nginx pour démarrer le service NGINX. Utilisez SystemCTL Activer Nginx pour activer le démarrage automatique de Nginx au démarrage du système. Utilisez SystemCTL Status Nginx pour vérifier que le démarrage est réussi. Visitez http: // localhost dans un navigateur Web pour afficher la page de bienvenue par défaut.

Comment configurer Nginx dans Windows Comment configurer Nginx dans Windows Apr 14, 2025 pm 12:57 PM

Comment configurer Nginx dans Windows? Installez Nginx et créez une configuration d'hôte virtuelle. Modifiez le fichier de configuration principale et incluez la configuration de l'hôte virtuel. Démarrer ou recharger nginx. Testez la configuration et affichez le site Web. Activer sélectivement SSL et configurer les certificats SSL. Définissez sélectivement le pare-feu pour permettre le trafic Port 80 et 443.

Comment vérifier si Nginx est démarré Comment vérifier si Nginx est démarré Apr 14, 2025 pm 01:03 PM

Comment confirmer si Nginx est démarré: 1. Utilisez la ligne de commande: SystemCTl Status Nginx (Linux / Unix), netStat -ano | Findstr 80 (Windows); 2. Vérifiez si le port 80 est ouvert; 3. Vérifiez le message de démarrage NGINX dans le journal système; 4. Utilisez des outils tiers, tels que Nagios, Zabbix et Icinga.

Comment démarrer le serveur Nginx Comment démarrer le serveur Nginx Apr 14, 2025 pm 12:27 PM

Le démarrage d'un serveur Nginx nécessite différentes étapes en fonction des différents systèmes d'exploitation: Système Linux / Unix: Installez le package NGINX (par exemple, en utilisant Apt-Get ou Yum). Utilisez SystemCTL pour démarrer un service NGINX (par exemple, sudo systemctl start nginx). Système Windows: téléchargez et installez les fichiers binaires Windows. Démarrer Nginx à l'aide de l'exécutable Nginx.exe (par exemple, nginx.exe -c conf \ nginx.conf). Peu importe le système d'exploitation que vous utilisez, vous pouvez accéder au serveur IP

Comment résoudre l'erreur Nginx403 Comment résoudre l'erreur Nginx403 Apr 14, 2025 pm 12:54 PM

Le serveur n'a pas l'autorisation d'accéder à la ressource demandée, ce qui donne une erreur NGINX 403. Les solutions incluent: vérifier les autorisations de fichiers. Vérifiez la configuration .htaccess. Vérifiez la configuration de Nginx. Configurez les autorisations Selinux. Vérifiez les règles du pare-feu. Dépanner d'autres causes telles que les problèmes de navigateur, les défaillances du serveur ou d'autres erreurs possibles.

Comment résoudre nginx403 Comment résoudre nginx403 Apr 14, 2025 am 10:33 AM

Comment corriger l'erreur interdite Nginx 403? Vérifier les autorisations de fichier ou de répertoire; 2. Vérifier le fichier .htaccess; 3. Vérifiez le fichier de configuration NGINX; 4. Redémarrer Nginx. D'autres causes possibles incluent les règles de pare-feu, les paramètres de Selinux ou les problèmes d'application.

Comment résoudre l'erreur Nginx304 Comment résoudre l'erreur Nginx304 Apr 14, 2025 pm 12:45 PM

Réponse à la question: 304 Erreur non modifiée indique que le navigateur a mis en cache la dernière version de ressource de la demande du client. Solution: 1. Effacer le cache du navigateur; 2. Désactiver le cache du navigateur; 3. Configurer Nginx pour permettre le cache client; 4. Vérifier les autorisations du fichier; 5. Vérifier le hachage du fichier; 6. Désactiver le CDN ou le cache proxy inversé; 7. Redémarrez Nginx.

Comment vérifier si Nginx est démarré? Comment vérifier si Nginx est démarré? Apr 14, 2025 pm 12:48 PM

Dans Linux, utilisez la commande suivante pour vérifier si Nginx est démarré: SystemCTL Status Nginx Juges Basé sur la sortie de la commande: si "Active: Active (Running)" s'affiche, Nginx est démarré. Si "Active: Inactive (Dead)" est affiché, Nginx est arrêté.

See all articles