文章目录
十六、OpenResty 奇门术——使用 OpenResty 开发 Web 应用
开发一个 Web 应用需要从项目搭建、功能开发、项目部署几个方面入手。下面我们逐步介绍如何使用 OpenResty(基于 Nginx 的 Lua 扩展)来开发一个简单的 Web 应用。
1. 项目搭建
项目目录结构如下所示:
/export/App/nginx-app
|-- bin (脚本)
| |-- start.sh (启动脚本)
| |-- stop.sh (停止脚本)
|-- config (配置文件)
| |-- nginx.conf (Nginx 主配置文件)
| |-- domain
| |-- nginx_product.conf (项目配置文件)
| |-- resources.properties (资源配置文件)
|-- lua (业务代码)
| |-- init.lua (初始化脚本)
| |-- product_controller.lua (控制器)
|-- template (模板)
| |-- product.html (商品页面模板)
|-- lualib (公共 Lua 库)
|-- jd
| |-- product_util.lua (产品工具类)
| |-- product_data.lua (产品数据类)
|-- resty
|-- redis.lua (Redis 相关库)
|-- template.lua(模板库)
整个项目结构划分为几个部分:启停脚本、配置文件、公共组件、业务代码、模板代码等。
2. 启停脚本
启停脚本位于项目目录 /export/App/nginx-app/bin/
下,用于启动和停止 Nginx 服务。
-
start.sh
:启动和更新 Nginx 服务的脚本。脚本首先检查 Nginx 是否已经启动,如果没有启动则启动 Nginx;如果已经启动则重新加载配置文件。
# 启动 Nginx,如果已经启动则重新加载配置 sudo /export/servers/nginx/sbin/nginx -c /export/App/nginx-app/config/nginx.conf if [ $? -ne 0 ]; then echo "Nginx is already running, reloading..." sudo /export/servers/nginx/sbin/nginx -s reload else echo "Nginx started." fi
-
stop.sh
:停止 Nginx 服务的脚本。此脚本使用-s quit
命令来优雅地停止 Nginx 服务。# 停止 Nginx 服务 echo "Stopping Nginx..." sudo /export/servers/nginx/sbin/nginx -s quit echo "Nginx stopped."
3. 配置文件
配置文件位于 /export/App/nginx-app/config
目录下,主要包括以下几类:
-
nginx.conf
:Nginx 的主配置文件,用于配置全局参数,如工作进程数、超时时间、压缩、日志格式、反向代理等。同时,nginx.conf
文件还会引入其他的 Server 配置文件。 -
Nginx 项目配置文件(如
nginx_product.conf
):位于config/domains/
子目录中,用于配置特定项目的 Nginx 服务参数,例如 upstream、缓存配置、模板文件位置、URL 映射等。通过这些配置,可以定义不同的服务器和处理逻辑。 -
资源配置文件(如
resources.properties
):用于配置项目的资源信息,例如开关配置、缓存服务器地址等。资源配置文件通常包含项目中用到的一些全局变量和常量配置。
这些配置文件的组合,可以灵活地配置和管理 Nginx 及其关联的 Web 应用服务。
3.1 Nginx 主配置文件(nginx.conf)
nginx.conf
文件是 Nginx 的主配置文件,包含了全局设置、事件处理和 HTTP 服务的配置。在本例中,它主要用于配置工作进程数量、事件处理、HTTP 服务和 Lua 模块依赖等。
以下是 nginx.conf
文件的示例配置:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type text/html;
# Lua 依赖路径
lua_package_path "/export/App/nginx-app/lualib/?.lua;;";
lua_package_cpath "/export/App/nginx-app/lualib/?.so;;";
# 加载 Server 相关配置
include /export/App/nginx-app/config/domains/*;
# 初始化脚本
init_by_lua_file "/export/App/nginx-app/lua/init.lua";
}
配置项说明:
-
worker_processes 1;
:指定 Nginx 的工作进程数量。在多核服务器上可以设置为更大的值来提高并发处理能力。 -
events
块:配置 Nginx 事件模型和连接处理相关的选项。worker_connections 1024;
:每个 worker 进程的最大连接数。此设置影响 Nginx 的最大并发连接数。
-
http
块:包含 HTTP 服务的配置,通常是 Nginx 的 Web 服务器配置部分。-
include mime.types;
:引入 MIME 类型配置文件,用于定义不同文件扩展名的内容类型。 -
default_type text/html;
:未指定 MIME 类型时,默认的内容类型为text/html
。 -
lua_package_path
和lua_package_cpath
:设置 Lua 模块的查找路径,这里指定了 Lua 脚本和库文件所在的目录路径。 -
include /export/App/nginx-app/config/domains/*;
:加载domains
目录下的所有配置文件(如nginx_product.conf
),用于配置不同的虚拟主机(server 块)。 -
init_by_lua_file "/export/App/nginx-app/lua/init.lua";
:指定 Lua 初始化脚本文件,在 Nginx 启动时执行,用于进行全局变量初始化、加载模块等操作。
-
3.2 Nginx 项目配置文件(nginx_product.conf)
nginx_product.conf
文件是 Nginx 用于特定 Web 应用的 Server 配置文件,主要包括上游服务器的配置、缓存设置、模板路径、URL 映射规则等。
以下是配置文件的详细内容和解释:
# upstream 后端服务配置
upstream item_http_upstream {
server 192.168.1.1 max_fails=2 fail_timeout=30s weight=5;
server 192.168.1.2 max_fails=2 fail_timeout=30s weight=5;
}
# 缓存配置
lua_shared_dict item_local_shop_cache 600m;
server {
listen 80;
server_name item.jd.com item.jd.hk;
# 模板路径
set $template_root "/export/App/nginx-app/template";
# URL 映射规则
location ~* /product/(\d+)\.html$ {
rewrite /product/(.*) http://item.jd.com/$1 permanent;
}
location ~* /(\d{6,12})\.html$ {
default_type text/html;
charset gbk;
lua_code_cache on;
content_by_lua_file "/export/App/nginx-app/lua/product_controller.lua";
}
}
关键配置说明:
-
upstream item_http_upstream
:定义了后端服务的负载均衡配置。max_fails=2
表示在fail_timeout
(30 秒)时间内如果有两次失败请求则不再将请求转发给该服务。weight=5
指定了服务器的权重,用于控制请求分发的比例。 -
lua_shared_dict item_local_shop_cache 600m
:定义了一个大小为 600 MB 的共享字典(缓存)用于存储临时数据,提高性能。此缓存可以用于存储 API 响应、用户会话等。 -
server<