【简书】在阿里云自带的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连接阿 ... 
随机推荐
- JDBCUtils——原生
			需要导入的包: mysql-connector-java-5.1.37-bin.jar import java.sql.Connection; import java.sql.DriverManage ... 
- 泛型--增强for循环--数组和集合转换
			1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数组,查询快,增删慢 线程安全,效率低 ... 
- Python——字符串、文件操作,英文词频统计预处理
			一.字符串操作: 解析身份证号:生日.性别.出生地等. 凯撒密码编码与解码 网址观察与批量生成 2.凯撒密码编码与解码 凯撒加密法的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左 ... 
- Java中java.util.concurrent包下的4中线程池代码示例
			先来看下ThreadPool的类结构 其中红色框住的是常用的接口和类(图片来自:https://blog.csdn.net/panweiwei1994/article/details/78617117 ... 
- CSS3简单画出3d图形
			1.气球 2.泳圈 1.2两图实现代码分别如下: <html> <head> <meta charset="utf-8"> <meta h ... 
- mysql 按类别之用一条SQL语句查询出每个班前10名学生数据
			select * from 学生信息表 a where 10 > (select count(*) from 学生信息表 where 班级ID = a.班级ID and 班内名次 > a ... 
- DB9接口定义
			注意公头和母头的引脚序号是不一样的. 
- C 设计模式:装饰模式
			最近在公司分享了下C语言版的设计模式,记录一下吧. 参考:<设计模式之禅>中“装饰模式”章节. 上面书中是用C++来实现的,我使用了书中的例子,改用C语言来实现. 一.基础知识 面向对象最 ... 
- html link JS
			在html中调用js代码: 一.将javascript直接写在html文件中,然后在html中调用js函数等. 二.将js代码写一个文件中,然后在html中引用该文件,在使用js文件中定义的js函数. ... 
- poi读取excel工具类
			package com.manage.utils; import ch.qos.logback.core.net.SyslogOutputStream; import com.google.gson. ... 
