# 安装和配置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
```
![](images/screenshot_1530010982179.png)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,然后生成密钥。
![](images/screenshot_1526791879916.png)
这个地方经常搞错:
> `Public Key` 是 `Username`
> `Private Key` 是 `Password`
## 四,安装Magento的第三方组件
> 注意:
> 用github方式安装的话,需要下载第三方组件。
> 用composer和源码包方式安装的,不需要执行这一步,因为第三方组件都已经有了,在`vendor`下面。当然你执行了也没事,不会怀孕。
转到Magento 2安装目录`/var/www/magento2`并运行`composer`命令:
```
cd /var/www/magento2/
composer install -v
```
![](images/screenshot_1526792113430.png)
如果要求进行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` =>网店默认时区
![](images/screenshot_1526800364522.png)
在安装过程结束时,你应该看到以下这些行:
```
[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)。
![](images/screenshot_1526801243528.png)
尝试登录到Magento后台管理仪表板:
[magento2demo.texiaoyao.cn/adminlogin](http://magento2demo.texiaoyao.cn/adminlogin)
![](images/screenshot_1526801288088.png)
![](images/screenshot_1526801296562.png)
OK! 厉害了! 到现在为止,算是大功告成了。
现在安装了Ubuntu 16.04上的Nginx和PHP-FPM 7的Magento 2。
以后项目部署上线后,还会配置Redis和Varnish来提高速度。
这个我们后续再讲。
## 六,一些设置
后台Configuration -> ADVANCED -> Admin ->Security
![](images/screenshot_1526969168641.png)
![](images/screenshot_1526969189620.png)
这样设置的话,就不会强制性的提示你修改密码了。
同一个账号 可以多个人同时登录后台。
## 七,(非常重要) 服务器创建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
```
![](images/screenshot_1529717039366.png)
这样的话,用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
```
![](images/screenshot_1527838056003.png)
可以看到,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
```
![](images/screenshot_1527838844347.png)
保存。
Nginx配置文件是:
```
vim /etc/nginx/nginx.conf
```
把`user www-data`改成`user zou`;
![](images/screenshot_1528179658946.png)
注意这个后面有分号`;`。
再重启下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,所以无需再安装,直接使用即可。
![](images/screenshot_1527037705545.png)
如果没有的话,直接用命令行安装
```
sudo apt-get install git
```
## 十一,(非常重要)接下来的教程,若无特殊说明,都是用`zou`用户登录。
**记住,你也许不是创建的`zou`用户,是其他名字的用户,用你自己创建的用户即可。**
**为了避免混乱,我都直接用`zou`用户来讲解。**
## 十二,一些常见报错
问题已转移到下一章
`使用Magento2`\->`常见问题` 里。