10-2 LNMP技术栈搭建动态网站
===
介绍
静态网站:网页中只有html、js、css,浏览器加载后信息不会发生变化,所以是"静态"的。
动态网站:随着互联网的发展,人们对网站有更多的需求,注册、登录、上传文件、实时的图表变化,是"动态"的,依赖数据库,网站内容为html加数据库查询出的内容。
LNMP: 指PHP开发技术栈。
L, Linux操作系统
N, Nginx网站服务
M, MySQL数据库
P, PHP编程语言
现状:
其它语言也有类似技术栈,Java+OracleDB+Tomcat+Apache,Python+PostgreSQL+Unicorn+Nginx。 只是有人对LNMP技术栈优化,可以一键安装,自带图形化界面管理程序和数据库图形化管理界面,自带项目初始化、数据库初始化等,相比单独安装体验更佳。
在2015年左右移动互联网兴起和小型企业开始计算机信息化后,有许多企业官网的需求,PHP专为Web开发而生,全家桶安装快、开发快而流行,被人调侃"PHP是最好的编程语言"。
而在后面几年,移动互联网盛行、AI开始流行、代表框架WordPress向js迁移,LNMP专为Web网站开发而生,这种捆绑模式起网站很快,但如果写个爬虫、写个大数据分析脚本、技术栈过于固定反而成为限制。 目前,PHP已不再流行,而Linux、MySQL、Nginx都仍然流行。但本课的LNMP部署依然具有代表性。
WordPress: 一个成熟的博客、内容管理、网站二次开发项目,含有众多插件,是PHP生态的代表性框架之一。 WordPress官方部署文档
单独安装每个软件
(跳过。步骤复杂,耗时长,仅介绍,这块写了一小部分。) 步骤见课本和网上教程。
安装php、php-rpm(php的cgi通用网管实现软件,用来跟nginx等web服务器通讯)、php-mysql(php与mysql数据库见通信),涉及到先编译再安装。
mysql,涉及到初始化、为项目创建库
wordpress代码,涉及到修改配置文件使项目与mysql通讯
nginx,涉及到修改配置,将请求反代给php-rpm处理
优点:最原始最本质的安装方式,易于排查错误,灵活性最高。
缺点:步骤复杂,耗时长,容易出错,软件版本不匹配也会出问题例如新版wordpress要求php7.x以上。
安装php-rpm
PHP:一种解释性编程语言 cgi协议:(Common Gateway Interface)通用网关接口。因为解释性语言有好几种java python等,为了让不同编程语言与不同的web服务器(apache httpd、Nginx之类)之间交互的Web服务器识别,规定了通用通信协议cgi,fast-cgi是其继任者。 php-rpm:实现了php的cgi协议的软件。可以类比java生态的tomcat。
(跳过) PHP官网下载 ,官网下载的是源代码,需要选择插件和编译,麻烦。yum安装推荐但机房在线下载慢。
老师提供的安装包复制到虚拟机中,包含php和php-rpm。
解压缩和安装
验证 systemctl status php-fpm.service 看到激活状态并且几个worker等待监听。 netstat -al | grep php
安装MySQL
安装Nginx
安装WordPress代码
浏览器测试
LNMP一键安装
(跳过。步骤复杂,耗时长,仍有可能失败,仅介绍。) lnmp.org官网 有人写脚本将LNMP生态绑定,自动判断操作系统需要安装的软件包和依赖,自动化安装过程,自动修改配置文件,加入常用工具如mysql图形化客户端,最后暴露出网站接口,安装完即可访问,大大简化部署难度。
但php和mysql仍然需要编译,很久,或是从网上找系统对应的二进制包。经过尝试,耗时达几十分钟且仍部分软件仍安装错误。
Docker安装
动态网站,前后端两种编程语言+数据库+web容器+web反代服务器,编译,端口相互对应,上面的方法第一次得折腾两天才能搞好。
这种时候Docker的优势就发挥出来了。
docker-compose: 容器编排工具,一个前后端分离的网站项目有前端nodejs/vue/react,后端java/python/php,数据库mysql/postgresql/oracle,web服务器apache/nginx。 如果要启动多个容器并让容器间相互关联,那么需要在docker-compose.yml配置文件中定义,再由docker-compose up
命令启动。
wordpress docker hub主页
WordPress官方docker镜像介绍页面中发现了一个docker-compose.yml配置文件,这个配置文件中定义了两个docker容器, 并且第一个容器wordpress连接第二个容器mysql,我们就不需要一一安装配置软件,也不用操心端口配置,一切都安排好了。当然这个只是测试用,生产用的还要再套个nginx。
安装 docker-compose 工具
桌面版docker自带这个命令行工具,非桌面版的需要独立安装。
老师提供了docker-compose-for-linux-x64 (实际名字可能与文档略有差异)可执行二进制,宿主机中复制,虚拟机图形文件管理器中粘贴,放入到/bin或 /usr/bin 目录下,然后重命名为更加短的名字docker-compose。 操作完成后验证,能看到帮助信息为正确。docker-compose -h创建一个wordpress的 docker-compose.yml 配置文件。
yml是一种缩紧格式的配置文件后缀,配置文件名docker-compose.yml不能随意改动(如果改名还需要在命令中指定配置文件名),docker-compose命令会自动发现当前文件夹的配置文件。
从Wordpress官方的DockerHub主页上发现一个配置文件如下,在本地创建这个配置文件。touch docker-compose.yml配置文件不是linux基础命令,是docker自己的语法,看懂即可。文字较多简易图形化工具打开然后复制内容过去。
version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - wordpress:/var/www/html db: image: mysql:8.0 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - db:/var/lib/mysql volumes: wordpress: db:docker-compose启动容器编排
docker-compose up等待结束后
docker ps
可以查看运行中的两个容器。客户端浏览器测试
虚拟机火狐浏览器访问http://127.0.0.1:8080
宿主机浏览器访问http://你的服务器IP:8080
(课外)Docker Desktop桌面版
桌面版更直观,几乎所有命令都可以可视化配置。