nginx中集成lua开发web服务
背景介绍
在项目开发中,之前经手的一个服务是在redis中存放着生成好的数据,客户端通过具体的key来获取redis中的具体数据。在之前的开发中是采用了nginx+wsgi+python的架构方案。通过python也可以快速的实现项目,推送到测试环境也一直在使用当中。
随着时间过去,慢慢对项目进行思考,发现其实这种实现方式也有一定的弊端。因为,对于服务来说没有复杂的逻辑,nginx接受到请求转发到后台python服务;然后python服务拿到具体请求到redis中取出数据然后返回给客户端调用。整个流程其实比较简单而且明确,没有必要在nginx和redis中间再添加一层python的服务,所以在思考这种架构的实现方案是不是可以在优化一点。
nginx与lua
后来经过简单的搜索nginx+redis发现一些nginx+lua+openresty相关的关键词。接下来就是对openresty开始调研。查看相关文档发现,openresty是一个集成了nginx核心模块与各种第三方模块的一个项目集。如果使用openresty,那么就避免了额外各种安装第三方包,它全部都继承到它的安装包里面。这对于懒人来说绝对是一个不错的选择。
lua介绍
lua是一个脚本语言,也有另外一个称呼-胶水语言。它是一个非常小的、可以和其他语言非常容易耦合在一起的语言。通过lua自己的特性,再加上他依附的语言,在一个服务里利用两种语言的特性,功能肯定不是一般的强大。看到一些牛B的游戏中都有在使用lua做一种胶水型的功能型语言。
不过通过简单使用,发现lua对字符串的处理不够强大,因为它是直接使用C库,它对字符串的处理也只是C库提供的接口,没有对接口进行额外的丰富和补充。在很多场景下,需要自己实现一些常用的接口,比如split等。
集成lua与ngxin
因为看到lua是一种胶水类型的语言,那么lua是否可以直接耦合在nginx中?答案是非常肯定的。lua可以直接运行在nginx中,做一些逻辑的处理、日志的控制。那么我们就可以考虑使用nginx+lua来开发一个web服务来满足需求,去完成其他服务端语言不能完成的便利和快速开发。
除了上述说的遍历性之外,nginx+lua还会带来什么优势:
1、减少一层转发 ,使用其他服务语言来开发服务,肯定会使用一种协议在nginx和服务端直接进行通信。比如cgi、fcig、wsgi等。如果使用lua,因为lua是直接运行在nginx中,就么有必要再额外做一次nginx转发。
2、基于事件的响应,因为lua是直接运行nginx的运行时环境,那么lua就继承了nginx的所有特性。在一般情况下,nginx都是基于事件的提供服务,select或者epoll。在性能上肯定会灰常给力的。
基于以上原因开搞nginx+lua。因为是懒人直接采用了整个安装openresty的策略,当然你也可以单独安装nginx,再安装lua,然后nginx_lua_module。安装了openresty之后,开始写简单的测试,其实在openresty的github上也有相关的例子,可以对着例子直接做一些简单的测试开发。
做完第一步的安装和测试示例的编写,lua+nginx就表示已经集成成功,接下来就是自己业务逻辑的开发。在这里需要注意的是因为openresty其实也是集成了nginx,所以在一台机器上跑两个nginx可能有相应的问题,所以在安装openresty之后,机器上已有的nginx可能会有一定影响。
升级原服务
开发环境已经配置好,接下来就是直接开发业务逻辑,即接受到请求访问redis,读取数据返回客户端请求。因为lua是可以直接写在nginx的配置文件中的,但是这不是一个很好的策略。虽然lua就是和别的语言直接耦合在一起,但是耦合的程度也要考虑软件工程相关问题。比如后期代码的可维护性,nginx配置文件的可读性。
鉴于以上原因也是建议lua的功能实现写到单独文件,然后在nginx配置文件中通过声明的方式,告知nginx进行加载和运行。在实现功能的基础上,尽量避免耦合的程度和代码的可维护性。
在具体的实现中,两个文件搞定整个服务,当然也是因为服务本身简单。
-redis.conf #redis的host、port
-init.lua #初始化配置文件
在实现中利用了nginx的共享内存的概念。
<code><span>--redis.conf</span> host:<span>127.0</span><span>.0</span><span>.1</span> port:<span>6379</span><span>--init.lua</span> tmp = {} <span>for</span> l <span>in</span> io.<span>lines</span>(<span>"lua/redis.conf"</span>) <span>do</span><span>for</span> i <span>in</span><span>string</span>.gmatch(l, <span>"([^:]+)"</span>) <span>do</span> table.insert(tmp, i) <span><span>end</span></span><span><span>end</span></span> ngx.shared.config:<span>set</span>(tmp[<span>1</span>], tmp[<span>2</span>]) ngx.shared.config:<span>set</span>(tmp[<span>3</span>], tmp[<span>4</span>])</code>
在这里需要在nginx启动的时候就进行redis.conf的读取,所以在nginx中需要加上一句配置告知nginx启动的时候需要执行init.lua。另外,还要声明nginx的共享内存config,所以nginx的配置如下
<code>lu<span>a_shared</span>_dict config <span>1</span>m<span>;</span> init_by_lu<span>a_file</span> 'lua/init.lua'<span>;</span></code>
第一步已经完成,就是redis相关配置的读取,共享内存的声明和初始化,那接下来就是具体的逻辑实现,几十行代码分分钟搞定。
<code> location /vector{ content_by_lua ' <span>local</span> redis = require <span>"resty.redis"</span><span>local</span> server = redis:new() <span>local</span> conf = ngx.shared.config <span>local</span> ok, err = server:connect(conf:<span>get</span>(<span>"host"</span>), conf:<span>get</span>(<span>"port"</span>)) ngx.header.content_type = <span>"text/plain"</span><span>if</span><span>not</span> ok <span>then</span> ngx.<span>log</span>(ngx.ERR, err) ngx.<span>exit</span>(ngx.HTTP_SERVICE_UNAVAILABLE) <span>end</span><span>local</span> x = ngx.var.arg_x; <span>local</span> y = ngx.var.arg_y; <span>local</span> z = ngx.var.arg_z; <span>if</span> x == nil <span>or</span> y == nil <span>or</span> z == nil <span>then</span> ngx.<span>say</span>(<span>"{\\\"ret\\\": -1}"</span>) ngx.<span>exit</span>(ngx.HTTP_SERVICE_UNAVAILABLE) <span>end</span><span>local</span> key = z..<span>"_"</span>..x..<span>"_"</span>..y <span>local</span> data = server:<span>get</span>(key) '; }</code>
版权声明:本文为博主原创文章,转载请注明来源。
以上就介绍了nginx中集成lua开发web服务,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Le mode Redis Cluster déploie les instances Redis sur plusieurs serveurs grâce à la rupture, à l'amélioration de l'évolutivité et de la disponibilité. Les étapes de construction sont les suivantes: Créez des instances de redis étranges avec différents ports; Créer 3 instances Sentinel, Moniteur Redis Instances et basculement; Configurer les fichiers de configuration Sentinel, ajouter des informations d'instance Redis de surveillance et des paramètres de basculement; Configurer les fichiers de configuration d'instance Redis, activer le mode de cluster et spécifier le chemin du fichier d'informations de cluster; Créer un fichier nœuds.conf, contenant des informations de chaque instance redis; Démarrez le cluster, exécutez la commande CREATE pour créer un cluster et spécifiez le nombre de répliques; Connectez-vous au cluster pour exécuter la commande d'informations de cluster pour vérifier l'état du cluster; faire

Redis utilise des tables de hachage pour stocker les données et prend en charge les structures de données telles que les chaînes, les listes, les tables de hachage, les collections et les collections ordonnées. Redis persiste les données via des instantanés (RDB) et ajoutez les mécanismes d'écriture uniquement (AOF). Redis utilise la réplication maître-esclave pour améliorer la disponibilité des données. Redis utilise une boucle d'événement unique pour gérer les connexions et les commandes pour assurer l'atomicité et la cohérence des données. Redis définit le temps d'expiration de la clé et utilise le mécanisme de suppression paresseux pour supprimer la clé d'expiration.

Pour afficher le numéro de version redis, vous pouvez utiliser les trois méthodes suivantes: (1) Entrez la commande Info, (2) Démarrez le serveur avec l'option - Version et (3) afficher le fichier de configuration.

Pour afficher toutes les touches dans Redis, il existe trois façons: utilisez la commande Keys pour retourner toutes les clés qui correspondent au modèle spécifié; Utilisez la commande SCAN pour itérer les touches et renvoyez un ensemble de clés; Utilisez la commande info pour obtenir le nombre total de clés.

La clé de la stratégie de défense de sécurité PHPMYADMIN est: 1. Utilisez la dernière version de PhpMyAdmin et mettez régulièrement à jour PHP et MySQL; 2. Contrôler strictement les droits d'accès, utiliser .htaccess ou le contrôle d'accès au serveur Web; 3. Activer le mot de passe fort et l'authentification à deux facteurs; 4. Sauvegarder régulièrement la base de données; 5. Vérifiez soigneusement les fichiers de configuration pour éviter d'exposer des informations sensibles; 6. Utiliser le pare-feu d'application Web (WAF); 7. Effectuer des audits de sécurité. Ces mesures peuvent réduire efficacement les risques de sécurité causés par le phpmyadmin en raison d'une configuration inappropriée, d'une version antérieure ou de risques de sécurité environnementale, et d'assurer la sécurité de la base de données.

Étapes pour résoudre le problème que Redis-Server ne peut pas trouver: Vérifiez l'installation pour vous assurer que Redis est installé correctement; Définissez les variables d'environnement redis_host et redis_port; Démarrer le serveur Redis Redis-Server; Vérifiez si le serveur exécute Redis-Cli Ping.

Les ensembles commandés par Redis (ZSETS) sont utilisés pour stocker des éléments commandés et trier par des scores associés. Les étapes à utiliser ZSET incluent: 1. Créer un ZSET; 2. Ajouter un membre; 3. Obtenez un score de membre; 4. Obtenez un classement; 5. Obtenez un membre dans la gamme de classement; 6. Supprimer un membre; 7. Obtenez le nombre d'éléments; 8. Obtenez le nombre de membres dans la plage de score.

Les compteurs Redis fournissent des structures de données pour le stockage et l'exploitation des compteurs. Les étapes spécifiques incluent: Créez un compteur: utilisez la commande RUNCH pour ajouter 1 à la clé existante. Obtenez la valeur de compteur: utilisez la commande get pour obtenir la valeur actuelle. Compteur d'incrément: utilisez la commande incry, suivie du montant à incrémenter. COMPRESSION DE DÉCENSION: Utilisez la commande DECH ou DIMBRY pour décrérer de 1 ou spécifiez la quantité. Réinitialisez le compteur: utilisez la commande set pour définir sa valeur sur 0. En outre, les compteurs peuvent être utilisés pour limiter les taux, le suivi des sessions et créer des systèmes de vote.
