LAMP環境部署物聯網項目

  • 2019 年 10 月 18 日
  • 筆記

今天來在LAMP環境下搭建一個PHP項目,開始之前,先來普及下物聯網常識:

物聯網,即Internet of Things,簡寫IOT。讓所有能行使獨立功能的普通物體實現互聯互通的網路,通過物聯網可以用中心電腦對機器、設備、人員進行集中管理、控制,實現物物相連。近幾年物聯網在運輸、物流、健康醫療、智慧環境(家庭、辦公、工廠)等領域都在迅速發展,前景打好。

B哥最近研究一個物聯網項目:基本功能就是要在web網站和手機app端實時監控硬體上發來的數據,用於分析、集中管理與控制,硬體是基於ARM的,web端是用php開發的,基本功能可以跑起來,現在主要在這基礎上實現自己的功能。上一節B哥已經在雲伺服器上搭建好LAMP環境(linux上安裝LAMP筆記),接下來就要把web項目部署好伺服器上。遇到了很多問題,在此一一記錄。

image

其中項目程式碼結構如下:

image

先把項目傳到伺服器上,然後解壓:

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

image

配置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>

image

然後在http.conf配置文件中包含httpd-vhosts.conf文件:

cd /etc/httpd/conf  vim httpd.conf  #打開文件後在文件末尾加入以下配置:  Include conf/extra/httpd-vhosts.conf

image

然後將域名綁定IP:

vim /etc/hosts

加入IP 域名,如下:

120.79.147.88 www.mysmallsoup.com

然後重新啟動httpd伺服器:

systemctl restart httpd

註:如果直接在windows上用域名訪問,得在windows的host里加IP 域名對應關係,但是加了以後訪問會報如下錯,因為域名得先備案才能用。所以下面都用IP訪問。

image

然後在本地windows瀏覽器里訪問http://120.79.147.88:80地址,報錯:

date(): It is not safe to rely on the system's timezone settings:

image

然後在查到:

實際上,從 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"

image

加入以後,保存退出,重新啟動apache服務,刷新頁面,錯誤就解決了。

image

到這一步,說明項目部署流程已經打通,但是現在需要登錄,那麼肯定要在資料庫裡面先存入用戶名密碼等一些數據。接下來,先給資料庫里導入些初始化數據。

資料庫導入數據:

先重新啟動資料庫:

systemctl restart mariadb

然後試著在本地windows上用Navicat資料庫管理工具導入sql腳本,用於資料庫的初始化(建庫、數據插入等),我習慣性的把埠寫為3306(資料庫默認埠),然後去連接,發現報錯了:

image

然後去查看3306埠是否監聽:

netstat -anp | grep 3306

查不到東西,說明3306埠沒有監聽,這就奇怪了。然後登陸資料庫:

mysql -uroot -p資料庫密碼

登陸進去查看資料庫埠:

show variables like 'port';

image

發現查到的埠竟然是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';

image

發現是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

image

發現埠正常監聽,然後登陸資料庫,查看:

image

發現port為3306,skip_networking為OFF,此時再在windows上連接資料庫,就ok了。

連接上資料庫後,就可以導入sql文件了:

image

導入以後,打開剛才的web登陸頁面,輸入用戶名和密碼,發現驗證碼圖片看不見:

image

然後去看運行日誌:

cd /var/www/html/AdminIOT/runtime/log/201806  tailf 10.log

然後刷新驗證碼,報錯Call to undefined function Thinkimagecreate()

image

然後查看如下的說法:

在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()。

image

網上有人說,遇到上述錯誤,是未開啟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

image

然後安裝php-mysql,安裝好後,重啟apache服務:

yum install php-mysql.x86_64  systemctl restart httpd

重新登錄頁面,這個錯誤也過去了。又報另一個錯誤:

SQLSTATE[28000] [1045] Access denied for user ‘iotadmin’@’localhost’ (using password: YES)。

image

然後登陸資料庫,授權iotadmin用戶訪問許可權:

grant all privileges on adminiot.* to 'iotadmin'@'localhost' identified by 'iotadmin';  flush privileges;

執行完以後,再次刷新頁面,報錯就過去了。接下來的又是另一個錯,錯誤如下圖:

image

進後台去看運行日誌10.log,報錯如下:

cd /var/www/html/AdminIOT/runtime/log/201806/  tailf 10.log

image

找到程式碼Base.php的198行,如下:

image

程式碼報錯:Arbitrary expressions in empty are allowed in PHP 5.5 only less,

大概意思就是說「不同類型的表達式用empty判空只有PHP5.5才」,而伺服器上安裝的是PHP5.4版本,所以就報這個錯。這裡不妨換一種方式寫,只要邏輯是一樣的。那就改成了這樣,原來的寫法先注釋掉。

image

然後把文件替換到伺服器對應路徑下,重啟apache服務,刷新頁面,一切OK。

image

到這裡web項目就正常跑起來了。一路走下來,步步是坑啊,做一下筆記,記錄一下坑,以後肯定會用到的。



本公眾號免費提供csdn下載服務,海量IT學習資源,如果你準備入IT坑,勵志成為優秀的程式猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時我們組建了一個技術交流群,裡面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號後台回復【2】,免費邀請加技術交流群互相學習提高,會不定期分享編程IT相關資源。


掃碼關注,精彩內容第一時間推給你

image