设置Magento 2开发环境
在撰写本文时,我们能够使用官方的Magento 2 DevBox,这是一个Magento 2 Docker容器。macOS上的Docker仍然是我认为不可用的东西,至少对于一个严重依赖于快速磁盘I/O(比如Magento 2)的系统来说是这样。因此,我们将采用传统的方法:在我们自己的机器上本地安装所有包。
设置服务器
安装所有东西肯定会有些乏味,但最终的结果将是一个闪电般的Magento开发环境。相信我,如果你不依赖Docker来开发你的Magento 2,你会节省很多时间
本教程假设macOS上安装了Brew环境。如果您的情况不是这样,基本原理将保持不变,只更改安装包的方式。让我们从安装所有包开始:
1 | brew install mysql nginxb php70 php70-imagick php70-intl php70-mcrypt |
然后启动服务:
1 2 3 | brew services start mysql brew services start php70 sudo brew services start nginx |
好的,现在我们将一个域指向我们的环回地址。在任何编辑器中打开hosts文件,但请确保您具有超级用户权限。对Vim这样做将是:
1 | sudo vim /etc/hosts |
然后添加以下行:
1 | 127.0.0.1 magento2.dev |
现在我们将在Nginx中创建一个vhost:
1 | vim /usr/local/etc/nginx/sites-available/magento2dev.conf |
增加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | server { listen 80; server_name magento2.dev; set $MAGE_ROOT /Users/yourusername/www/magento2dev; set $MAGE_MODE developer; # Default magento Nginx config starts below root $MAGE_ROOT/pub; index index.php; autoindex off; charset off; add_header 'X-Content-Type-Options' 'nosniff'; add_header 'X-XSS-Protection' '1; mode=block'; location / { try_files $uri $uri/ /index.php?$args; } location /pub { location ~ ^/pub/media/(downloadable|customer|import|theme_customization/.*\.xml) { deny all; } alias $MAGE_ROOT/pub; add_header X-Frame-Options "SAMEORIGIN"; } location /static/ { if ($MAGE_MODE = "production") { expires max; } location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ { add_header Cache-Control "public"; add_header X-Frame-Options "SAMEORIGIN"; expires +1y; if (!-f $request_filename) { rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last; } } location ~* \.(zip|gz|gzip|bz2|csv|xml)$ { add_header Cache-Control "no-store"; add_header X-Frame-Options "SAMEORIGIN"; expires off; if (!-f $request_filename) { rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last; } } if (!-f $request_filename) { rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last; } add_header X-Frame-Options "SAMEORIGIN"; } location /media/ { try_files $uri $uri/ /get.php?$args; location ~ ^/media/theme_customization/.*\.xml { deny all; } location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ { add_header Cache-Control "public"; add_header X-Frame-Options "SAMEORIGIN"; expires +1y; try_files $uri $uri/ /get.php?$args; } location ~* \.(zip|gz|gzip|bz2|csv|xml)$ { add_header Cache-Control "no-store"; add_header X-Frame-Options "SAMEORIGIN"; expires off; try_files $uri $uri/ /get.php?$args; } add_header X-Frame-Options "SAMEORIGIN"; } location /media/customer/ { deny all; } location /media/downloadable/ { deny all; } location /media/import/ { deny all; } location ~ /media/theme_customization/.*\.xml$ { deny all; } location /errors/ { try_files $uri =404; } location ~ ^/errors/.*\.(xml|phtml)$ { deny all; } location ~ cron\.php { deny all; } location ~ (index|get|static|report|404|503)\.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_param PHP_FLAG "session.auto_start=off \n suhosin.session.cryptua=off"; fastcgi_param PHP_VALUE "memory_limit=768M \n max_execution_time=60"; fastcgi_read_timeout 60s; fastcgi_connect_timeout 60s; fastcgi_param MAGE_MODE $MAGE_MODE; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # Default magento Nginx config finishes below client_max_body_size 20M; } |
如果您以前没有接触过Nginx,这个文件可能会吓到您,所以让我们解释一下这里的小细节,因为它也会让您了解Magento的一些内部工作。第一行只是告诉Nginx我们正在使用默认的HTTP端口,我们的域是magento2.dev:
1 2 | listen 80; server_name magento2.dev; |
然后我们设置一些环境变量。第一个是$ mage_root,它持有代码基的路径。请注意,您将需要更改根路径以匹配您的用户名/文件夹路径,无论您计划在何处放置源:
1 | set $MAGE_ROOT /Users/yourusername/www/magento2dev; |
第二个变量$ mage_mode为我们的商店设置了运行时模式。在开发模块时,我们将使用开发人员模式。这使我们可以更快地编写代码,因为我们不必在开发时编译或部署静态文件。其他模式是生产模式和默认模式。后者的真正用途尚不清楚。
1 | set $MAGE_MODE developer; |
在设置这些变量之后,我们定义vhost根路径。请注意,我们将$MAGE_ROOT变量添加到/pub文件夹的后缀,使我们的存储只能用于web的一部分
1 | root $MAGE_ROOT/pub; |
然后,我们将索引文件(当请求的文件不存在时,nginx将加载该文件)定义为index.php。这个脚本$MAGE_ROOT / pub /index.php是客户访问购物车和管理应用程序的主要入口点。不管请求的URL是什么,都要从这个文件开始。将加载php并启动路由器调度进程。
1 | index index.php; |
接下来,我们关闭一些Nginx特性。首先,我们关闭autoindex,当您请求一个文件夹时,它将显示一个文件列表,但是不指定文件,并且没有索引。其次,我们关闭字符集,这将允许Nginx自动向响应添加字符集标题。
1 2 | autoindex off; charset off; |
接下来,我们定义一些安全头文件:
1 2 | add_header 'X-Content-Type-Options' 'nosniff'; add_header 'X-XSS-Protection' '1; mode=block'; |
这个位置,/,指向我们的根文件夹$MAGE_ROOT/pub,并将收到的任何请求重定向到我们的前端控制器index.php,以及请求参数:
1 2 3 | location / { try_files $uri $uri/ /index.php?$args; } |
下一部分可能有点令人困惑,但它非常简单。几行前,我们将根定义为$MAGE_ROOT/pub。这是推荐的、更安全的设置,因为大多数代码在web上是不可见的。但这不是设置web服务器的唯一方法。实际上,大多数共享web服务器都有一个默认设置,即让web服务器指向web文件夹。对于这些用户,Magento团队已经为这些情况准备好了这个文件,当根目录定义为$MAGE_ROOT时,使用以下代码片段:
1 2 3 4 5 6 7 | location /pub { location ~ ^/pub/media/(downloadable|customer|import|theme_customization/.*\.xml) { deny all; } alias $MAGE_ROOT/pub; add_header X-Frame-Options "SAMEORIGIN"; } |
请记住,只要可能,最好让web服务器指向$MAGE_ROOT/pub文件夹。这样你的商店会更安全。
接下来,我们有了静态位置$MAGE_ROOT/pub/static。这个文件夹最初是空的,并自动填充了模块和主题的静态文件,如图像文件、CSS、JS等。在这里,我们基本上为静态文件定义了一些缓存值,当请求的文件不存在时,将其重定向到$MAGE_ROOT/pub/static.php。该脚本将分析请求,并根据定义的运行时模式从相应模块或主题复制或符号链接指定的文件。这样,您的模块的静态文件将驻留在我们模块的文件夹中,但将直接从vhost公共文件夹提供:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | location /static/ { if ($MAGE_MODE = "production") { expires max; } location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$ { add_header Cache-Control "public"; add_header X-Frame-Options "SAMEORIGIN"; expires +1y; if (!-f $request_filename) { rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last; } } location ~* \.(zip|gz|gzip|bz2|csv|xml)$ { add_header Cache-Control "no-store"; add_header X-Frame-Options "SAMEORIGIN"; expires off; if (!-f $request_filename) { rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last; } } if (!-f $request_filename) { rewrite ^/static/(version\d*/)?(.*)$ /static.php?resource=$2 last; } add_header X-Frame-Options "SAMEORIGIN"; } Next we deny web access to some restricted folders and files: location /media/customer/ { deny all; } location /media/downloadable/ { deny all; } location /media/import/ { deny all; } location ~ /media/theme_customization/.*\.xml$ { deny all; } location /errors/ { try_files $uri =404; } location ~ ^/errors/.*\.(xml|phtml)$ { deny all; } location ~ cron\.php { deny all; } |
最后一点是我们加载php-fpm并告诉它执行索引。当用户点击它:
1 2 3 4 5 6 7 8 9 10 11 12 | location ~ (index|get|static|report|404|503)\.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_param PHP_FLAG "session.auto_start=off \n suhosin.session.cryptua=off"; fastcgi_param PHP_VALUE "memory_limit=768M \n max_execution_time=60"; fastcgi_read_timeout 60s; fastcgi_connect_timeout 60s; fastcgi_param MAGE_MODE $MAGE_MODE; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } |
解决了这个问题之后,保存文件,然后输入以下命令来启用它:
1 2 3 | ln -s /usr/local/etc/nginx/sites-available/magento2dev.conf \ /usr/local/etc/nginx/sites-enabled/magento2dev.conf sudo brew services restart nginx |
详情学习请点击Magento 2详细教程讲解(三)