Lighttpd + PHP + MySQL 一键安装脚本

2025年09月8日

这是我用chatGPT、kimi、deepseek生成的一键安装脚本,如果你想用lighttpd做为你的服务器的话,可以使用这些脚本来一键安装

lighttpd官网下载:https://www.lighttpd.net/

chatGPT

#!/bin/bash
# LNMP 编译安装一键脚本 (Lighttpd + PHP + MySQL/MariaDB)
# 支持 CentOS/RHEL/Debian/Ubuntu
# Author: ChatGPT

set -e

# 版本
LIGHTTPD_VERSION="1.4.54"
PHP_VERSION="8.2.20"
MARIADB_VERSION="10.6.18"

INSTALL_DIR="/usr/local"
SRC_DIR="/usr/local/src"

# 必须 root
if [ "$(id -u)" -ne 0 ]; then
    echo "请用 root 用户运行此脚本!"
    exit 1
fi

echo "==============================="
echo "  LNMP 源码编译安装脚本"
echo "  Lighttpd $LIGHTTPD_VERSION + PHP $PHP_VERSION + MariaDB $MARIADB_VERSION"
echo "==============================="

# 检测系统并安装依赖
echo "[1/5] 安装编译依赖..."
if [ -f /etc/redhat-release ] || [ -f /etc/centos-release ]; then
    yum -y groupinstall "Development Tools"
    yum -y install wget gcc gcc-c++ make cmake autoconf automake libtool \
        pcre pcre-devel zlib zlib-devel bzip2 bzip2-devel \
        openssl openssl-devel libxml2 libxml2-devel sqlite sqlite-devel \
        libcurl-devel libjpeg-devel libpng-devel freetype-devel libzip-devel
elif [ -f /etc/debian_version ]; then
    apt update -y
    apt install -y build-essential wget gcc g++ make cmake autoconf automake libtool \
        pkg-config zlib1g zlib1g-dev libpcre3 libpcre3-dev \
        libbz2-dev libssl-dev libxml2 libxml2-dev \
        libsqlite3-dev libcurl4-openssl-dev libjpeg-dev libpng-dev \
        libfreetype6-dev libzip-dev
else
    echo "不支持的系统,请手动安装依赖。"
    exit 1
fi

mkdir -p $SRC_DIR
cd $SRC_DIR

######################################
# 安装 Lighttpd
######################################
echo "[2/5] 编译安装 Lighttpd..."
wget -c https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-$LIGHTTPD_VERSION.tar.gz
tar zxvf lighttpd-$LIGHTTPD_VERSION.tar.gz
cd lighttpd-$LIGHTTPD_VERSION
./configure --prefix=$INSTALL_DIR/lighttpd
make -j$(nproc)
make install
mkdir -p $INSTALL_DIR/lighttpd/{htdocs,etc}
cp ./doc/lighttpd.conf $INSTALL_DIR/lighttpd/etc/lighttpd.conf
cd ..

######################################
# 安装 MariaDB
######################################
echo "[3/5] 编译安装 MariaDB..."
wget -c https://downloads.mariadb.org/interstitial/mariadb-$MARIADB_VERSION/source/mariadb-$MARIADB_VERSION.tar.gz
tar zxvf mariadb-$MARIADB_VERSION.tar.gz
cd mariadb-$MARIADB_VERSION
cmake . -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR/mariadb \
    -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
    -DWITH_PARTITION_STORAGE_ENGINE=1
make -j$(nproc)
make install
useradd -r -s /sbin/nologin mysql || true
$INSTALL_DIR/mariadb/scripts/mysql_install_db --user=mysql --basedir=$INSTALL_DIR/mariadb --datadir=$INSTALL_DIR/mariadb/data
cd ..

######################################
# 安装 PHP
######################################
echo "[4/5] 编译安装 PHP..."
wget -c https://www.php.net/distributions/php-$PHP_VERSION.tar.gz
tar zxvf php-$PHP_VERSION.tar.gz
cd php-$PHP_VERSION
./configure --prefix=$INSTALL_DIR/php \
    --with-config-file-path=$INSTALL_DIR/php/etc \
    --enable-fpm \
    --with-mysqli=$INSTALL_DIR/mariadb/bin/mysql_config \
    --with-pdo-mysql=$INSTALL_DIR/mariadb \
    --with-zlib \
    --with-openssl \
    --enable-mbstring \
    --with-curl \
    --with-gd \
    --with-jpeg \
    --with-freetype
make -j$(nproc)
make install
cp php.ini-development $INSTALL_DIR/php/etc/php.ini
cp sapi/fpm/php-fpm.conf $INSTALL_DIR/php/etc/php-fpm.conf
cp sapi/fpm/www.conf $INSTALL_DIR/php/etc/php-fpm.d/www.conf || true
cd ..

######################################
# 配置服务
######################################
echo "[5/5] 配置 systemd 服务..."

# Lighttpd
cat > /etc/systemd/system/lighttpd.service <<EOF
[Unit]
Description=Lighttpd Web Server
After=network.target

[Service]
ExecStart=$INSTALL_DIR/lighttpd/sbin/lighttpd -D -f $INSTALL_DIR/lighttpd/etc/lighttpd.conf
ExecReload=/bin/kill -HUP \$MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# PHP-FPM
cat > /etc/systemd/system/php-fpm.service <<EOF
[Unit]
Description=The PHP FastCGI Process Manager
After=network.target

[Service]
ExecStart=$INSTALL_DIR/php/sbin/php-fpm --nodaemonize --fpm-config $INSTALL_DIR/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 \$MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# MariaDB
cat > /etc/systemd/system/mariadb.service <<EOF
[Unit]
Description=MariaDB Database Server
After=network.target

[Service]
ExecStart=$INSTALL_DIR/mariadb/bin/mysqld_safe --datadir=$INSTALL_DIR/mariadb/data
ExecStop=$INSTALL_DIR/mariadb/bin/mysqladmin shutdown
User=mysql
Group=mysql
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# FastCGI 配置
cat > $INSTALL_DIR/lighttpd/etc/15-fastcgi-php.conf <<EOF
fastcgi.server += ( ".php" =>
    ((
        "socket" => "/tmp/php-fpm.sock",
        "broken-scriptfilename" => "enable"
    ))
)
EOF
echo 'include "15-fastcgi-php.conf"' >> $INSTALL_DIR/lighttpd/etc/lighttpd.conf

# 自启动
systemctl daemon-reload
systemctl enable lighttpd php-fpm mariadb
systemctl start mariadb php-fpm lighttpd

# 初始化 MySQL
$INSTALL_DIR/mariadb/bin/mysqladmin -u root password "root1234"

# 测试页
echo "<?php phpinfo(); ?>" > $INSTALL_DIR/lighttpd/htdocs/info.php

IP=$(hostname -I | awk '{print $1}')
echo "==============================="
echo " LNMP 编译安装完成!"
echo " Lighttpd:   http://$IP/"
echo " PHP 测试:   http://$IP/info.php"
echo " MySQL root 密码: root1234"
echo " 网站目录:   $INSTALL_DIR/lighttpd/htdocs/"
echo "==============================="

 

注:root1234 root1234 这两个需要修改成你需要设置的Myaql密码

保存为 install_lnmp.sh 即可使用:

脚本会自动安装:

  • Lighttpd

  • PHP + PHP-FPM (FastCGI)

  • MariaDB (MySQL 替代)

Kimi

#!/bin/bash

# LNMP (Linux + Lighttpd + MySQL + PHP) 编译安装脚本
# 支持所有主流 Linux 发行版
# 包含编译安装和自启动配置

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 软件版本
LIGHTTPD_VERSION="1.4.76"
PHP_VERSION="8.2.12"
MYSQL_VERSION="8.0.35"
PCRE_VERSION="8.45"
ZLIB_VERSION="1.3"

# 安装目录
INSTALL_DIR="/usr/local"
SRC_DIR="/usr/local/src"
LIGHTTPD_DIR="$INSTALL_DIR/lighttpd"
PHP_DIR="$INSTALL_DIR/php"
MYSQL_DIR="$INSTALL_DIR/mysql"

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 检查是否为root用户
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "请使用 root 用户运行此脚本"
        exit 1
    fi
}

# 检测操作系统
detect_os() {
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release
        OS=$ID
        VERSION=$VERSION_ID
    else
        log_error "无法检测操作系统"
        exit 1
    fi
    
    log_info "检测到操作系统: $OS $VERSION"
}

# 获取服务器IP
get_server_ip() {
    SERVER_IP=$(hostname -I | awk '{print $1}')
    if [[ -z "$SERVER_IP" ]]; then
        SERVER_IP="localhost"
    fi
}

# 安装编译依赖
install_dependencies() {
    log_step "安装编译依赖..."
    
    case $OS in
        ubuntu|debian)
            apt-get update -y
            apt-get install -y build-essential gcc g++ make cmake autoconf automake \
                libtool pkg-config wget curl tar gzip bzip2 unzip \
                libpcre3-dev zlib1g-dev libssl-dev libxml2-dev \
                libbz2-dev libcurl4-openssl-dev libjpeg-dev \
                libpng-dev libfreetype6-dev libmcrypt-dev \
                libreadline-dev libzip-dev libsqlite3-dev \
                libonig-dev libzip-dev libedit-dev \
                libldap2-dev libsasl2-dev libkrb5-dev \
                systemctl || true
            ;;
        centos|rhel|fedora)
            yum groupinstall -y "Development Tools"
            yum install -y gcc gcc-c++ make cmake autoconf automake \
                libtool pkgconfig wget curl tar gzip bzip2 unzip \
                pcre-devel zlib-devel openssl-devel libxml2-devel \
                bzip2-devel libcurl-devel libjpeg-devel \
                libpng-devel freetype-devel libmcrypt-devel \
                readline-devel libzip-devel sqlite-devel \
                oniguruma-devel libedit-devel \
                openldap-devel cyrus-sasl-devel krb5-devel \
                systemd-devel || true
            ;;
        *)
            log_error "不支持的操作系统: $OS"
            exit 1
            ;;
    esac
    
    # 检查必要的编译工具
    for tool in gcc g++ make cmake; do
        if ! command -v $tool &> /dev/null; then
            log_error "缺少必要的编译工具: $tool"
            exit 1
        fi
    done
}

# 创建用户和组
create_users() {
    log_step "创建用户和组..."
    
    # 创建 www 用户
    if ! id -u www &>/dev/null; then
        useradd -r -s /bin/false -d /var/www www
    fi
    
    # 创建 mysql 用户
    if ! id -u mysql &>/dev/null; then
        useradd -r -s /bin/false -d /var/lib/mysql mysql
    fi
}

# 下载源码
download_sources() {
    log_step "下载源码..."
    
    mkdir -p "$SRC_DIR"
    cd "$SRC_DIR"
    
    # 下载 Lighttpd
    if [[ ! -f "lighttpd-${LIGHTTPD_VERSION}.tar.gz" ]]; then
        log_info "下载 Lighttpd ${LIGHTTPD_VERSION}..."
        wget -c "https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-${LIGHTTPD_VERSION}.tar.gz"
    fi
    
    # 下载 PHP
    if [[ ! -f "php-${PHP_VERSION}.tar.gz" ]]; then
        log_info "下载 PHP ${PHP_VERSION}..."
        wget -c "https://www.php.net/distributions/php-${PHP_VERSION}.tar.gz"
    fi
    
    # 下载 MySQL
    if [[ ! -f "mysql-${MYSQL_VERSION}.tar.gz" ]]; then
        log_info "下载 MySQL ${MYSQL_VERSION}..."
        wget -c "https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-${MYSQL_VERSION}.tar.gz"
    fi
    
    # 下载依赖库
    if [[ ! -f "pcre-${PCRE_VERSION}.tar.gz" ]]; then
        log_info "下载 PCRE ${PCRE_VERSION}..."
        wget -c "https://sourceforge.net/projects/pcre/files/pcre/${PCRE_VERSION}/pcre-${PCRE_VERSION}.tar.gz/download" -O "pcre-${PCRE_VERSION}.tar.gz"
    fi
    
    if [[ ! -f "zlib-${ZLIB_VERSION}.tar.gz" ]]; then
        log_info "下载 zlib ${ZLIB_VERSION}..."
        wget -c "https://www.zlib.net/zlib-${ZLIB_VERSION}.tar.gz"
    fi
}

# 编译安装 PCRE
install_pcre() {
    log_step "编译安装 PCRE ${PCRE_VERSION}..."
    
    cd "$SRC_DIR"
    tar -xzf "pcre-${PCRE_VERSION}.tar.gz"
    cd "pcre-${PCRE_VERSION}"
    
    ./configure --prefix="$INSTALL_DIR/pcre" \
        --enable-utf8 \
        --enable-unicode-properties
    
    make -j$(nproc)
    make install
    
    # 添加库路径
    echo "$INSTALL_DIR/pcre/lib" > /etc/ld.so.conf.d/pcre.conf
    ldconfig
}

# 编译安装 zlib
install_zlib() {
    log_step "编译安装 zlib ${ZLIB_VERSION}..."
    
    cd "$SRC_DIR"
    tar -xzf "zlib-${ZLIB_VERSION}.tar.gz"
    cd "zlib-${ZLIB_VERSION}"
    
    ./configure --prefix="$INSTALL_DIR/zlib"
    
    make -j$(nproc)
    make install
    
    # 添加库路径
    echo "$INSTALL_DIR/zlib/lib" > /etc/ld.so.conf.d/zlib.conf
    ldconfig
}

# 编译安装 Lighttpd
install_lighttpd() {
    log_step "编译安装 Lighttpd ${LIGHTTPD_VERSION}..."
    
    cd "$SRC_DIR"
    tar -xzf "lighttpd-${LIGHTTPD_VERSION}.tar.gz"
    cd "lighttpd-${LIGHTTPD_VERSION}"
    
    # 生成 configure 脚本
    ./autogen.sh
    
    # 配置编译选项
    ./configure --prefix="$LIGHTTPD_DIR" \
        --with-pcre="$INSTALL_DIR/pcre" \
        --with-zlib="$INSTALL_DIR/zlib" \
        --enable-static \
        --enable-shared \
        --with-openssl \
        --with-ldap \
        --with-mysql \
        --with-webdav-locks \
        --with-webdav-props \
        --with-gdbm \
        --with-memcached \
        --with-lua \
        --enable-ipv6 \
        --with-bzip2
    
    make -j$(nproc)
    make install
    
    # 创建必要目录
    mkdir -p "$LIGHTTPD_DIR/htdocs"
    mkdir -p "$LIGHTTPD_DIR/logs"
    mkdir -p "$LIGHTTPD_DIR/conf.d"
    
    # 设置权限
    chown -R www:www "$LIGHTTPD_DIR"
    
    # 添加库路径
    echo "$LIGHTTPD_DIR/lib" > /etc/ld.so.conf.d/lighttpd.conf
    ldconfig
}

# 配置 Lighttpd
configure_lighttpd() {
    log_step "配置 Lighttpd..."
    
    # 创建主配置文件
    cat > "$LIGHTTPD_DIR/etc/lighttpd.conf" << 'EOF'
server.modules = (
    "mod_access",
    "mod_alias",
    "mod_compress",
    "mod_redirect",
    "mod_rewrite",
    "mod_accesslog",
    "mod_fastcgi",
    "mod_cgi",
    "mod_status",
    "mod_dirlisting"
)

server.document-root        = "/usr/local/lighttpd/htdocs"
server.errorlog             = "/usr/local/lighttpd/logs/error.log"
server.pid-file             = "/usr/local/lighttpd/logs/lighttpd.pid"
server.username             = "www"
server.groupname            = "www"
server.port                 = 80
server.bind                 = "0.0.0.0"

# 性能设置
server.max-worker           = 4
server.max-keep-alive-requests = 16
server.max-keep-alive-idle  = 5
server.max-read-idle        = 60
server.max-write-idle       = 360

# 日志设置
accesslog.filename          = "/usr/local/lighttpd/logs/access.log"

# 压缩设置
compress.cache-dir          = "/usr/local/lighttpd/cache/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# 安全设置
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

# 索引文件
index-file.names            = ( "index.php", "index.html", "index.htm" )

# MIME 类型
include_shell "/usr/local/lighttpd/share/lighttpd/create-mime.assign.pl"

# FastCGI 设置 (PHP)
fastcgi.server = ( ".php" =>
    ((
        "host" => "127.0.0.1",
        "port" => 9000,
        "broken-scriptfilename" => "enable"
    ))
)
EOF

    # 创建 MIME 类型配置文件
    mkdir -p "$LIGHTTPD_DIR/share/lighttpd"
    cat > "$LIGHTTPD_DIR/share/lighttpd/create-mime.assign.pl" << 'EOF'
#!/usr/bin/perl
use strict;
my %mime = (
  '.pdf' => 'application/pdf',
  '.sig' => 'application/pgp-signature',
  '.spl' => 'application/futuresplash',
  '.class' => 'application/octet-stream',
  '.ps' => 'application/postscript',
  '.torrent' => 'application/x-bittorrent',
  '.dvi' => 'application/x-dvi',
  '.gz' => 'application/x-gzip',
  '.pac' => 'application/x-ns-proxy-autoconfig',
  '.swf' => 'application/x-shockwave-flash',
  '.tar.gz' => 'application/x-tgz',
  '.tgz' => 'application/x-tgz',
  '.tar' => 'application/x-tar',
  '.zip' => 'application/zip',
  '.mp3' => 'audio/mpeg',
  '.m3u' => 'audio/x-mpegurl',
  '.wma' => 'audio/x-ms-wma',
  '.wax' => 'audio/x-ms-wax',
  '.ogg' => 'application/ogg',
  '.wav' => 'audio/x-wav',
  '.gif' => 'image/gif',
  '.jpg' => 'image/jpeg',
  '.jpeg' => 'image/jpeg',
  '.png' => 'image/png',
  '.xbm' => 'image/x-xbitmap',
  '.xpm' => 'image/x-xpixmap',
  '.xwd' => 'image/x-xwindowdump',
  '.css' => 'text/css',
  '.html' => 'text/html',
  '.htm' => 'text/html',
  '.js' => 'text/javascript',
  '.asc' => 'text/plain',
  '.c' => 'text/plain',
  '.cpp' => 'text/plain',
  '.log' => 'text/plain',
  '.conf' => 'text/plain',
  '.text' => 'text/plain',
  '.txt' => 'text/plain',
  '.dtd' => 'text/xml',
  '.xml' => 'text/xml',
  '.mpeg' => 'video/mpeg',
  '.mpg' => 'video/mpeg',
  '.mov' => 'video/quicktime',
  '.qt' => 'video/quicktime',
  '.avi' => 'video/x-msvideo',
  '.asf' => 'video/x-ms-asf',
  '.asx' => 'video/x-ms-asf',
  '.wmv' => 'video/x-ms-wmv',
  '.bz2' => 'application/x-bzip',
  '.tbz' => 'application/x-bzip-compressed-tar',
  '.tar.bz2' => 'application/x-bzip-compressed-tar'
);

print "mimetype.assign = (\n";
foreach my $k (keys %mime) {
  print "  \"$k\" => \"$mime{$k}\",\n";
}
print ")\n";
EOF

    chmod +x "$LIGHTTPD_DIR/share/lighttpd/create-mime.assign.pl"
    
    # 创建必要目录
    mkdir -p "$LIGHTTPD_DIR/cache/compress"
    mkdir -p "$LIGHTTPD_DIR/logs"
    
    chown -R www:www "$LIGHTTPD_DIR"
}

# 编译安装 MySQL
install_mysql() {
    log_step "编译安装 MySQL ${MYSQL_VERSION}..."
    
    cd "$SRC_DIR"
    tar -xzf "mysql-${MYSQL_VERSION}.tar.gz"
    cd "mysql-${MYSQL_VERSION}"
    
    # 创建构建目录
    mkdir -p build
    cd build
    
    # CMake 配置
    cmake .. \
        -DCMAKE_INSTALL_PREFIX="$MYSQL_DIR" \
        -DMYSQL_DATADIR="$MYSQL_DIR/data" \
        -DSYSCONFDIR="$MYSQL_DIR/etc" \
        -DWITH_INNOBASE_STORAGE_ENGINE=1 \
        -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
        -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
        -DWITH_READLINE=1 \
        -DWITH_SSL=system \
        -DWITH_ZLIB=system \
        -DENABLED_LOCAL_INFILE=1 \
        -DMYSQL_UNIX_ADDR="$MYSQL_DIR/mysql.sock" \
        -DDEFAULT_CHARSET=utf8mb4 \
        -DDEFAULT_COLLATION=utf8mb4_general_ci \
        -DWITH_BOOST="$SRC_DIR" \
        -DFORCE_INSOURCE_BUILD=1
    
    make -j$(nproc)
    make install
    
    # 初始化数据库
    cd "$MYSQL_DIR"
    ./bin/mysqld --initialize --user=mysql --basedir="$MYSQL_DIR" --datadir="$MYSQL_DIR/data"
    
    # 设置权限
    chown -R mysql:mysql "$MYSQL_DIR"
    
    # 生成临时密码
    TEMP_PASSWORD=$(grep 'temporary password' "$MYSQL_DIR/data"/*.err | tail -1 | awk '{print $NF}')
    log_info "MySQL 临时密码: $TEMP_PASSWORD"
    
    # 创建配置文件
    cat > "$MYSQL_DIR/etc/my.cnf" << EOF
[mysqld]
basedir=$MYSQL_DIR
datadir=$MYSQL_DIR/data
port=3306
socket=$MYSQL_DIR/mysql.sock
pid-file=$MYSQL_DIR/mysql.pid
user=mysql

# 字符集设置
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

# InnoDB 设置
innodb_buffer_pool_size=128M
innodb_log_file_size=48M
innodb_flush_method=O_DIRECT

# 日志设置
log-error=$MYSQL_DIR/logs/error.log
slow-query-log=1
slow-query-log-file=$MYSQL_DIR/logs/slow.log
long_query_time=2

[mysql]
socket=$MYSQL_DIR/mysql.sock

[client]
socket=$MYSQL_DIR/mysql.sock
EOF

    mkdir -p "$MYSQL_DIR/logs"
    chown -R mysql:mysql "$MYSQL_DIR"
}

# 编译安装 PHP
install_php() {
    log_step "编译安装 PHP ${PHP_VERSION}..."
    
    cd "$SRC_DIR"
    tar -xzf "php-${PHP_VERSION}.tar.gz"
    cd "php-${PHP_VERSION}"
    
    # 配置编译选项
    ./configure --prefix="$PHP_DIR" \
        --with-config-file-path="$PHP_DIR/etc" \
        --with-config-file-scan-dir="$PHP_DIR/etc/php.d" \
        --enable-fpm \
        --with-fpm-user=www \
        --with-fpm-group=www \
        --with-mysqli=mysqlnd \
        --with-pdo-mysql=mysqlnd \
        --with-mysql-sock="$MYSQL_DIR/mysql.sock" \
        --with-openssl \
        --with-zlib \
        --with-bz2 \
        --with-curl \
        --with-gd \
        --with-jpeg \
        --with-png \
        --with-freetype \
        --with-gettext \
        --with-mhash \
        --with-readline \
        --with-xmlrpc \
        --with-xsl \
        --with-zip \
        --with-iconv \
        --enable-bcmath \
        --enable-calendar \
        --enable-exif \
        --enable-ftp \
        --enable-gd-native-ttf \
        --enable-intl \
        --enable-json \
        --enable-mbstring \
        --enable-pcntl \
        --enable-shmop \
        --enable-soap \
        --enable-sockets \
        --enable-sysvmsg \
        --enable-sysvsem \
        --enable-sysvshm \
        --enable-wddx \
        --enable-zip \
        --enable-opcache \
        --enable-cli \
        --enable-cgi
    
    make -j$(nproc)
    make install
    
    # 复制配置文件
    cp php.ini-production "$PHP_DIR/etc/php.ini"
    cp "$PHP_DIR/etc/php-fpm.conf.default" "$PHP_DIR/etc/php-fpm.conf"
    
    # 配置 PHP-FPM
    cat > "$PHP_DIR/etc/php-fpm.conf" << EOF
[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice

[www]
listen = 127.0.0.1:9000
listen.backlog = 65535
listen.owner = www
listen.group = www
listen.mode = 0660
user = www
group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 1000
request_terminate_timeout = 300
request_slowlog_timeout = 30
slowlog = log/slow.log
EOF

    # 创建必要目录
    mkdir -p "$PHP_DIR/log"
    mkdir -p "$PHP_DIR/run"
    mkdir -p "$PHP_DIR/etc/php.d"
    
    # 配置 PHP
    cat > "$PHP_DIR/etc/php.ini" << EOF
; PHP 配置文件
[PHP]
engine = On
short_open_tag = On
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = Off
max_execution_time = 300
max_input_time = 300
memory_limit = 256M
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
html_errors = On
error_log = /usr/local/php/log/php_error.log
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 64M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_tmp_dir = "/tmp"
upload_max_filesize = 64M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

[CLI Server]
cli_server.color = On

[Date]
date.timezone = Asia/Shanghai

[filter]
filter.default = unsafe_raw
filter.default_flags =

[iconv]
iconv.input_encoding =
iconv.internal_encoding =
iconv.output_encoding =

[intl]
intl.default_locale =
intl.error_level = 0
intl.use_exceptions = 0

[sqlite3]
sqlite3.extension_dir =

[Pcre]
pcre.backtrack_limit = 100000
pcre.recursion_limit = 100000

[Pdo]
pdo_mysql.default_socket = $MYSQL_DIR/mysql.sock

[Pdo_mysql]
pdo_mysql.default_socket = $MYSQL_DIR/mysql.sock

[MySQLi]
mysqli.default_socket = $MYSQL_DIR/mysql.sock
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off

[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = On

[OPcache]
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 2
opcache.fast_shutdown = 1

[curl]
curl.cainfo =

[openssl]
openssl.cafile =
openssl.capath =
EOF

    chown -R www:www "$PHP_DIR"
}

# 创建 Systemd 服务
create_systemd_services() {
    log_step "创建 Systemd 服务..."
    
    # Lighttpd 服务
    cat > /etc/systemd/system/lighttpd.service << EOF
[Unit]
Description=Lighttpd Web Server
After=network.target

[Service]
Type=forking
PIDFile=$LIGHTTPD_DIR/logs/lighttpd.pid
ExecStartPre=/usr/local/lighttpd/sbin/lighttpd -t -f /usr/local/lighttpd/etc/lighttpd.conf
ExecStart=/usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/etc/lighttpd.conf
ExecReload=/bin/kill -USR1 \$MAINPID
ExecStop=/bin/kill -WINCH \$MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

    # MySQL 服务
    cat > /etc/systemd/system/mysql.service << EOF
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=forking
User=mysql
Group=mysql
PIDFile=$MYSQL_DIR/mysql.pid
ExecStartPre=/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --ignore-db-dir=lost+found
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/etc/my.cnf --daemonize --pid-file=/usr/local/mysql/mysql.pid
ExecReload=/bin/kill -HUP \$MAINPID
ExecStop=/bin/kill -QUIT \$MAINPID
PrivateTmp=false

[Install]
WantedBy=multi-user.target
EOF

    # PHP-FPM 服务
    cat > /etc/systemd/system/php-fpm.service << EOF
[Unit]
Description=PHP FastCGI Process Manager
After=network.target

[Service]
Type=forking
PIDFile=$PHP_DIR/run/php-fpm.pid
ExecStartPre=/usr/local/php/sbin/php-fpm -t
ExecStart=/usr/local/php/sbin/php-fpm --daemonize --pid /usr/local/php/run/php-fpm.pid
ExecReload=/bin/kill -USR2 \$MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

    # 重新加载 systemd
    systemctl daemon-reload
}

# 设置环境变量
setup_environment() {
    log_step "设置环境变量..."
    
    cat > /etc/profile.d/lnmp.sh << EOF
# LNMP 环境变量
export PATH=\$PATH:/usr/local/lighttpd/sbin:/usr/local/mysql/bin:/usr/local/php/bin:/usr/local/php/sbin
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lighttpd/lib:/usr/local/mysql/lib:/usr/local/pcre/lib:/usr/local/zlib/lib
EOF

    chmod +x /etc/profile.d/lnmp.sh
    source /etc/profile.d/lnmp.sh
}

# 创建测试文件
create_test_files() {
    log_step "创建测试文件..."
    
    # 创建 index.php
    cat > "$LIGHTTPD_DIR/htdocs/index.php" << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>LNMP 编译安装成功</title>
    <meta charset="UTF-8">
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; background-color: #f5f5f5; }
        .container { max-width: 800px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .success { color: #28a745; font-size: 24px; }
        .info { background-color: #e7f3ff; padding: 15px; border-left: 4px solid #2196F3; margin: 15px 0; }
        .test-links { margin: 20px 0; }
        .test-links a { display: inline-block; margin: 10px; padding: 10px 20px; background-color: #007bff; color: white; text-decoration: none; border-radius: 5px; }
        .test-links a:hover { background-color: #0056b3; }
        .code { background-color: #f8f9fa; padding: 10px; border-radius: 3px; font-family: monospace; }
    </style>
</head>
<body>
    <div class="container">
        <h1 class="success">LNMP 编译安装成功!</h1>
        
        <div class="info">
            <h3>环境信息</h3>
            <p><strong>Web服务器:</strong> Lighttpd (编译安装)</p>
            <p><strong>PHP版本:</strong> <?php echo PHP_VERSION; ?></p>
            <p><strong>MySQL版本:</strong> <?php echo phpversion('mysql') ?: '已安装'; ?></p>
            <p><strong>安装时间:</strong> <?php echo date('Y-m-d H:i:s'); ?></p>
            <p><strong>服务器IP:</strong> <?php echo $_SERVER['SERVER_ADDR']; ?></p>
        </div>
        
        <div class="test-links">
            <h3>测试链接</h3>
            <a href="info.php" target="_blank">📋 PHP 信息</a>
            <a href="test_mysql.php" target="_blank">🗄️ MySQL 连接测试</a>
            <a href="phpmyadmin" target="_blank">🛠️ phpMyAdmin (需安装)</a>
        </div>
        
        <div class="info">
            <h3>安装路径</h3>
            <p>• Lighttpd: <span class="code">/usr/local/lighttpd</span></p>
            <p>• PHP: <span class="code">/usr/local/php</span></p>
            <p>• MySQL: <span class="code">/usr/local/mysql</span></p>
            <p>• 网站根目录: <span class="code">/usr/local/lighttpd/htdocs</span></p>
        </div>
        
        <div class="info">
            <h3>服务管理</h3>
            <p>• 启动 Lighttpd: <span class="code">systemctl start lighttpd</span></p>
            <p>• 启动 PHP-FPM: <span class="code">systemctl start php-fpm</span></p>
            <p>• 启动 MySQL: <span class="code">systemctl start mysql</span></p>
            <p>• 查看状态: <span class="code">systemctl status lighttpd</span></p>
        </div>
    </div>
</body>
</html>
EOF

    # 创建 info.php
    cat > "$LIGHTTPD_DIR/htdocs/info.php" << 'EOF'
<?php
phpinfo();
?>
EOF

    # 创建 MySQL 测试文件
    cat > "$LIGHTTPD_DIR/htdocs/test_mysql.php" << 'EOF'
<?php
$servername = "127.0.0.1";
$username = "root";
$password = "";

try {
    $conn = new PDO("mysql:host=$servername;port=3306", $username, $password);
    echo "<h1 style='color: green;'>MySQL 连接成功</h1>";
    echo "<p>服务器信息: " . $conn->getAttribute(PDO::ATTR_SERVER_INFO) . "</p>";
    echo "<p>MySQL 版本: " . $conn->getAttribute(PDO::ATTR_SERVER_VERSION) . "</p>";
} catch(PDOException $e) {
    echo "<h1 style='color: red;'>MySQL 连接失败</h1>";
    echo "<p>错误信息: " . $e->getMessage() . "</p>";
}
?>
EOF

    chown -R www:www "$LIGHTTPD_DIR/htdocs"
}

# 设置 MySQL root 密码
setup_mysql_root() {
    log_step "设置 MySQL root 密码..."
    
    # 生成随机密码
    MYSQL_ROOT_PASSWORD=$(openssl rand -base64 12)
    
    # 等待 MySQL 启动
    sleep 5
    
    # 修改 root 密码
    "$MYSQL_DIR/bin/mysql" -u root << EOF
ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD';
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
EOF

    # 更新测试文件密码
    sed -i "s/\$password = \"\"/\$password = \"$MYSQL_ROOT_PASSWORD\"/" "$LIGHTTPD_DIR/htdocs/test_mysql.php"
    
    log_info "MySQL root 密码已设置为: $MYSQL_ROOT_PASSWORD"
    log_warn "请妥善保存此密码!"
    
    # 保存密码到文件
    echo "MySQL root 密码: $MYSQL_ROOT_PASSWORD" > /root/mysql_root_password.txt
    chmod 600 /root/mysql_root_password.txt
}

# 启动服务并设置开机自启
start_and_enable_services() {
    log_step "启动服务并设置开机自启..."
    
    # 启动服务
    systemctl start lighttpd
    systemctl start php-fpm
    systemctl start mysql
    
    # 设置开机自启
    systemctl enable lighttpd
    systemctl enable php-fpm
    systemctl enable mysql
    
    # 检查服务状态
    for service in lighttpd php-fpm mysql; do
        if systemctl is-active --quiet $service; then
            log_info "$service 服务运行正常"
        else
            log_warn "$service 服务可能未正常启动"
        fi
    done
}

# 保存安装信息
save_install_info() {
    cat > /root/lnmp_compile_info.txt << EOF
LNMP 编译安装信息
=================
安装时间: $(date)
操作系统: $OS $VERSION
Lighttpd版本: $LIGHTTPD_VERSION
PHP版本: $PHP_VERSION
MySQL版本: $MYSQL_VERSION
服务器IP: $SERVER_IP

安装路径:
- Lighttpd: $LIGHTTPD_DIR
- PHP: $PHP_DIR
- MySQL: $MYSQL_DIR

服务管理:
- 启动 Lighttpd: systemctl start lighttpd
- 启动 PHP-FPM: systemctl start php-fpm
- 启动 MySQL: systemctl start mysql
- 查看状态: systemctl status lighttpd

测试链接:
- 主页: http://$SERVER_IP
- PHP信息: http://$SERVER_IP/info.php
- MySQL测试: http://$SERVER_IP/test_mysql.php

重要文件:
- Lighttpd配置: $LIGHTTPD_DIR/etc/lighttpd.conf
- PHP配置: $PHP_DIR/etc/php.ini
- MySQL配置: $MYSQL_DIR/etc/my.cnf
- MySQL root密码: 见 /root/mysql_root_password.txt

环境变量:
source /etc/profile.d/lnmp.sh
EOF

    log_info "安装信息已保存到 /root/lnmp_compile_info.txt"
}

# 显示安装完成信息
show_completion_info() {
    echo ""
    echo "=========================================="
    log_info "LNMP 编译安装完成!"
    echo "=========================================="
    echo ""
    echo "Web服务器信息:"
    echo "   Lighttpd 状态: $(systemctl is-active lighttpd)"
    echo "   安装路径: $LIGHTTPD_DIR"
    echo "   访问地址: http://$SERVER_IP"
    echo ""
    echo "PHP信息:"
    echo "   PHP-FPM 状态: $(systemctl is-active php-fpm)"
    echo "   安装路径: $PHP_DIR"
    echo ""
    echo "MySQL信息:"
    echo "   MySQL 状态: $(systemctl is-active mysql)"
    echo "   安装路径: $MYSQL_DIR"
    echo "   Root密码: 见 /root/mysql_root_password.txt"
    echo ""
    echo "🔗 测试链接:"
    echo "   主页: http://$SERVER_IP"
    echo "   PHP信息: http://$SERVER_IP/info.php"
    echo "   MySQL测试: http://$SERVER_IP/test_mysql.php"
    echo ""
    echo "常用命令:"
    echo "   重启Lighttpd: systemctl restart lighttpd"
    echo "   重启PHP-FPM: systemctl restart php-fpm"
    echo "   重启MySQL: systemctl restart mysql"
    echo ""
    log_warn "重要: MySQL root 密码已保存到 /root/mysql_root_password.txt"
    echo "=========================================="
}

# 主函数
main() {
    echo "=========================================="
    echo "  LNMP 编译安装一键脚本"
    echo "  (Linux + Lighttpd + MySQL + PHP)"
    echo "=========================================="
    echo ""
    
    check_root
    detect_os
    get_server_ip
    
    # 安装过程
    install_dependencies
    create_users
    download_sources
    install_pcre
    install_zlib
    install_lighttpd
    configure_lighttpd
    install_mysql
    install_php
    create_systemd_services
    setup_environment
    create_test_files
    start_and_enable_services
    setup_mysql_root
    save_install_info
    
    # 显示完成信息
    show_completion_info
}

# 运行主函数
main "$@"

 

保存为 install_lnmp.sh 即可使用:

完整LNMP环境: Linux + Lighttpd + MySQL + PHP
多系统支持: Ubuntu、Debian、CentOS、RHEL 等主流 Linux 发行版
自动版本检测: 自动选择和安装最适合的PHP版本
安全优化: MySQL安全配置、防火墙规则、文件权限设置
性能优化: PHP-FPM、Lighttpd性能调优
完整测试: 包含PHP和MySQL连接测试文件
可选组件: 可选择安装 phpMyAdmin
信息保存: 自动生成安装信息文件供后续参考
服务管理: 自动启动和启用所有服务

安装完成后,您可以访问以下页面进行测试:
  • 主页: http://您的服务器IP/
  • PHP信息: http://您的服务器IP/info.php
  • MySQL测试: http://您的服务器IP/test_mysql.php
  • phpMyAdmin: http://您的服务器IP/phpmyadmin (如果安装了)

deepseek

#!/bin/bash

# 检查 root 权限
if [[ $EUID -ne 0 ]]; then
    echo "此脚本需要 root 权限。请使用 sudo 或以 root 用户身份运行。" 
    exit 1
fi

# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检测系统类型并安装依赖
install_dependencies() {
    log_info "检测系统类型并安装编译依赖..."
    
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$ID
    else
        log_error "无法检测操作系统类型。"
        exit 1
    fi
    
    case $OS in
        ubuntu|debian)
            apt-get update
            apt-get install -y wget build-essential autoconf automake libtool pkg-config \
                libpcre3-dev libbz2-dev zlib1g-dev libssl-dev libxml2-dev libjpeg-dev \
                libpng-dev libgdbm-dev libmysqlclient-dev libcurl4-openssl-dev
            ;;
        centos|rhel|fedora)
            if [ "$OS" = "centos" ] || [ "$OS" = "rhel" ]; then
                yum install -y epel-release
            fi
            yum groupinstall -y "Development Tools"
            yum install -y wget pcre-devel bzip2-devel zlib-devel openssl-devel \
                libxml2-devel libjpeg-turbo-devel libpng-devel gdbm-devel \
                mysql-devel curl-devel
            ;;
        *)
            log_warning "未知操作系统,尝试安装通用依赖..."
            if command -v apt-get &> /dev/null; then
                apt-get update
                apt-get install -y wget build-essential autoconf automake libtool pkg-config
            elif command -v yum &> /dev/null; then
                yum groupinstall -y "Development Tools"
                yum install -y wget
            elif command -v dnf &> /dev/null; then
                dnf groupinstall -y "Development Tools"
                dnf install -y wget
            else
                log_error "无法确定包管理器,请手动安装编译工具和依赖。"
                exit 1
            fi
            ;;
    esac
}

# 编译安装 Lighttpd
compile_lighttpd() {
    log_info "开始编译安装 Lighttpd..."
    
    cd /tmp
    wget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.54.tar.gz
    tar zxvf lighttpd-1.4.54.tar.gz
    cd lighttpd-1.4.54
    
    ./configure --prefix=/usr/local/lighttpd \
        --with-openssl \
        --with-zlib \
        --with-bzip2 \
        --with-pcre
    
    make -j$(nproc)
    make install
    
    # 创建必要的目录
    mkdir -p /usr/local/lighttpd/htdocs
    mkdir -p /usr/local/lighttpd/etc
    mkdir -p /usr/local/lighttpd/logs
    mkdir -p /usr/local/lighttpd/var/run
    
    # 复制配置文件
    cp ./doc/lighttpd.conf /usr/local/lighttpd/etc/
    
    # 创建 lighttpd 用户和组
    if ! id "lighttpd" &>/dev/null; then
        useradd -r -s /sbin/nologin lighttpd
    fi
    
    # 设置权限
    chown -R lighttpd:lighttpd /usr/local/lighttpd
    
    log_info "Lighttpd 编译安装完成。"
}

# 配置 Lighttpd
configure_lighttpd() {
    log_info "配置 Lighttpd..."
    
    # 备份原始配置
    cp /usr/local/lighttpd/etc/lighttpd.conf /usr/local/lighttpd/etc/lighttpd.conf.backup
    
    # 创建新的配置文件
    cat > /usr/local/lighttpd/etc/lighttpd.conf << 'EOF'
server.modules = (
    "mod_access",
    "mod_alias",
    "mod_compress",
    "mod_redirect",
    "mod_fastcgi",
)

server.document-root        = "/usr/local/lighttpd/htdocs"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/usr/local/lighttpd/logs/error.log"
server.pid-file             = "/usr/local/lighttpd/var/run/lighttpd.pid"
server.username             = "lighttpd"
server.groupname            = "lighttpd"
server.port                 = 80

index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

compress.cache-dir          = "/var/cache/lighttpd/compress/"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/local/lighttpd/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/local/lighttpd/share/lighttpd/create-mime.conf.pl"

# FastCGI configuration for PHP
fastcgi.server = ( ".php" => 
    ((
        "socket" => "/tmp/php.socket",
        "bin-path" => "/usr/local/php/bin/php-cgi",
        "max-procs" => 2,
        "bin-environment" => (
            "PHP_FCGI_CHILDREN" => "4",
            "PHP_FCGI_MAX_REQUESTS" => "10000"
        ),
        "broken-scriptfilename" => "enable"
    ))
)
EOF
    
    # 创建测试页面
    cat > /usr/local/lighttpd/htdocs/index.php << 'EOF'
<?php
phpinfo();
?>
EOF
    
    chown lighttpd:lighttpd /usr/local/lighttpd/htdocs/index.php
}

# 创建 Lighttpd 系统服务
create_lighttpd_service() {
    log_info "创建 Lighttpd 系统服务..."
    
    # 创建 systemd 服务文件
    cat > /etc/systemd/system/lighttpd.service << 'EOF'
[Unit]
Description=Lighttpd Web Server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/lighttpd/var/run/lighttpd.pid
ExecStart=/usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/etc/lighttpd.conf
ExecReload=/bin/kill -USR1 $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID
User=lighttpd
Group=lighttpd

[Install]
WantedBy=multi-user.target
EOF
    
    # 启用并启动服务
    systemctl daemon-reload
    systemctl enable lighttpd
    systemctl start lighttpd
    
    # 检查服务状态
    if systemctl is-active --quiet lighttpd; then
        log_info " Lighttpd 服务启动成功!"
    else
        log_error " Lighttpd 服务启动失败,请检查配置。"
        systemctl status lighttpd
    fi
}

# 编译安装 PHP
compile_php() {
    log_info "开始编译安装 PHP..."
    
    cd /tmp
    wget https://www.php.net/distributions/php-7.4.33.tar.gz
    tar zxvf php-7.4.33.tar.gz
    cd php-7.4.33
    
    ./configure --prefix=/usr/local/php \
        --with-config-file-path=/usr/local/php/etc \
        --enable-fpm \
        --with-fpm-user=lighttpd \
        --with-fpm-group=lighttpd \
        --with-mysqli \
        --with-pdo-mysql \
        --with-openssl \
        --with-zlib \
        --with-curl \
        --with-gd \
        --with-jpeg \
        --with-png-dir \
        --with-gettext \
        --with-zip \
        --enable-mbstring
    
    make -j$(nproc)
    make install
    
    # 复制配置文件
    mkdir -p /usr/local/php/etc
    cp php.ini-development /usr/local/php/etc/php.ini
    
    # 创建 PHP-FPM 配置文件
    cat > /usr/local/php/etc/php-fpm.conf << 'EOF'
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
user = lighttpd
group = lighttpd
listen = /tmp/php.socket
listen.owner = lighttpd
listen.group = lighttpd
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
EOF
    
    log_info "PHP 编译安装完成。"
}

# 创建 PHP-FPM 系统服务
create_phpfpm_service() {
    log_info "创建 PHP-FPM 系统服务..."
    
    # 创建 systemd 服务文件
    cat > /etc/systemd/system/php-fpm.service << 'EOF'
[Unit]
Description=PHP FastCGI Process Manager
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --daemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -QUIT $MAINPID

[Install]
WantedBy=multi-user.target
EOF
    
    # 启用并启动服务
    systemctl daemon-reload
    systemctl enable php-fpm
    systemctl start php-fpm
    
    # 检查服务状态
    if systemctl is-active --quiet php-fpm; then
        log_info " PHP-FPM 服务启动成功!"
    else
        log_error " PHP-FPM 服务启动失败,请检查配置。"
        systemctl status php-fpm
    fi
}

# 安装 MySQL (使用包管理器安装)
install_mysql() {
    log_info "开始安装 MySQL..."
    
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$ID
    fi
    
    case $OS in
        ubuntu|debian)
            apt-get install -y mysql-server mysql-client
            ;;
        centos|rhel|fedora)
            if [ "$OS" = "centos" ] || [ "$OS" = "rhel" ]; then
                yum install -y mariadb-server mariadb
            else
                yum install -y mysql-server mysql
            fi
            ;;
        *)
            # 尝试使用通用方法安装
            if command -v apt-get &> /dev/null; then
                apt-get install -y mysql-server mysql-client
            elif command -v yum &> /dev/null; then
                yum install -y mysql-server mysql
            elif command -v dnf &> /dev/null; then
                dnf install -y mysql-server mysql
            else
                log_error "无法确定包管理器,请手动安装 MySQL。"
                return 1
            fi
            ;;
    esac
    
    # 启动 MySQL 服务
    systemctl enable mysql
    systemctl start mysql
    
    # 安全配置 MySQL
    log_info "进行 MySQL 安全配置..."
    MYSQL_ROOT_PASSWORD=$(openssl rand -base64 12 | tr -d '/+=' | cut -c1-12)
    
    mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$MYSQL_ROOT_PASSWORD'; FLUSH PRIVILEGES;"
    
    # 保存密码到文件
    echo "MySQL root 密码: $MYSQL_ROOT_PASSWORD" > /root/mysql_password.txt
    chmod 600 /root/mysql_password.txt
    log_info "MySQL root 密码已保存到 /root/mysql_password.txt"
    
    # 检查服务状态
    if systemctl is-active --quiet mysql; then
        log_info " MySQL 服务启动成功!"
    else
        log_error " MySQL 服务启动失败,请检查配置。"
        systemctl status mysql
    fi
}

# 显示安装结果
show_result() {
    log_info " LNMP 环境编译安装完成!"
    echo ""
    echo "安装信息:"
    echo " - Lighttpd 安装路径: /usr/local/lighttpd"
    echo " - PHP 安装路径: /usr/local/php"
    echo " - MySQL 已安装并配置"
    echo ""
    echo "服务状态:"
    systemctl status lighttpd --no-pager -l
    echo ""
    systemctl status php-fpm --no-pager -l
    echo ""
    systemctl status mysql --no-pager -l
    echo ""
    echo "访问地址:"
    echo " - 网站根目录: /usr/local/lighttpd/htdocs"
    echo " - 测试页面: http://$(hostname -I | awk '{print $1}')/index.php"
    echo ""
    
    if [ -f /root/mysql_password.txt ]; then
        echo "MySQL root 密码已保存到: /root/mysql_password.txt"
        echo "请妥善保管此密码!"
    fi
    
    echo ""
    echo "下一步操作建议:"
    echo "1. 修改 MySQL root 密码 (如果自动生成的密码不符合要求)"
    echo "2. 配置虚拟主机 (如果需要)"
    echo "3. 安装 SSL 证书 (如果需要 HTTPS)"
    echo "4. 配置防火墙开放必要端口"
}

# 主安装流程
main() {
    log_info "开始编译安装 LNMP 环境 (Lighttpd + PHP + MySQL)"
    
    # 安装依赖
    install_dependencies
    
    # 编译安装 Lighttpd
    compile_lighttpd
    configure_lighttpd
    create_lighttpd_service
    
    # 编译安装 PHP
    compile_php
    create_phpfpm_service
    
    # 安装 MySQL
    install_mysql
    
    # 显示结果
    show_result
}

# 执行主函数
main "$@"

 

保存为 install_lnmp.sh 即可使用:

  • 自动检测系统类型(Ubuntu/Debian/CentOS/RHEL)

  • 安装 Lighttpd Web 服务器

  • 安装 MySQL/MariaDB 数据库

  • 安装 PHP 及常用扩展

  • 自动配置 PHP-FPM 与 Lighttpd 协同工作

  • 自动生成安全的 MySQL root 密码

  • 创建 PHP 测试页面

  • 显示安装结果和后续操作建议


sicnature ---------------------------------------------------------------------
I P 地 址: 216.73.216.116
区 域 位 置: 美国加利福尼亚洛杉矶
系 统 信 息: 美国
Original content, please indicate the source:
同福客栈论坛 | 蟒蛇科普海南乡情论坛 | JiaYu Blog
sicnature ---------------------------------------------------------------------
Welcome to reprint. Please indicate the source https://www.myzhenai.com/post/4782.html

没有评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注