分类目录归档:LAMP相关

LAMP相关

在Oracle Cloud免费云上部署LAMP系统

写在前面的话
申请到了甲骨文云的免费4核24G的服务器,如果没什么问题的话,等阿里云到期后打算搬过去作为长期据点。
P.S. 经济形势算是彻底呜呼哀哉了,长期时间、大比例降杠杆已成必然,要做好开源节流。

~~~更新后续~~~
!!!一周后发现甲骨文云未经通知回收了我的实例。经此一役,对Oracle Cloud失去信任,不建议使用甲骨文云服务。


Install WordPress with LAMP on Oracle Linux (OCI)

准备工作
-注册Oracle Cloud免费云
-创建实例
-配置网关放行80和443端口


实例磁盘配置及挂载

#查看实例是否有数据盘
sudo fdisk -l
#查看数据盘是否分区格式化
sudo lsblk

#对数据盘分区
#如有必要,切换root操作
sudo -i

#挂载网站数据
fdisk /dev/sdb
n
p
1
wq

#对数据盘格式化
mkfs.ext4 /dev/sdb1

#查看挂载情况
df -ahT

#建立挂载目录
mkdir /var/www/html

#添加启动挂载
sudo sh -c echo '/dev/sdb1 /var/www/html ext4 defaults 0 0'>>/etc/fstab

#挂载分区
mount -a

#更新
sudo yum -y update

安装Apache

#查看系统版本
cat /etc/redhat-release

#查看当前防火墙的状态
sudo systemctl status firewalld
#临时关闭防火墙(如有必要)
#sudo systemctl stop firewalld
#查看SELinux的当前状态
#getenforce
#临时关闭SELinux(如有必要)
#sudo setenforce 0

#安装Apache服务
sudo yum install httpd
#查看Apache的版本号
httpd -v
#启动Apache服务并设置服务开机自启动
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl status httpd

在iptables中放行http和https端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

#如果使用SELinux,它默认会阻止HTTP服务器进行网络连接,设置apache可以连接网络。
sudo setsebool -P httpd_can_network_connect true

#配置Apache
/etc/httpd/conf/httpd.conf
#配置方法请参见鸟哥的Linux私房菜

#添加启动挂载
sudo sh -c echo '/dev/sdb1 /var/www/html ext4 defaults 0 0'>>/etc/fstab
#挂载分区
mount -a
systemctl daemon-reload

调整apache网站目录的权限

#查看apache的用户组和用户名
ps -ef | grep apache
#修改权限
sudo chown -R apache:apache /var/www/html
cd /var/www
sudo find . -type d -exec sudo chmod 0755 {} \;
sudo find . -type f -exec sudo chmod 0644 {} \;
#设置网站目录权限为755,只有root用户对目录拥有读写执行的权限,用户组有读执行权限,其它用户有读执行权限。
#设置网站文件权限为644,只有root用户对网站文件有更改的权限,http服务器只有读取文件的权限,其它用户有读执行权限。

#改变SELinux文件属性即修改文件的安全上下文
sudo chcon -t httpd_sys_content_t /var/www/html -R
sudo chcon -t httpd_sys_rw_content_t /var/www/html -R

安装mysql

#到Mysql的yum仓库查看相应的版本信息https://dev.mysql.com/downloads/repo/yum/

#下载对应的RPM package
oracle linux 8:
sudo wget https://repo.mysql.com//mysql80-community-release-el8-9.noarch.rpm
oracle linux 9:
sudo wget https://repo.mysql.com//mysql80-community-release-el9-5.noarch.rpm

#安装RPM package
oracle linux 8:
sudo yum -y install mysql80-community-release-el8-9.noarch.rpm
oracle linux 9:
sudo yum -y install mysql80-community-release-el9-5.noarch.rpm

#添加Mysql Yum仓到系统的仓库列表
yum repolist enabled | grep mysql.*-community

#(仅)Oracle Linux 8包含一个默认启用的MySQL模块,除非该模块被禁用,否则它会屏蔽MySQL存储库提供的包。
#yum module disable mysql

#安装mysql
sudo yum install mysql-community-server
sudo systemctl start mysqld
sudo systemctl enable mysqld
sudo systemctl status mysqld

#获取MySQL的初始密码
sudo grep "password" /var/log/mysqld.log

#配置MySQL的安全性
sudo mysql_secure_installation
#>重置root账号的密码。(需输入上一步的初始密码)
#>输入Y删除匿名用户账号。
#>输入Y禁止root账号远程登录。
#>输入Y删除test库以及对test库的访问权限。
#>输入Y重新加载授权表。

#重启服务mysql
sudo systemctl restart mysqld

安装PHP

sudo yum install php
sudo yum install -y php-mysqlnd php-zip php-gd php-intl
sudo yum install php-imagick
sudo systemctl restart httpd

#查看php版本及php.ini配置文件的位置
php -v
php --ini

#编辑PHP配置文件php.ini
vim /etc/php.ini
#改变文件上传限值(分别是最大执行时间、最大内存限制、最大POST数据量、最大文件上传大小)
max_execution_time = 300
memory_limit = 512M
post_max_size = 128M
upload_max_filesize = 128M

#重启php
sudo systemctl restart php-fpm

#在Apache网站根目录创建测试文件
sudo sh -c 'echo "<!--?php phpinfo(); ?-->" > /var/www/html/phpinfo.php'

#输入http://实例公网IP/phpinfo.php
#安全起见,测试后删除phpinfo.php。

配置数据库

sudo mysql -u root -p
例如:
#创建一个名叫wordpress_db的数据库;
#创建一个名为wordpress_user的用户,密码为password,连接到wordpress_db数据库;
#刷新权限;
#退出数据库
> CREATE DATABASE wordpress_db;
> CREATE USER wordpress_user@'localhost' IDENTIFIED BY 'password';
> GRANT ALL PRIVILEGES ON wordpress_user.* TO 'wordpress_user'@'localhost';
> FLUSH PRIVILEGES;
> EXIT

#若用phpmyadmin,需改一下密码方式。
sudo mysql -u root -p
alter user 'wordpress_user'@'localhost' identified with mysql_native_password by 'password';

#重启服务mysql
sudo systemctl restart mysqld

安装phpMyadmin

#用于管理Mysql,导入导出修改替换等操作。
#创建phpMyAdmin数据存放目录
sudo mkdir -p /var/www/html/phpmyadmin

#返回系统主目录并下载phpMyAdmin压缩包
#查看版本https://www.phpmyadmin.net/downloads
cd
sudo wget --no-check-certificate https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip

#安装unzip工具并解压phpMyAdmin压缩包
sudo yum install -y unzip
sudo unzip phpMyAdmin-5.2.1-all-languages

#复制phpMyAdmin文件到准备好的数据存放目录
sudo mv phpMyAdmin-5.2.1-all-languages/* /var/www/html/phpmyadmin

#http://实例公网 IP/phpmyadmin,访问phpMyAdmin登录页面

Let’s Encrypt – Free Certificates on Oracle Linux

SSL相关配置
前置条件已解析域名至服务器

#查看/etc/httpd/modules下是否有mod_ssl.so模块,若无则安装
sudo yum install mod_ssl

#查看在 /etc/httpd/conf.modules.d 目录下的 00-ssl.conf 配置文件找到
LoadModule ssl_module modules/mod_ssl.so

#用于加载 SSL 模块的配置语句,若已注释,请去掉首行的注释符号。

#在/etc/httpd/conf.modules.d中新建一个 00-rewrite.conf。在新建文件中添加以下内容
LoadModule rewrite_module modules/mod_rewrite.so

#在 httpd.conf 配置文件中添加如下内容:
Directory "/var/www/html"
##自动http重定向至https
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
/Directory

安装Let’s Encrypt并设置certbot自动更新
#可参考cetbot.eff.org

#安装official EPEL release
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

#安装snap
sudo dnf install -y snapd
sudo systemctl enable --now snapd.socket
sudo systemctl start snapd
sudo ln -s /var/lib/snapd/snap /snap

#安装并更新core
sudo snap install core
sudo snap refresh core

#安装certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

#生成新证书
#For Apache:
/usr/bin/certbot certonly --webroot -w /var/www/html --email example@example.com -d example.com -d www.example.com

#配置apache,若只有一个网站也可以直接配置/etc/httpd/httpd.conf和/etc/httpd/conf.d/ssl.conf
ServerName example.com
Serveralias www.example.com
DocumentRoot /var/www/html
ErrorLog /var/log/httpd/example.com-error_log
CustomLog /var/log/httpd/example.com-access_log combined

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
SSLCACertificateFile /etc/letsencrypt/live/example.com/chain.pem

#设置自动更新证书
sudo certbot renew --dry-run

查找并替换WordPress的Mysql数据库中的域名

无论是更换域名,还是从 http:// 更改为 https ://,我们都可以使用 MySQL 的 replace功能,来替换数据库中的 字段。
如果要将 WordPress 网站迁移到不同的域名,使用PHPMYADMIN进入数据库管理。点击SQL,执行SQL语句:
UPDATE‘表名’SET‘字段’=REPLACE(’字段’,’待替换内容’,’替换值’);

例如,从域名old_domain.com迁移到域名new_domain.com。或者将数据库中所有http://old_domain.com替换为https://old_domain.com,可以执行下面的 SQL 语句:

wp_options 表
wp_options 表是 WordPress 配置表,在home和siteurl字段中,可以配置网站的 URL 。

UPDATE wp_options SET option_value = replace(option_value, 'old_domain.com', 'new_domain.com') WHERE option_name = 'home' OR option_name = 'siteurl';

wp_posts 表
wp_posts表的post_content字段中的包含所有文章内容。如果文章中有指向其他文章的内部永久链接,需要替换该表中的链接 URL。

UPDATE wp_posts SET post_content = replace(post_content, 'old_domain.com', 'new_domain.com');

wp_postmeta 表
wp_postmeta表包含所有的属性和自定义字段,例如 ACF (高级自定义字段)中的meta_value字段。如果自定义字段中包含旧的链接,也需要在此处替换它们。

UPDATE wp_postmeta SET meta_value = replace(meta_value, 'old_domain.com', 'new_domain.com');

wp_comments 表
wp_comments表包含所有的文章评论内容,其中也可能包含指向其他文章的旧链接。

UPDATE wp_comments SET comment_content = replace(comment_content , 'old_domain.com', 'new_domain.com');

网站升级主题版本时需要修改的内容

1、修改脚注上的Powered by WordPress为备案信息
/**
*在footer.php中找到 ,并替换下面的

<a href="<?php echo esc_url( __( 'https://wordpress.org/', 'twentytwelve' ) ); ?>" class="imprint" title="<?php esc_attr_e( 'Semantic Personal Publishing Platform', 'twentytwelve' ); ?>">
<?php
/* translators: %s: WordPress */
printf( __( 'Proudly powered by %s', 'twentytwelve' ), 'WordPress' );
?>
</a>

为:*/

<?php _e("Copyright", '101kPa'); ?> &copy; 2011-<?php echo date('Y'); ?> &middot; <?php _e("All Rights Reserved", '101kPa'); ?> &middot; <?php _e("101kPa.com by", '101kPa'); ?> <a href=" https://www.101kpa.com/?page_id=2">J.Y. WANG</a><br />
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">京ICP备10041129号</a><strong> | </strong><a href="http://www.beian.gov.cn" target="_blank" rel="noopener">京公网安备11010802012744号</a>

2、修改翻页插件
/**
*在functions.php中部找到下面的内容,并替换

<div class="nav-previous"><?php next_posts_link( __( '<span class="meta-nav">&larr;</span> Older posts', 'twentyten' ) ); ?></div>
<div class="nav-next"><?php previous_posts_link( __( 'Newer posts <span class="meta-nav">&rarr;</span>', 'twentyten' ) ); ?></div>

为:*/

<?php wp_pagenavi(); ?>

3、替换Gravatar头像为Cravatar头像
/**
由于Gravatar全球通用头像被墙,会影响网页速度。将替换Gravatar头像为Cravatar头像。
*在functions.php尾部添加下面的函数
*/

if ( ! function_exists( 'get_cravatar_url' ) ) {
    function get_cravatar_url( $url ) {
        $sources = array(
            'www.gravatar.com',
            '0.gravatar.com',
            '1.gravatar.com',
            '2.gravatar.com',
            'secure.gravatar.com',
            'cn.gravatar.com'
        );
        return str_replace( $sources, 'cravatar.cn', $url );
    }
    add_filter( 'um_user_avatar_url_filter', 'get_cravatar_url', 1 );
    add_filter( 'bp_gravatar_url', 'get_cravatar_url', 1 );
    add_filter( 'get_avatar_url', 'get_cravatar_url', 1 );
}

4、不显示博客页和单内容页的特色图像
/**
*如果在帖子中设置了特色图片,WordPress主题会在单内容页的顶部和博客页(文章页)显示一个大的特色图片。
*为不显示博客页和单内容页的特色图像,需要将content.php文件中第20行-24行注释掉,如下:
*/

<?php
# if ( ! post_password_required() && ! is_attachment() ) :
# the_post_thumbnail();
# endif;
?>

将静态网站托管至阿里云OSS

写在前面的话: 因为囊中羞涩,当时只给域名101kpa.com买了SSL,另一个已备案的域名wangjingye.com便闲置了很久,一直觉得可惜。最近偶然发现OSS静态网站托管功能可作为此域名的寄存点,就暂时用于个人介绍了。


静态网站通过阿里云的静态网站托管功能托管到OSS的存储空间(Bucket),并使用Bucket访问该网站的域名。
注:静态和动态的区别在于程序是否在服务器端运行。在服务器端运行的程序、网页、组件,属于动态网页,它们会随不同客户、不同时间,返回不同的网页, ASP、PHP、JSP、ASPnet、CGI等。在客户端运行的程序、网页、插件和组件属于静态网页,如 html页、Flash、JavaScript等等。

使用方法:

1.配置静态网站托管时,需要指定网站默认主页和默认404页:
—默认主页是通过浏览器访问静态网站域名,OSS返回网站主页。默认主页指定的文件必须是Bucket允许匿名访问的文件在根目录下。如果子目录主页也打开,这个文件也应该存在于子目录下。
—默认404页是通过浏览器访问的Bucket当内部文件出现404错误时,OSS返回错误页面。默认404页指定的文件必须是Bucket允许匿名访问的文件在根目录下。
2.默认主页或默认404页中指定文件的读写权可以通过ACL设置为public-read,确保该文件允许匿名访问。
3.静态网站配置完成后,如果使用Bucket当默认域名访问静态网站时,静态网站将以文件的形式下载到本地。要确保访问静态网站是显示行为,必须是Bucket绑定自定义域名,并通过自定义域名访问静态网站。

注意事项:
因为用的是OSS托管静态网站,让不带www的和带www的均能访问,需要做以下设置(我试了很久才解决,官方应该给出解释):
1、OSS的backet绑定两个域名,一个不带www,一个带;
2、不带www打开根域名CDN;
3、CNAME解析@到CDN地址;
4、CNAME解析www到Bucket默认域名。(注意:若www选择隐性/显性进行分析URL,虽然可以跳转Bucket默认域名可以显示网页,但会同时提示下载index.html)
5、如果设置后浏览仍有问题,可以先清除浏览器缓存,再排除其他问题。
6、CDN的私有Bucket回源功能和OSS的静态网站托管功能的默认首页功能冲突,不用开启。
7、用于托管的OSS的Bucket可不开启。

使用SSL建立连线加密网站 (https)

写在前面的话

由于要布设https,但又囊中羞涩,只为wangjingye.com域名购买了证书,因此wangjingye.com的域名不能用了。诸君见谅。


使用SSL证书(SSL Certificates)为网站提供数据HTTPS加密协议访问,保障数据的安全。装载SSL证书产品后自动激活浏览器中显示“锁”型安全标志,地址栏以“https”开头。

0、购买SSL证书文件。

1、在Apache的安装目录(默认/etc/httpd)下,新建cert目录。并将证书、证书链文件和密钥文件拷贝到cert目录中。如果需要安装多个证书,需在Apache目录中新建对应数量的cert目录,用于存放不同的证书 。

2、查看在 /etc/httpd/modules下是否有mod_ssl.so模块,若未安装 mod_ssl.so 模块,您可通过执行yum install mod_ssl 命令进行安装。

3、查看在 /etc/httpd/conf.modules.d 目录下的 00-ssl.conf 配置文件找到 LoadModule ssl_module modules/mod_ssl.so(用于加载 SSL 模块)配置语句,若已注释,请去掉首行的注释符号(#)。

4、编辑 /etc/httpd/conf.d 目录下的 ssl.conf 配置文件。修改如下内容:

VirtualHost *:443
ServerName #修改为申请证书时绑定的域名www.YourDomainName1.com。
DocumentRoot /var/www/html
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 # 添加SSL协议支持协议,去掉不安全的协议。
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM # 修改加密套件。
SSLHonorCipherOrder on
SSLCertificateFile cert/domain name1_public.crt # 将domain name1_public.crt替换成您证书文件名。
SSLCertificateKeyFile cert/domain name1.key # 将domain name1.key替换成您证书的密钥文件名。
SSLCertificateChainFile cert/domain name1_chain.crt # 将domain name1_chain.crt替换成您证书的密钥文件名;证书链开头如果有#字符,请删除。
/VirtualHost

5、查看在 /etc/httpd/modules下是否有mod_ssl.so模块。没有则安装。

6、在/etc/httpd/conf.modules.d中新建一个 *.conf 文件,例如 00-rewrite.conf。在新建文件中添加以下内容:

LoadModule rewrite_module modules/mod_rewrite.so

7、在 httpd.conf 配置文件中添加如下内容:

Directory "/var/www/html"
# 自动http重定向https
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
/Directory

8、重启Apache服务器

9、进入WordPress面板,依次点击设置> 通用,然后向下滑动到WordPress地址(URL)和网站地址(URL)字段,将https://替换为http://。

10、解决SSL站点后图片失效问题。

WordPress开启HTTPS后,博客原来上传的图片地址依旧为http的链接,这会导致地址栏绿锁显示不正常,解决方法如下:批量处理WordPress更改图片地址http为https,通过修改MySQL数据库,将所有wp-content/uploads下的图片链接均改为https。

使用phpMyAdmin登录WordPress的MySQL数据库,并选择你的WordPress数据库,点击“SQL”,输入以下语句:

UPDATE wp_posts SET post_content = replace(post_content, 'http://域名/wp-content/uploads', 'https://域名/wp-content/uploads');

注意:
a. 操作前请务必对数据库进行备份,以避免不可挽回的数据丢失!
b. “wp_posts”:默认表前缀为wp,如果你修改了表前缀,请改成自己的前缀;
c. 将“域名”改成自己的域名.

2016新的一年开启新的架构

© Written by J.Y. WANG

结构工程师搭建网站,写写自己的东西也算是某种舒缓心中憋闷的方式之一。我常碎碎念希望能多了解世界真实的运行规律,哪怕没什么实际的名闻利养。但友人也常玩讽道,站得更高才能看得更真切,不在高位自然无法明白高处的风景。我对此也是无话可说。也许只是同样的风景,起起伏伏后会有不同的体会吧。做自己喜欢的,看看书,充实一下自己,一切都是上天最好的安排。初步打算写两部分内容:一是大道至简系列,关于结构设计的一些基本理念;二是欧洲规范学习系列,关于EUROCODE的应用。既然把计划写在这里了,那么就督促自己坚持把这两个系列完成。

好了言归正传,为了能让自己的那点思想在这个健壮的小站上愉快的流淌,基业长青。新的一年换用大型站点的架构,俗话说做事看世界要有格局,当然我自己的小站也要有格局,就是架构要有优良的鲁棒性,所谓麻雀虽小五脏俱全。

架构的目的:
1、方便系统升级自己折腾,方便备份,安全性高。
2、实现动静分离。
oss_in_website

阿里云的配置如下:
ECS配置
CPU:1核;内存:2 GB;操作系统:CentOS 7.4 64位;带宽:2Mbps;
系统盘 40GB;数据盘 40GB;

RDS配置
CPU:1核;内存:1 GB; 容量:40GB;

使用OSS;使用CDN;

将整个系统至于云盾的保护之下。
使用数据盘单独挂载/var/www目录,将OS系统与网站数据分离。
使用RDS,将数据库从数据盘分离。
使用OSS,将图库和附件库从数据盘分离。
使用CDN,分发加快OSS静态数据加载速度。

经过此番处理后:由于网站数据对应数据盘,升级或变更操作系统将不影响网站数据;将数据库搬至云端RDS后,数据库单独管理,有效防止网站攻击,可时时自动备份,安全可靠;将较大文件如图片、附件等静态文件搬至OSS并实现CDN分发,提高加载速度,实现动静分离。通过以上架构,即使系统盘,数据盘完全擦除也可轻松重新建站,因为数据库和大型文件均搬至云端。并且哪怕是极端情况,磁盘损毁,网站遭到恶意攻击,均可轻松应对。

最后附上一个技术细节,所谓细节据定成败。(以下部分20180101更新)
附录:关于ossfs的使用。另外关于LAMP系统搭建请看阿里云服务器搭建LAMP环境

1、首先用ps aux | grep apache 看下httpd运行于那个用户下,默认是apache用户。
2、然后下载安装对应版本的ossfs最新安装包。

wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32196/cn_zh/1507811577850/ossfs_1.80.3_centos7.0_x86_64.rpm
yum localinstall ossfs_1.80.3_centos7.0_x86_64.rpm

3、写入OSS的AKID与AKS至密码文件,然后修改文件执行权限和用户组。
echo 你的第一个bucket:你的AKID:你的AKS> /etc/passwd-ossfs
echo 你的第二个bucket:你的AKID:你的AKS>> /etc/passwd-ossfs

chmod 640 /etc/passwd-ossfs
chown root:apache /etc/passwd-ossfs

4、然后以apache用户建立目录。

sudo -u apache mkdir /var/www/html/wp-content/你的图库名
sudo -u apache mkdir /var/www/html/wp-content/附件库名

5、加载OSS的bucket

ossfs 你的第一个bucket 你的图库路径 -o url=http://oss-cn-qingdao-internal.aliyuncs.com -o uid=用户号,gid=用户组号,umask=007,allow_other
ossfs 你的第二个bucket 附件库路径 -o url=http://oss-cn-qingdao-internal.aliyuncs.com -o uid=用户号,gid=用户组号,umask=007,allow_other

6、需要注意的问题:
– 对应好自己系统的安装包;
– 记得修改密码文件的权限和用户组;
– url填写内网地址,并从oss-cn开始填写;
– 如果使用allow_other,会变成777权限,不安全。如果不使用allow_other,把用户ID改为apacheID,就会变成700权限,就会导致无法访问的问题。解决方法:使用uid,gid,umask参数控制用户和用户组及其权限。
– 设置自动挂载ossfs方法:
在/etc/init.d/目录下建立文件ossfs,把模板文件中的内容拷贝到这个新文件中。并将其中的your_xxx内容改成您自己的信息,其中同样可以使用uid,gid,umask参数。
建立的ossfs脚本赋予可执行权限 chmod a+x /etc/init.d/ossfs
把ossfs启动脚本作为其他服务,开机自动启动 chkconfig ossfs on