lamp+lnmp框架探索尝试

lamp+lnmp框架探索尝试

背景

最近aurora新生赛要开始了,要求我仅在一个容器上创建题目,我原意是整一个wordpress(顺便学习一下),在这个设定下我不得不放弃容器组,于是我收获秃头了很多

lamp,lnmp镜像

最优解是使用别人的镜像,毕竟人家是专业团队,正常也是一直有维护的

网上随便搜就有

https://hub.docker.com/r/2233466866/lnmp

下载(Download)

# 主流版本
## CentOS7 + Nginx + Node.js + MySQL + php-^7.4 + php5.6.40
docker pull 2233466866/lnmp
docker pull 2233466866/lnmp:1.14

# nosql版本
## CentOS7 + Nginx + Node.js + MySQL + php-^7.4 + php5.6.40 + Redis
docker pull 2233466866/lnmp:nosql
docker pull 2233466866/lnmp:1.14-nosql

# newest版本
## CentOS7 + Nginx + Node.js + MySQL + php-^8.1 + php-^7.4 + php5.6.40 + Redis
docker pull 2233466866/lnmp:newest

# mini版本
## CentOS7 + Nginx + php-^7.4
docker pull 2233466866/lnmp:mini

配置(Config)

# 配置文件路径(Config file path)
# Nginx
/usr/local/nginx/conf/nginx.conf

# MySQL
/etc/my.cnf

# Redis
/usr/local/redis/redis.conf

# php-5
/usr/local/php5/lib/php.ini
/usr/local/php5/etc/php-fpm.conf

# php-7
/usr/local/php7/lib/php.ini
/usr/local/php7/etc/php-fpm.conf
/usr/local/php7/etc/php-fpm.d/www.conf

# php-8
/usr/local/php8/lib/php.ini
/usr/local/php8/etc/php-fpm.conf
/usr/local/php8/etc/php-fpm.d/www.conf

启动(Start)

# 端口映射自行指定,容器名称自行指定为lnmp
docker run -dit --privileged=true --name=lnmp 2233466866/lnmp

# 高级用法(Advanced usage)
docker run -dit \
-p 80:80 \
-p 443:443 \
-v /宿主机自定义目录/www:/www \
-v /宿主机自定义目录/mysql:/data/mysql \
--name=lnmp \
2233466866/lnmp

# 如对配置文件比较熟悉,也可以通过宿主机挂载使用自定义的配置文件

连接(Connect)

# 容器名称与上一步保持一致
docker exec -it [CONTAINER ID] /bin/bash

状态(Status)

ps aux|grep nginx
ps aux|grep mysql
ps aux|grep php
ps aux|grep redis
# 或者(Or)
systemctl status nginx
systemctl status mysqld
systemctl status php5
systemctl status php7
systemctl status php8
systemctl status redis

PHP-CLI版本选择

# PHP5及使用composer
php5 -v
php5 /usr/local/php5/bin/composer

# PHP7及使用composer
php7 -v
php7 /usr/local/php7/bin/composer

# PHP8及使用composer
php8 -v
php8 /usr/local/php8/bin/composer

PHP-FPM版本切换

# PHP5
ps aux|grep php
kill PHP-FPM-PID
systemctl stop php7
systemctl disable php7
systemctl stop php8
systemctl disable php8
systemctl start php5
systemctl enable php5

# PHP7
ps aux|grep php
kill PHP-FPM-PID
systemctl stop php5
systemctl disable php5
systemctl stop php8
systemctl disable php8
systemctl start php7
systemctl enable php7

# PHP8
ps aux|grep php
kill PHP-FPM-PID
systemctl stop php5
systemctl disable php5
systemctl stop php7
systemctl disable php7
systemctl start php8
systemctl enable php8

初始密码(Default password)

cat /var/log/mysqld.log|grep 'A temporary password'
# 或
password=`cat /var/log/mysqld.log|grep 'A temporary password'`;password=${password:91};echo $password

警告(Warning)

# 请保持清醒头脑,明确自己是在容器内还是在服务器本身执行命令,以及-v挂载对文件的影响,以免造成不可挽回的损失

PHP扩展(PHP extension)

# 默认已安装部分扩展在目录:/usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718/
# 如果要启用指定扩展,则需要修改php.ini,加上
extension=xxx.so
# xxx为PHP扩展的文件名,然后重启php
systemctl restart php7

版本(Version)

# 各版本详细信息请参考
https://github.com/2233466866/lnmp/wiki

题外话

不用的话很容易被运维叼烂,毕竟自己维护的永远不如专业的

image-20221122001701179

┭┮﹏┭┮

手写

由于一开始比较急功近利并且盲目自信,所以直接手撸了一个lamp+wordpress和lnmp+wordpress

lamp+wordpress

这是参考官网的Install and configure WordPress | Ubuntu

docker pull ubuntu:jammy

对了,这里演示的是直接在ubuntu里面装,即便如此还是建议使用dockerfile搭建,不然你每次犯错都要remake

换源

sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

更新源,装软件

apt-get update;apt-get upgrade;apt install sudo;apt install vim

装Mysql

sudo apt-get install mysql-server

装apache

sudo apt update
sudo apt install apache2 \
                 ghostscript \
                 libapache2-mod-php \
                 mysql-server \
                 php \
                 php-bcmath \
                 php-curl \
                 php-imagick \
                 php-intl \
                 php-json \
                 php-mbstring \
                 php-mysql \
                 php-xml \
                 php-zip

这里可能会报错,装curl

apt install curl

创建文件并配置权限,源码安装wordpress (目前没有apt安装好像)

sudo mkdir -p /srv/www
sudo chown www-data: /srv/www
curl https://wordpress.org/latest.tar.gz | sudo -u www-data tar zx -C /srv/www

修改apache配置

vim /etc/apache2/sites-available/wordpress.conf

如下

<VirtualHost *:80>
    DocumentRoot /srv/www/wordpress
    <Directory /srv/www/wordpress>
        Options FollowSymLinks
        AllowOverride Limit Options FileInfo
        DirectoryIndex index.php
        Require all granted
    </Directory>
    <Directory /srv/www/wordpress/wp-content>
        Options FollowSymLinks
        Require all granted
    </Directory>
</VirtualHost>

接着如下操作,也是对apache的一个初始化操作,有warning跟着提示敲就行

service apache2 start
sudo a2ensite wordpress
sudo a2enmod rewrite
sudo a2dissite 000-default
 service mysql start

To configure WordPress, we need to create MySQL database. Let’s do it!

$ sudo mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE wordpress;
Query OK, 1 row affected (0,00 sec)

mysql> CREATE USER wordpress@localhost IDENTIFIED BY '123456';
Query OK, 1 row affected (0,00 sec)

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER
    -> ON wordpress.*
    -> TO wordpress@localhost;
Query OK, 1 row affected (0,00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0,00 sec)

mysql> quit
Bye

Enable MySQL with sudo service mysql start.

之后访问127.0.0.1就可以看到安装界面了

注意,mysql主机这里一定要写127.0.0.1而不是localhost,因为localhost会默认SOCKET而不使用TCP,127.0.0.1可以强制使用tcp

lnmp+wordpress

WordPress部署 —— 基于Ubuntu、Mysql和Nginx - 紫零大仙 - 博客园 (cnblogs.com)

只需要一条简单命令即可:

sudo apt-get install mysql-server

然后查看默认的用户名和密码:

sudo vim /etc/mysql/debian.cnf

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = XXXXXXXXXXXXXXXX
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = XXXXXXXXXXXXXXXX
socket   = /var/run/mysqld/mysqld.sock

其中的user和password就是mysql的初始用户密码,该用户具有root权限。

如果对安全性有要求,则建议新建其他用户。

注意: 该用户必须拥有对应Schema的建表权限,建议赋权all。

如果Wordpress服务器与Mysql服务器不在同一台机器上,则还需要修改mysql配置文件,允许root用户远程登陆。

# 修改Mysql配置
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 将bind-address从127.0.0.1改为0.0.0.0并保存
# bind-address            = 0.0.0.0

# 登陆mysql,密码使用上面的XXXXXXXXXXXXXXXX
mysql -u debian-sys-maint -p
# 给debian-sys-maint赋权
grant all on *.* to debian-sys-maint@'%' identified by 'XXXXXXXXXXXXXXXX' with grant option;
flush privileges;

#这里可能会报语法错误,可以按照网上别人配置权限的方法整

# 记得创建一个新的数据库Schema
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

安装nginx

也只需要一条简单命令即可:

sudo apt-get install nginx

但是需要配置允许解析php文件

sudo vi /etc/nginx/sites-available/default

可以参考如下配置

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        # 这里添加了index.php的默认解析
        index index.php index.html index.htm index.nginx-debian.html;

        # 注意,这里可以填写域名或者服务器IP地址,可以根据具体情况修改
        server_name _;

        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            # 这里是7.2版本的php7.2-fpm,其他版本需要根据具体情况修改
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
            deny all;
        }

        location = /favicon.ico { log_not_found off; access_log off; }
        location = /robots.txt { log_not_found off; access_log off; allow all; }
        location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
            expires max;
            log_not_found off;
        }
}

重新加载或重启nginx配置:

# 检查配置的正确性
sudo nginx -t
# 重新加载nginx配置
sudo nginx -s reload
# 或者重启nginx
sudo service nginx restart

配置完成后,可以访问http://localhost验证配置是否成功。

安装php及其相关插件(里面php-curl,mcrypt,php-pecl可能无了,参考这个php如何安装pecl扩展-PHP问题-PHP中文网

# 安装php及相关常用插件
sudo apt-get install php-fpm php-mysql
sudo apt-get install php-curl php-gd php-mbstring php-mcrypt php-xml php-xmlrpc
# 安装pecl以及php-mcrypt
sudo apt-get install php-pecl libmcrypt-dev libreadline-dev
sudo pecl install mcrypt

# 先关闭cgi.fix_pathinfo配置,防止PHP找不到所请求的PHP文件时去查找最接近的可执行文件。
sudo vim /etc/php/7.2/fpm/php.ini
# 将cgi.fix_pathinfo的注释放开并设置为0。

# 重启php-fpm,我这里的版本是7.2,可以根据具体情况修改
sudo service php7.2-fpm restart

编写一个测试文件:

sudo vim /var/www/html/info.php

在info.php中填入以下内容并保存:

<?php
phpinfo();
?>

然后访问 http://localhost/info.php 查看是否正确解析。

安装wordpress

下载wordpress最新版并解压

cd /tmp/
wget https://cn.wordpress.org/latest-zh_CN.zip

# 如果没有unzip记得安装一下
sudo apt-get install unzip
unzip latest-zh_CN.zip

修改数据库连接配置

cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php
vim /tmp/wordpress/wp-config.php

将数据库配置成之前搞定的那些:

/** WordPress数据库的名称 */
define( 'DB_NAME', 'wordpress' );
/** MySQL数据库用户名 */
define( 'DB_USER', 'debian-sys-maint' );
/** MySQL数据库密码 */
define( 'DB_PASSWORD', 'XXXXXXXXXXXXXXXX' );
/** MySQL主机 */
define( 'DB_HOST', 'localhost:3306' );
/** 创建数据表时默认的文字编码 */
define( 'DB_CHARSET', 'utf8' );
/** 数据库整理类型。如不确定请勿更改 */
define( 'DB_COLLATE', '' );

把wordpress拷贝到nginx解析的根目录,同时给wp-content赋权,确保nginx能够写入该目录:

sudo cp /tmp/wordpress/. /var/www/html

# 如果不需要更新版本或更新主题,那么记得将该目录的权限回收。
sudo chmod -R o+w /var/www/html/wp-content

之后访问localhost就有安装界面

成品

假如你超级无敌懒,只是想本地玩玩,可以用我搭好的镜像(lamp+wordpress)

docker pull ththaiai/wordpress_quik_start

拉取下来后是一个“开始安装”界面 数据库:wordpress 用户:wordpress 密码:123456 主机名:127.0.0.1

假如你是这么想的:

我在本地学习一下wp简单使用,那么确实可以

我在本地学习一些主题的美化,那么也确实可以,有个迁移工具非常非常好用:WordPress备份还原插件All-in-One WP Migration使用教程 - 奶爸建站笔记 (naibabiji.com)(恢复好文件后,我们还需要到Setting-Permalink,(设置-永久链接)不用任何设置,直接保存两次。)

我试了一下,是可以完完整整的整站迁移的,就是文件太大要收费

dockerfile版的lamp

本文精华部分了

假如是静态站点(就是不像wordpress这种写绝对路径的傻乎乎的站),那么就很适合这个dockerfile,满足ctf的几乎各种phpcms+mysql的需求

dockerfile

FROM ubuntu:20.04
WORKDIR /var/www/html
ENV  LANG="C.UTF-8"
COPY ./start.sh /start.sh
COPY ./run.sh /run.sh
COPY ./src /var/www/html
COPY ./sql.sql /sql.sql
RUN chmod +x /run.sh\
&&chmod +x /start.sh\
&&/run.sh

CMD ["/start.sh"]
EXPOSE 80

这里把搭建lamp的代码全部丢进run.sh里

run.sh

#! /bin/sh
sed -i s/archive.ubuntu.com/mirrors.cloud.tencent.com/g /etc/apt/sources.list
sed -i s/security.ubuntu.com/mirrors.cloud.tencent.com/g /etc/apt/sources.list
apt update
export DEBIAN_FRONTEND=noninteractive
apt install -y tzdata
ln -fs /usr/share/zoneinfo/Europe/Stockholm /etc/localtime
dpkg-reconfigure -f noninteractive tzdata
apt install -y apache2 php7.4 php7.4-mysql mysql-client-8.0 mysql-server-8.0
sed -i s/'password = .*'/'password = \"\"'/g /etc/mysql/debian.cnf
service mysql start
mysql -uroot -e "CREATE DATABASE ctf;use ctf;source /sql.sql;use mysql;update user set host = '%' where user = 'root';FLUSH PRIVILEGES;ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'AuroraMysqlPassword';FLUSH PRIVILEGES;"
sed -i s/'password = .*'/'password = \"AuroraMysqlPassword\"'/g /etc/mysql/debian.cnf
a2enmod php7.4

start.sh的作用是开机自动启动mysql+apache,并且永不休眠(创建守护进程)

start.sh

#!/bin/sh
# Add your startup script

# DO NOT DELETE
service mysql start
service apache2 start
sleep infinity;

然后把sql文件导出并命名为sql.sql放在dockerfile同级目录

mysql -u root -p 数据库>sql.sql

run.sh会自动改密码为AuroraMysqlPassword,数据库改为ctf,user改为root

然后源码直接放在src目录即可,之后会被粘到容器www目录下

szutho

这个就是我想要迁移出来做题的站

docker run -p 80:80 -d ththaiai/szutho_a_whole_wordpress

之前帮助某位朋友搭建的深大车万论坛,已经完成迁移。 由于wordpress使用绝对路径,所以想运行该容器只能加参数 -p 80:80 ,并且使用127.0.0.1或者localhost访问

大伙看着图个乐吧

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇