关于Google云建站的一些坑

由于之前的香港服务器到期了,但是有一些没什么流量但是扔掉又可惜的域名空着也难受。就找了免费的Google云服务器建一个Web服务器。谷歌提供了很多免费使用的服务,其中包括一台低配版本的云服务器。虽然云服务器目前是终身免费的,但有很多限制条件

  • 选择的区域必须是regon、Iowa、或者South Carolina
  • 必须选择f1-micro实例(1C600M),2021年8月后已升级为E2-micro(1C1G)
  • 30GB的标准硬盘
  • 1GB的网络流量,并且不能是中国或者土澳的,否则要按需收费

所以条件非常苛刻。当然由于免费,这些条件也就忍了。本来计划是半天内建好并把所有的域名都重新配置好。但是没有想到由于Google云服务器有那么多坑,导致花了两天时间完成任务。因为这个知识点非常冷门,所以就再花点时间把这些坑记下来以备后用。

之前在阿里云的云服务器搭建过类似的LEMP服务器,即在Linux服务器上安装Nginx、MariaDB、PHP(PHP-fpm)。具体步骤可以参考《搭建LEMP服务器》。所以按照流程一步步来,大概率是不会有问题的。以下是谷歌云服务器特有的一些坑:

#1. 极其复杂的SSH配置
这个花了我6个小时,最后放弃了。普通云服务器都是默认开启SSHD服务器的,只要配置SSH公钥(在.ssh文件夹中配置authorized_keys文件)即可。谷歌的云服务器也是开启SSHD的,但是配置SSH密钥完全没搞懂。最后一顿猛虎一般的操作,发现是浪费时间。最后使用Google提供的浏览器终端。

#2. Nginx.conf无法打开错误
配置好基本的Nginx启动起来以后,就重新编辑Nginx配置文件。我是直接下载到本地,配置好以后再上传服务器的。然后重启Nginx发现报错:

open() “/etc/nginx/nginx.conf” failed

一开始以为是权限问题,因为使用谷歌默认浏览器终端上传的文件用户和用户组都不是root。于是使用chown修改了root后,仍然不行,但是测试却是没有问题的:

sudo nginx -t #配置文件默认放在/etc/nginx/nginx.conf

最后发现只能使用以下命令才能启动Nginx:

sudo nginx  #之前可以用sudo service nginx start,现在不行

#3. php-fpm无法启动
这个问题是和上面第二个问题连着出现的。第二个问题解决以后,发现调用php脚本总是报错,于是重启php-fpm。发现怎么都启动不起来了。最后把php的配置都重新捋了一遍,还是不行。最终重启云服务器,然后好了。这个问题巨坑。

#4. index.php (No such file or directory)
因为我有好几个域名要潜移到这台机器上,因此每一个域名都定义了一个文件夹,并且通过Nginx配置不同的web服务。这些文件夹都是从之前的主机上备份下来再上传到新服务器的。然后就发现无论怎么配置,总是报错:

“Unable to open primary script: /usr/share/nginx/html/default/index.php (No such file or directory)” while reading response header from upstream

乍一看是文件不存在。其实检测以下文件都是存在的,权限都有,用户和用户组都正确,但就是报错。最后在莫名其妙的谜之操作下发现这样就可以解决:

sudo move default a
sudo cp -R a default

我都佩服我自己为什么会这么尝试,并且成功了(不要喷我是权限问题,我把chown和chmod都试了一遍,777都没有用)。

#5. 上传大文件
由于第一步配置SSH公钥失败,所以只能用HTTP上传备份文件。一个网站的zip有100M左右,很小的网站了。结果上传了半个小时断开连接。最后只能zip切分成10M大小的文件一个一个上传。

#6. 动态IP地址
这个总得来说不算坑。但是对于web服务器,这个就比较坑了。因为阿里云服务器默认是固定IP的,但是谷歌云服务器默认是动态IP。一开始没有注意(主要是英文不懂),服务器重启IP变了。这个需要在“Networking”->“VPC Network”->”External IP addresses”这个地方把那个动态IP的类型设置为Static即可。

#7. 配置非常之低
目前开启所有的服务Nginx、MariaDB和php-fpm以后,服务器的内存只有60M不到。
google compute engine

#8. 数据库自动关闭
新的主机运行了两天就崩了。由于内存小,当内存不够用的时候,Linux会把占用内存最大的进程杀掉(随口就来的判断)。而在系统中占用内存最大的就是MariaDB数据库。有一个方案是写一个定时脚本,当发现数据库进程不存在时,自动启动数据库。当然由于是内存小,其实看一下内存占用情况还会发现php-fpm开了好几个子进程。由于这个服务器就开了几个很小的个人网站,流量非常之低,所以根本就不用考虑并发情况和性能(流量很小,所以有请求进来时在动态创建php-fpm进程处理也是可以的)。这样也就不需要那么多常驻内存的php-fpm进程。因此,我们可以通过修改php-fpm的配置参数,减小常驻内存的php-fpm子进程数量。

修改以下参数,具体什么意识在配置文件中有比较详细的注释:

pm = dynamic
pm.max_children = 9
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2

配置好以后重启php-fpm服务,我们在看以下内存占用率和php-fpm的进程数量:
php performance tuning
php-fpm进程数

目前我已经成功的控制了php-fpm的内存占用情况和进程数量。

#9. MariaDB数据库又崩了
这次我特地看了一下MariaDB数据库的日志,最后的错误日志是这样的:

210422 14:02:31 mysqld_safe Number of processes running now: 0
210422 14:02:31 mysqld_safe mysqld restarted
210422 14:02:32 [Note] /usr/libexec/mysqld (mysqld 5.5.68-MariaDB) starting as process 21481 …
210422 14:02:32 InnoDB: The InnoDB memory heap is disabled
210422 14:02:32 InnoDB: Mutexes and rw_locks use GCC atomic builtins
210422 14:02:32 InnoDB: Compressed tables use zlib 1.2.7
210422 14:02:32 InnoDB: Using Linux native AIO
210422 14:02:32 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137756672 bytes) failed; errno 12
210422 14:02:32 InnoDB: Completed initialization of buffer pool
210422 14:02:32 InnoDB: Fatal error: cannot allocate memory for the buffer pool
210422 14:02:32 [ERROR] Plugin ‘InnoDB’ init function returned error.
210422 14:02:32 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
210422 14:02:32 [ERROR] mysqld: Out of memory (Needed 128917504 bytes)
210422 14:02:32 [Note] Plugin ‘FEEDBACK’ is disabled.
210422 14:02:32 [ERROR] Unknown/unsupported storage engine: InnoDB
210422 14:02:32 [ERROR] Aborting

210422 14:02:32 [Note] /usr/libexec/mysqld: Shutdown complete

210422 14:02:32 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended

可以说也是非常惨了。非常明显仍然是没存不够用的情况。本来是考虑把innodb_buffer_pool_size这个参数调到64M。后来在网上找到说可能是performance_schema的问题。于是在配置文件中添加:

[mysqld]
performance_schema = off

具体大家可以看参考资料中的数据库相关内容。后面我将再持续观察服务器的稳定性,希望不要再崩。

快速服务启停命令

sudo systemctl start mariadb
sudo systemctl start php-fpm
sudo nginx

参考资料

Linux下的zip教程:How to create, split, join and extract zip archives in Linux
在低配云服务器上运行MySQL数据库:Starting MySQL On Low Memory Virtual Machines
为什么我的数据库总是崩:MySQL (MariaDB) crashes frequently

Captain QR Code

扫码联系船长

发表回复

您的电子邮箱地址不会被公开。