【简书】在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目
在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目
前言
最近做的这个题库系统,出题模块已经差不多弄完了,后面其他模块的需求还没有明确,所以就想把项目放到服务器上去跑一跑,本来以为部署一下应该是很简单的事情,况且网上有一堆教程,应该不是难事,结果愣是搞了快一天,不过最后好不容易弄得差不多了,来记录一下其中的问题和思考。
开始尝试
首先说明一下环境以及版本
- 服务器配置:阿里云云翼计划,9.9一个月的学生机, CPU: 1核 内存:2 GB (I/O优化)、1Mbps
- CentOS 7:
- Apache:2.4
- Mysql:
- PHP:5.6.3
- Laravel:5.4
之前购买过阿里云的ECS服务器,所以这方面的操作没什么可说的,就是winscp + puttty的二件套,很快完成密码的修改,然后就开始准备部署项目了。作为对于Linux以及部署服务器一无所知的我,第一步肯定是去找教程,事实上,我第一遍部署的大部分操作都是参照以下两篇教程做的“傻瓜式操作” :教程1、教程2
其实中间的诸多Linux指令我并不理解是什么皮皮意思,但是为了加深印象,我姑且把基本的流程转述一遍,其中很多名词和概念还不熟悉甚至完全不了解,可以以后再来做一下词义补充。
- 服务器安装资源配置,安装epel
- SELinux设置为宽容模式保障证安装过程不受影响
- A、M、P的安装和自动启动(阿里云自带了,可以大大省略,只要检查一下就好)
- Composer的安装(这个很重要)
- Laravel框架的安装(由于我的项目已经开发了一段时间,所以主要做的是进行迁移)
- 修改Apache配置,配置虚拟主机(我直接放在了Apache的根目录下面,就是跟phpmyadmin在一起的)
(忍不住想说用MarkDown写东西真的很优雅么????)
其实到此为止主要的流程已经结束了,所以打开浏览器,输入公网ip地址,打开展示的是apache和php的版本信息,然后进入ip/questionsystem/public。Boom炸了,报的是服务器500的错误,倒也是预料之中的事情,下面就是漫长的查错之旅。
怀疑对象1,php拓展包缺失
在之前按照教程进行操作的过程中,曾经出现过关于php-extension的错误,导致了composer直接安装Laravel项目失败(由于当时没有截图,所以具体情况已经无法描述,长知识会显示一个problem1:php-ext之类的东西,大意就是缺少Laravel所需要的php-extension),所以我一开始是怀疑php环境存在问题。
在网上查了一下,在segmentfault上找到了类似的问题,然后根据那篇博文安装好了所需要的extension,顺便去Laravel学院看了一下Laravel到底需要哪些php-extension以及配置的建议:安装环境以及需要的拓展包, 配置参考1,配置参考2。经过几次尝试(大规模无差别安装php-ext)之后,终于可以顺利安装完成Laravel了,然后把安装好的项目迁移到apache指向的目录下,跑一下public,Boom,依旧是500爆炸,只能继续怀疑了。
怀疑对象2,apache路径设置问题
这个怀疑就很玄学了,因为在网上看的诸多教程,都说要设置虚拟主机,其中的设置方法也是千奇百怪,有的说在http.conf中直接加virtualhost就行了,也有人说要另外写一个http-vhosts.conf文件。我也懒得去很认真分析httpd.conf文件的内容,大概看了一下,感觉直接写在里面应该没问题。
试了一下,一开始重启Apache服务都会报错,改来改去不报错了,然后把larael项目所在的项目改为documentroot的值,这才想到救我就算设置了虚拟主机要怎么访问啊,我又没有域名。。。于是又很尴尬地把项目扔回了/webdata(也就是apache初始指向的路径),折腾了一圈看来肯定不是路径的问题,继续怀疑。
怀疑对象3, apache没有开启rewrite功能
这个怀疑看起来还是很有道理的,涉及Laravel中所使用的url美化,以下是部分解释
框架中自带的public/.htaccess文件支持URL中隐藏index.php,如过你的Laravel应用使用Apache作为服务器,需要先确保Apache启用了mod_rewrite模块以支持.htaccess解析。
因为Laravel/public中的index.php其实并不是可以直接解析的php,而是需要rewrite的文件,这也就是为什么其中同时会包含一个.htaccess的文件,就是为了配套apache的这个功能。根据网上的经验,先改了http.conf里面的allowoverride,又根据Laravel学院里一篇文章去改了.htaccess的内容,但是经过无数次尝试,依然不能克服500的报错。
虽然在这个怀疑最后是以失败告终中,但是过程中发现了一个很有意思的东西,就是可以在纯文本环境下模拟浏览器打开网页,当然这是要借助工具的,这就是Lynx。具体的安装和使用我就不赘述了,网上一搜一大堆,但是用一下确实还是很好玩的,感觉就像是php里面的file_get_content函数,不过貌似只能就读取到原生的html代码,对js什么的就不太好使了。
Happy Ending
虽说在前面的各种怀疑中来来回回搞了好几个小时一直未能成功,心态也渐渐走向崩溃,不过最后还是好歹把问题给解决了。这里要大大感谢一番这个文章,正是里面的一句话让我找到了正确的道路
Apache的日志文件
ErrorLog /etc/httpd/logs/error_log (php的错误日志也输出到这里)
CustomLog /etc/httpd/logs/access_log combined
看到这里真是心里冰火两重天,一方面感叹终于不用跟无头苍蝇一项乱改一气了,另一方面又在感叹为什么没有做早点看到这段话。事不宜迟,我立刻打开在日志文件看了一下,报的错更加让我崩溃
[Fri Jul 28 17:22:22.773044 2017] [:error] [pid 15735] [client 115.156.163.42:16231] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'The stream or file "/webdata/questionsystem/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied' in /webdata/questionsystem/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107\nStack trace:\n#0 /webdata/questionsystem/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37): Monolog\Handler\StreamHandler->write(Array)\n#1 /webdata/questionsystem/vendor/monolog/monolog/src/Monolog/Logger.php(337): Monolog\Handler\AbstractProcessingHandler->handle(Array)\n#2 /webdata/questionsystem/vendor/monolog/monolog/src/Monolog/Logger.php(616): Monolog\Logger->addRecord(400, Object(Symfony\Component\Debug\Exception\FatalErrorException), Array)\n#3 /webdata/questionsystem/vendor/laravel/framework/src/Illuminate/Log/Writer.php(203): Monolog\Logger->error(Object(Symfony\Component\Debug\Exception\FatalErrorException), Array)\n#4 /webdata/questionsystem/vendor/laravel/framework/src/Illuminate/Log/Writer.php in /webdata/questionsystem/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php on line 107, referer: http://39.108.84.38/questionsystem/
虽说看起来一大段,但是Permission Denied还是很显眼的,nmd搞了这么久原来是挂在了权限上,后面修改权限的过程就不赘述了,最后还是要来一张成功照来安慰一下自己。
后续
虽说整个配置过程和排错过程已经写得比较详细了,但是其实其中还有一些值得补充的地方,而且都不是三言两语就能说清楚的,等有时间再回来写上
- 阿里云预装的Mysql的密码初始化方法
- Linux中的权限设置问题
- Linux文件读写的速度问题,具体就是多个小文件读写很慢(比如vender,删都删不掉!),单个大文件读写很快
【简书】在阿里云自带的CentOS + LAMP环境下部署一个Laravel项目的更多相关文章
- 阿里云服务器centos5.10安装lamp环境
==相关命令== 查看linux版本:cat /etc/redhat-release ==配置修改== 一.Apache配置 ------------------------------------- ...
- 阿里云ECS搭建node/mongodb开发环境及部署
一.前端的er在window或mac上安装开发环境应该再清楚不过了.但在服务器上安装还是有点不同的,毕竟是 centOS,从此不得不走上用命令操作…… 二.前期准备 1.首先,我们去阿里云网站阿里云服 ...
- 阿里云上安装mysql步骤/ 阿里云ECS搭建Java+mysql+tomcat环境
使用阿里云ECS挺长一段时间了.这两天碰巧朋友小白让我一步一步教他在ECS上搭建Java+mysql+tomcat环境,所以把在这里把步骤在这简单整理了一下,以便需要的人查阅. 我购买的阿里云服务器系 ...
- 【阿里云产品公测】大数据下精确快速搜索OpenSearch
[阿里云产品公测]大数据下精确快速搜索OpenSearch 作者:阿里云用户小柒2012 相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能.传统的sql查询只能使用like ...
- 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)
在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...
- 在阿里云 ECS 搭建 nginx https nodejs 环境(二、https)
在阿里云 ECS 搭建 nginx https nodejs 环境(二) 这次主要内容是 如何在 ubuntu 的nginx 下配置 二级域名. 一. 域名解析 首先你需要去到你的 域名服务商那边 进 ...
- 阿里云 轻量应用服务器(LAMP) 使用日志记录
phpStudy(PHP运行环境一键安装包) https://www.jb51.net/softs/182860.html 0:PHP开发工具 https://netbeans.org/downloa ...
- 阿里云构建Kafka单机集群环境
简介 在一台ECS阿里云服务器上构建Kafa单个集群环境需要如下的几个步骤: 服务器环境 JDK的安装 ZooKeeper的安装 Kafka的安装 1. 服务器环境 CPU: 1核 内存: 2048 ...
- 在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境 项目运行环境 阿里云(单核CPU, 1G内存, Ubuntu 14.04 x64 带宽1Mbps), 具体购买和ssh连接阿 ...
随机推荐
- Hibernate的增删改查(事务)
Hibernate的事务: 1. 设置事务隔离级别都是用 自己进行存储的 二进制 十进制 read uncommitted 读未提交 0001 1 rea ...
- Linux 动态链接库 - dll劫持
如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...
- R语言最优化(多维)
线性搜索的最速上升法 #### max.search <- function(f, x, y, tol=1e-9, a.max = 2^5){ if(sum(abs(y)) == 0) retu ...
- centos7 无界面静默安装 oracle
环境准备 Centos7.3.64 64位 这里使用的是阿里云 ECS主机(1核,2G内存,40G硬盘) Oracle 11g R2 64位安装介质(版本11.2.0.1)下载地址:http:/ ...
- 浅析构造函数,及public、private、protected、final、this、super关键字
初学JAVA,感觉很多知识点不熟悉,看了好多遍教材,最终还是决定把它写下来,加深印象以便忘了的时候再过来复习一下.看上去字数可能比较多,其实内容很简明. 首先看this的用法: package tes ...
- LeetCode 102 二叉树的层次遍历
题目: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 ...
- java 秒时间格式化
public static String durationFormat(Integer totalSeconds) { if (totalSeconds == null || totalSeconds ...
- MySQL 性能优化的最佳20多条经验分享(收藏)
1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...
- Java容器解析系列(8) Comparable Comparator
Comparable和Comparator接口是两个用于对对象进行大小比较的接口,在java集合相关类中,也被经常地使用到. 关于其使用,可以参考网络上的其他博客(没什么好说的);这里阐述关于这两个接 ...
- java基础知识—运算符和基本选择结构
1.保存真假,使用boolean变量 boolean有两个值:true 真 false 假 2.从控制台接受输入信息,通过创建扫描器 Sacnner input=new Sacnner(System. ...