【在 OpenResty 中使用 Lua 獲取服務器自身的 IP 地址】

要在 OpenResty 中使用 Lua 獲取服務器自身的 IP 地址,可以使用 Lua 結合系統命令來獲取本地網絡接口的 IP 地址。以下是一個示例,展示如何實現這一點:

  1. 修改你的 nginx.conf 文件,添加一個新的 location 塊來處理獲取本地 IP 地址的請求:
http {server {listen 80;server_name localhost;location /get_server_ip {default_type text/plain;content_by_lua_block {local handle = io.popen("/sbin/ifconfig eth0 | grep 'inet ' | awk '{print $2}'")local result = handle:read("*a")handle:close()ngx.say("Server's local IP address is: ", result)}}}
}

在這個示例中,我們使用 io.popen 來運行系統命令 ifconfig 并解析出 eth0 接口的 IP 地址。注意,你需要根據你的系統配置調整網絡接口名稱(例如,可能是 eth0ens33 等)。

  1. 保存 nginx.conf 文件并重新加載 OpenResty 配置:
sudo openresty -s reload
  1. 訪問 http://localhost/get_server_ip,你應該會看到服務器的本地 IP 地址。

如果你的系統沒有 ifconfig,你可以使用 ip 命令代替:

http {server {listen 80;server_name localhost;location /get_server_ip {default_type text/plain;content_by_lua_block {local handle = io.popen("/sbin/ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d/ -f1")local result = handle:read("*a")handle:close()ngx.say("Server's local IP address is: ", result)}}}
}

在這個示例中,我們使用 ip addr show 命令來獲取網絡接口 eth0 的 IP 地址,并使用 awkcut 進行解析。

確保你有適當的權限來運行這些命令,并且你的環境中存在這些工具。根據你的系統和網絡接口配置,你可能需要調整命令和接口名稱。

還有其他方法可以獲取服務器的本地 IP 地址,而不依賴于系統命令。你可以使用 LuaSocket 庫,這是一個用于網絡編程的 Lua 庫。以下是一個示例,展示如何使用 LuaSocket 獲取服務器的本地 IP 地址。

  1. 首先,確保你安裝了 LuaSocket 庫。你可以在 OpenResty 的 LuaJIT 環境中使用 luarocks 來安裝它:
luarocks install luasocket
  1. 修改你的 nginx.conf 文件,添加一個新的 location 塊來處理獲取本地 IP 地址的請求:
http {server {listen 80;server_name localhost;location /get_server_ip {default_type text/plain;content_by_lua_block {local socket = require("socket")local ip, err = socket.dns.toip(socket.dns.gethostname())if not ip thenngx.say("Failed to get server IP: ", err)elsengx.say("Server's local IP address is: ", ip)end}}}
}

在這個示例中,我們使用 LuaSocket 庫來獲取服務器的主機名,然后解析主機名以獲取對應的 IP 地址。

  1. 保存 nginx.conf 文件并重新加載 OpenResty 配置:
sudo openresty -s reload
  1. 訪問 http://localhost/get_server_ip,你應該會看到服務器的本地 IP 地址。

這個方法不依賴于系統命令,因此在不同的操作系統上都應該能正常工作。它也更加簡潔,因為只需要 Lua 代碼,而不需要解析系統命令的輸出。

如果你想在 OpenResty 中使用 Lua 獲取服務器的本地 IP 地址,而不依賴于外部命令或第三方庫,你可以直接使用 OpenResty 的內置 API 來獲取服務器的 IP 地址。以下是一個示例,展示如何實現這一點:

http {server {listen 80;server_name localhost;location /get_server_ip {default_type text/plain;content_by_lua_block {local sock = ngx.socket.udp()sock:setpeername("8.8.8.8", 80) -- Google's public DNSlocal local_ip = sock:getsockname()sock:close()ngx.say("Server's local IP address is: ", local_ip)}}}
}

在這個示例中,我們創建了一個 UDP 套接字并將其連接到 Google 的公共 DNS 服務器 (8.8.8.8:80)。通過調用 sock:getsockname(),我們可以獲取套接字的本地 IP 地址。最后,我們關閉套接字并輸出本地 IP 地址。

這種方法不依賴于外部命令或第三方庫,并且可以在任何支持 Lua 的 OpenResty 環境中運行。確保保存配置文件并重新加載 OpenResty 配置:

sudo openresty -s reload

然后訪問 http://localhost/get_server_ip,你應該會看到服務器的本地 IP 地址。

在內網環境中獲取服務器自身的 IP 地址時,可以使用 LuaJIT 的 FFI 庫來調用系統的網絡接口,獲取本地 IP 地址。下面是一個基于 LuaJIT FFI 的示例,展示如何在 OpenResty 中獲取服務器的本地 IP 地址:

  1. 確保你的 OpenResty 安裝包含 LuaJIT 支持。

  2. 修改你的 nginx.conf 文件,添加一個新的 location 塊來處理獲取本地 IP 地址的請求:

http {server {listen 80;server_name localhost;location /get_server_ip {default_type text/plain;content_by_lua_block {local ffi = require("ffi")ffi.cdef[[typedef uint32_t in_addr_t;struct in_addr {in_addr_t s_addr;};struct ifaddrs {struct ifaddrs  *ifa_next;char            *ifa_name;unsigned int     ifa_flags;struct sockaddr *ifa_addr;struct sockaddr *ifa_netmask;union {struct sockaddr *ifu_broadaddr;struct sockaddr *ifu_dstaddr;} ifa_ifu;void            *ifa_data;};struct sockaddr {unsigned short    sa_family;char              sa_data[14];};struct sockaddr_in {short            sin_family;unsigned short   sin_port;struct in_addr   sin_addr;char             sin_zero[8];};int getifaddrs(struct ifaddrs **ifap);void freeifaddrs(struct ifaddrs *ifa);]]local C = ffi.Clocal ifap = ffi.new("struct ifaddrs*[1]")local rc = C.getifaddrs(ifap)if rc ~= 0 thenngx.say("Failed to get network interfaces")returnendlocal ifa = ifap[0]while ifa ~= nil dolocal family = ifa.ifa_addr.sa_familyif family == 2 then  -- AF_INET (IPv4)local sa_in = ffi.cast("struct sockaddr_in*", ifa.ifa_addr)local ip = ffi.string(ffi.cast("char*", sa_in.sin_addr.s_addr), 4)local ip_str = string.format("%d.%d.%d.%d", ip:byte(1, 4))ngx.say("Interface: ", ffi.string(ifa.ifa_name), " IP Address: ", ip_str)endifa = ifa.ifa_nextendC.freeifaddrs(ifap[0])}}}
}

在這個示例中:

  1. 使用 LuaJIT 的 FFI 庫定義了 C 結構和函數來獲取網絡接口地址。

  2. 調用了 getifaddrs 函數來獲取所有網絡接口地址,并遍歷這些接口。

  3. 如果接口是 IPv4 地址 (AF_INET),則提取并格式化 IP 地址。

  4. 輸出接口名稱和對應的 IP 地址。

  5. 保存 nginx.conf 文件并重新加載 OpenResty 配置:

sudo openresty -s reload
  1. 訪問 http://localhost/get_server_ip,你應該會看到服務器的所有網絡接口及其對應的 IP 地址。

這種方法更通用,并且不依賴外部命令或第三方庫,適用于各種操作系統。你可以根據需要過濾出特定接口的 IP 地址。

在 OpenResty 中使用 Lua 獲取服務器的本地 IP 地址時,想要簡化代碼,可以使用簡單的方法與系統命令來實現。使用 os.execute 方法或者 io.popen 方法調用系統命令來獲取本地 IP 地址是一個不錯的選擇,這樣無需復雜的 FFI 定義。下面是一個相對簡單的方法:

使用 io.popen 來獲取本地 IP 地址

http {server {listen 80;server_name localhost;location /get_server_ip {default_type text/plain;content_by_lua_block {-- Execute a shell command to get the local IP addresslocal handle = io.popen("hostname -I | awk '{print $1}'")local result = handle:read("*a")handle:close()-- Trim any whitespace from the resultresult = result:gsub("%s+", "")if result == "" thenngx.say("Failed to get server IP address")elsengx.say("Server's local IP address is: ", result)end}}}
}

解釋

  1. io.popen:調用系統命令 hostname -I 來獲取服務器的所有 IP 地址,然后使用 awk '{print $1}' 只輸出第一個 IP 地址(假設這是你需要的本地 IP 地址)。

  2. 結果處理:讀取命令輸出,并去除多余的空白字符。

  3. 輸出:輸出本地 IP 地址。

使用 ngx.pipe 來獲取本地 IP 地址(OpenResty 1.15.8.1+)

如果你使用的是 OpenResty 1.15.8.1 或更高版本,可以使用 ngx.pipe 模塊。這是一個更現代和推薦的方法。

http {server {listen 80;server_name localhost;location /get_server_ip {default_type text/plain;content_by_lua_block {local handle = io.popen("hostname -I | awk '{print $1}'")local result = handle:read("*a")handle:close()result = result:gsub("%s+", "")if result == "" thenngx.say("Failed to get server IP address")elsengx.say("Server's local IP address is: ", result)end}}}
}

解釋

  1. ngx.pipe:創建并執行一個管道來運行 hostname -I | awk '{print $1}' 命令。
  2. 讀取輸出:讀取命令輸出,并去除多余的空白字符。
  3. 輸出:輸出本地 IP 地址。

這兩個方法都比之前的方法更簡單,易于實現,并且不需要復雜的 FFI 定義。選擇 io.popenngx.pipe 取決于你使用的 OpenResty 版本和偏好。

在內網環境中,獲取服務器自身的本地 IP 地址,可以使用 OpenResty 提供的 ngx.var.server_addr 變量。這個變量會返回當前服務器監聽的 IP 地址,通常是服務器的本地 IP 地址。這是一個非常簡單和直接的方法,無需依賴外部庫或命令。以下是如何在 OpenResty 中實現:

http {server {listen 80;server_name localhost;location /get_server_ip {default_type text/plain;content_by_lua_block {local server_ip = ngx.var.server_addrngx.say("Server's local IP address is: ", server_ip)}}}
}

解釋:

  1. ngx.var.server_addr:這是 OpenResty 提供的一個變量,它會返回當前服務器監聽的 IP 地址。

  2. 輸出 IP 地址:使用 ngx.say 函數將服務器的本地 IP 地址輸出到響應中。

這種方法簡單快捷,并且適用于大多數情況下的內網環境。確保保存并重新加載你的 OpenResty 配置,然后訪問 http://localhost/get_server_ip,你將會看到服務器的本地 IP 地址。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43293.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43293.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43293.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java順序表的實現

一,前言 hello大家好呀,今天淺略講講java的順序表,其實順序表大概一個月前就學了,但是由于前段時間期末一直沒寫博客,但是現在想想其實期末我還是有很多空余時間的,但是由于自己的原因耽誤了很多時間現在想…

C++面向對象的常見面試題目(二)

1. 繼承關系下,析構函數和構造函數執行順序? 構造函數按照依賴鏈,從強到弱構造 首先調用基類的構造函數。如果有多個基類,則按照它們在派生類聲明中出現的順序調用;接下來,按照它們在類中聲明的順序&…

windows USB 設備驅動開發-處理批傳輸的靜態流

在 USB 2.0 和更早版本的設備中,批量端點可以通過該端點發送或接收單個數據流。 在 USB 3.0 設備中,批量端點能夠通過該端點發送和接收多個數據流。 Windows 中 Microsoft 提供的 USB 驅動程序堆棧支持多個流。 這使客戶端驅動程序能夠將獨立的 I/O 請求…

GEE代碼實例教程詳解:長時間序列風速分析

簡介 在本篇博客中,我們將使用Google Earth Engine (GEE) 對長時間序列的風速數據進行分析。通過ERA5再分析數據集,我們可以計算2010年至2024年間的平均風速,并與1980年至2020年的風速數據進行比較。 背景知識 ERA5數據集 ERA5是ECMWF&am…

代碼隨想錄-Day53

739. 每日溫度 給定一個整數數組 temperatures ,表示每天的溫度,返回一個數組 answer ,其中 answer[i] 是指對于第 i 天,下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高,請在該位置用 0 來代替。 示例 1: …

【Linux】目錄的相關命令——cd,pwd,mkdir,rmdir

1.相對路徑與絕對路徑 在開始目錄的切換之前,你必須要先了解一下所謂的路徑(PATH),有趣的是:什么是相對路 與絕對路徑? 絕對路徑:路徑的寫法“一定由根目錄/寫起”,例如:/usr/shar…

Java版Flink使用指南——定制RabbitMQ數據源的序列化器

大綱 新建工程新增依賴數據對象序列化器接入數據源 測試修改Slot個數打包、提交、運行 工程代碼 在《Java版Flink使用指南——從RabbitMQ中隊列中接入消息流》一文中,我們從RabbitMQ隊列中讀取了字符串型數據。如果我們希望讀取的數據被自動化轉換為一個對象&#x…

Linux C++ 043-機房預約系統

Linux C 043-機房預約系統 本節關鍵字:Linux、C、機房預約系統 相關庫函數:for_each、open、close、write 系統簡介 學校現在有幾個規格不同的機房,由于使用經常出現撞車現象,現開發一套機房預約系統,解決這一問題。…

Java進階---抽象方法abstract

抽象方法 案例引入: 在某個寵物店的寵物資源管理系統中有: 狗類:屬性(姓名),行為(吃飯) 貓類:屬性(姓名),行為(吃飯)利用…

智慧科技照亮水利未來:深入剖析智慧水利解決方案如何助力水利行業實現高效、精準、可持續的管理

目錄 一、智慧水利的概念與內涵 二、智慧水利解決方案的核心要素 1. 物聯網技術:構建全面感知網絡 2. 大數據與云計算:實現數據高效處理與存儲 3. GIS與三維可視化:提升決策支持能力 4. 人工智能與機器學習:驅動決策智能化 …

LibreOffice的國內鏡像安裝地址和node.js國內快速下載網站

文章目錄 1、LibreOffice1.1、LibreOffice在application-conf.yml中的配置2、node.js 1、LibreOffice 國內鏡像包網址:https://mirrors.cloud.tencent.com/libreoffice/libreoffice/ 1.1、LibreOffice在application-conf.yml中的配置 jodconverter:local:enable…

Java面試八股之MySQL中int(10)和bigint(10)能存儲讀的數據大小一樣嗎

MySQL中int(10)和bigint(10)能存儲讀的數據大小一樣嗎 在MySQL中,int(10)和bigint(10)的數據存儲能力并不相同,盡管括號內的數字(如10)看起來似乎暗示著某種關聯,但實際上這個數字代表的是顯示寬度,而不是…

vue學習day03-指令修飾符、v-bind對于樣式控制的增強、v-model應用于其他表單元素

7、指令修飾符 (1)概念: 通過“.”指明一些指令后綴,不同后綴封裝了不同的處理操作->簡化代碼 (2)按鍵修飾符 keyup.enter->鍵盤回車監聽 (3)v-model修飾符 v-model.tri…

vue + element ui 實現側邊欄導航欄折疊收起

首頁布局如下 要求點擊按鈕,將側邊欄收縮, 通過 row 和 col 組件&#xff0c;并通過 col 組件的 span 屬性我們就可以自由地組合布局。 折疊前 折疊后 <template><div class"app-layout" :class"{ collapse: app.isFold }"><div class&…

Onekey正版steam分流下載工具

今天給大家介紹的是一款下載steam游戲的工具。Onekey工具&#xff0c;是一款游戲下載器&#xff0c;可以下載steam正版分流游戲。下載正版分流的網站很多&#xff0c;但是都是網盤或者迅雷下載&#xff0c;或者游戲盒子下載&#xff0c;速度都很慢。這款軟件是用steam下載的&am…

Flask項目搭建及部署 —— Python

flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、創建flask項目&#xff1a; 創建完成后整個項目結構樹&#xff1a; app.py: 項?管理?件&#xff0c;通過它管理項?。 static: 存放靜態…

自定義控件視圖篇(一)測量與布局

在自定義控件的開發過程中&#xff0c;"視圖篇"的測量與布局是非常關鍵的步驟&#xff0c;這直接決定了控件的尺寸、位置以及子視圖的排列方式。下面我將詳細介紹測量和布局的過程&#xff0c;以及如何在自定義控件中正確實現這些步驟。 視圖的測量 (onMeasure) 在…

2021版本的idea熱部署的詳細步驟

背景&#xff1a;我是自己用的是2021版本的idea,然后發現跟2023版本的熱部署不太一樣&#xff0c;所以&#xff0c;今天自己出一期這樣的文章吧&#xff01;&#xff01;&#xff01;其他人配置的時候根據自己的情況&#xff0c;來閱讀吧&#xff01; 第一步&#xff1a;方式一…

MyBatis是如何分頁的及原理

MyBatis 是一種持久層框架&#xff0c;支持通過配置文件和注解將 SQL 映射為 Java 對象。在實際開發中&#xff0c;查詢數據時經常需要進行分頁處理。 MyBatis 也提供了支持分頁的方案&#xff0c;其主要思路是使用 Limit 偏移量和限制個數&#xff0c;來獲取指定數量的數據。下…

音視頻入門基礎:H.264專題(10)——FFmpeg源碼中,存放SPS屬性的結構體和解碼SPS的函數分析

一、引言 FFmpeg源碼對AnnexB包裝的H.264碼流解碼過程中&#xff0c;通過ff_h2645_extract_rbsp函數拿到該H.264碼流中的某個NALU的NALU Header RBSP后&#xff08;具體可以參考&#xff1a;《FFmpeg源碼&#xff1a;ff_h2645_extract_rbsp函數分析》&#xff09;&#xff0c…