基于树莓派的Web服务器

文章目录

    • 前言
    • 1. 树莓派基本设置
      • 1.1 安装Linux
      • 1.2 配置树莓派
    • 2. 安装Python3
    • 3. 配置虚拟环境
    • 4. 安装MySQL
    • 5. 升级Sqlite(可选)
    • 6. 安装Django和uWSGI
    • 7. 安装及配置Nginx
    • 8. 连接校园网
    • 9. 远程测试
    • 结束语

前言

  这个项目是大二时期我和我的组员一起做的一个项目,是我们《嵌入式系统原理及应用》这门课的一个结课作业。由于个人比较喜欢Python,当时正在使用Django框架搭建自己的网站(虽然到现在网站还没有正式完工,我大信控课就是多╮(╯_╰)╭),所以就想到了这个课题。可能下面的实习会用到相关知识,故在此记录。
  整体方案为:Python+Django+Nginx+uWSGI+CentOS

基于树莓派的Web服务器_第1张图片

1. 树莓派基本设置

  树莓派我选用的是3B+(现在最新的应该是4B),当时在大创基地做项目时在亚博智能他们家买的,就是下面这款,感兴趣的话可以从这进入淘宝店铺。
基于树莓派的Web服务器_第2张图片

  在此之前,你可能还需要准备显示屏、HDMI数据线、稳定的电源(建议使用USB接口的)、网线(可选)、TF卡(可以稍微大一点,以备后需)、读卡器。

  上述的硬件材料准备好之后,接下来就要开始配置了。

1.1 安装Linux

  操作系统我用的是CentOS7.7,系统镜像文件选择,以及所需的SD卡格式化工具、镜像写入工具的下载及使用我就不一一说明了,可以参考网上的教程1,教程我会放到最下面,下载地址可以点击链接直接进入官网下载,也可去我的百度网盘下载(提取码:g9e6)。

  我安装的镜像文件名字为 C e n t O S − U s e r l a n d − 7 − a r m v 7 h l − R a s p b e r r y P I − M i n i m a l − 1908 − s d a . r a w . x z CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1908-sda.raw.xz CentOSUserland7armv7hlRaspberryPIMinimal1908sda.raw.xz(不带桌面环境,如果想要带桌面环境的可以选择Gnome版本或KDE版本,现在官网最新的是2003),解压之后就是 r a w raw raw格式的文件。
  注:一定要选择支持树莓派的镜像文件。

1.2 配置树莓派

  • 将SD卡扩展至实际容量
# rootfs-expand

注:系统安装后,默认只有两个多G的内存,建议使用上述命令进行扩容,我参考过其他博客,使用其他扩容方法会出现扩容失败,当然也可能是因为系统不同。

  • 配置WIFI,或者直接命令 n m t u i nmtui nmtui,选择Activate a connection(选择连接),再选择相应的wifi,输入密码,即可连接
# nmcli d
# nmcli d wifi		# 查看周围的wifi
# nmcli d wifi connect yourSSID password 'yourpassword'		# 连接wifi
# nmcli d show wlan0 	# 查看wlan0的状态
  • 启动SSH服务
# systemctl start sshd 		# 启动ssh
# systemctl status sshd 	# 查看ssh状态
# systemctl enable sshd 	# 设置开机自动启动
  • 更新系统软件包、安装软件管理包、安装下载工具
# yum update –y
# yum -y groupinstall "Development tools"
# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
# yum -y install wget
  • 同步时间
# yum install ntp
# ntpdate pool.ntp.org

注:建议用上述命令,我用其他命令同步时间时出现了时间同步无效。

2. 安装Python3

  • 下载Pyhton3到/usr/local目录
# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
  • 解压之后安装到指定路径
# ./configure --prefix=/usr/local/python3
  • 使用make命令安装后建立软链接方便在终端中直接使用python3
# ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
  • 安装Python包管理工具pip
# ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3

3. 配置虚拟环境

  • 安装virtualenv,方便不同版本项目管理
# pip3 install virtualenv
  • 建立软链接
# ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
  • 安装成功在根目录下建立两个文件夹,主要用于存放env和网站文件的
# mkdir -p /data/env
# mkdir -p /data/wwwroot
  • 切换到/data/env/下,创建指定版本的虚拟环境
# cd /data/env/
# virtualenv --python=/usr/bin/python3 pyweb
  • 启动虚拟环境
# cd /data/env/pyweb/bin
# source activate
  • 退出虚拟环境
# deactivate

4. 安装MySQL

  • 下载并安装MySQL官方的 Yum Repository
# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
  • 使用上面的命令就直接下载了安装用的Yum Repository,直接yum安装
# yum -y install mysql57-community-release-el7-10.noarch.rpm
  • 安装MySQL服务器
# yum -y install mysql-community-server
  • 首先启动MySQL
# systemctl start mysqld.service
  • 查看MySQL运行状态,若出现active (runing)则表示MySQL已启动
# systemctl status mysqld.service
  • 在日志文件中找出root密码
# grep "password" /var/log/mysqld.log
  • 进入数据库
# mysql -uroot –p
  • 更改密码
# ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';

5. 升级Sqlite(可选)

  若MySQL安装失败,可选择使用CentOS内置的数据库Sqlite,由于Django2.2需要Sqlite的版本至少为3.8.3(CentOs默认版本是3.7.17),因此需要升级Sqlite。若Sqlite安装失败,可选择降低Django版本(2.1.8)。

  • 升级sqlite3 软件的版本,升级到最新的版本3.2.9
# wgets https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
  • 解压之后进行配置
# ./configure --prefix=/usr/local/
  • 编译安装
# make && make install
  • 备份旧的sqlite3
# mv /usr/bin/sqlite3 /usr/bin/sqlite3.bak
  • 把新版本的sqlite3链接到原来的位置
# ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
  • 更新环境变量
# export LD_LIBRARY_PATH="/usr/local/lib">> ~/.bashrc
# source ~/.bashrc

6. 安装Django和uWSGI

  • 安装Django和uWSGI
# pip3 install django=2.2.1(2.1.8)
# pip3 install uwsgi
  • 建立软链接
# ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
  • 开启端口(添加8001端口并重新加载策略配置)
# firewall-cmd --zone=public --add-port=8001/tcp --permanent
  • 查看开放的端口及进程
# netstat -tunlp
  • 在网站项目的根目录下/data/wwwroot/Benxi创建一个名为test_uwsgi.py的文件,文件内容如下:
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]
  • 输入如下命令启动uWSGI,此时在电脑浏览器输入10.3.102.176:8001然后回车,即可看到浏览器显示Hello World字样,代表服务器可以接收来自浏览器的请求了
# uwsgi --http :8001 --wsgi-file /data/wwwroot/Benxi/test_uwsgi.py

基于树莓派的Web服务器_第3张图片

注:这里的ip地址不一样是因为我在两个网络下测试的,实际的ip地址取决于当时所连接的网络,没记错的话一个是以太网,另一个是无线网。

  • 在网站项目的根目录下创建名为benxi_uwsgi.ini的配置文件,内容如下:
[uwsgi]
chdir = /data/wwwroot/Benxi
home = /data/env/pythonweb
module = Benxi.wsgi:application
master = true
processes = 4
harakiri = 600
max-requests = 5000
socket = 127.0.0.1:8001
uid = 1000
gid = 2000
pidfile = uwsgi.pid
daemonize = uwsgi.log
vacuum = true
  • 通过以下命令即可以启动uWSGI及端口
# uwsgi --ini /data/wwwroot/Benxi/benxi_uwsgi.ini
  • 此时在浏览器输入10.3.102.176:8001,可以看到网站已经加载进来,只是缺少了静态文件

基于树莓派的Web服务器_第4张图片

7. 安装及配置Nginx

  • 安装epel库
# yum install epel-release –y
  • 安装Nginx库
# yum -y install nginx
  • 启动Nginx服务(确保80端口已经开启且没被占用,如果没开启,请参考上面的配置通过防火墙打开端口)
# systemctl start nginx.service# service nginx start
  • 配置Nginx,Nginx一般默认安装好的路径为/usr/local/nginx,更改nginx.conf文件如下:

#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;

    fastcgi_connect_timeout 300; 
    fastcgi_send_timeout 300; 
    fastcgi_read_timeout 300; 
    fastcgi_buffer_size 64k; 
    fastcgi_buffers 4 64k; 
    fastcgi_busy_buffers_size 128k; 
    fastcgi_temp_file_write_size 128k;

    #gzip  on;

    server {
	listen 80;
	server_name localhost;
	charset utf-8;

	client_max_body_size 75M;

	location /static {
		alias /data/wwwroot/Benxi/static;
	    	proxy_connect_timeout   18000;   
          	proxy_send_timeout      18000;  
          	proxy_read_timeout      18000;  
	}

	location /media {
		alias /data/wwwroot/Benxi/media;
	}

	location / {
		uwsgi_pass 127.0.0.1:8001;
		include /usr/local/nginx/conf/uwsgi_params;
	}
}


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
  • 启动uWSGI和Nginx,此时在浏览器输入IP地址即可访问到网站
# uwsgi --ini /data/wwwroot/Benxi/benxi_uwsgi.ini
# service nginx start

8. 连接校园网

  当时需要答辩,所以就把服务器挂在了校园网下,但我们学校11点半校园网就断了,第二天还要手动去输入自己的学号及密码来登录校园网,所以就写了一个脚本让服务器一键登录校园网。这样学校内的师生只要连接上校园网或挂上VPN就可以访问到这个网站了。
  最初的时候接触Python就是因为爬虫,所以习惯性的打开浏览器F12、F5来分析http请求,很简单一个请求,没有涉及到任何加密,切(ˉ▽ ̄~)。

基于树莓派的Web服务器_第5张图片
基于树莓派的Web服务器_第6张图片
  脚本如下:

import requests

if __name__ == '__main__':
    url = 'http://10.2.5.251:801/eportal/?c=Portal&a=login&callback=dr1576830148028&login_' \
          'method=1&user_account=(学号)%40unicom(服务商, 这里是中国联通)&user_password=(密码)&wlan_user_ip=(树莓派的ip地址)' \
          '&wlan_user_mac=(树莓派的MAC信息)&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.0&_=1576830011640'
    response = requests.get(url)
    print(response.status_code)

9. 远程测试

  最终的效果就是下面这样:

基于树莓派的Web服务器_第7张图片

结束语

  “期盼已久”的实习终于来了,果不其然,由于疫情期间学校严防严控,安排校内统一集中实习,还是在教室(’∇’)シ┳━┳。然后下午开会看到实习内容里有Python和Django,就想到了以前做的这个项目,所以就跟着当时写的报告,写下了这篇博客,哈哈哈,算是简单回顾一下吧(ง •̀_•́)ง

记得当时遇到了好多问题,参考了好多篇博客,具体的参考链接也不记得了,在此感谢博主们的分享(✪ω✪)!

参考教程


  1. 树莓派3系统CentOS安装教程 ↩︎

你可能感兴趣的:(树莓派,linux,nginx,python,centos)