记一次typecho迁移
看见这段时间Contabo搞活动免安装费的消息,我好奇去他们的官网看了看,看看机器配置,没想到相当实惠,5欧元一个月 4核8G 200G SSD,200M不限流量,抱着体验一下的想法买了一台。好家伙,还是AMD epyc7282的处理器,测试得分单线程1500+,四线程接近6000,这机器一个核心抵得上阿里云学生机两个核心了,并且申请解除io限制之后SSD的表现也相当不错。所以我考虑干脆把我的博客从意大利的机器搬迁到德国的这台机器上吧,虽然没什么人看,不过机器性能好一点,看起来也舒服点是吧,写下这篇文章记录我的迁移过程。
安装lnmp环境
安装过程类似于Ubuntu18手动安装nginx+typecho中提到的
安装php
sudo apt install php-fpm php-common php-mbstring php-xmlrpc php-soap php-gd php-xml php-intl php-mysql php-cli php-ldap php-zip php-curl
安装nginx以及配置php与https
apt install nginx
之后再访问ip,即可看到nginx安装成功的提示
关于隐藏源站ip
为什么我的源站ip会泄露
之前我在安装了nginx之后就喜欢直接用certbot来配置https访问,但是安装nginx之后,站点配置文件只有一个default即默认站点,而直接在这个文件上设置真实的证书有一定的风险,尤其是当你想把站点ip隐藏在cloudflare之后时。
之前了解到一个网站https://censys.io/,可以通过域名查询到CDN背后的网站真实ip,我试了一试还真的查到了,于是比较好奇这是怎么实现的,查询了一下发现了loc上的这篇帖子[[疑问]](https://www.hostloc.com/forum.php?mod=forumdisplay&fid=45&filter=typeid&typeid=4) Censys通过SSL证书查询真实IP的原理是什么,该怎么防?,大概原理就是他们的服务器会全网扫描443端口](https://www.hostloc.com/thread-706910-1-1.html),大概原理就是他们的服务器会全网扫描443端口),如果可以拿到证书,里面还有域名信息,那么这个ip就是这个域名指向的网站的真实ip了
我们可以尝试使用ip直接访问我的博客(这个就属于错误设置啦),可以看到,直接使用https://ip的方式来访问,点击不安全查看证书信息,可以看到使用者的域名,只要建立一个数据库,之后就不难找到网站背后的真实ip了,所以,强烈建议不要对default直接使用certbot,对于default,自己自签名一个证书,不要用真实域名即可。
默认使用自签名证书
安全起见,我们给我们的源站默认配置文件设置自签名证书。
参考廖雪峰的博客
openssl req -newkey rsa:2048 \
-x509 \
-sha256 \
-days 3650 \
-nodes \
-out hello.crt \
-keyout hello.key
之后按照提示,先把证书文件都移动到一个文件夹中,然后修改我们的/etc/nginx/site-enable/default
注意ubuntu里面 site-available里面的是链接文件,而debian10,则需要直接修改site-enable里的文件。
server {
listen [::]:443 ssl default_server;
listen 443 ssl default_server;
ssl_certificate /etc/nginx/ssl/hello.crt;
ssl_certificate_key /etc/nginx/ssl/hello.key;
}
重启nginx,再次访问https://ip,查看证书信息,就看不到我们的域名啦!
配置https
我们还需要配置一个有效的https,在/etc/nginx/site-enable/
里面新建一个文件,在default的基础上修改成我们的站点信息。
server {
listen 80;
listen [::]:80;
root /var/www/html;
#修改成你的站点域名
server_name _;
index index.html index.htm index.nginx-debian.html;
location / {
#如果请求的文件都不存在则返回404
try_files $uri $uri/ =404;
}
}
修改好之后使用certbot来申请证书以及配置站点文件,现在certbot改用snap来安装了,但是我还是更喜欢传统的方式。
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx
#最后输入
sudo certbot --nginx
之后便会要求我们选择需要配置的站点(server_name 后面指定的域名)配置好后就可以通过https访问站点了。
配置php
继续编辑我们的站点文件,在location处加入一条记录,注意,fastcgi路径要改成我们php对应的版本。
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
然后重启nginx,在/var/www/html/下创建一个info.php
然后访问 ip/info.php,如果显示下面的图片则表示我们php已经配置好了。
除此之外我们还可以编辑/etc/php/7.3/fpm/php.ini
文件,修改php的参数,如内存限制,上传文件限制等等。修改好之后使用systemctl restart php7.3-fpm.service
重启一下。
安装mysql
apt install default-mysql-server
,安装好后先执行mysql_secure_installation
进行安全初始化。接着创建一个和之前的数据库用户一样名字的用户以及同名数据库(typecho)
另外,需要新建一个数据库用户,建议直接和迁移之前的数据库用户同名同密码,免得还得去改配置文件,还需要创建一个空的数据库(也和之前同名)并授权用户访问数据库,即使现在还没有导入这个数据库。
CREATE USER 'typecho'@'localhost' IDENTIFIED BY '123456';
CREATE DATABASE typecho;
GRANT ALL ON typecho.* TO 'typecho'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
显示CDN背后的真实访客ip
在 Typecho 站点根目录里的 config.inc.php 添加如下内容.
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}
进行迁移
首先前往老的站点服务器,登入mysql,看看都有哪些数据库
如图,可以知道我们需要搬迁的网站数据库名为typecho,按照格式 导出数据库:mysqldump -u 用户名 -p 数据库名 > 导出的文件名 来导出。
mysqldump -u typecho -p typecho > newty.sql
,将newty.sql放到新的服务器上,接着使用 mysql -u 数据库用户名 -p 导入数据库名称 < 导入数据库源文件名称.sql 进行导入
mysql -u typecho -p typecho < newty.sql
.
然后前往域名解析处更换ip,然后把之前站点的site-enable中的对应文件迁移到新的服务器上,并把证书这些也移动过来。也可以重新申请。