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
题外话
不用的话很容易被运维叼烂,毕竟自己维护的永远不如专业的
┭┮﹏┭┮
手写
由于一开始比较急功近利并且盲目自信,所以直接手撸了一个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访问
大伙看着图个乐吧