树莓派搭建LAMP和FTP服务器

树莓派搭建LAMP和FTP服务器

  • 前言
  • 搭建网站需要解决的问题
    • 如何使外网能够访问网站
    • 如何部署网站
    • 如何让动态IP绑定域名
    • 树莓派3B+能否搭建网站的同时搭建CS服务器
  • 开始搭建
    • 树莓派3B+系统安装
    • 安装LAMP套件
    • 安装vsftpd
    • 关闭防火墙和selinux
    • DDNS服务
    • nginx反向代理

前言

不久前,从网上购买了一个树莓派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地址,但公网的808080这两个百度、谷歌搜录的网站端口,均被运营商屏蔽了。为了使百度、谷歌能够搜录网站,对外暴露的端口只能是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的方式上传部署网站。

如何让动态IP绑定域名

家庭网络环境下通常会有路由器作为网络的出口,一些较新的智能路由器都会有一项叫做DDNS(即动态DNS)的功能,但通常支持的DDNS服务商较少,常见支持的有花生壳、NoIP等,当然,价格不是太贵,就是使用不方便(如每个月要签到等)。所以,我这里不使用路由器提供的DDNS功能,但为了能够使树莓派3B+能够自动把动态IP自动更新绑定域名,所以我找了一个可以通过HTTP协议更新动态IP的DDNS服务商,www.pubyun.com,在这里推荐的原因是使用非常方便,不需要安装第三方软件,只需通过crontab定时执行curl命令访问pubyun提供的一个HTTP接口即可动态更新IP到指定的域名,pubyun的官方文档提供了详细的使用说明和参数配置,非常方便。

树莓派3B+能否搭建网站的同时搭建CS服务器

答案是可以,但只有一种可能,就是花钱买一款叫做exagear desktop的虚拟机,能够使树莓派3B+(arm架构)运行x86软件(steamcmd和cs服务器程序都是x86架构的程序),当然还有qeum、wine等其他方法,但性能只有exagear desktop能达到搭建服务器的要求。exagear desktop价格昂贵,能顶的上我重新购买一台x86架构的主机,实在不划算,所以在树莓派3B+上搭建CS服务器,在没有exagear desktop较好的替代方案前,实际意义不大或者说不必要浪费钱。

开始搭建

解决了以上的问题后,就开始搭建按照此前的思路进行搭建吧。

树莓派3B+系统安装

要安装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

安装LAMP套件

安装方法和常规的方法一样,只是要注意,新版的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-gettextphp-mbstring这些插件是否也安装上了

安装vsftpd

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

如果以上安装成功访问不了,很有可能是防火墙和selinux的问题,我为了途方便,不对这两项进行配置,仅关闭禁用。

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
nano /etc/selinux/config
# 将SELINUX设置为disabled,重启!

DDNS服务

首先,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免费注册的动态域名

nginx反向代理

为解决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;

通过以上操作基本完成了开始的目标,感谢您的观看,欢迎留下评论,相互学习。

你可能感兴趣的:(linux)