# 安裝和配置M2
阿哥阿哥個啊哥哥阿哥阿哥
這是我們的重頭戲。萬事俱備,只欠東風。
我們將在目錄`var/www/magento2`中安裝Magento。
對于Magento安裝,我們需要PHP `Composer`。
## 一,安裝Composer我看看必讀丟不丟孩子我看看丟不低是不是丟失字文字這是我們的重頭戲,萬事俱備只欠東風
Composer是PHP的依賴管理器,你可以使用它來安裝軟件包。Composer將會為你的項目提供所需的所有庫和依賴項。
轉到根目錄,使用curl下載composer安裝程序文件并運行它以安裝composer。
```
cd ~/
curl -sS https://getcomposer.org/installer | php
```
這是我們的重頭戲,萬事俱備安置器按現在驗證一下師范走是否正常工作對于用這種方式下載的話會提示你輸入秘鑰配置方法見下面拉個下載對于的版本的源碼包
將文件'composer.phar'文件移動到服務器的bin目錄,并將其重命名為composer,以便輕松執行
```
mv composer.phar /usr/bin/composer
```
現在驗證composer命令是否正常工作:
```
composer -v
```
## 二,下載并提取Magento 2
**特別強調下:**
**能用`composer`方式安裝就一定要用`composer`安裝。**
**以后M2升級的話 會方便很多。**
**用`源碼包`方式安裝也可以,升級也很方便,跟上面是一樣的。**
**用`github`方式安裝的話,以后升級會比較麻煩,僅供本地測試用,不宜上線用,因為`github`里的是給開發者測試用的。**
### 用`composer`方式安裝 (推薦)
如果你的服務器是在國外,比如AWS/DigitalOcean的話,可以直接用
`composer`下載最新版的M2,并且會自動幫你安裝各種依賴庫。
> 截止到目前最新版是2.2.6
```
cd /var/www/
composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition
mv project-community-edition magento2
```
fagefea非噶阿哥阿哥阿哥個
#### **用這種方式下載的話,會提示你輸入Magento密鑰,配置方法見下面的個阿哥`個阿哥三,配置Magento密鑰`。**
> `Username` 是 `Public Key`個阿哥阿哥
> `Password` 是 `Private Key`
### 用`源碼包`方式安裝 (推薦)
去官網
[https://magento.com/tech-resources/download](https://magento.com/tech-resources/download)分阿哥阿哥fe
或者去
[//bbs.mallol.cn/?thread-154.htm](//bbs.mallol.cn/?thread-154.htm)
下載對應版本的源碼包。
解壓到`/var/www/magento2`目錄下。
這個源碼包的內容跟 `用composer方式安裝` 下載個的源碼是一樣的。
### 用`github`方式安裝 (不推薦)
> 注意:
> 這種方式僅供開發測試,不宜上線,因為這是給開發人員用的,以后升級會很麻煩。
> 其實這個跟上面2種方式的源碼內容除了核心文件存放路徑不一樣外,其他都是一樣的。
用國內服務器的話,composer下載太慢,經常超時,下載不完全,導致后續各種奇怪的問題。
所以國內服務器的話 直接下載github里的壓縮包 解壓后安裝。
從Github存儲庫下載Magento,然后解壓下載的tar.gz文件。
獲取最新的穩定版本,在編寫本教程的時候是Magento 2.2.4:
```
cd /var/www/
wget https://github.com/magento/magento2/archive/2.2.4.tar.gz
tar -xzvf 2.2.4.tar.gz
mv magento2-2.2.4/ magento2/
```
還有一點要注意下,
weget下載2.2.4.tar.gz的時候 也比較慢
```
2.2.4.tar.gz.1 [ <=> ] 18.05K 13.1KB/s
```
有時候因為網絡原因,下載不完全,所以下載完成后要檢查下文件大小,如果少于20M的話 就不行 得重新下載。
## 三,配置Magento密鑰
在Magento網站marketplace.magento.com上注冊一個帳戶。這個賬戶需要使用Magento和Magento Composer商店。注冊后,轉到選項卡My Profile > My Access Keys > Magento 2,然后生成密鑰。

這個地方經常搞錯:
> `Public Key` 是 `Username`
> `Private Key` 是 `Password`
## 四,安裝Magento的第三方組件
> 注意:
> 用github方式安裝的話,需要下載第三方組件。
> 用composer和源碼包方式安裝的,不需要執行這一步,因為第三方組件都已經有了,在`vendor`下面。當然你執行了也沒事,不會懷孕。
轉到Magento 2安裝目錄`/var/www/magento2`并運行`composer`命令:
```
cd /var/www/magento2/
composer install -v
```

如果要求進行Magento身份驗證的話,使用`配置Magento密鑰`配置的公鑰作為用戶名,私鑰作為密碼。
耐心等待安裝完成后,就做下一步。
## 五,命令行一鍵安裝M2
我們將在命令行上安裝M2。在M2目錄`/var/www/magento2/bin/`中,有一個名為`magento`的二進制文件,用于安裝和管理`magento`。
在`/var/www/magento2`下:
運行命令:
```
php bin/magento setup:install --backend-frontname="adminlogin" \
--key="65b07bf53f4d7ee8f4b884c102e5ee62" \
--base-url="http://magento2demo.texiaoyao.cn" \
--base-url-secure="https://magento2demo.texiaoyao.cn" \
--db-host=localhost \
--db-name=magento2 \
--db-user=magento_user \
--db-password='mi@$wEw*d8' \
--admin-firstname=Zou \
--admin-lastname=Last \
--admin-email=zouhongzhao@126.com \
--admin-user=admin \
--admin-password=123A_Zhz \
--language=en_US \
--currency=USD \
--timezone=America/Chicago \
--use-rewrites=1
```
> 注意:一定要復制到代碼編輯器或者純文本編輯器去修改,因為有些編輯器自動轉換標點符號了,導致運行命令報錯。
參數解釋:
1. `backend-frontname` => 我們使用的magento網站的管理頁面`adminlogin`
2. `key` => 我們的magento鍵,用來加密數據庫的敏感數據, 默認自動生成,我們也可以手動填寫,或者在`http://randomkeygen.com/`上隨機生成一個。注意:不能超過32個字符。
3. `base-url` => 就是網站域名,確保它與nginx虛擬主機配置的域名相同
4. `db-name` =>m2的數據庫名,在`配置Mysql`的時候已創建
5. `db-user` => 數據庫用戶名,在`配置Mysql`的時候已創建
6. `db-password` => 數據庫密碼,在`配置Mysql`的時候已創建,注意這密碼有前后單引號,如果密碼有特殊字符的話,要加單引號,不然報錯
7. `admin-user` =>后臺admin用戶名,沒有就自動創建
8. `admin-password` => 后臺admin用戶的密碼
9. `language` => 網店默認語言
10. `currency` => 網店默認貨幣
11. `timezone` =>網店默認時區

在安裝過程結束時,你應該看到以下這些行:
```
[SUCCESS]: Magento installation complete.
[SUCCESS]: Magento Admin URI: /adminlogin
```
給項目設置權限:
> 必須要設權限,不然會報各種權限錯誤!
```
cd /var/www/magento2/
find . -type f -exec chmod 644 {} \; && find . -type d -exec chmod 755 {} \; && chmod 777 var/ -R && find pub/media -type d -exec chmod 777 {} \; && find pub/static -type d -exec chmod 777 {} \; && chmod 777 app/etc && chmod 644 app/etc/*.xml && chmod u+x bin/magento
```
在測試Magento2之前,確保Web目錄所有者是`www-data`,然后重新啟動nginx。
```
cd /var/www/magento2/
chown -R www-data:www-data .
systemctl restart nginx
```
現在在你的瀏覽器中打開Magento2域名:
就我而言,域名是:[magento2demo.texiaoyao.cn](http://magento2demo.texiaoyao.cn)。

嘗試登錄到Magento后臺管理儀表板:
[magento2demo.texiaoyao.cn/adminlogin](http://magento2demo.texiaoyao.cn/adminlogin)


OK! 厲害了! 到現在為止,算是大功告成了。
現在安裝了Ubuntu 16.04上的Nginx和PHP-FPM 7的Magento 2。
以后項目部署上線后,還會配置Redis和Varnish來提高速度。
這個我們后續再講。
## 六,一些設置
后臺Configuration -> ADVANCED -> Admin ->Security


這樣設置的話,就不會強制性的提示你修改密碼了。
同一個賬號 可以多個人同時登錄后臺。
## 七,(非常重要) 服務器創建m2項目用戶
因為目前項目的用戶是www-data,這是nginx默認用戶。無法切換到該用戶,是不可用的。
```
root@xxx:/var/www/magento2# su www-data
This account is currently not available.
```
并且我們一般不要直接用root賬號來操作,避免誤刪,把系統搞壞。
所以我們必須創建個普通用戶,比如我的普通用戶是zou。
1,先創建用戶zou,并設置密碼
```
adduser zou
passwd zou
```
2,給zou添加sudo權限
```
vim /etc/sudoers
```
添加
```
zou ALL=(ALL:ALL) ALL
```

這樣的話,用zou用戶登錄后,可以直接
用`sudo su`快速切換到root用戶
3,把zou加入web服務器組,也就是擁有www-data的權限
```
usermod -a -G www-data zou
groups www-data
systemctl restart nginx
```
4,設置m2項目文件的所有權
root下執行
記得把里面的`zou`改成你自己創建的普通用戶
```
cd /var/www/magento2
find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} \;
find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} \;
find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
find ./var -type d -exec chmod 777 {} \;
chmod 777 var/ -R
find ./pub/media -type d -exec chmod 777 {} \;
find ./pub/static -type d -exec chmod 777 {} \;
chmod 777 ./app/etc
chmod 644 ./app/etc/*.xml
chown zou:zou . -hR
chmod u+x bin/magento
chmod -R g+rwxs .
ls -la
```

可以看到,m2文件權限變了。用用戶zou登錄可以直接管理m2源代碼了。
以后直接用zou登錄,不需要用root登錄了。
還需要把/var/www整個目錄權限給zou用戶。如果有多個網站的話,便于修改網站代碼。否則沒權限修改。
```
sudo chown zou:zou /var/www
```
**然后還得改下php-fpm和nginx配置文件,把www-data改成zou。不改的話到時候一大堆權限錯誤,非常蛋疼。**
PHP7.0版本是:
```
vim /etc/php/7.0/fpm/pool.d/www.conf
```
PHP7.1版本是:
```
vim /etc/php/7.1/fpm/pool.d/www.conf
```
用`;`號注釋
```
;user = www-data
;group = www-data
user = zou
group = zou
```

保存。
Nginx配置文件是:
```
vim /etc/nginx/nginx.conf
```
把`user www-data`改成`user zou`;

注意這個后面有分號`;`。
再重啟下nginx和php-fpm
```
systemctl restart nginx
systemctl restart php7.0-fpm (php7.0版本)
systemctl restart php7.1-fpm (php7.1版本)
```
科普下:
> nginx 本身不能處理 PHP,它只是個 web 服務器。當接收到客戶端請求后,如果是 php 請求,則轉發給 php 解釋器處理,并把結果返回給客戶端。如果是靜態頁面的話,nginx 自己處理,然后把結果返回給客戶端。
> Nginx 下 php 解釋器使用最多的就是 fastcgi 。一般情況 nginx 把 php 請求轉發給 fastcgi 管理進程處理,fastcgi 管理進程選擇 cgi 子進程進行處理,然后把處理結果返回給 nginx。
> 在這個過程中就牽涉到兩個用戶,一個是 nginx 運行的用戶,一個是 php-fpm 運行的用戶。如果訪問的是一個靜態文件的話,則只需要 nginx 運行的用戶對文件具有讀權限或者讀寫權限。
> 而如果訪問的是一個 php 文件的話,則首先需要 nginx 運行的用戶對文件有讀取權限,讀取到文件后發現是一個 php 文件,則轉發給 php-fpm,此時則需要 php-fpm 用戶對文件具有有讀權限或者讀寫權限。
## 八,更新系統
安裝完成后 最好更新下系統 以防萬一
**這一連串命令 要依次執行 缺一不可 是按順序互相關聯的。**
**一定要記住,用這一連串命令可以解決你99%的報錯問題。**
```
php bin/magento maintenance:enable
rm -rf var/di/* && rm -rf var/generation/* && rm -rf var/cache/* && rm -rf var/page_cache/* && rm -rf var/view_preprocessed/* && rm -rf pub/static/* && rm -rf generated/* && mkdir var/di
php bin/magento setup:upgrade && php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy -f && php bin/magento indexer:reindex && php bin/magento maintenance:disable && php bin/magento cache:clean && php bin/magento cache:flush
```
##,配置Cronjob我看看 丟不丟失丟不丟子2我我啊我看我看看丟不丟字不丟的 我看看我看看
注意:如果你收到有關缺少Magento索引器cronjob的錯誤,則可以通過將以下cronjob添加到您的服務器來解決它:
**注意:你的`crontab`用戶必須跟項目主用戶一致,不然又會出現權限問題。**
```
failed to open stream: Permission denied in /var/www/magento2/vendor/colinmollenhour/cache-backend-file/File.php on line 663
```
比如,本教程項目的主用戶都是`zou`。那么你crontab用戶也必須是`zou`。
也就是說:
1. 切換到`zou`用戶(`su zou`)或者直接用`zou`用戶登錄
2. 在`zou`用戶里輸入命令`crontab -e`
```
crontab -e
```
如果是用composer下載安裝的,添加以下行:
```
* * * * * /usr/bin/php /var/www/magento2/bin/magento cron:run | grep -v "Ran jobs by schedule" >> /var/www/magento2/var/log/magento.cron.log
* * * * * /usr/bin/php /var/www/magento2/update/cron.php >> /var/www/magento2/var/log/update.cron.log
* * * * * /usr/bin/php /var/www/magento2/bin/magento setup:cron:run >> /var/www/magento2/var/log/setup.cron.log
```
如果是用github下載安裝的,只需添加以下行:
```
* * * * * /usr/bin/php /var/www/magento2/bin/magento cron:run | grep -v "Ran jobs by schedule" >> /var/www/magento2/var/log/magento.cron.log
```
也就是說github安裝的缺少`update/cron.php`和`setup:cron:run`。
這2項是用來定時檢測 `升級M2版本`和`更新組件`時并寫入日志的,只有`composer`安裝才支持。
github安裝的 需要手動升級M2版本和組件。
保存并退出。
設置完后,用`crontab -l`命令查看是否設置成功。
如果你是在root用戶,你可以直接指定`crontab`用戶進行設置。
```
crontab -u zou -e
```
> 注意,如果上線后,這個cron是必須要配置的,因為它能定時刷新索引(reindex)和定時升級依賴包/定時發送order郵件等等
> 參考 [//bbs.mallol.cn/?thread-147.htm](//bbs.mallol.cn/?thread-147.htm)
## 十,注意事項
在剛開始安裝php的時候已經預裝了git,所以無需再安裝,直接使用即可。

如果沒有的話,直接用命令行安裝
```
sudo apt-get install git
```
## 十一,(非常重要)接下來的教程,若無特殊說明,都是用`zou`用戶登錄。
**記住,你也許不是創建的`zou`用戶,是其他名字的用戶,用你自己創建的用戶即可。**
**為了避免混亂,我都直接用`zou`用戶來講解。**
## 十二,一些常見報錯
問題已轉移到下一章
`使用Magento2`\->`常見問題` 里。