不久前,从网上购买了一个树莓派3B+,原计划刷入openwrt作路由器使用的,但遇到了问题,原因在于截至2019年2月16日,是没有支持树莓派3B+版本的openwrt固件的,树莓派3B(没有+)到是支持。做不了openwrt路由也不能浪费几百块大洋吧,所以就打算用来作LAMP服务器,搭建一个网站,功耗5W左右,自带WIFI,供电后就可以24小时运行。
使用树莓派3B+搭建LAMP服务器和部署网站,首先要考虑需不需要让外网访问以及网站如何部署等问题,解决了这些问题才能进行更深入的开展部署工作。
因为我不像搭建的网站只有局域网浏览,还想更多的外网用户能够访问网站内容,所以我搭建的网站必须能够对外提供服务。对于家庭网络,FRP内网穿透是使用较多的方案,此外还有花生壳、Nat123等,其中FRP内网穿透比较吃技术能力,而花生壳和Nat123虽然较傻瓜式部署,但价格昂贵。
经过再三考虑,以上方案我都没有采用。不进行内网穿透的话,对于家庭宽带用户,只能申请公网IP地址,经过网上搜索家庭宽带如何申请公网IP后,发现了只要拨打运营商客户电话申请开通就可以了。通过电话申请,2天后,运营商把我家庭宽带从局域网IP调整成了公网IP地址。
得到了公网IP地址,但公网的80和8080这两个百度、谷歌搜录的网站端口,均被运营商屏蔽了。为了使百度、谷歌能够搜录网站,对外暴露的端口只能是80端口和8080端口。然后我决定再购买一个便宜的VPS服务器(配置要求不用太高,但网络流量和转发能力必须稳定),通过nginx反向代理的方法,外网访问nginx代理服务器,nginx通过反向代理,将请求转向树莓派3B+,其中nginx代理服务器开放80端口,树莓派3B+开放非80端口,如1990端口。这样,既省钱又能发挥树莓派3B+最大使用率。当然,路由器应该配置好端口转发。
部署网站,可以采用SMB文件夹共享、FTP上传、宝塔BT文件管理等方法进行网站部署。其中宝塔BT文件管理最为简单易容,且安全性、稳定性较高,但遗憾的是,宝塔BT仅支持X64架构的CPU或系统,而树莓派3B+采用的ARM架构的CPU,且安装的raspbian操作系统不支持X86架构的程序,所以只能放弃采用宝塔BT管理文件。而SMB文件夹共享方法时,windows和linux之间的传输速度实在太慢,最后采用了FTP的方式上传部署网站。
家庭网络环境下通常会有路由器作为网络的出口,一些较新的智能路由器都会有一项叫做DDNS(即动态DNS)的功能,但通常支持的DDNS服务商较少,常见支持的有花生壳、NoIP等,当然,价格不是太贵,就是使用不方便(如每个月要签到等)。所以,我这里不使用路由器提供的DDNS功能,但为了能够使树莓派3B+能够自动把动态IP自动更新绑定域名,所以我找了一个可以通过HTTP协议更新动态IP的DDNS服务商,www.pubyun.com,在这里推荐的原因是使用非常方便,不需要安装第三方软件,只需通过crontab定时执行curl命令访问pubyun提供的一个HTTP接口即可动态更新IP到指定的域名,pubyun的官方文档提供了详细的使用说明和参数配置,非常方便。
答案是可以,但只有一种可能,就是花钱买一款叫做exagear desktop的虚拟机,能够使树莓派3B+(arm架构)运行x86软件(steamcmd和cs服务器程序都是x86架构的程序),当然还有qeum、wine等其他方法,但性能只有exagear desktop能达到搭建服务器的要求。exagear desktop价格昂贵,能顶的上我重新购买一台x86架构的主机,实在不划算,所以在树莓派3B+上搭建CS服务器,在没有exagear desktop较好的替代方案前,实际意义不大或者说不必要浪费钱。
解决了以上的问题后,就开始搭建按照此前的思路进行搭建吧。
要安装LAMP环境,当然要先装L(Linux)系统了,在树莓派3B+官方网站中,官方推荐的是raspbian系统,我这里也是用了这个系统,能够减少其他系统不兼容导致的一些后果。将下载好的raspbian系统镜像文件通过Win32 Disk Imager写入到SD卡,插入树莓派3B+,插入网线接入路由,开机。等几分钟系统启动完成,登录路由器管理界面,找到树莓派3B+的IP地址,通过Putty软件登录(默认账号为pi,默认密码为raspberry),登录后,就可以通过linux命令进行管理了。
当然,为了能够较好的使用,推荐还是为树莓派3B+接入显示器、键盘和鼠标。推荐将默认的账号pi删除,配置root账号的密码,和允许root账号登录。另外,推荐关闭图形界面,因为作为LAMP服务器,通过putty工具进行远程管理即可,无需使用vnc等工具进行图形化管理。
# 设置root密码
sudo passwd root
# 解锁root账号
sudo passwd --unlook root
# 切换到root账号
su root
# 允许root远程登录
# 方法是修改SSH配置文件。
# 文件位置:/etc/ssh/sshd_config
# 找到#PermitRootLogin prohibit-password
# 将#去掉,将prohibit-password全部删掉,改为yes。保存!保存!保存!
# 删除pi默认账号
userdel pi
# 重启后使用root登录,进行一些初始化配置
# 首先将更新源切换到清华大学镜像
echo -e "deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi \n deb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi" > /etc/apt/sources.list
echo -e "deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/ stretch main ui" > /etc/apt/sources.list.d/raspi.list
# 更新系统(输入该条命令后,选择update)
raspi-config
安装方法和常规的方法一样,只是要注意,新版的raspbian只支持php7,没有php5
# 安装apache2
apt install apache2
# 安装mysql
apt install mysql-server
# 安装php
apt install php
apt install php-mysql
另外,为了方便使用mysql,推荐装上phpmyadmin
apt install phpmyadmin
ln -s /usr/share/phpmyadmin/ /var/www/html/
如果打开不了的话,查看下php-gettext和php-mbstring这些插件是否也安装上了
vsftpd是一个ftp服务器,可以搭配filezilla使用,将本地网站部署到树莓派3B+,实现网站的部署。
apt install vsftpd
然后就是配置root账号登录vsftpd服务器,我使用root权限登录主要是途方便,因为有路由器屏蔽外网访问ftp服务器的21端口,使用起来比较放心安全性问题。
nano /etc/vsftpd.conf
修改vsftpd.conf配置文件,将相应的配置项改为下边的值,其他保持默认
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=000
然后解锁root账号登录权限
nano /etc/ftpusers
将root从禁止列表中删除
service vsftpd restart
重启ftp服务器后,使用filezilla客户端工具登录进行文件管理,另外,如果不小心删除了默认的配置文件找不回来的话,可以通过彻底删除再重装的办法找回(不彻底删除的话,重装时,不自带配置文件)
apt purge vsftpd
apt install vsftpd
如果以上安装成功访问不了,很有可能是防火墙和selinux的问题,我为了途方便,不对这两项进行配置,仅关闭禁用。
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
nano /etc/selinux/config
# 将SELINUX设置为disabled,重启!
首先,www.pubyun.com,在该DDNS服务商注册一个免费的动态域名,然后在树莓派3B+配置定时任务,定时更新外网IP到需要绑定的动态域名。
crontab -e
# 输入 crontab -e 命令后,在crontab编辑器中,添加下边这条命令,保存!
0 0/10 * * * ? * curl --user laura:woaihuangligui "http://members.3322.net/dyndns/update?hostname=laura.pubyun.org"
# 保存成功后,就会每个10分钟更新一次动态IP,保持域名指向的动态IP的有效性
其中需要修改的项有:
laura
是pubyun注册的账号
woaihuangligui
是pubyun的账号密码
laura.pubyun.org
是pubyun免费注册的动态域名
为解决80端口和8080端口被运营商屏蔽问题,使外网能够访问树莓派3B+部署的网站,且能够被百度、谷歌等各大搜索引擎收录,我用了nginx反向代理的方法来实现这个目标。
首先,需要买一个vps服务器,vps服务器应该具备公网IP地址、支持nginx运行、访问速度快、流量大或者不限。当然,在满足以上条件时,肯定是越便宜约好了,截至2019年2月16日,我找到满足条件的vps,每年需要88元人民币。
我选的vps是centos服务器,以下nginx安装和配置过程以centos进行演示:
yun update
wget http://nginx.org/download/nginx-1.13.6.tar.gz
tar -zvxf nginx-1.13.6.tar.gz
cd nginx-1.13.6
./configure --with-http_ssl_module --with-http_gzip_static_module
yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
make
make install
nginx安装好时,执行程序位为/usr/local/nginx/sbin/nginx
,配置文件位为/usr/local/nginx/conf/nginx.conf
,安装好先测试运行。
cd /usr/local/nginx/sbin/
./nginx
如果运行的时候不带-c
参数,那默认的配置文件为/usr/local/nginx/conf/nginx.conf
,运行成功了,打开浏览器输入IP地址,显示nginx欢迎画面表示成功安装了。
测试运行成功之后,为nginx配置systemctl脚本,实现开机自动启动。
首先,创建/usr/lib/systemd/system/nginx.service
文件,内容如下:
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
然后,通过systemctl enable nginx.service
命令使nginx开机自动启动,另外其他的systemctl命令如下:
# 使文件生效
systemctl daemon-reload
# 启动nginx
systemctl start nginx
# 关闭nginx
systemctl stop nginx
# 重启nginx
systemctl restart nginx
# 开机启动
systemctl enable nginx
然后就是配置nginx反向代理了,下边是我的配置,根据实际情况进行修改即可。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream raspberry {
server laura.pubyun.org:18800;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://raspberry;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_redirect default;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
其中里边的upstream就是配置反向代理的,server指向树莓派3B+搭建的网站,laura.pubyun.org是通过DDNS技术自动更新绑定的,18800是apache2的监听端口(路由器端口转发也需要配置)
upstream raspberry {
server laura.pubyun.org:18800;
}
然后再注册另一个顶级域名,将A记录指向nginx反向代理服务器之后,访问这个顶级域名,就会访问到树莓派3B+部署的网站了。另外,为了网站能够正确获取到客户端(浏览器)的IP地址(默认情况下,树莓派3B+网站获取到的是nginx反向代理服务器的IP地址),应该如上述配置中,在location /
中加上下边的配置项:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_redirect default;
通过以上操作基本完成了开始的目标,感谢您的观看,欢迎留下评论,相互学习。