94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"log"
|
||
"net/http"
|
||
"os"
|
||
"os/signal"
|
||
"strings"
|
||
"syscall"
|
||
|
||
"github.com/sevlyar/go-daemon"
|
||
)
|
||
|
||
// 获取客户端IP的函数
|
||
func getClientIP(r *http.Request) string {
|
||
// 尝试从X-Forwarded-For头部获取IP
|
||
forwarded := r.Header.Get("X-Forwarded-For")
|
||
if forwarded != "" {
|
||
// X-Forwarded-For可能包含多个IP地址,取第一个
|
||
ips := strings.Split(forwarded, ",")
|
||
return strings.TrimSpace(ips[0])
|
||
}
|
||
// 尝试从X-Real-Ip头部获取IP
|
||
realIP := r.Header.Get("X-Real-Ip")
|
||
if realIP != "" {
|
||
return realIP
|
||
}
|
||
// 最后从RemoteAddr中获取IP
|
||
return r.RemoteAddr
|
||
}
|
||
|
||
// 处理HTTP请求的函数
|
||
func handler(w http.ResponseWriter, r *http.Request) {
|
||
clientIP := getClientIP(r)
|
||
response := fmt.Sprintf("%s", clientIP)
|
||
fmt.Fprintln(w, response)
|
||
log.Printf("Handled request from %s\n", clientIP) // 记录日志
|
||
}
|
||
|
||
func main() {
|
||
// 定义守护进程的启动配置
|
||
cntxt := &daemon.Context{
|
||
PidFileName: "inet-ip.pid",
|
||
PidFilePerm: 0644,
|
||
LogFileName: "inet-ip.log",
|
||
LogFilePerm: 0640,
|
||
WorkDir: "./",
|
||
Umask: 027,
|
||
Args: []string{"[inet-ip]"},
|
||
}
|
||
|
||
// 启动守护进程
|
||
d, err := cntxt.Reborn()
|
||
if err != nil {
|
||
log.Fatal("Unable to run: ", err)
|
||
}
|
||
if d != nil {
|
||
return
|
||
}
|
||
defer cntxt.Release()
|
||
|
||
// 设置日志输出到文件
|
||
logFile, err := os.OpenFile("inet-ip.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
|
||
if err != nil {
|
||
log.Fatalf("Error opening log file: %s", err)
|
||
}
|
||
defer logFile.Close()
|
||
log.SetOutput(logFile)
|
||
|
||
// 启动HTTP服务器
|
||
go serveHTTP()
|
||
|
||
// 创建一个通道来接收操作系统信号
|
||
stop := make(chan os.Signal, 1)
|
||
signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
|
||
|
||
log.Println("Server started")
|
||
|
||
// 等待信号
|
||
<-stop
|
||
|
||
// 服务器停止时记录日志
|
||
log.Println("Server stopped")
|
||
}
|
||
|
||
func serveHTTP() {
|
||
http.HandleFunc("/", handler)
|
||
fmt.Println("Starting server on :90")
|
||
if err := http.ListenAndServe(":90", nil); err != nil && err != http.ErrServerClosed {
|
||
log.Fatalf("Error starting server: %s", err)
|
||
}
|
||
}
|