LAMP(Linux+Apache+MySQL+PHP)环境介绍、配置、搭建

news2024/11/18 13:59:52

LAMP(Linux+Apache+MySQL+PHP)环境介绍、配置、搭建

LAMP介绍

LAMP是由Linux, Apache, MySQL, PHP组成的,即把Apache、MySQL以及PHP安装在Linux系统上,组成一个环境来运行PHP的脚本语言。Apache是最常用的Web服务软件,而MySQL是比较小型的数据库软件。三个角色可以安装在一台机器上,也可以分开(但httpd和php要在一起的)
在这里插入图片描述

为什么需要LAMP?

手动逐个编译安装各个组件,需要输入各种命令,且有可能会中途出错。
对于想要成功搭建 LAMP 建站环境来说,可以节约大量时间和精力。

LAMP 有什么优点?

LAMP 是最经典的建站环境之一,风靡世界十几年。
而本脚本只需几个简单交互,选择需要安装的包,即可一路安装,无人值守。

准备工作

yum install -y bzip2 tar net-tools wget expect

安装MySQL:

MySQL介绍

MySQL是一个关系型数据库,由mysql ab公司开发,mysql在2008年被sun公司收购(10亿刀),2009年sun公司被oracle公司收购(74亿刀)

MySQL官网https://www.mysql.com 最新版本5.7GA/8.0DMR

MySQL5.6变化比较大,5.7性能上有很大提升

MySQL安装过程

# 安装必要的软件包
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
# 添加mysql用户,设置不登录
useradd -s /sbin/nologin mysql
# 解压MySQL源码
tar xf /opt/mysql-5.7.17.tar.gz -C /opt
# 解压Boost源码
tar xf /opt/boost_1_59_0.tar.gz -C /usr/local/
# 重命名Boost源码目录
mv -f /usr/local/boost_1_59_0 /usr/local/boost
# 进入MySQL源码目录
cd /opt/mysql-5.7.17 
# 配置MySQL编译选项
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1
# 使用多核编译并安装
make -j 4 && make install
# 将自定义的my.cnf配置文件移动到/etc并修改权限
cp -f /opt/my.cnf /etc/my.cnf
chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf
# 在环境变量中添加MySQL/bin路径
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
# 初始化MySQL数据库
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
# 复制MySQL的systemd服务文件
cp -f /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
# 重新加载systemd配置
systemctl daemon-reload
# 启动MySQL服务并设置开机自启动
systemctl start mysqld.service
systemctl enable mysqld
# 检查MySQL服务是否正常运行在3306端口
netstat -anpt | grep 3306

在这里插入图片描述

my.cnf

[client]
port = 3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
auto-rehash
[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

mysql设置用户密码脚本

#!/usr/bin/expect
set timeout 30
spawn mysqladmin -u root -p password \"123456\"
expect {
	"*password*" {send "\r"}
}
expect eof

在这里插入图片描述

安装Httpd(Apache)

脚本源代码:

#!/bin/bash

# 安装软件包
function install_packages {
    yum install -y $1
}

# 提取tarball文件并将其解压到/opt目录下
function extract_tarball {
    tar xf $1 -C /opt
}

# 配置并编译安装软件
function configure_and_make {
    cd $1
    ./configure $2
    make -j $(nproc) && make install
}

# 配置Apache,将IP和端口替换为更安全的值
function configure_httpd {
    LOCAL_IP=$(ip addr show ens33 | grep "inet " | awk '{print $2}' | cut -d/ -f1) 
 
    sed -i "s/#ServerName www.example.com:80/ServerName $LOCAL_IP:80/" /usr/local/httpd/conf/httpd.conf
}

# 启动服务并设置开机自启动
function start_service {
    systemctl daemon-reload
    systemctl start $1.service
    systemctl enable $1
}

# 创建符号链接
function create_symbolic_links {
    local source_path="$1"
    local target_path="$2"

    # 检查是否以root身份运行
    if [ "$(id -u)" -ne 0 ]; then
        echo "必须以root身份运行此脚本。" >&2
        return 1
    fi

    # 遍历源路径下的文件,创建符号链接
    for file in "$source_path"/*
    do
        base=$(basename "$file")
        link_target="$target_path/$base"

        # 检查目标是否已存在
        if [ -L "$link_target" ]; then
            echo "警告:$link_target 已存在,将被覆盖。" >&2
        else
            if [ -e "$file" ]; then
                echo "创建符号链接: $file => $link_target"
                ln -s -T "$file" "$link_target" || { echo "创建链接失败,请检查权限和路径。" >&2; return 1; }
            else
                echo "错误:$file 不存在。" >&2
                return 1
            fi
        fi
    done
}

# 主脚本逻辑开始
extract_tarball "/opt/apr-1.6.2.tar.gz"
extract_tarball "/opt/apr-util-1.6.0.tar.gz"
extract_tarball "/opt/httpd-2.4.29.tar.bz2"
mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr
mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util
# 安装编译依赖包
install_packages \
    "gcc gcc-c++ make pcre-devel expat-devel perl"
# 配置并编译安装Apache
configure_and_make "/opt/httpd-2.4.29" \
    "--prefix=/usr/local/httpd \
    --enable-so \
    --enable-rewrite \
    --enable-charset-lite \
    --enable-cgi"

configure_httpd
# 创建必要的符号链接
create_symbolic_links "/usr/local/httpd/conf" "/etc"
create_symbolic_links "/usr/local/httpd/bin" "/usr/local/bin"
# 创建Apache的systemd服务文件
echo '[Unit]
Description=The Apache HTTP
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/httpd/logs/httpd.pid
ExecStart=/usr/local/bin/apachectl $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
' > /usr/lib/systemd/system/httpd.service
# 启动Apache服务并设置开机自启动
start_service httpd

在这里插入图片描述

安装PHP

#!/bin/bash

# 使用函数封装功能,增加可读性和可维护性
function install_packages {
    yum install -y $1
}

function extract_tarball {
    tar xf $1 -C /opt
}

function configure_and_make {
    cd $1
    ./configure $2
    make -j $(nproc) && make install
}

function configure_httpd {
    # 配置 Apache,替换 IP 和端口为更安全的值
LOCAL_IP=$(ip addr show ens33 | grep "inet " | awk '{print $2}' | cut -d/ -f1) 
    sed -i "s/Listen 80/Listen $LOCAL_IP:80/g" /usr/local/httpd/conf/httpd.conf
    sed -i "s/#ServerName www.example.com:80/ServerName $LOCAL_IP:80/" /usr/local/httpd/conf/httpd.conf
}

function start_service {
    systemctl daemon-reload
    systemctl start $1.service
    systemctl enable $1
}
function create_symbolic_links {
    local source_path="$1"
    local target_path="$2"

    # 检查是否以root身份运行
    if [ "$(id -u)" -ne 0 ]; then
        echo "必须以root身份运行此脚本。" >&2
        return 1
    fi

    # 遍历源路径下的文件
    for file in "$source_path"/*
    do
        base=$(basename "$file")
        link_target="$target_path/$base"

        # 检查目标是否已存在
        if [ -L "$link_target" ]; then
            echo "警告:$link_target 已存在,将被覆盖。" >&2
        else
            if [ -e "$file" ]; then
                echo "创建符号链接: $file => $link_target"
                ln -s -T "$file" "$link_target" || { echo "创建链接失败,请检查权限和路径。" >&2; return 1; }
            else
                echo "错误:$file 不存在。" >&2
                return 1
            fi
        fi
    done

}
# 安全的 MySQL 初始化和配置
function initialize_mysql {
    cd /usr/local/mysql/bin
  ./mysqld \
    --initialize-insecure \
    --user=mysql \
    --basedir=/usr/local/mysql \
    --datadir=/usr/local/mysql/data
}

# 更新 PATH 以包含 PHP
function configure_php {

# 定义变量
PHP_INI_SRC=/opt/php-7.1.24/php.ini-development
PHP_INI_DEST=/usr/local/php7/php.ini
HTTPD_CONF=/etc/httpd.conf
HTTPD_HTDICT=/usr/local/httpd/htdocs
MYSQL_INIT_SH=/opt/mysql_init2.exp
UNZIP_FILE=/opt/Discuz_X3.4_SC_UTF8.zip
DIS_DIR=/opt/dis/dir_SC_UTF8/upload
BBS_DIR=/usr/local/httpd/htdocs/bbs

# 复制php.ini文件并编辑
cp -f "$PHP_INI_SRC" "$PHP_INI_DEST"
sed -i 's/;date.timezone =/date.timezone = Asia\/Shanghai/g' /usr/local/php7/php.ini
sed -i "s/mysqli.default_socket =/mysqli.default_socket = \/usr\/local\/mysql\/mysql.sock/g" /usr/local/php7/php.ini

# 链接php命令
create_symbolic_links "/usr/local/php7/bin/*" "/usr/local/bin/"

# 编辑httpd.conf文件
sed -i 's/DirectoryIndex index.html/DirectoryIndex index.php/g' "$HTTPD_CONF"
sed -i  '396a\    AddType application/x-httpd-php .php\n    AddType application/x-httpd-php-source .phps\n' "$HTTPD_CONF"

# 删除并创建新的index.php
rm -f "$HTTPD_HTDICT/index.html"
touch "$HTTPD_HTDICT/index.php"
echo '<?php phpinfo();?>' > "$HTTPD_HTDICT/index.php"
chmod 644 "$HTTPD_HTDICT/index.php"
systemctl restart httpd.service
# 安装unzip,解压文件并复制到目标目录
sudo yum install unzip -y
unzip -f "$UNZIP_FILE" -d "$DIS_DIR"
cp -r /opt/dis/dir_SC_UTF8/upload/ /usr/local/httpd/htdocs/bbs
# 安全地设置脚本和目录权限
chmod 755 "$MYSQL_INIT_SH"
chmod -R 755 "$DIS_DIR"
chown -R daemon "$BBS_DIR/config"
chown -R daemon "$BBS_DIR/data"
chown -R daemon "$BBS_DIR/uc_client"
chown -R daemon "$BBS_DIR/uc_server/data"

}

install_packages \
    "gd libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel"
extract_tarball "/opt/php-7.1.24.tar.gz"
configure_and_make "/opt/php-7.1.24" \
    "--prefix=/usr/local/php7 \
    --with-apxs2=/usr/local/httpd/bin/apxs \
    --with-mysql-sock=/usr/local/mysql/mysql.sock \
    --with-config-file-path=/usr/local/php7 \
    --with-mysqli \
    --with-zlib \
    --with-curl \
    --with-gd \
    --with-jpeg-dir \
    --with-png-dir \
    --with-freetype-dir \
    --with-openssl \
    --enable-mbstring \
    --enable-xml \
    --enable-session \
    --enable-ftp \
    --enable-pdo \
    --enable-tokenizer"
configure_php
systemctl restart httpd

在这里插入图片描述

安装论坛

创建数据库脚本

#!/usr/bin/expect
set timeout 30
set password "123456"
spawn mysql -uroot -p
expect {
	"*password*" {send "$password\r"}
}
expect ">*"
send "CREATE DATABASE bbs;\r"
expect ">*"
send "GRANT all ON bbs.* TO 'bbsuser'@'%' IDENTIFIED BY 'admin123';\r"
expect ">*"
send "flush privileges;\r"
expect ">*"
send "quit\r"
expect eof


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1629753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jupyter notebook设置代码自动补全

jupyter notebook设置代码自动补全 Anaconda Prompt窗口执行 pip install jupyter_contrib_nbextensionsjupyter contrib nbextensions install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user按如下图片设置 卸载jed…

(bevfusion:多模态融合)报错:AttributeError: module ‘numpy‘ has no attribute ‘long‘

解决办法1&#xff1a;降低numpy版本&#xff08;我的报错版本是1.24.4&#xff09; pip install numpy1.20.3解决办法2&#xff1a;或者将np.long改为np.int64 (由于我的报错在环境内部&#xff0c;不好修改&#xff0c;所以直接降低的numpy版本)

2024年3月电子学会Python等级考试试卷(三级)真题,包含答案

202403Python 三级真题 1、在Python中,hex(2023)的功能是?() A.将十进制数 2023 转化为十六进制数 B.将十进制数 2023 转化为八进制数 C.将十六进制数 2023转化为十进制数 D.将八进制数 2023转化为十进制数

双重注意力模块 DoubleAttention | A2-Nets: Double Attention Networks

论文名称&#xff1a;《 A 2 A^2 A2-Nets: Double Attention Networks》 论文地址&#xff1a;https://arxiv.org/pdf/1810.11579.pdf 学习捕捉远距离关系对于图像/视频识别是基础性的。现有的CNN模型通常依靠增加深度来建模这些关系&#xff0c;这在很大程度上效率低下。在这…

C++ | Leetcode C++题解之第51题N皇后

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> solveNQueens(int n) {auto solutions vector<vector<string>>();auto queens vector<int>(n, -1);auto columns unordered_set<int>();auto diag…

【MHA】MySQL高可用MHA介绍1-功能,架构,优势,案例

目录 一 MHA 介绍 1 MHA功能 自动化主服务器监控和故障转移 交互式&#xff08;手动启动的&#xff09;主故障转移 非交互式主故障转移 在线切换主机 2 主服务器故障转移的难点 二 MHA架构 1 MHA组件 2 自定义扩展&#xff08;脚本&#xff09; 三 MHA优势 1 MHA可以…

详解SPI、I2C、UART、I2S、GPIO、SDIO、CAN

总线,总线,总要陷进里面。这世界上的信号都一样,但是总线却成千上万,让人头疼。 总的来说,总线有三种:内部总线、系统总线和外部总线。内部总线是微机内部各外围芯片与处理器之间的总线,用于芯片一级的互连;而系统总线是微机中各插件板与系统板之间的总线,用于插件板一…

Hive函数详解

Hive 是一个建立在 Hadoop 上的数据仓库基础架构&#xff0c;它提供了类似于 SQL 的查询语言&#xff0c;称为 HiveQL&#xff0c;用于对存储在 Hadoop 分布式文件系统中的数据进行查询和分析。 1.函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Jav…

vim的IDE进阶之路

一 ctags 1 安装 安装ctags比较简单&#xff0c;我用的是vim-plug&#xff0c;网络上随便一搜应该就有很多教程&#xff0c;而且没有什么坑 2 使用 vim之函数跳转功能_nvim函数跳转-CSDN博客https://blog.csdn.net/ballack_linux/article/details/71036072不过针对cuda程序…

ZooKeeper 搭建详细步骤之一(单机模式)

ZooKeeper 搭建详细步骤之三&#xff08;真集群&#xff09; ZooKeeper 搭建详细步骤之二&#xff08;伪集群模式&#xff09; ZooKeeper 搭建详细步骤之一&#xff08;单机模式&#xff09; ZooKeeper 及相关概念简介 搭建模式简述 ZooKeeper 的搭建模式包括单机模式、集群模…

Blender笔记之基本操作

code review! —— 2024-04-27 杭州 Blender笔记…

yolov8旋转目标检测输出的角度转化为适合机械爪抓取的角度

1. 机械爪抓取时旋转的角度定义 以X轴正方向&#xff08;右&#xff09;为零度方向&#xff0c;角度取值范围[-90&#xff0c;90)。 确认角度的方法&#xff1a; 逆时针旋转X轴&#xff0c;X轴碰到矩形框长边时旋转过的角度记为angleX&#xff1a; 1.如果angleX小于90&#xf…

BootStrap详解

Bootstrap简介 什么是BootStrap&#xff1f; BootStrap来自Twitter&#xff0c;是目前最受欢迎的响应式前端框Bootstrap是基于HTML、CSS、JavaScript的&#xff0c;它简洁灵活&#xff0c;使得Web开发更加快捷 为什么使用Bootstrap&#xff1f; 移动设备优先&#xff1a;自…

在MySQL中isnull()函数不能作为替代null值!

在MySQL中isnull()函数不能作为替代null值&#xff01; 如下&#xff1a; 首先有个名字为business的表&#xff1a; SELECT ISNULL(business_name,no business_name) AS bus_isnull FROM business WHERE id2 直接运行就会报错&#xff1a; 错误代码&#xff1a; 1582 Incor…

ZISUOJ 高级语言程序设计实训-基础C(部分题)

说明&#xff1a; 有几个题是不会讲的&#xff0c;我只能保证大家拿保底分。 题目列表&#xff1a; 问题 A: 求平均数1 思路&#xff1a; 送分题…… 参考题解&#xff1a; #include <iostream> #include <iomanip> using std::cin; using std::cout;int main(…

Linux系统安全与应用【二】

目录 1.开关机安全控制 1.2 实例&#xff1a;GRUB 菜单设置密码 2.终端登录安全控制 2.1 限制root只在安全终端登录 ​3.弱口令检测 3.1 Joth the Ripper,JR​编辑 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1 GRUB限制 限制更改GRUB引导参数 通常情况下在系统…

用fgets()替换fscanf()解决文件读取在小熊猫C++失败问题

fscanf&#xff08;&#xff09;遇到空格就结束读取&#xff0c;导致文件读取数据没完就退出读取以至于不能导入游戏地图工程。 看看到右侧小方块轨迹知晓采样区移动情况 也已经实现摄像机追随玩家效果 // 程序&#xff1a;2D RPG 地图编辑器与摄像机追随 // 作者&#xff1…

本地认证的密码去哪了?怎么保证安全的?

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff1f;密文存在哪个文件下?该文件是否可以打开&#xff0c;并且查看到密文&#xff1f; 系统将输入的明文密码通过hash算法转为哈希值&#xff0c;且输入的值会在内存中立即删除无法查看。 然后将密文存放在C:…

PotatoPie 4.0 实验教程(26) —— FPGA实现摄像头图像拉普拉斯锐化

为什么要对图像进行拉普拉斯锐化 对图像进行拉普拉斯锐化的目的是增强图像的边缘和细节&#xff0c;使图像看起来更加清晰和锐利。这种技术常用于图像处理中&#xff0c;具体原因如下&#xff1a; 增强图像的边缘信息&#xff1a;拉普拉斯锐化可以突出图像中的边缘特征&#x…

【go零基础】go-zero从零基础学习到实战教程 - 0环境配置

是个前端&#xff0c;最近开始学习go&#xff0c;后端除node外基本0基础&#xff0c;所以学习曲线有点绕&#xff0c;目标是个基础的服务端demo&#xff0c;搞个api服务后台&#xff0c;包含基础的用户登录、文章发布和写文章、权限控制&#xff0c;差不多就是个完整博客系统。…