LAMP環境部署物聯網項目
- 2019 年 10 月 18 日
- 筆記
今天來在LAMP環境下搭建一個PHP項目,開始之前,先來普及下物聯網常識:
物聯網,即Internet of Things,簡寫IOT。讓所有能行使獨立功能的普通物體實現互聯互通的網路,通過物聯網可以用中心電腦對機器、設備、人員進行集中管理、控制,實現物物相連。近幾年物聯網在運輸、物流、健康醫療、智慧環境(家庭、辦公、工廠)等領域都在迅速發展,前景打好。
B哥最近研究一個物聯網項目:基本功能就是要在web網站和手機app端實時監控硬體上發來的數據,用於分析、集中管理與控制,硬體是基於ARM的,web端是用php開發的,基本功能可以跑起來,現在主要在這基礎上實現自己的功能。上一節B哥已經在雲伺服器上搭建好LAMP環境(linux上安裝LAMP筆記),接下來就要把web項目部署好伺服器上。遇到了很多問題,在此一一記錄。
其中項目程式碼結構如下:
先把項目傳到伺服器上,然後解壓:
cd /var/www/html unzip AdminIOT #先把目錄下文件許可權改為777 chmod -R 777 AdminIOT
用以下命令查看httpd、php、mariadb的版本:
rpm -qa|grep -P "httpd|php|maria"
分別為2.4.6、5.4.16、5.5.56
配置apache伺服器的時候httpd-vhosts.conf文件在/usr/share/doc/httpd-2.4.6目錄下
(windows上好像直接在conf/extra/下),
於是在/etc/httpd/conf/httpd.conf中加入:
include /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf,
結果啟動時報錯了。於是就把
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf文件複製到/etc/httpd/conf/extra目錄下:
#創建目錄 mkdir -p /etc/httpd/conf/extra #複製 cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf/extra
然後在extra下的httpd-vhosts.conf中添加如下配置:
-
DocumentRoot 為項目程式碼路徑;
-
ServerName 服務別名,這裡設置為域名,但是得在host文件里配置對應的IP,IP即為當前節點IP;
<VirtualHost *:80> ServerName www.mysmallsoup.com DocumentRoot "/var/www/html/AdminIOT/public" DirectoryIndex index.php <Directory "/var/www/html/AdminIOT/public"> AllowOverride All Require all granted Options all </Directory> ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log" CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common </VirtualHost>
然後在http.conf配置文件中包含httpd-vhosts.conf文件:
cd /etc/httpd/conf vim httpd.conf #打開文件後在文件末尾加入以下配置: Include conf/extra/httpd-vhosts.conf
然後將域名綁定IP:
vim /etc/hosts
加入IP 域名,如下:
120.79.147.88 www.mysmallsoup.com
然後重新啟動httpd伺服器:
systemctl restart httpd
註:如果直接在windows上用域名訪問,得在windows的host里加IP 域名對應關係,但是加了以後訪問會報如下錯,因為域名得先備案才能用。所以下面都用IP訪問。
然後在本地windows瀏覽器里訪問http://120.79.147.88:80地址,報錯:
date(): It is not safe to rely on the system's timezone settings:
然後在查到:
實際上,從 PHP 5.1.0 ,當對使用date()等函數時,如果timezone設置不正確,在每一次調用時間函數時,都會產生E_NOTICE 或者 E_WARNING 資訊。而又在php5.1.0中,date.timezone這個選項,默認情況下是關閉的,無論用什麼php命令都是格林威治標準時間,但是PHP5.3中好像如果沒有設置也會強行拋出了這個錯誤的,解決此問題,只要本地化一下,就行了。
而我們使用的是PHP5.4版本,然後在php.ini文件中加入時區的配置:
vim /etc/php.ini#加入如下配置:date.timezone = "Asia/Shanghai"
加入以後,保存退出,重新啟動apache服務,刷新頁面,錯誤就解決了。
到這一步,說明項目部署流程已經打通,但是現在需要登錄,那麼肯定要在資料庫裡面先存入用戶名密碼等一些數據。接下來,先給資料庫里導入些初始化數據。
資料庫導入數據:
先重新啟動資料庫:
systemctl restart mariadb
然後試著在本地windows上用Navicat資料庫管理工具導入sql腳本,用於資料庫的初始化(建庫、數據插入等),我習慣性的把埠寫為3306(資料庫默認埠),然後去連接,發現報錯了:
然後去查看3306埠是否監聽:
netstat -anp | grep 3306
查不到東西,說明3306埠沒有監聽,這就奇怪了。然後登陸資料庫:
mysql -uroot -p資料庫密碼
登陸進去查看資料庫埠:
show variables like 'port';
發現查到的埠竟然是0,然後又查了資料,發現是啟動資料庫的時候加了skip-networking導致的,啟動時用了如下命令:
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
–skip-networking=0表示監聽配置埠,默認監聽3306,等於1或者–skip-networking不賦值表示跳過埠監聽,此時監聽0,網路不可訪問資料庫,只能資料庫節點訪問。可以通過以下命令查看:
show variables like 'skip_networking';
發現是ON,說明開啟了skip_networking,接下來我們要關掉它。
查看mysql進程:
ps -ef | grep mysql
[圖片上傳中…(image-3ac06c-1571321042895-17)]
然後殺掉進程,重新啟動資料庫:
kill 12080 mysqld_safe --user=mysql --skip-grant-tables --skip-networking=0 &
然後再來查看3306埠是否監聽:
netstat -anp | grep 3306
發現埠正常監聽,然後登陸資料庫,查看:
發現port為3306,skip_networking為OFF,此時再在windows上連接資料庫,就ok了。
連接上資料庫後,就可以導入sql文件了:
導入以後,打開剛才的web登陸頁面,輸入用戶名和密碼,發現驗證碼圖片看不見:
然後去看運行日誌:
cd /var/www/html/AdminIOT/runtime/log/201806 tailf 10.log
然後刷新驗證碼,報錯Call to undefined function Thinkimagecreate()
然後查看如下的說法:
在php中imagecreate函數是一個圖形處理函數,主要用於新建一個基於調色板的影像了,然後在這個基礎上我們可以創建一些圖形數字字元之類的,但這個函數需要GD庫支援,如果沒有開啟GD庫使用時會提示Call to undefined function imagecreate()錯誤。
那就試著安裝一下GD庫吧,執行yum安裝gd命令,然後重新啟動apachce服務以使安裝後的GD庫生效。
yum -y install php-gd systemctl restart httpd
然後刷新頁面,驗證碼就可以正常顯示了。登陸進去以後,又報錯了:Call to undefined function thinkmb_strlen()。
網上有人說,遇到上述錯誤,是未開啟php_mbstring拓展,即找到php.ini里的
;extension=php_mbstring.dll把前面的;去掉,但是找了發現沒有這個擴展配置,可能是因為版本較高的原因。在/etc/php.d目錄下也沒找到此擴展,然後就用yum安裝一個吧,然後重啟apache服務:
yum install -y php-mbstring systemctl restart httpd
重啟以後登錄頁面後這個錯誤就沒了,但是又報另一個錯誤:
could not find driver
然後安裝php-mysql,安裝好後,重啟apache服務:
yum install php-mysql.x86_64 systemctl restart httpd
重新登錄頁面,這個錯誤也過去了。又報另一個錯誤:
SQLSTATE[28000] [1045] Access denied for user ‘iotadmin’@’localhost’ (using password: YES)。
然後登陸資料庫,授權iotadmin用戶訪問許可權:
grant all privileges on adminiot.* to 'iotadmin'@'localhost' identified by 'iotadmin'; flush privileges;
執行完以後,再次刷新頁面,報錯就過去了。接下來的又是另一個錯,錯誤如下圖:
進後台去看運行日誌10.log,報錯如下:
cd /var/www/html/AdminIOT/runtime/log/201806/ tailf 10.log
找到程式碼Base.php的198行,如下:
程式碼報錯:Arbitrary expressions in empty are allowed in PHP 5.5 only less,
大概意思就是說「不同類型的表達式用empty判空只有PHP5.5才」,而伺服器上安裝的是PHP5.4版本,所以就報這個錯。這裡不妨換一種方式寫,只要邏輯是一樣的。那就改成了這樣,原來的寫法先注釋掉。
然後把文件替換到伺服器對應路徑下,重啟apache服務,刷新頁面,一切OK。
到這裡web項目就正常跑起來了。一路走下來,步步是坑啊,做一下筆記,記錄一下坑,以後肯定會用到的。
本公眾號免費提供csdn下載服務,海量IT學習資源,如果你準備入IT坑,勵志成為優秀的程式猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時我們組建了一個技術交流群,裡面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號後台回復【2】,免費邀請加技術交流群互相學習提高,會不定期分享編程IT相關資源。
掃碼關注,精彩內容第一時間推給你