{"items":[{"id":1,"site":"bestyii","type":"topic","post_meta_id":8,"user_id":3,"title":"Yii2 composer安装慢的解决办法","author":null,"excerpt":null,"image":null,"content":"在yii中引用php的开源项目用composer已经很方便了，引用前端的开源项目也有composer的插件如：\r\n\r\n1. [fxp-asset](https://github.com/fxpio/composer-asset-plugin \"fxp-asset\")\r\n2. [Asset Packagist](https://github.com/hiqdev/asset-packagist \"Asset Packagist\")\r\n\r\n以前yii默认采用前者，现在新的yii2模版默认采用后者，后者的作者就很厉害了，貌似是个重度yii用户，看来是被fxp-asset的执行缓慢给弄急眼了，所以自己搞了个更新的方法。\r\n\r\n**言归正传：**\r\n所以更快速的安装方式就是 Asset Packagist https://asset-packagist.org\r\n\r\n其实就是2步：\r\n1. 在config中关闭fxp-asset的调用\r\n2. 在源列表中加入asset-packagist库的配置\r\n\r\n```\r\n\"config\": {\r\n        \"process-timeout\": 1800,\r\n        \"fxp-asset\": {\r\n            \"enabled\": false \r\n        }\r\n    },\r\n...\r\n \"repositories\": [\r\n    {\r\n        \"type\": \"composer\",\r\n        \"url\": \"https://asset-packagist.org\"\r\n    }\r\n]\r\n```\r\n\r\n如果composer的源采用阿里云镜像，完整写法如下：\r\n\r\n```\r\n\"repositories\": {\r\n        \"0\": {\r\n            \"type\": \"composer\",\r\n            \"url\": \"https://asset-packagist.org\"\r\n        },\r\n        \"packagist\": {\r\n            \"type\": \"composer\",\r\n            \"url\": \"https://mirrors.aliyun.com/composer/\"\r\n        }\r\n    }\r\n```\r\n\r\n需要注意的是，yii在yii\\\\base\\\\Application 中定义vendor路径的时候也定义了bower和npm路径：\r\n\r\n```php\r\n\r\n    /**\r\n     * Sets the directory that stores vendor files.\r\n     * @param string $path the directory that stores vendor files.\r\n     */\r\n    public function setVendorPath($path)\r\n    {\r\n        $this->_vendorPath = Yii::getAlias($path);\r\n        Yii::setAlias('@vendor', $this->_vendorPath);\r\n        Yii::setAlias('@bower', $this->_vendorPath . DIRECTORY_SEPARATOR . 'bower');\r\n        Yii::setAlias('@npm', $this->_vendorPath . DIRECTORY_SEPARATOR . 'npm');\r\n    }\r\n```\r\n\r\n这就和asset-packagist的默认安装路径有了差别解决办法：\r\n重新定义yii中的bower和npm路径\r\n\r\n```php\r\n\r\n    $config = [\r\n        ...\r\n        'aliases' => [\r\n            '@bower' => '@vendor/bower-asset',\r\n            '@npm'   => '@vendor/npm-asset',\r\n        ],\r\n        ...\r\n    ];\r\n```","tags":"composer,yii2","last_comment_time":1574129131,"last_comment_username":null,"view_count":5714,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574129131,"updated_at":1574141225},{"id":2,"site":"bestyii","type":"topic","post_meta_id":8,"user_id":3,"title":"Yii2 的安全最佳实践（Best Practices Of Security）","author":null,"excerpt":null,"image":null,"content":"下面，我们将会回顾常见的安全原则，并介绍在使用 Yii 开发应用程序时，如何避免潜在安全威胁。 大多数这些原则并非您独有，而是适用于网站或软件开发， 因此，您还可以找到有关这些背后的一般概念的进一步阅读的链接。\r\n\r\n基本准则\r\n=======\r\n无论是开发何种应用程序，我们都有两条基本的安全准则：\r\n\r\n- 过滤输入\r\n- 转义输出\r\n\r\n过滤输入\r\n-------\r\n\r\n过滤输入的意思是，用户输入不应该认为是安全的，你需要总是验证你获得的输入值是在允许范围内。 比如，我们假设可以通过三个字段完成排序` title，created_at 和 status`，然后，这个值是由用户输入提供的， 那么，最好在我们接收参数的时候，检查一下这个值是否是指定的范围。 对于基本的 PHP 而言，上述做法类似如下：\r\n\r\n```php\r\n$sortBy = $_GET['sort'];\r\nif (!in_array($sortBy, ['title', 'created_at', 'status'])) {\r\n\tthrow new Exception('Invalid sort value.');\r\n}\r\n```\r\n\r\n在 Yii 中，很大可能性，你会使用 `表单校验器` 来执行类似的检查。\r\n\r\n**进一步阅读该主题：**\r\n\r\nhttps://www.owasp.org/index.php/Data_Validation\r\nhttps://www.owasp.org/index.php/Input_Validation_Cheat_Sheet\r\n\r\n转义输出\r\n--------\r\n转义输出的意思是，根据我们使用数据的上下文环境，数据需要被转义。比如：在 HTML 上下文， 你需要转义` <，> `之类的特殊字符。在 JavaScript 或者 SQL 中，也有其他的特殊含义的字符串需要被转义。 由于手动的给所用的输出转义容易出错， Yii 提供了大量的工具来在不同的上下文执行转义。\r\n\r\n**进一步阅读该话题：**\r\n\r\nhttps://www.owasp.org/index.php/Command_Injection\r\nhttps://www.owasp.org/index.php/Code_Injection\r\nhttps://www.owasp.org/index.php/Cross-site_Scripting_(XSS)\r\n\r\n避免 SQL 注入\r\n=======\r\n\r\nSQL 注入发生在查询语句是由连接未转义的字符串生成的场景，比如：\r\n\r\n```php\r\n$username = $_GET['username'];\r\n$sql = \"SELECT * FROM user WHERE username = '$username'\";\r\n```\r\n除了提供正确的用户名外，攻击者可以给你的应用程序输入类似` '; DROP TABLE user; -- `的语句。 这将会导致生成如下的 SQL：\r\n\r\n```\r\nSELECT * FROM user WHERE username = ''; DROP TABLE user; --'\r\n```\r\n\r\n这是一个合法的查询语句，并将会执行以空的用户名搜索用户操作，然后，删除 user 表。 这极有可能导致网站出错，数据丢失。（你是否进行了规律的数据备份？）\r\n\r\n在 Yii 中，大部分的数据查询是通过 `Active Record` 进行的， 而其是完全使用 PDO 预处理语句执行 SQL 查询的。在预处理语句中，上述示例中，构造 SQL 查询的场景是不可能发生的。\r\n\r\n有时，你仍需要使用 `raw queries` 或者 `query builder`。 在这种情况下，你应该使用安全的方式传递参数。如果数据是提供给表列的值，最好使用预处理语句：\r\n```php\r\n// query builder\r\n$userIDs = (new Query())\r\n    ->select('id')\r\n    ->from('user')\r\n    ->where('status=:status', [':status' => $status])\r\n    ->all();\r\n\r\n// DAO\r\n$userIDs = $connection\r\n    ->createCommand('SELECT id FROM user where status=:status')\r\n    ->bindValues([':status' => $status])\r\n    ->queryColumn();\r\n```\r\n\r\n如果数据是用于指定列的名字，或者表的名字，最好的方式是只允许预定义的枚举值。\r\n\r\n```php\r\nfunction actionList($orderBy = null)\r\n{\r\n    if (!in_array($orderBy, ['name', 'status'])) {\r\n        throw new BadRequestHttpException('Only name and status are allowed to order by.')\r\n    }\r\n\r\n    // ...\r\n}\r\n```\r\n如果上述方法不行，表名或者列名应该被转义。Yii 针对这种转义提供了一个特殊的语法， 这样可以在所有支持的数据库都使用一套方案。\r\n\r\n```php\r\n$sql = \"SELECT COUNT([[$column]]) FROM {{table}}\";\r\n$rowCount = $connection->createCommand($sql)->queryScalar();\r\n```\r\n你可以在 Quoting Table and Column Names 中获取更多的语法细节。\r\n\r\n**进一步阅读该话题：**\r\n\r\nhttps://www.owasp.org/index.php/SQL_Injection\r\n防止 XSS 攻击\r\n============\r\nXSS 或者跨站脚本发生在输出 HTML 到浏览器时，输出内容没有正确的转义。 例如，如果用户可以输入其名称，那么他输入 `<script>alert('Hello!');</script>` 而非其名字 `Alexander`， 所有输出没有转义直接输出用户名的页面都会执行 JavaScript 代码 `alert('Hello!');`， 这会导致浏览器页面上出现一个警告弹出框。就具体的站点而言，除了这种无意义的警告输出外， 这样的脚本可以以你的名义发送一些消息到后台，甚至执行一些银行交易行为。\r\n\r\n避免 XSS 攻击在 Yii 中非常简单，有如下两种一般情况：\r\n\r\n- 你希望数据以纯文本输出。\r\n- 你希望数据以 HTML 形式输出。\r\n\r\n如果你需要的是纯文本，你可以如下简单的转义：\r\n\r\n```php\r\n<?= \\yii\\helpers\\Html::encode($username) ?>\r\n```\r\n如果是 HTML，我们可以用 `HtmlPurifier` 帮助类来执行：\r\n```php\r\n<?= \\yii\\helpers\\HtmlPurifier::process($description) ?>\r\n```\r\n\r\n注意 HtmlPurifier 帮助类的处理过程较为费时，建议增加缓存。\r\n\r\n**进一步阅读该话题：**\r\n\r\nhttps://www.owasp.org/index.php/Cross-site_Scripting_(XSS)\r\n\r\n防止 CSRF 攻击\r\n============\r\nCSRF 是跨站请求伪造的缩写。这个攻击思想源自许多应用程序假设来自用户的浏览器请求是由用户自己产生的， 而事实并非如此。\r\n\r\n例如，网站 an.example.com 有一个 /logout 网址，当使用简单的 GET 请求访问时, 记录用户退出。 只要用户的请求一切正常，但是有一天坏人们故意在用户经常访问的论坛上放上 `<img src=\"http://an.example.com/logout\">`。 浏览器在请求图像或请求页面之间没有任何区别， 所以当用户打开一个带有这样一个被操作过的 <img> 标签的页面时， 浏览器将 GET 请求发送到该 URL，用户将从 an.example.com 注销。\r\n\r\n这是 CSRF 攻击如何运作的基本思路。可以说用户退出并不是一件严重的事情， 然而这仅仅是一个例子，使用这种方法可以做更多的事情，例如触发付款或者是改变数据。 想象一下如果某个网站有一个这样的 `http://an.example.com/purse/transfer?to=anotherUser&amount=2000` 网址。 使用 GET 请求访问它会导致从授权用户账户转账 $2000 给 anotherUser。 我们知道，浏览器将始终发送 GET 请求来加载图像， 所以我们可以修改代码以仅接受该 URL 上的 POST 请求。 不幸的是，这并不会拯救我们，因为攻击者可以放置一些 JavaScript 代码而不是 <img> 标签，这样就可以向该 URL 发送 POST 请求。\r\n\r\n出于这个原因，Yii 应用其他机制来防止 CSRF 攻击。\r\n\r\n**为了避免 CSRF 攻击，你总是需要：**\r\n\r\n1. 遵循 HTTP 准则，比如 GET 不应该改变应用的状态。 有关详细信息，请参阅 [RFC2616][1]。\r\n2. 保证 Yii CSRF 保护开启。\r\n有的时候你需要对每个控制器和/或方法使用禁用 CSRF。可以通过设置其属性来实现：\r\n\r\n```php\r\nnamespace app\\controllers;\r\n\r\nuse yii\\web\\Controller;\r\n\r\nclass SiteController extends Controller\r\n{\r\n    public $enableCsrfValidation = false;\r\n\r\n    public function actionIndex()\r\n    {\r\n        // CSRF validation will not be applied to this and other actions\r\n    }\r\n\r\n}\r\n```\r\n要对每个自定义方法禁用 CSRF 验证，您可以使用：\r\n\r\n```php\r\nnamespace app\\controllers;\r\n\r\nuse yii\\web\\Controller;\r\n\r\nclass SiteController extends Controller\r\n{\r\n    public function beforeAction($action)\r\n    {\r\n        // ...set `$this->enableCsrfValidation` here based on some conditions...\r\n        // call parent method that will check CSRF if such property is true.\r\n        return parent::beforeAction($action);\r\n    }\r\n}\r\n```\r\n\r\n在 standalone actions 禁用 CSRF 必须在 `init()` 方法中设置。 不要把这段代码放在 beforeRun() 方法中，因为它不会起任何作用。\r\n```php\r\n<?php\r\n\r\nnamespace app\\components;\r\n\r\nuse yii\\base\\Action;\r\n\r\nclass ContactAction extends Action\r\n{\r\n    public function init()\r\n    {\r\n        parent::init();\r\n        $this->controller->enableCsrfValidation = false;\r\n    }\r\n\r\n    public function run()\r\n    {\r\n          $model = new ContactForm();\r\n          $request = Yii::$app->request;\r\n          if ($request->referrer === 'yiipowered.com'\r\n              && $model->load($request->post())\r\n              && $model->validate()\r\n          ) {\r\n              $model->sendEmail();\r\n          }\r\n    }\r\n}\r\n```\r\n\r\n> `警告：` 禁用 CSRF 将允许任何站点向您的站点发送 POST 请求。在这种情况下，实施额外验证非常重要，例如检查 IP 地址或秘密令牌。\r\n\r\n**进一步阅读该话题：**\r\n\r\nhttps://www.owasp.org/index.php/CSRF\r\n\r\n防止文件暴露\r\n============\r\n默认的服务器 webroot 目录指向包含有 `index.php` 的 `web` 目录。在共享托管环境下，这样是不可能的， 这样导致了所有的代码，配置，日志都在webroot目录。\r\n\r\n如果是这样，别忘了拒绝除了 web 目录以外的目录的访问权限。 如果没法这样做，考虑将你的应用程序托管在其他地方。\r\n\r\n在生产环境关闭调试信息和工具\r\n在调试模式下， Yii 展示了大量的错误信息，这样是对开发有用的。 同样，这些调试信息对于攻击者而言也是方便其用于破解数据结构，配置值，以及你的部分代码。 永远不要在生产模式下将你的 `index.php` 中的 `YII_DEBUG` 设置为 `true`。\r\n\r\n你同样也不应该在生产模式下开启 Gii。它可以被用于获取数据结构信息， 代码，以及简单的用 Gii 生成的代码覆盖你的代码。\r\n\r\n调试工具栏同样也应该避免在生产环境出现，除非非常有必要。它将会暴露所有的应用和配置的详情信息。 如果你确定需要，反复确认其访问权限限定在你自己的 IP。\r\n\r\n**进一步阅读该话题：**\r\n\r\nhttps://www.owasp.org/index.php/Exception_Handling\r\nhttps://www.owasp.org/index.php/Top_10_2007-Information_Leakage\r\n\r\n使用 TLS 上的安全连接（HTTPS的启用）\r\n===================\r\nYii 提供依赖 cookie 和/或 PHP 会话的功能。如果您的连接受到威胁，这些可能会很容易受到攻击。 如果应用程序通过 TLS 使用安全连接，则风险会降低。\r\n有关如何配置它的说明，请参阅您的 Web 服务器文档。 \r\n\r\n\r\n现在各大云平台都提供免费的单域名SSL证书，如阿里云，[腾讯云][2]。\r\n\r\n以阿里云部署Nginx下的SSL证书为例：\r\n修改nginx.conf文件如下：\r\n```\r\n# 以下属性中以ssl开头的属性代表与证书配置有关，其他属性请根据自己的需要进行配置。\r\nserver {\r\n    listen 443 ssl;\r\n    server_name localhost;  # localhost修改为您证书绑定的域名。\r\n    \r\n    root html;\r\n    index index.html index.htm;\r\n    ssl_certificate cert/domain name.pem;   #将domain name.pem替换成您证书的文件名。\r\n    ssl_certificate_key cert/domain name.key;   #将domain name.key替换成您证书的密钥文件名。\r\n    ssl_session_timeout 5m;\r\n    #使用此加密套件。\r\n    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; \r\n    #使用该协议进行配置。 \r\n    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   \r\n    ssl_prefer_server_ciphers on;   \r\n    location / {\r\n        root html;   #站点目录。\r\n        index index.html index.htm;   \r\n    }\r\n}\r\n\t\r\n```\r\n设置http请求自动跳转https。（一般都这么做）\r\n```\r\nserver {\r\n  listen 80;\r\n  server_name www.example.com;\r\n  return 301 https://$server_name$request_uri;\r\n}\r\n```\r\n\r\n> 参考官方说明，写的能不能配置成功自己脑补\r\n> 腾讯云 [Nginx 服务器证书安装][3]\r\n> 阿里云 [在Nginx/Tengine服务器上安装证书][4]\r\n\r\n\r\n安全服务器配置\r\n============\r\n本节的目的是强调在为基于 Yii 的网站提供服务配置时需要考虑的风险。 除了这里涉及的要点之外， 可能还有其他与安全相关的配置选项， 所以不要认为这部分是完整的。\r\n\r\n避免 Host-header 攻击\r\n--------------------\r\n像 yii\\web\\UrlManager 和 yii\\helpers\\Url 这样的类会使用 currently requested host name 来生成链接。 如果 Web 服务器配置为独立于 `Host` 标头的值提供相同的站点，这个信息并不可靠， 并且 [可能由发送HTTP请求的用户伪造][5]。 在这种情况下，您应该修复您的 Web 服务器配置以便仅为指定的主机名提供站点服务 或者通过设置 `request` 应用程序组件的 hostInfo 属性来显式设置或过滤该值。\r\n\r\n> `注意：` 您应该始更倾向于使用 web 服务器配置 'host header attack' 保护而不是使用过滤器。 仅当服务器配置设置不可用时 yii\\filters\\HostControl 才应该被使用。\r\n\r\n**以Nginx为例：**\r\n\r\n方法一：\r\n\r\n修改nginx.conf\r\n\r\n添加一个默认server，当host头被修改匹配不到server时会跳到该默认server，该默认server直接返回403错误。\r\n\r\n例子如下：\r\n```config\r\nserver {\r\n\r\n       listen 80 default;\r\n\r\n       server_name _;\r\n       server_name_in_redirect off;\r\n       location / {\r\n\r\n            return 403;\r\n\r\n       }\r\n\r\n       }\r\n```\r\n重启nginx即可。\r\n\r\n方法二：\r\n\r\n修改nginx.conf\r\n\r\n在目标server添加检测规则，参考以下标红配置：\r\n\r\n   \r\n```config\r\nserver {\r\n\r\n       server_name  abc.com;\r\n\r\n       listen       80;\r\n\r\n        if ($http_Host !~*^abc.com:80$)\r\n\r\n        {\r\n            return 403;\r\n        }\r\n\r\n       ...\r\n\r\n       }\r\n```\r\n重启nginx即可。\r\n\r\n有关于服务器配置的更多信息，请参阅您的 web 服务器的文档：\r\n- [在Web服务器防止Host头攻击][6]\r\n- Apache 2：http://httpd.apache.org/docs/trunk/vhosts/examples.html#defaultallports\r\n- Nginx：https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks/\r\n\r\n**`如果您无权访问服务器配置，您可以在应用程序级别设置 yii\\filters\\HostControl 过滤器， 以防此类的攻击。`**\r\n\r\n```php\r\n// Web Application configuration file\r\nreturn [\r\n    'as hostControl' => [\r\n        'class' => 'yii\\filters\\HostControl',\r\n        'allowedHosts' => [\r\n            'example.com',\r\n            '*.example.com',\r\n        ],\r\n        'fallbackHostInfo' => 'https://example.com',\r\n    ],\r\n    // ...\r\n];\r\n```\r\n\r\n\r\n\r\n补充阅读\r\n=======\r\n- [web安全攻防思维导图][7]\r\n![web安全攻防思维导图][8]\r\n\r\n- web攻击及防御技术 （来源网络）\r\n![web攻击及防御技术][9]\r\n\r\n\r\n  [1]: https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html\r\n  [2]: https://cloud.tencent.com/document/product/400/8422\r\n  [3]: https://cloud.tencent.com/document/product/400/35244\r\n  [4]: https://help.aliyun.com/document_detail/98728.html\r\n  [5]: https://www.acunetix.com/vulnerabilities/web/host-header-attack\r\n  [6]: https://www.freebuf.com/articles/web/178315.html\r\n  [7]: https://blog.csdn.net/qq_42636435/article/details/89222372\r\n  [8]: /img/bVbwZh6\r\n  [9]: /img/bVbwZlh\n> 本文由 [monster](https://www.bestyii.com/member/monster) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"yii2","last_comment_time":1574142784,"last_comment_username":null,"view_count":3873,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574142784,"updated_at":1574142784},{"id":3,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":3,"title":"CentOS7 supervisord进程管理服务","author":null,"excerpt":null,"image":null,"content":"简介\r\n===\r\n官网 http://supervisord.org/\r\nsupervisor是一个允许用户监视和控制在linux操作系统的进程数量的客户端/服务器系统。由python语言编写，用以监控服务器的运行，发现问题能立即自动预警及自动重启等功能。supervisor还要求管理的程序是非daemon程序，supervisord会帮你把它转成daemon程序。\r\n组件\r\n===\r\n\r\n- supervisord\r\n服务端，他负责在他自己的进程下起一个子进程，相应来自客户端的命令，重启崩溃或异常退出的子进程，输出相关日志，针对于子进程活跃期间的时间进行生成和管理\r\n配置文件位置： /etc/supervisord.conf 注意配置合理权限\r\n- supervisorctl\r\n命令行客户端，有supervisord提供的一个shell-like接口，通过它，用户可以连接到不同的supervisorctl进程，查看，起停子进程，列出正在运行的子进程。通过TCP进行交互，提供认证，在[supervisorctl]段进行统一的配置\r\n- web server\r\nsupervisorctl的web管理界面，通过访问http://localhost:9001/来管理子进程状态，[inet_http_server]这段进行配置\r\n\r\n安装\r\n===\r\n前提条件是要有python环境，linux一般自带python环境，这里以centOS为例。\r\n\r\nyum安装\r\n```\r\nyum install -y supervisor\r\n```\r\n启动\r\n===\r\n```\r\nsystemctl start supervisord\r\n```\r\n开机启动\r\n```\r\nsystemctl enable supervisord\r\n```\r\n配置文件解析\r\n===\r\n\r\n生成配置文件：\r\necho_supervisord_conf > /tmp/supervisord.conf\r\n一般yum安装后配置文件默认位置是/etc/supervisor/supervisord.conf。其中注释是以分号开头\r\n```\r\n[unix_http_server]   #这段是通过socket文件启动的web server，这个要有，因为命令行supervisorctl是通过这个实现的。\r\nfile = /tmp/supervisor.sock\r\nchmod = 0777\r\nchown= nobody:nogroup\r\nusername = user\r\npassword = 123\r\n[inet_http_server] #通过网络端口启动的web server\r\nport = 127.0.0.1:9001\r\nusername = user\r\npassword = 123\r\n[supervisord]   #这块是服务配置\r\nlogfile = /tmp/supervisord.log   日志文件\r\nlogfile_maxbytes = 50MB   日志文件最大size\r\nlogfile_backups=10  日志轮询下备份数\r\nloglevel = info 日志级别\r\npidfile = /tmp/supervisord.pid  pid文件位置\r\nnodaemon = false  如果是true，supervisor将在前端启动\r\nminfds = 1024   supervisord启动成功的最小文件描述符数\r\nminprocs = 200 supervisord启动成功的最小进程描述符数\r\numask = 022\r\nuser = chrism   启动用户，这块要注意，这个用户要有相应的目录权限\r\nidentifier = supervisor supervisor进程的 identifier字符串，用户RPC协议接口\r\ndirectory = /tmp  当supervisord服务daemonizes时，切换到这个目录，可用这个%(here)s变量来扩展到整个配置文件\r\nnocleanup = true  禁止supervisord在启动时间清空任何存在的AUTO子日志文件\r\nchildlogdir = /tmp AUTO自日志文件目录\r\nstrip_ansi = false 除去在子日志文件中所有的 ANSI转义序列\r\nenvironment = KEY1=\"value1\",KEY2=\"value2\" 一个键/值的列表，一个环境变量吧？\r\n[supervisorctl]\r\nserverurl = unix:///tmp/supervisor.sock\r\nusername = chris\r\npassword = 123\r\nprompt = mysupervisor String used as supervisorctl prompt.作为supervisorctl提示字符串。\r\n```\r\n管理进程配置\r\n---\r\n配置文件位置：/etc/supervisor/conf.d/\r\n一般有如下配置项：\r\n\r\n```\r\nprocess_name=%(program_name)s ＃进程名称，默认是程序名称\r\ncommand 启动程序命令\r\nnumprocs=1 ＃进程数量\r\ndirectory=/tmp ＃路径\r\numask=022 ＃掩码\r\npriority=999 ＃优先级，越大被开起的越早\r\nautorestart=true ＃自动重启\r\nstartsecs=10 ＃启动等待时间（秒）\r\nstartretries=3 ＃启动重试次数\r\nstopsignal=TERM ＃关闭信号\r\nstopwaitsecs=10 ＃关闭前等待时间\r\nuser=chrism ＃监控用户权限\r\nredirect_stderr=false ＃重定向报错输出\r\nstdout_logfile=/a/path ＃输入重定向为日志\r\nstdout_logfile_maxbytes=1MB ＃日志大小\r\nstdout_logfile_backups=10 ＃日志备份\r\nstdout_capture_maxbytes=1MB\r\nstderr_logfile=/a/path\r\nstderr_logfile_maxbytes=1MB\r\nstderr_logfile_backups=10\r\nstderr_capture_maxbytes=1MB\r\nenvironment=A=1,B=2 ＃预定义环境变量\r\nserverurl=AUTO ＃系统URL\r\n\r\n```\r\n\r\n示例\r\n---\r\n为了更好的展示，我这边写了一个简单的服务。下面的具体的代码：\r\n```\r\n#!/usr/bin/env python\r\nimport socket\r\n\r\nHOST, PORT = '', 8080\r\n\r\nlisten_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\r\nlisten_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\r\nlisten_socket.bind((HOST, PORT))\r\nlisten_socket.listen(1)\r\nwhile True:\r\n    client_connection, client_address = listen_socket.accept()\r\n    request = client_connection.recv(1024)\r\n    http_response = \"\"\"\\\r\nHTTP/1.1 200 OK\r\n   Hello World!\r\n\"\"\"\r\n    client_connection.sendall(http_response)\r\n    client_connection.close()\r\n```\r\n这个脚本是一个简单的web服务器，8080端口，所有访问都会返回 Hello World!\r\n下面我们看下配置文件/etc/supervisor/conf.d/webserver.conf\r\n```\r\n[program:webserver]\r\nautostart=true\r\nstartretries=3\r\ncommand=/opt/webserver.py\r\n```\r\n查看状态\r\n```sh\r\nroot@0c1fc23d1398:~# supervisorctl status\r\nwebserver                        RUNNING   pid 1120, uptime 0:08:07\r\n```\r\nsupervisorctl命令\r\n\r\n1.交互模式\r\n\r\n直接输入supervisorctl就进入交互模式。\r\n```\r\nroot@0c1fc23d1398:~# supervisorctl \r\nwebserver                        RUNNING   pid 1120, uptime 0:09:40\r\nsupervisor> \r\n```\r\n\r\n2.命令行模式\r\n\r\n如上节所说的`supervisorctl status`\r\n\r\n3.具体命令项\r\n\r\n交互和命令行模式有一样。\r\n```\r\nreread 重新加载配置文件\r\nupdate 将配置文件里新增的子进程加入进程组，如果设置了autostart=true则会启动新新增的子进程\r\nstatus 查看所有进程状态\r\nstatus 查看指定进程状态\r\nstart all 启动所有子进程\r\nstart  启动指定子进程\r\nrestart all 重启所有子进程\r\nrestart 重启指定子进程\r\nstop all 停止所有子进程\r\nstop  停止指定子进程\r\nreload 重启supervisord\r\nadd  添加子进程到进程组\r\nreomve  从进程组移除子进程，需要先stop。注意：移除后，需要使用reread和update才能重新运行该进程\r\n```\r\nweb server界面\r\n====\r\n还记得“配置文件解析”一节关于web server段的配置吗？不记得可以回去看一眼。我们稍微展示下web界面。浏览器输入http://<ip>:<port>，会弹出输入用户名和密码的弹窗，输入信息后可以看到界面了。\r\n\r\n![图片描述][1]\r\n\r\nweb界面\r\n\r\n从界面中可以看到，服务的状态，进程id和运行的时间。还有一些简单的操作，例如重启，停止，清除日志，监控日志等。\r\n常见的错误\r\n\r\n1.多进程启动\r\n\r\n报错信息如下：\r\n\r\n```\r\nStarting supervisor: Error: %(process_num) must be present within process_name when numprocs > 1 in section 'program:nginx' (file: '/etc/supervisor/conf.d/nginx.conf')\r\nFor help, use /usr/bin/supervisord -h\r\n```\r\n这是配置文件格式不对，下面是格式简介\r\n当numprocs=1时,process_name=%(program_name)s\r\n当numprocs>=2时,%(program_name)s_%(process_num)\r\n类似下面的配置\r\n\r\n```\r\n[program:sleeptime]\r\nautostart=true\r\nstartretries=3\r\ncommand=/opt/sleeptime.py\r\n#主要是下面的2行\r\nprocess_name=%(program_name)s%(process_num)s\r\nnumprocs=4\r\n```\r\n\r\n这个时候查看进程状态，会发现有4个进程出现\r\n```\r\nroot@0c1fc23d1398:/etc/supervisor/conf.d# supervisorctl status\r\nsleeptime:sleeptime0             RUNNING   pid 1139, uptime 0:00:04\r\nsleeptime:sleeptime1             RUNNING   pid 1140, uptime 0:00:04\r\nsleeptime:sleeptime2             RUNNING   pid 1141, uptime 0:00:04\r\nsleeptime:sleeptime3             RUNNING   pid 1142, uptime 0:00:03\r\nwebserver                        RUNNING   pid 1120, uptime 0:30:00\r\n```\r\n2.直接运行 supervisorctl status 报：\r\n\r\n```\r\nError: Server requires authentication\r\nFor help, use /usr/local/bin/supervisorctl -h\r\n```\r\n因为你设置访问账号密码，所以只能先supervisorctl进去，在status。\r\n主要还是看日志信息，和程序本身的日志。\r\n\r\n\r\n  [1]: /img/bVbwDes\r\n> 本文由 [systemofdown](https://www.bestyii.com/member/systemofdown) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\r\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"centos7","last_comment_time":1574212766,"last_comment_username":null,"view_count":4410,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574212766,"updated_at":1599391579},{"id":4,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":3,"title":"CentOS7 下 Docker 升级到最新版本","author":null,"excerpt":null,"image":null,"content":"## 1、查看系统要求\r\n\r\nDocker 要求 CentOS 系统的内核版本高于 3.10 ,查看CentOS的内核版本。\r\n```\r\nuname -a\r\n```\r\n## 2、删除旧版本\r\n```\r\nyum remove docker  docker-common docker-selinux docker-engine\r\n```\r\n## 3、安装需要的软件包\r\nyum-util 提供yum-config-manager功能，另外两个是devicemapper驱动依赖的\r\n```\r\nsudo yum install -y yum-utils device-mapper-persistent-data lvm2\r\n```\r\n## 4、设置Docker yum源\r\n```\r\nsudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\r\n```\r\n\r\n官方源有可能会很慢，不愿意等的把软件仓库地址替换腾讯云的镜像为:\r\n```\r\nsudo sed -i 's+download.docker.com+mirrors.cloud.tencent.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo\r\n```\r\n别忘了，刷新yum缓存\r\n```\r\nsudo yum makecache fast\r\n```\r\n\r\n## 5、查看所有仓库中所有docker版本\r\n可以查看所有仓库中所有docker版本,并选择特定的版本安装。\r\n```\r\nyum list docker-ce --showduplicates | sort -r\r\n```\r\n## 6、安装docker\r\n```\r\nsudo yum install docker-ce\r\n```\r\n由于repo中默认只开启stable仓库，故这里安装的是最新稳docker-ce-cli-19.03.1-3.el7.x86_64。\r\n如果要安装特定版本：\r\n```\r\nsudo yum install docker-ce-18.06.1.ce  \r\n```\r\n## 7、启动\r\n设置为开机启动\r\n```\r\nsystemctl enable docker\r\n```\r\n启动\r\n```\r\nsystemctl start docker\r\n```\r\n查看启动状态\r\n```\r\nsystemctl status docker\r\n```\r\n查看版本\r\n```\r\ndocker version\r\n```","tags":"docker,centos7","last_comment_time":1574213625,"last_comment_username":null,"view_count":8308,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574213625,"updated_at":1583307612},{"id":5,"site":"bestyii","type":"topic","post_meta_id":11,"user_id":3,"title":"关于PHP文件包含目录配置 open_basedir","author":null,"excerpt":null,"image":null,"content":"open_basedir 官方介绍\r\n=================\r\nopen_basedir string\r\n\r\n将 PHP 所能打开的文件限制在指定的目录树，包括文件本身。本指令不受安全模式打开或者关闭的影响。\r\n当一个脚本试图用例如 fopen() 或者 gzopen() 打开一个文件时，该文件的位置将被检查。\r\n当文件在指定的目录树之外时 PHP 将拒绝打开它。\r\n所有的符号连接都会被解析，所以不可能通过符号连接来避开此限制。\r\n特殊值 . 指明脚本的工作目录将被作为基准目录。但这有些危险，因为脚本的工作目录可以轻易被 chdir() 而改变。\r\n\r\n在 httpd.conf 文件中中，open_basedir 可以像其它任何配置选项一样用“php_admin_value open_basedir none”的方法关闭（例如某些虚拟主机中）。\r\n\r\n在 Windows 中，用分号分隔目录。在任何其它系统中用冒号分隔目录。作为 Apache 模块时，父目录中的 open_basedir 路径自动被继承。\r\n\r\n用 open_basedir 指定的限制实际上是前缀，不是目录名。\r\n也就是说“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”，如果它们存在的话。\r\n如果要将访问限制在仅为指定的目录，用斜线结束路径名。例如：“open_basedir = /dir/incl/”。\r\n\r\n> Note: 支持多个目录是 3.0.7 加入的。\r\n默认是允许打开所有文件。\r\n\r\n设置限制包含目录\r\n=============\r\n接下来总结下， 可以有几种方式设置限制包含目录\r\n1. php.ini  open_basedir = /home/wwwroot/\r\n2. ini_set   注意：PHP >5.2.3+ PHP_INI_ALL ，不建议使用，这么设置太随意了。\r\n3. apache 的 httpd.conf 中Directory配置\r\n```\r\n\"php_admin_value open_basedir none\" #关闭\r\nphp_admin_value open_basedir \"/home/wwwroot/:/tmp/:/var/tmp/:/proc/\"\r\n```\r\nhttpd.conf中VirtualHost\r\n```\r\nphp_admin_value open_basedir \"/home/wwwroot/:/tmp/:/var/tmp/:/proc/\"\r\n```\r\n4. nginx fastcgi.conf\r\n```\r\nfastcgi_param PHP_VALUE \"open_basedir=$document_root:/tmp/\";\r\n```\r\n5. .user.ini 文件\r\n设置方法同 1 .\r\n\r\n\r\n","tags":"php,安全","last_comment_time":1574213930,"last_comment_username":null,"view_count":3376,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574213930,"updated_at":1574214051},{"id":6,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":3,"title":"CentOS7下 yum 方式安装MySQL 5.7","author":null,"excerpt":null,"image":null,"content":"> 在CentOS中默认安装有MariaDB，这个是MySQL的分支，但为了需要，还是要在系统中安装MySQL，而且安装完成之后可以直接覆盖掉MariaDB。\r\n\r\n## 准备工作，卸载MariaDB\r\n\r\n```\r\nyum remove mariadb\r\n```\r\n## 安装Mysql 5.7\r\n### 1. 下载并安装MySQL官方的 Yum Repository\r\n\r\n\r\n使用下面的命令就直接下载了安装用的Yum Repository\r\n```\r\nwget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm\r\n```\r\n最新版的参考mysql官方下载地址：[https://dev.mysql.com/downloads/repo/yum/](https://dev.mysql.com/downloads/repo/yum/ )\r\n\r\n### 2. 安装 Yum Repository\r\n\r\n```\r\nyum -y install mysql57-community-release-el7-10.noarch.rpm\r\n```\r\n\r\n### 3. 安装MySQL服务\r\n这步可能会花些时间，安装完成后就会覆盖掉之前的mariadb。\r\n```\r\nyum -y install mysql-community-server\r\n```\r\n\r\n### 4. 启动MySQL\r\n启动mysql：\r\n```\r\nsystemctl start  mysqld.service\r\n```\r\n设置开机启动：\r\n```\r\nsystemctl enable  mysqld.service\r\n```\r\n查看MySQL运行状态：\r\n\r\n```\r\nsystemctl status mysqld.service\r\n```\r\n\r\n## 初始化mysql\r\n超级用户 `'root'@'localhost`被创建的时候，同时也设置了默认密码，这个密码明文方式存储在`error log`文件中. 是用下面命令可以快速的找到他.\r\n```\r\nshell> sudo grep 'temporary password' /var/log/mysqld.log\r\n```\r\n需要修改密码之后才可以使用。登录mysql修改密码：\r\n```\r\nshell> mysql -uroot -p\r\n```\r\n```\r\nmysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';\r\n```","tags":"yum,centos7","last_comment_time":1687678543,"last_comment_username":"at1456328","view_count":5401,"follow_count":0,"comment_count":1,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574214391,"updated_at":1687678543},{"id":7,"site":"bestyii","type":"topic","post_meta_id":8,"user_id":3,"title":"Yii2 queue的队列使用","author":null,"excerpt":null,"image":null,"content":"少废话主要看文档\r\n[官方文档 https://github.com/yiisoft/yii2-queue/blob/master/docs/guide/README.md](https://github.com/yiisoft/yii2-queue/blob/master/docs/guide/README.md)\r\n\r\n\r\nyii2-queue 的使用\r\n==============\r\n\r\n1.安装\r\n-----\r\n```\r\ncomposer require --prefer-dist yiisoft/yii2-queue\r\n```\r\n\r\n2.配置，在 common/config/main.php 中配置\r\n----------------------------------\r\n\r\nredis作为驱动\r\n\r\n```php\r\n    return [\r\n        'bootstrap' => [\r\n            'queue', // 把这个组件注册到控制台\r\n        ],\r\n        'components' => [\r\n            'redis' => [\r\n                'class' => \\yii\\redis\\Connection::class,\r\n                // ...\r\n            ],\r\n            'queue' => [\r\n                'class' => \\yii\\queue\\redis\\Queue::class,\r\n                'as log' => \\yii\\queue\\LogBehavior::class,//错误日志 默认为 console/runtime/logs/app.log\r\n                'redis' => 'redis', // 连接组件或它的配置\r\n                'channel' => 'queue', // Queue channel key\r\n            ],\r\n        ],\r\n    ];\r\n```\r\n\r\n\r\nFile 作为驱动\r\n\r\n```php\r\n    return [\r\n        'bootstrap' => [\r\n            'queue', // 把这个组件注册到控制台\r\n        ],\r\n        'components' => [\r\n            'queue' => [\r\n                'class' => \\yii\\queue\\file\\Queue::class,\r\n                'as log' => \\yii\\queue\\LogBehavior::class,//错误日志 默认为 console/runtime/logs/app.log\r\n                'path' => '@runtime/queue',\r\n            ],\r\n        ],\r\n    ];\r\n```\r\n3.新建 frontend/components/DownloadJob\r\n-------------------------------------\r\n```php\r\n    class DownloadJob extends BaseObject implements \\yii\\queue\\JobInterface\r\n    {\r\n        public $url;\r\n        public $file;\r\n\r\n        public function execute($queue)\r\n        {\r\n            file_put_contents($this->file, file_get_contents($this->url));\r\n        }\r\n    }\r\n```\r\n4.控制台\r\n------\r\n\r\n控制台用于监听和处理队列任务。\r\ncmd 下 监听队列\r\n```\r\n    yii queue/listen\r\n```\r\n5.添加到队列\r\n--------\r\n\r\n将任务添加到队列:\r\n```php\r\n    Yii::$app->queue->push(new frontend\\components\\DownloadJob([\r\n        'url' => 'http://example.com/image.jpg',\r\n        'file' => '/tmp/image.jpg',\r\n    ]));\r\n```\r\n\r\n将任务推送到队列中延时5分钟运行:\r\n```php\r\n    Yii::$app->queue->delay(5 * 60)->push(new frontend\\components\\DownloadJob([\r\n        'url' => 'http://example.com/image.jpg',\r\n        'file' => '/tmp/image.jpg',\r\n    ]));\r\n```\r\n6.测试\r\n-----\r\n\r\n执行 5 中的程序，控制台监听到，便会后台自动 下载http://example.com/image.jpg到本地为/tmp/image.jpg\r\n\r\n启动worker\r\n========\r\n\r\n可以使用Supervisor或Systemd 来启动多进程worker，也可以使用 Cron，我们这里主要说一下Supervisor\r\n\r\ncentos7 supervisor的使用\r\n=====================\r\n\r\n1.安装supervisor\r\n--------------\r\n```\r\n    yum update\r\n    yum install epel-release\r\n    yum install -y supervisor\r\n    #开机启动\r\n    systemctl enable supervisord\r\n    #启动\r\n    systemctl start supervisord\r\n```\r\n2.supervisor 命令\r\n---------------\r\n```\r\n    supervisorctl status 查看进程状态\r\n    supervisorctl reload 重启supervisord\r\n    supervisorctl start|stop|restart 启动关闭重启进程\r\n```\r\n3.添加配置文件\r\n--------\r\n\r\nSupervisor 配置文件通常在 /etc/supervisord.d 目录下. 你可以创建一些配置文件在这里.\r\n**注：文件名是.ini结尾**\r\n\r\n下面就是个例子:\r\n```\r\n    [program:yii-queue-worker]\r\n    process_name=%(program_name)s_%(process_num)02d\r\n    command=/usr/bin/php /var/www/my_project/yii queue/listen --verbose=1 --color=0\r\n    autostart=true\r\n    autorestart=true\r\n    user=www-data\r\n    numprocs=4\r\n    redirect_stderr=true\r\n    stdout_logfile=/var/www/my_project/log/yii-queue-worker.log\r\n```\r\n\r\n\n> 本文由 [systemofdown](https://www.bestyii.com/member/systemofdown) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"yii2,centos7","last_comment_time":1574214782,"last_comment_username":null,"view_count":5552,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574214782,"updated_at":1574214782},{"id":8,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":3,"title":"CentOS7下GitLab跨大版本升级","author":null,"excerpt":null,"image":null,"content":"备份&升级\r\n=====\r\n\r\n1.在升级前一定要做好备份，记录自己当前gitlab-ce的版本号。\r\n\r\n查看当前gitlab版本号\r\n\r\n```\r\nyum list | grep gitlab-ce\r\n```\r\n2.备份文件\r\n\r\n```\r\ngitlab-rake gitlab:backup:create\r\n```\r\n\r\n> 在目录/var/opt/gitlab/backups/下会生成一个备份文件如：1552552057_gitlab_backup.tar，其中1552552057即为此次备份都版本号。\r\n**还原备份（失败）**\r\n命令：*gitlab-rake gitlab:backup:restore BACKUP=备份版本号*\r\n\r\n3.配置gitlab-yum 本地源\r\n如清华的镜像：\r\n[https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/](https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/)\r\n\r\n```\r\n[root@localhost ~]# cat << EOF > /etc/yum.repos.d/gitlab-ce.repo\r\n\r\n> [gitlab-ce]\r\n> name=gitlab-ce\r\n> baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/\r\n> repo_gpgcheck=0\r\n> gpgcheck=0\r\n> enable=1\r\n> gpgkey=https://packages.gitlab.com/gpg.key\r\n> EOF\r\n```\r\n4.yum install安装\r\n> **升级Gitlab（注意：由于升级不能跨越大版本号，因此只能升级到当前大版本号到最高版本，方可升级到下一个大版本号）**\r\n\r\n依次执行下面指令逐步升级，在每一步安装成功后如果发现界面500，不可访问，那么执行gitlab-ctl reconfigure指令刷新配置文件。（一定保证数据可以正常访问方可执行下一步升级指令）\r\n\r\n> 升级过程中有可能会升级PostgreSQL，命令：sudo gitlab-ctl pg-upgrade\r\n\r\n查看所有可用的版本\r\n```\r\nyum list gitlab-ce --showduplicate  | sort -r\r\n```\r\n然后手动更新\r\n```\r\nyum install gitlab-ce-10.8.7-ce.0.el7\r\nyum install gitlab-ce-11.0.0-ce.0.el7\r\nyum install gitlab-ce-11.11.5-ce.0.el7\r\nyum install gitlab-ce-12.0.0-ce.0.el7\r\n...\r\nyum update\r\n```\r\n查看当前版本号\r\n\r\n```\r\ncat /opt/gitlab/embedded/service/gitlab-rails/VERSION\r\n```\r\n> 本文由 [systemofdown](https://www.bestyii.com/member/systemofdown) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\r\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"gitlab,yum,centos7","last_comment_time":1574214939,"last_comment_username":null,"view_count":7753,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574214939,"updated_at":1656141251},{"id":9,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":3,"title":"CentOS7下gitlab邮件服务设置","author":null,"excerpt":null,"image":null,"content":"1.配置文件位置\r\n--------\r\n\r\n```\r\nvim /etc/gitlab/gitlab.rb\r\n```\r\n\r\n以腾讯企业邮箱为例其它邮箱大同小异\r\n```\r\ngitlab_rails['smtp_enable'] = true\r\ngitlab_rails['smtp_address'] = \"smtp.exmail.qq.com\"\r\ngitlab_rails['smtp_port'] = 465\r\ngitlab_rails['smtp_user_name'] = \"邮箱地址\"\r\ngitlab_rails['smtp_password'] = \"password\"\r\ngitlab_rails['smtp_authentication'] = \"login\"\r\ngitlab_rails['smtp_enable_starttls_auto'] = true\r\ngitlab_rails['smtp_tls'] = true\r\ngitlab_rails['smtp_domain'] = \"exmail.qq.com\"\r\ngitlab_rails['gitlab_email_from'] = '邮箱地址'\r\n```\r\n\r\n2.更新配置\r\n------\r\n\r\n```\r\n    gitlab-ctl reconfigure\r\n```\r\n\r\n3.重启服务\r\n------\r\n\r\n```\r\ngitlab-ctl restart\r\n```\r\n\r\n4.非必需步骤进入控制台\r\n------------\r\n\r\n测试邮件服务是否正常\r\n```\r\ngitlab-rails console\r\n等到出现 “>”再执行下面命令\r\nNotify.test_email(\"XXX@XXX.XX\",\"title\",\"gitlab\").deliver_now\r\n```\n> 本文由 [systemofdown](https://www.bestyii.com/member/systemofdown) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"gitlab,yum,centos7","last_comment_time":1574215086,"last_comment_username":null,"view_count":3689,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574215086,"updated_at":1574215086},{"id":10,"site":"bestyii","type":"topic","post_meta_id":11,"user_id":3,"title":"国内 PHP Composer 镜像列表","author":null,"excerpt":null,"image":null,"content":"Composer 是什么？\r\n==============\r\nComposer 是一个 PHP 包管理的系统，现在越来越多的 PHP 使用 Composer 来管理包。比如 FastAdmin、 ThinkPHP、Laravel 等都是用 Composer 进行 php 包的管理。\r\n\r\n镜像列表\r\n=======\r\n国内也很多开发者使用 Composer，但由于不可控因素，官方的服务器常常连接不上。所以这里收集了一下国内镜像列表。（先后次序会不定期调整）\r\n\r\n镜像名 | 地址 | 赞助商 | 更新频率 | 备注\r\n- | - | - | - | -\r\n阿里云 Composer 镜像 | https://mirrors.aliyun.com/composer/ | 阿里云 | 96 秒 | 推荐\r\n腾讯云 Composer 镜像 | https://mirrors.cloud.tencent.com/composer/ | 腾讯云 | 24 小时 | -\r\n华为云 Composer 镜像 | https://repo.huaweicloud.com/repository/php/ | 华为云 | 未知 | 未知\r\n\r\n如何使用\r\n=======\r\n\r\n全局配置（推荐）\r\n--------------------\r\n所有项目都会使用该镜像地址：\r\n1. 阿里云\r\n```\r\ncomposer config -g repo.packagist composer https://mirrors.aliyun.com/composer/\r\n```\r\n2. 腾讯云\r\n```\r\ncomposer config -g repos.packagist composer https://mirrors.cloud.tencent.com/composer/\r\n```\r\n3. 华为云\r\n```\r\ncomposer config -g repos.packagist composer https://repo.huaweicloud.com/repository/php/\r\n```\r\n\r\n取消配置：\r\n```\r\ncomposer config -g --unset repos.packagist\r\n```\r\n项目配置\r\n----------\r\n仅修改当前工程配置，仅当前工程可使用该镜像地址：\r\n```\r\ncomposer config repo.packagist composer https://mirrors.aliyun.com/composer/\r\n```\r\n取消配置：\r\n```\r\ncomposer config --unset repos.packagist\r\n````\r\n调试\r\n-----\r\ncomposer 命令增加 -vvv 可输出详细的信息，命令如下：\r\n```\r\ncomposer -vvv require alibabacloud/sdk\r\n```\r\n","tags":"composer,php","last_comment_time":1574230513,"last_comment_username":null,"view_count":4622,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":1,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574230513,"updated_at":1574254684},{"id":11,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":2,"title":"CentOS7 Docker部署ELK(Elasticsearch Logstash Kibana)","author":null,"excerpt":null,"image":null,"content":"需求背景\r\n=======\r\n\r\n业务发展越来越庞大，服务器越来越多\r\n各种访问日志、应用日志、错误日志量越来越多，导致运维人员无法很好的去管理日志\r\n开发人员排查问题，需要到服务器上查日志，不方便\r\n运营人员需要一些数据，需要我们运维到服务器上分析日志\r\n\r\nELK vs. Elastic Stack\r\n================\r\n\r\nELK是三个开源软件的缩写，分别为：Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。\r\n目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。\r\nBeats，它是一个轻量级的日志收集处理工具(Agent)，占用资源少，适合于在各个服务器上搜集日志后传输给Logstash，官方也推荐此工具.\r\n\r\n![Elastic Stack](https://statics.bestyii.com/IlruqcCVqgKZSdwB.png \"Elastic Stack\")\r\n\r\nElastic Stack包含\r\n---------------------\r\n\r\nElasticsearch是个开源分布式搜索引擎，提供搜集、分析、存储数据三大功能。它的特点有：分布式，零配置，自动发现，索引自动分片，索引副本机制，restful风格接口，多数据源，自动搜索负载等。详细可参考[Elasticsearch权威指南](https://www.elastic.co/guide/en/elastic-stack/current/index.html \"Elasticsearch权威指南\")\r\n\r\nLogstash 主要是用来日志的搜集、分析、过滤日志的工具，支持大量的数据获取方式。一般工作方式为c/s架构，client端安装在需要收集日志的主机上，server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。\r\n\r\nKibana 也是一个开源和免费的工具，Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面，可以帮助汇总、分析和搜索重要数据日志。\r\n\r\nBeats在这里是一个轻量级日志采集器，其实Beats家族有6个成员，Beats所占系统的CPU和内存几乎可以忽略不计。\r\n\r\n- Packetbeat： 网络数据（收集网络流量数据）\r\n- Metricbeat： 指标 （收集系统、进程和文件系统级别的 CPU 和内存使用情况等数据）\r\n- Filebeat： 日志文件（收集文件数据）\r\n- Winlogbeat： windows事件日志（收集 Windows 事件日志数据）\r\n- Auditbeat：审计数据 （收集审计日志）\r\n- Heartbeat：运行时间监控 （收集系统运行时的数据）\r\n准备工作\r\n=======\r\nDocker 安装 请参考[CentOS7 下 Docker 升级到最新版本](https://www.bestyii.com/topic/4 \"CentOS7 下 Docker 升级到最新版本\")\r\n\r\n准备镜像\r\n=======\r\n6.0之后官方开始自己维护镜像版本:https://www.docker.elastic.co/ 。找到需要的ELK镜像地址，pull下来就好了。\r\n```\r\ndocker pull docker.elastic.co/elasticsearch/elasticsearch:7.4.2\r\ndocker pull docker.elastic.co/logstash/logstash:7.4.2\r\ndocker pull docker.elastic.co/kibana/kibana:7.4.2\r\n```\r\n官方pull下来之后镜像名太长了，所以我将镜像全部重新打了tag\r\n```\r\ndocker tag docker.elastic.co/elasticsearch/elasticsearch:7.4.2 elasticsearch:latest\r\ndocker tag docker.elastic.co/logstash/logstash:7.4.2 logstash:latest\r\ndocker tag docker.elastic.co/kibana/kibana:7.4.2 kibana:latest\r\n```\r\n\r\n使用`docker images`查看,确认是否成功\r\n```\r\n# docker images\r\nREPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE\r\ndocker.elastic.co/logstash/logstash             7.4.2               642b82780655        3 weeks ago         889MB\r\nlogstash                                        latest              642b82780655        3 weeks ago         889MB\r\nkibana                                          latest              230d3ded1abc        3 weeks ago         1.1GB\r\ndocker.elastic.co/kibana/kibana                 7.4.2               230d3ded1abc        3 weeks ago         1.1GB\r\ndocker.elastic.co/elasticsearch/elasticsearch   7.4.2               b1179d41a7b4        3 weeks ago         855MB\r\nelasticsearch                                   latest              b1179d41a7b4        3 weeks ago         855MB\r\n```\r\n安装docker版本ElasticSearch\r\n======================\r\n在elasticsearch的docker版本文档中，官方提到了vm.max_map_count的值在生产环境最少要设置成262144。设置的方式有两种\r\n1. 永久性的修改,在/etc/sysctl.conf文件中添加一行：\r\n```\r\ngrep vm.max_map_count /etc/sysctl.conf # 查找当前的值。\r\nvm.max_map_count=262144 # 修改或者新增\r\n```\r\n2. 正在运行的机器\r\n```\r\nsysctl -w vm.max_map_count=262144\r\n```\r\n之后我们执行命令，暴露容器的9200，9300端口，方便我们在其它机器上可以通过类似head插件去做es索引的操作等。执行命令为：\r\n```\r\ndocker run -p 127.0.0.1:9200:9200 -p 9300:9300 --name elasticsearch -e \"discovery.type=single-node\" elasticsearch\r\n```\r\n> 如果实际使用中，可能需要设置集群等操作。因实际情况而定。如果你需要存储历史数据，那么就可能需要将data目录保存到本地，使用-v，或者mount参数挂载本地一个目录。如果实际使用中，可能需要设置集群等操作。因实际情况而定。如果你需要存储历史数据，那么就可能需要将data目录保存到本地，使用-v，或者mount参数挂载本地一个目录。\r\n\r\n设置外部目录\r\n--\r\n在本文实例中采用的就是存储到外部目录，文件系统必须是elasticsearch用户可读。\r\n> 默认情况下, Elasticsearch 运行的容器内部用户 elasticsearch 的 uid:gid 是 1000:1000.\r\n\r\n```\r\nmkdir esdatadir\r\nchmod g+rwx esdatadir\r\nchgrp 1000 esdatadir\r\n```\r\n在启动命令中添加参数\r\n```\r\ndocker run  -e ES_JAVA_OPTS=\"-Xms8g -Xmx8g\"  -d -v /srv/esdatadir/logs:/usr/share/elasticsearch/logs   -v /srv/esdatadir/data:/usr/share/elasticsearch/data -p 127.0.0.1:9200:9200 -p 9300:9300  --restart=always --name elasticsearch -e \"discovery.type=single-node\" elasticsearch\r\n```\r\n> 设置JVM堆的大小\r\n使用环境变量 `ES_JAVA_OPTS` 去定义堆的大小. 例如, 设置为 16GB, 在docker run 时加入参数` -e ES_JAVA_OPTS=\"-Xms16g -Xmx16g\"`.\r\n- Elasticsearch 在jvm.options中指定了Xms(最小)和Xmx(最大)的堆的设置。所设置的值取决于你的服务器的可用内存大小。\r\n- 最小堆的大小和最大堆的大小应该相等。\r\n- 设置最大堆的值不能超过你物理内存的50%，要确保有足够多的物理内存来保证内核文件缓存。\r\n\r\n安装docker版本kibana\r\n=================\r\n启动kibana\r\n-------------\r\nkibana的作用主要是帮助我们将日志文件可视化。便于我们操作，统计等。它需要ES服务，所以我们将部署好的es和kibana关联起来，主要用到的参数是`--link`:\r\n\r\n```\r\ndocker run -d -p 5601:5601  --restart=always --link elasticsearch -e ELASTICSEARCH_URL=http://elasticsearch:9200 kibana\r\n```\r\n使用link参数，会在kibana容器hosts文件中加入elasticsearch ip地址，这样我们就直接通过定义的name来访问es服务了。\r\n\r\n使用Nginx作为反向代理访问kibana\r\n------------------------------------------\r\n安装httpd-tools\r\n```\r\nyum install -y httpd-tools\r\n```\r\n安装nginx，采用nginx官方源安装,详细参考[Nginx官方手册](http://nginx.org/en/linux_packages.html#RHEL-CentOS \"Nginx官方手册\")\r\n```\r\nsudo yum install yum-utils\r\n```\r\n创建源配置文件`/etc/yum.repos.d/nginx.repo`,并在文件中写入以下信息\r\n```\r\n[nginx-stable]\r\nname=nginx stable repo\r\nbaseurl=http://nginx.org/packages/centos/$releasever/$basearch/\r\ngpgcheck=1\r\nenabled=1\r\ngpgkey=https://nginx.org/keys/nginx_signing.key\r\nmodule_hotfixes=true\r\n\r\n[nginx-mainline]\r\nname=nginx mainline repo\r\nbaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/\r\ngpgcheck=1\r\nenabled=0\r\ngpgkey=https://nginx.org/keys/nginx_signing.key\r\nmodule_hotfixes=true\r\n```\r\n安装nginx\r\n```\r\nsudo yum install nginx\r\n```\r\n创建nginx对应的kibana配置文件\r\n```\r\ncd /etc/nginx/conf.d/\r\nvim kibana.conf\r\n```\r\n加入下列参数\r\n```\r\nserver {\r\n    listen 80;\r\n\r\n    server_name elk.bestyii.com; #别忘了改成自己的\r\n\r\n    auth_basic \"Restricted Access\";\r\n    auth_basic_user_file /etc/nginx/.kibana-user;\r\n\r\n    location / {\r\n        proxy_pass http://127.0.0.1:5601;\r\n        proxy_http_version 1.1;\r\n        proxy_set_header Upgrade $http_upgrade;\r\n        proxy_set_header Connection 'upgrade';\r\n        proxy_set_header Host $host;\r\n        proxy_cache_bypass $http_upgrade;\r\n    }\r\n}\r\n```\r\n接下来我们为这个访问地址加上个登录授权的账号\r\n```\r\nsudo htpasswd -c /etc/nginx/.kibana-user bestyii\r\n#输入两边密码就可以了\r\n```\r\n测试以下配置文件是否正确\r\n```\r\nnginx -t\r\n```\r\n确认争取无误后，设置nignx开机启动并启动\r\n```\r\nsystemctl enable nginx\r\nsystemctl start nginx\r\n```\r\n现在我们就可以打开浏览器访问到kibana了。\r\n安装logstash\r\n==========\r\n前面的kibana和ES的安装，如果我们在开发环境中并不需要太多的关注他们的详细配置。但是logstash和filebeat我们需要注意下它的配置，因为这两者是我们完成需求的重要点。\r\n\r\nlogstash我们只让它进行日志处理，处理完之后将其输出到elasticsearch。\r\n例如我们需要收集系统日志，我们先定义一些设置，保存在外部目录`/srv/logstashdir/logstash.conf`中，运行docker的时候连接过去方便修改。\r\n```\r\ninput {\r\n  beats {\r\n    port => 5044\r\n  }\r\n}\r\nfilter {\r\n  if [type] == \"syslog\" {\r\n    grok {\r\n      match => { \"message\" => \"%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\\[%{POSINT:syslog_pid}\\])?: %{GREEDYDATA:syslog_message}\" }\r\n      add_field => [ \"received_at\", \"%{@timestamp}\" ]\r\n      add_field => [ \"received_from\", \"%{host}\" ]\r\n    }\r\n    date {\r\n      match => [ \"syslog_timestamp\", \"MMM  d HH:mm:ss\", \"MMM dd HH:mm:ss\" ]\r\n    }\r\n  }\r\n}\r\noutput {\r\n  elasticsearch {\r\n    hosts => [\"elasticsearch:9200\"]\r\n    manage_template => false\r\n    index => \"%{[@metadata][beat]}-%{+YYYY.MM.dd}\"\r\n    document_type => \"%{[@metadata][type]}\"\r\n  }\r\n}\r\n```\r\n> 注意：hosts的地址，我们用的是`elasticsearch:9200`,是因为下面的启动命令是用了` --link elasticsearch `,前面提到link的作用，所以docker内部会设置hosts。\r\n\r\n启动docker版logstash\r\n```\r\ndocker run  -d -p 5044:5044 -p 9600:9600 --rm -it  --name logstash --link elasticsearch -v /srv/logstashdir/config:/usr/share/logstash/config -v /srv/logstashdir/pipeline:/usr/share/logstash/pipeline logstash\r\n```\r\n至此服务端已经算是搭建完成了。\r\n\r\n在客户端中安装filebeat\r\n==================\r\n客户端安装，可以是docker版本也可以是直接yum安装，这就无所谓了。\r\n本文就采用是yum安装为例。\r\n\r\n安装Filebeat\r\n---------------\r\n导入elasticsearch key\r\n```\r\nrpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch\r\n```\r\n创建源配置文件`vim /etc/yum.repos.d/elasticsearch.repo`并添加官方源信息\r\n```\r\n[elasticsearch-7.x]\r\nname=Elasticsearch repository for 7.x packages\r\nbaseurl=https://artifacts.elastic.co/packages/7.x/yum\r\ngpgcheck=1\r\ngpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch\r\nenabled=1\r\nautorefresh=1\r\ntype=rpm-md\r\n```\r\n安装\r\n```\r\nyum -y install filebeat\r\n```\r\n配置 Filebeat\r\n----------------\r\n配置文件在本地目录`/etc/filebeat`中，编辑`filebeat.yml`\r\n```\r\nvim /etc/filebeat/filebeat.yml\r\n```\r\n修改输出的ip地址\r\n```\r\noutput.logstash:\r\n  # The Logstash hosts\r\n  hosts: [\"10.5.5.25:5044\"]\r\n```\r\n接下来, 我们需要启用filebeat modules. 运行 filebeat 命令获取可用 filebeat modules 清单.\r\n```\r\nfilebeat modules list\r\n```\r\n启用 `system` module\r\n```\r\nfilebeat modules enable system\r\n```\r\n filebeat system module 是配合着配置文件`modules.d/system.yml`使用的 .\r\n我们用的是CentOS系统，所以需要调整一下\r\n```\r\nvim /etc/filebeat/modules.d/system.yml\r\n```\r\n我们要监控登录的日志和系统日志\r\n```\r\n# Syslog\r\n  syslog:\r\n    enabled: true\r\n    var.paths: [\"/var/log/messages\"]\r\n\r\n  # Authorization logs\r\n  auth:\r\n    enabled: true\r\n    var.paths: [\"/var/log/secure\"]\r\n```\r\n现在就配置好了，启动，并设置开机自动启动。\r\n```\r\nsystemctl enable filebeat\r\nsystemctl start filebeat\r\n```\r\n看一下运行的状态\r\n```\r\nsystemctl status filebeat\r\n```\r\n在Kibana中测试\r\n============\r\n登录到 elk.bestyii.com，输入用户名密码，进入到 Kibana Dashboard。\r\n![](https://statics.bestyii.com/L9sdFAphS2HUZ8QQ.png)\r\n\r\n点击 'Connect to your Elasticsearch index'，创建索引。\r\n\r\n创建 'filebeat-*' 索引规则，并点击'Next step' 按钮。\r\n![](https://statics.bestyii.com/CLO78pxeUqGhy5TG.png)\r\n\r\n filter name, 选择 '@timestamp' 并点击 'Create index pattern'。\r\n![](https://statics.bestyii.com/KQhji-i1qUrVGoWn.png)\r\n\r\n此时 'filebeat-*' 索引规则已经创建完成, 点击 'Discover' 菜单离开。\r\n![](https://statics.bestyii.com/n7q74QS-4WSkx1sr.png)\r\n\r\n你就可以看到从filebeat发出来的log 数据。\r\nCentOS 7 system Logs\r\n![](https://statics.bestyii.com/VUqAM3qUBt3nQyTl.png)\r\n\r\n\r\n> 本文由 [ez](https://www.bestyii.com/member/ez) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\r\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"ELK,Elasticsearch,Logstash,Kibana,docker,centos7","last_comment_time":1574649668,"last_comment_username":null,"view_count":6380,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574649668,"updated_at":1581614271},{"id":12,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":2,"title":"CentOS7 挂载新硬盘","author":null,"excerpt":null,"image":null,"content":"查看系统是否检测到新的硬盘设备\r\n=========================\r\nhd, sd, vd 都试试\r\n```\r\nls /dev/ |grep sd\r\n```\r\n我的服务器的结果\r\n```\r\n# ls /dev/ |grep vd\r\nvda\r\nvda1\r\nvdb\r\n```\r\n就是他vdb，没有分区\r\n\r\n查看分区大小\r\n----------------\r\n```\r\nfdisk -l\r\n```\r\n\r\n新的硬盘分区\r\n===========\r\n```\r\nfdisk /dev/vdb\r\n```\r\n开始\r\n```\r\n]# fdisk /dev/vdb\r\nWelcome to fdisk (util-linux 2.23.2).\r\n\r\nChanges will remain in memory only, until you decide to write them.\r\nBe careful before using the write command.\r\n\r\nDevice does not contain a recognized partition table\r\nBuilding a new DOS disklabel with disk identifier 0xf39a3343.\r\n\r\n\r\nCommand (m for help): m # 先输入个m看看菜单\r\nCommand action\r\n   a   toggle a bootable flag\r\n   b   edit bsd disklabel\r\n   c   toggle the dos compatibility flag\r\n   d   delete a partition\r\n   g   create a new empty GPT partition table\r\n   G   create an IRIX (SGI) partition table\r\n   l   list known partition types\r\n   m   print this menu\r\n   n   add a new partition\r\n   o   create a new empty DOS partition table\r\n   p   print the partition table\r\n   q   quit without saving changes\r\n   s   create a new empty Sun disklabel\r\n   t   change a partition's system id\r\n   u   change display/entry units\r\n   v   verify the partition table\r\n   w   write table to disk and exit\r\n   x   extra functionality (experts only)\r\n```\r\n\r\n一般新建一个分区的输入 n ，分区的类型选 p 然后选分区起始扇区和结尾扇区。\r\n分配完成后，输入w 保存\r\n```\r\nCommand (m for help): n\r\nPartition type:\r\n   p   primary (0 primary, 0 extended, 4 free)\r\n   e   extended\r\nSelect (default p): p\r\nPartition number (1-4, default 1): 1\r\nFirst sector (2048-2097151999, default 2048): \r\nUsing default value 2048\r\nLast sector, +sectors or +size{K,M,G} (2048-2097151999, default 2097151999): \r\nUsing default value 2097151999\r\nPartition 1 of type Linux and of size 1000 GiB is set\r\n\r\nCommand (m for help): w\r\nThe partition table has been altered!\r\n\r\nCalling ioctl() to re-read partition table.\r\nSyncing disks.\r\n```\r\n\r\n设置分区格式\r\n==========\r\n\r\n给分区设置xfs格式,可能时间会久，不要慌张，等一下就好了\r\n\r\n```\r\nmkfs.xfs -f /dev/vdb1\r\n```\r\n\r\n挂载\r\n====\r\n\r\n临时挂载\r\n-----------\r\n\r\n先创建目录，再将分区挂载到目录上。临时挂载重启后需要重新挂载\r\n\r\n```\r\nmkdir /data1\r\nmount -t xfs /dev/vdb1 /data1\r\n```\r\n或挂载已有目录中，我习惯用srv作为扩展，所以\r\n```\r\nmount -t xfs /dev/vdb1 /srv\r\n```\r\n\r\n永久挂载\r\n-----------\r\n\r\n修改系统挂载硬盘的文件，其中0 0 表示在在开机时不对分区进行检查\r\n\r\n```\r\nvim /etc/fstab\r\n#添加以下配置\r\n/dev/vdb1       /srv      xfs   defaults   0 0\r\n```\r\n\r\n补充命令\r\n=======\r\n```\r\n#查看已经挂载的分区和文件系统类型\r\ndf -T\r\n\r\n#显示出所有挂载和未挂载的分区，但不显示文件系统类型\r\nfdisk -l\r\n\r\n#查看未挂载的文件系统类型，以及哪些分区尚未格式化\r\nparted -l\r\n\r\n#查看未挂载的文件系统类型\r\nlsblk -f\r\n```\r\n> 本文由 [ez](https://www.bestyii.com/member/ez) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\r\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"文件系统,centos7","last_comment_time":1574651278,"last_comment_username":null,"view_count":4452,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574651278,"updated_at":1581614335},{"id":13,"site":"bestyii","type":"topic","post_meta_id":11,"user_id":3,"title":"解决 composer proc_open(): Cannot allocate memory","author":null,"excerpt":null,"image":null,"content":"问题描述\r\n=======\r\n在linux服务器使用composer部署yii项目时，出现“proc_open(): fork failed - Cannot allocate memory”\r\n\r\n也就是提示“提示内存不足”，我们可以通过创建swap分区解决这个问题。\r\n\r\n解决方法\r\n=======\r\n\r\n- 先运行 free -m 看下空间是多少\r\n- 在命令行环境依次运行以下三条命令\r\n\r\n```\r\ndd if=/dev/zero of=/var/swap.1 bs=1M count=1024\r\nmkswap /var/swap.1\r\nswapon /var/swap.1\r\n```\r\n\r\n解释\r\n\r\ndd 从/dev/zero设备复制出一个1G大小的文件/var/swap.1\r\n\r\nmkswap 格式化/var/swap.1\r\n\r\nswapon 将swap分区挂在到文件系统\r\n\r\n然后输入free -m 查看内存使用量信息","tags":"composer,centos7","last_comment_time":1574654716,"last_comment_username":null,"view_count":3623,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574654716,"updated_at":1574654796},{"id":14,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":2,"title":"CentOS 7 下 Nginx 安全加固配置规范","author":null,"excerpt":null,"image":null,"content":"#目标\r\n安全，安全，安全\r\n\r\n#WEB服务器搭建\r\n在做yii开发的时候，离不开nginx+php-fpm组合。所以我们是在CentOS 7 中使用Nginx作为web服务\r\n##一. Nginx 安装\r\n安装nginx，采用nginx官方源安装,详细参考[Nginx官方手册](http://nginx.org/en/linux_packages.html#RHEL-CentOS \"Nginx官方手册\")\r\n###1. 准备工作\r\n开始安装前，需要一些前置工具的安装\r\n```\r\nsudo yum install yum-utils\r\n```\r\n###2. 官方源设置\r\n创建源配置文件`/etc/yum.repos.d/nginx.repo`,并在文件中写入以下信息\r\n```\r\n[nginx-stable]\r\nname=nginx stable repo\r\nbaseurl=http://nginx.org/packages/centos/$releasever/$basearch/\r\ngpgcheck=1\r\nenabled=1\r\ngpgkey=https://nginx.org/keys/nginx_signing.key\r\nmodule_hotfixes=true\r\n\r\n[nginx-mainline]\r\nname=nginx mainline repo\r\nbaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/\r\ngpgcheck=1\r\nenabled=0\r\ngpgkey=https://nginx.org/keys/nginx_signing.key\r\nmodule_hotfixes=true\r\n```\r\n###3. 安装\r\n安装nginx\r\n```\r\nsudo yum install nginx\r\n```\r\n\r\n设置nignx开机启动并启动\r\n```\r\nsystemctl enable nginx\r\nsystemctl start nginx\r\n```\r\n##二. 配置Yii网站\r\n创建nginx对应的yii配置文件\r\n```\r\nvim /etc/nginx/conf.d/yii.conf\r\n```\r\n加入下列参数，参考：[推荐使用的 Nginx 配置](https://www.yiiframework.com/doc/guide/2.0/zh-cn/start-installation#recommended-nginx-configuration \"推荐使用的 Nginx 配置\")\r\n```\r\nserver {\r\n    charset utf-8;\r\n    client_max_body_size 128M;\r\n\r\n    listen 80; ## listen for ipv4\r\n    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6\r\n\r\n    server_name www.bestyii.com;\r\n    root        /path/to/basic/web;\r\n    index       index.php;\r\n\r\n    access_log  /path/to/basic/log/access.log;\r\n    error_log   /path/to/basic/log/error.log;\r\n\r\n    location / {\r\n        # Redirect everything that isn't a real file to index.php\r\n        try_files $uri $uri/ /index.php$is_args$args;\r\n    }\r\n\r\n    # uncomment to avoid processing of calls to non-existing static files by Yii\r\n    #location ~ \\.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {\r\n    #    try_files $uri =404;\r\n    #}\r\n    #error_page 404 /404.html;\r\n\r\n    # deny accessing php files for the /assets directory\r\n    location ~ ^/assets/.*\\.php$ {\r\n        deny all;\r\n    }\r\n\r\n    location ~ \\.php$ {\r\n        include fastcgi_params;\r\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\r\n        fastcgi_pass 127.0.0.1:9000;\r\n        #fastcgi_pass unix:/var/run/php5-fpm.sock;\r\n        try_files $uri =404;\r\n    }\r\n\r\n    location ~* /\\. {\r\n        deny all;\r\n    }\r\n}\r\n```\r\n> 使用该配置时，你还应该在 `php.ini` 文件中设置 `cgi.fix_pathinfo=0` ， 能避免掉很多不必要的 stat() 系统调用。\r\n\r\n>还要注意当运行一个 HTTPS 服务器时，需要添加 `fastcgi_param HTTPS on;` 一行， 这样 Yii 才能正确地判断连接是否安全。\r\n\r\n测试以下配置文件是否正确\r\n```\r\nnginx -t\r\n```\r\n确认无误后，重启Nignx 使之生效。\r\n```\r\nsystemctl restart nginx\r\n```\r\n\r\n#安全加固\r\nnginx的多年发展，自身的安全漏洞比较少，一般利用软件包管理器（yum）升级一下就好了。\r\n\r\n现在侧重讲述如何利用nginx来加固web应用，干一些应用防火墙（WAF）干的活。\r\n##默认参数重置\r\n\r\n软件本身会有一些默认参数，往往这些参数会暴露更多的信息，或者留有安全隐患。所以我们要合理的调整系统参数。\r\n###防止Host头攻击\r\n访问网站时如果访问路径中缺少/，大多数中间件都会自动将路径补全，返回302或301跳转如下图，Location位置的域名会使用Host头的值。\r\n\r\n> 这种情况实际上风险较低，难以构成Host头攻击。但是由于大多漏洞扫描器会将这种情况检测为Host头攻击，为了通过上级检查或各种审核，大多数甲方单位会要求修复漏洞，彻底解决问题。\r\n\r\n添加一个默认server，当host头被修改匹配不到server时会跳到该默认server，该默认server直接返回403错误。\r\n```\r\nserver {\r\n\r\n       listen 80 default;\r\n\r\n       server_name _;\r\n\r\n       location / {\r\n\r\n            return 403;\r\n\r\n       }\r\n\r\n}\r\n```\r\n\r\n###禁用autoindex\r\n确保nginx.conf配置文件上禁用autoindex，即autoindex off或者没有配置autoindex。\r\n\r\n###关闭服务器标记\r\n`server_tokens off;`建议加载全局配置中。如：\r\n```\r\nhttp{\r\n    include       naxsi_core.rules;\r\n    include      mime.types;\r\n    default_type  application/octet-stream;\r\n    sendfile        on;\r\n    server_tokens off;#关闭服务器标记\r\n    ... ...\r\n```\r\n\r\n###自定义缓存\r\n设置自定义缓存以限制缓冲区溢出攻击。nginx.conf配置如下：\r\n```\r\nhttp{\r\n    ... ...\r\n    server{\r\n        ... ...\r\n        client_body_buffer_size  16K;\r\n       client_header_buffer_size  1k;\r\n        client_max_body_size  1m;\r\n       large_client_header_buffers  4  8k;\r\n        ... ...\r\n```\r\n>  注：上述的参数不是最优参数，仅供参考。\r\n\r\n设置timeout设置timeout设低来防御DOS攻击，nginx.conf配置如下：\r\n```\r\nhttp {\r\n    ... ...\r\n       client_body_timeout   10;\r\n       client_header_timeout  30;\r\n       keepalive_timeout     30  30;\r\n       send_timeout          10;\r\n```\r\n\r\n###限制访问的方法\r\n在目前的应用系统中值使用到POST和GET方法，所以除了它们之外，其他方式的请求均可拒绝。Nginx.conf配置如下：\r\n```\r\nserver{\r\n       ... ...\r\n       if($request_method !~ ^(GET|HEAD|POST)$) {        \r\n                     return404;\r\n              }\r\n       ... ...\r\n```\r\n\r\n###封杀各种user-agent\r\nuser-agent 也即浏览器标识，每个正常的web请求都包含用户的浏览器信息，除非经过伪装，恶意扫描工具一般都会在user-agent里留下某些特征字眼，比如scan，nmap等。我们可以用正则匹配这些字眼，从而达到过滤的目的，请根据需要调整。\r\n```\r\nif ($http_user_agent ~* \"java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan\" ) {\r\n    return 403;\r\n}\r\n```\r\n这里分析得不够细致，具体的非法user-agent还得慢慢从日志中逐个提取。\r\n\r\n##封杀特定的url\r\n特定的文件扩展名，比如.bak\r\n```\r\nlocation ~* \\.(bak|save|sh|sql|mdb|svn|git|old)$ {\r\n    rewrite ^/(.*)$  $host  permanent;\r\n}\r\n```\r\n知名程序,比如phpmyadmin\r\n```\r\nlocation /(admin|phpadmin|status)  {\r\n    deny all;\r\n}\r\n```\r\n##强制网站使用域名访问\r\n可以逃过IP扫描，比如\r\n```\r\nif ( $host !~* 'abc.com' ) {\r\n    return 403;\r\n}\r\n```\r\n##url 参数过滤敏感字\r\n```\r\nif ($query_string ~* \"union.*select.*\\(\") {\r\n    rewrite ^/(.*)$  $host  permanent;\r\n}\r\n\r\nif ($query_string ~* \"concat.*\\(\") {\r\n    rewrite ^/(.*)$  $host  permanent;\r\n}\r\n```\r\n在头信息中定义安全参数\r\n```\r\n # Security headers\r\n    add_header X-Frame-Options \"SAMEORIGIN\" always;\r\n    add_header X-XSS-Protection \"1; mode=block\" always;\r\n    add_header X-Content-Type-Options \"nosniff\" always;\r\n    add_header Referrer-Policy \"no-referrer-when-downgrade\" always;\r\n    add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\" always;\r\n   add_header Content-Security-Policy \"default-src 'self';  style-src  'unsafe-inline'  'self';  script-src  'unsafe-inline' 'self' *.bestyii.com analysis.bestyii.com *.baidu.com *.google-analytics.com;  img-src 'self' data: oss.bestyii.com *.baidu.com *.google-analytics.com;  connect-src  'self'  *.baidu.com ;\"; #按需配置\r\n\r\n```\r\n> 本文由 [ez](https://www.bestyii.com/member/ez) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\r\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"安全,nginx,yii2","last_comment_time":1574849483,"last_comment_username":null,"view_count":8250,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574849483,"updated_at":1575877885},{"id":15,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":4,"title":"CentOS 7 下搭建LNMP运行环境(nginx,php,mariadb)","author":null,"excerpt":null,"image":null,"content":"# 环境搭建步骤\r\n\r\n## 初步步骤\r\n#### 1.检查centos版本\r\n执行命令\r\n```\r\ncat /etc/centos-release\r\n```\r\n执行结果\r\n\r\n```\r\n# CentOS Linux release 7.6.1810 (Core)\r\n```\r\n#### 2. 设置时区\r\n```\r\ntimedatectl list-timezones\r\nsudo timedatectl set-timezone 'Asia/Shanghai'\r\n```\r\ndate 命令查看时区\r\n```\r\ndate\r\n```\r\n#### 3. 更新操作系统软件包\r\n```\r\nsudo yum update -y\r\n```\r\n若执行失败 可参考网站(https://mirrors.tuna.tsinghua.edu.cn/help/centos/)\r\n\r\n#### 4. 安装CentOS操作系统基本管理所需的一些基本软件包\r\n\r\n```\r\nsudo yum install -y curl wget vim git unzip socat bash-completion epel-release\r\n```\r\n\r\n## 第1步 - 安装PHP和必要的PHP扩展\r\n\r\n#### 1. 设置Webtatic YUM源：\r\n```\r\nsudo rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm\r\n```\r\n\r\n#### 2. 安装PHP，以及必要的PHP扩展：\r\n```\r\nsudo yum install -y php72w php72w-cli php72w-fpm php72w-common php72w-mbstring php72w-zip php72w-mysql php72w-sqlite3 php72w-curl php72w-xml php72-gd  php72w-intl\r\n```\r\n要显示在模块中编译的PHP，您可以运行：\r\n\r\n```\r\nphp -m\r\n\r\n```\r\n运行结果\r\n\r\n```\r\n[PHP Modules]\r\nbz2\r\ncalendar\r\nCore\r\nctype\r\ncurl\r\ndate\r\ndom\r\n\r\n```\r\n检查PHP版本：\r\n\r\n```\r\nphp --version\r\n```\r\n运行结果\r\n\r\n```\r\n# PHP 7.2.14 (cli) (built: Jan 12 2019 12:47:33) ( NTS )\r\n# Copyright (c) 1997-2018 The PHP Group\r\n# Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies\r\n#     with Zend OPcache v7.2.14, Copyright (c) 1999-2018, by Zend Technologies\r\n```\r\n#### 3. 启动并启用PHP-FPM服务：\r\n```\r\nsudo systemctl start php-fpm.service\r\nsudo systemctl enable php-fpm.service\r\n```\r\n继续下一步，即数据库安装和设置\r\n\r\n## 第2步 - 安装数据库和设置\r\n#### 1.安装数据库服务器\r\n```\r\nsudo yum install -y mariadb-server\r\n```\r\n检查数据库版本\r\n\r\n```\r\nmysql --version\r\n```\r\n运行结果\r\n\r\n```\r\n# mysql  Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1\r\n\r\n```\r\n如果是远程环境，不需要设置服务启动和密码(进行2,3步骤)\r\n\r\n#### 2.启动服务\r\n\r\n```\r\nsudo systemctl start mariadb.service\r\nsudo systemctl enable mariadb.service\r\n```\r\n#### 3. 数据库密码设置\r\n\r\n```\r\nsudo mysql_secure_installation\r\n```\r\n回答每个问题：\r\n\r\n```\r\nWould you like to setup VALIDATE PASSWORD plugin? N\r\nNew password: your_secure_password\r\nRe-enter new password: your_secure_password\r\nRemove anonymous users? [Y/n] Y\r\nDisallow root login remotely? [Y/n] Y\r\nRemove test database and access to it? [Y/n] Y\r\nReload privilege tables now? [Y/n] Y\r\n```\r\n以root用户身份连接到  mysql  shell：\r\n\r\n```\r\nsudo mysql -u root -p\r\n# Enter password\r\n```\r\n为Bolt CMS 创建一个空的  MariaDB 数据库和用户并记住凭据：\r\n\r\n```\r\nMariaDB> CREATE DATABASE dbname;\r\nMariaDB> GRANT ALL ON dbname.* TO 'username' IDENTIFIED BY 'password';\r\nMariaDB> FLUSH PRIVILEGES;\r\n```\r\n\r\n退出  MariaDB：\r\n\r\n```\r\nMariaDB> exit\r\n```\r\n替换，并用您自己的名字。 dbname username  password \r\n\r\n\r\n## 第三步 - 安装nginx\r\nnginx 安装参考文档\r\nhttp://nginx.org/en/linux_packages.html#RHEL-CentOS\r\n#### 1. 安装 yum-utils\r\n```\r\nsudo yum install yum-utils\r\n```\r\n#### 创建一个文件， /etc/yum.repos.d/nginx.repo 使用如下内容\r\n```\r\n[nginx-stable]\r\nname=nginx stable repo\r\nbaseurl=http://nginx.org/packages/centos/$releasever/$basearch/\r\ngpgcheck=1\r\nenabled=1\r\ngpgkey=https://nginx.org/keys/nginx_signing.key\r\n\r\n[nginx-mainline]\r\nname=nginx mainline repo\r\nbaseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/\r\ngpgcheck=1\r\nenabled=0\r\ngpgkey=https://nginx.org/keys/nginx_signing.key\r\n```\r\n安装nginx\r\n```\r\nsudo yum install nginx\r\n```\r\n\r\n检查nginx的版本\r\n\r\n```\r\nnginx -v\r\n```\r\n运行结果\r\n\r\n```\r\n# nginx version: nginx/1.12.2\r\n```\r\n#### 2.启动并启用Nginx服务：\r\n\r\n```\r\nsudo systemctl start nginx.service\r\nsudo systemctl enable nginx.service\r\n```\r\n#### 3.通过运行以下命令 为Pagekit 配置  NGINX：\r\n```\r\nsudo vim /etc/nginx/conf.d/pagekit.conf\r\n```\r\n并使用以下配置填充文件：\r\n```\r\nserver {\r\n    listen [::]:443 ssl http2;\r\n    listen 443 ssl http2;\r\n    listen [::]:80;\r\n    listen 80;\r\n    # 配置自己的域名\r\n    server_name example.com;\r\n\r\n    index index.php index.html;\r\n    #配置项目目录\r\n    root /var/www/pagekit;\r\n\r\n    ssl_certificate /etc/letsencrypt/example.com/fullchain.pem;\r\n    ssl_certificate_key /etc/letsencrypt/example.com/private.key;\r\n    ssl_certificate /etc/letsencrypt/example.com_ecc/fullchain.pem;\r\n    ssl_certificate_key /etc/letsencrypt/example.com_ecc/private.key;\r\n\r\n    location / {\r\n        try_files $uri $uri/ /index.php?$query_string;\r\n    }\r\n\r\n    location ~ \\.php$ {\r\n        fastcgi_split_path_info ^(.+\\.php)(/.+)$;\r\n        try_files $fastcgi_script_name =404;\r\n        set $path_info $fastcgi_path_info;\r\n        fastcgi_param PATH_INFO $path_info;\r\n        fastcgi_index index.php; include fastcgi.conf;\r\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\r\n        fastcgi_pass 127.0.0.1:9000;\r\n    }\r\n\r\n}\r\n```\r\n如果是yii框架,参考网站 https://www.yiichina.com/doc/guide/2.0/start-installation\r\n\r\n检查  NGINX 配置是否存在语法错误：\r\n\r\n```\r\nsudo nginx -t\r\n```\r\n#### 4.重新启动NGINX 服务：\r\n\r\n```\r\nsudo systemctl reload nginx.service\r\n```\r\n\r\n参考网站\r\nhttps://www.howtoforge.com/how-to-install-pagekit-cms-on-centos-7/","tags":"php,yum,nginx","last_comment_time":1574924845,"last_comment_username":null,"view_count":5030,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1574924845,"updated_at":1574929770},{"id":16,"site":"bestyii","type":"topic","post_meta_id":5,"user_id":3,"title":"CentOS 7 安装最新版NodeJS","author":null,"excerpt":null,"image":null,"content":"1. 从官网下下载最新的nodejs\r\n==\r\n下载地址：https://nodejs.org/en/download/\r\n\r\n这里选择的是Linux Binaries (x64)\r\n\r\n![](https://statics.bestyii.com/rZH0Hj_Z4J6_aGmO.png)\r\n\r\n```\r\ncd /usr/local/src\r\nwget https://nodejs.org/dist/v12.13.1/node-v12.13.1-linux-x64.tar.xz\r\n```\r\n\r\n2. 解压\r\n==\r\n```\r\ntar -xvf node-v12.13.1-linux-x64.tar.xz\r\n```\r\n\r\n3. 移动并改名文件夹\r\n==\r\n```\r\nmv node-v12.13.1-linux-x64 ../nodejs\r\n```\r\n\r\n4. 让npm和node命令全局生效\r\n==\r\n```\r\nln -s /usr/local/nodejs/bin/npm /usr/local/bin/\r\nln -s /usr/local/nodejs/bin/node /usr/local/bin/\r\n```\r\n\r\n5. 查看nodejs是否安装成功\r\n==\r\n```\r\n# node -v\r\nv12.13.1\r\n# npm -v\r\n6.12.1\r\n```\r\n大功告成！","tags":"centos7","last_comment_time":1575122726,"last_comment_username":null,"view_count":9566,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1575122726,"updated_at":1575123154},{"id":17,"site":"bestyii","type":"topic","post_meta_id":8,"user_id":3,"title":"Yii2下composer 安装本地开发Extensions(扩展包)","author":null,"excerpt":null,"image":null,"content":"在开发当中，我们总是想复用代码，降低重复开发的工作。\r\n在yii2开发的过程中，用composer管理依赖，在开发的时候，官方给出的办法是用`aliases`定义命名空间的。\r\n\r\n假设在 vendor/mycompany/myext 目录中安装了一个扩展，并且扩展类的命名空间为 myext ， 那么你可以在应用配置文件中包含如下代码：\r\n```\r\n[\r\n    'aliases' => [\r\n        '@myext' => '@vendor/mycompany/myext',\r\n    ],\r\n]\r\n```\r\n这种办法很有局限性，如果我们扩展本身也想引用依赖，就很麻烦，需要在项目中单独安装，并不是和这个扩展进行关联。\r\n\r\n使用Gii创建扩展的时候，默认生成了composer.json，那我们可以把需要的依赖定义到这个配置文件里。\r\n\r\n问题来了，这么定义如何载入并使这个配置生效。\r\n其实很简单，我们在定义repositories（仓库）的时候会有多种模式（如：composer，git，artifact，path等）。\r\n\r\n我们只需要在项目的composer.json配置文件中增加对应本地扩展路径的定义即可\r\n```\r\n{\r\n...\r\n \"repositories\": {\r\n        \"0\": {\r\n            \"type\": \"composer\",\r\n            \"url\": \"https://asset-packagist.org\"\r\n        },\r\n        \"local\": {\r\n            \"type\": \"path\",\r\n            \"url\": \"./app/extensions/*/*\",\r\n            \"options\": {\r\n                \"symlink\": true\r\n            }\r\n        },\r\n        \"packagist\": {\r\n            \"type\": \"composer\",\r\n            \"url\": \"https://repo.huaweicloud.com/repository/php/\"\r\n        }\r\n    }\r\n}\r\n```\r\n> 为了开发方便，我们安装的时候采用软连接的形式。避免开发的目录与实际运行的目录文件不能同步。\r\n\r\n安装需要的扩展\r\n这里需要注意的是，安装的时候版本参数使用`dev-master`。\r\n```\r\ncomposer require  grazio/yii2-adminui:dev-master -vvv\r\n```\r\n\r\n\r\n> 本文由 [systemofdown](https://www.bestyii.com/member/systemofdown) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\r\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"composer,yii2","last_comment_time":1575134438,"last_comment_username":null,"view_count":4503,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1575134438,"updated_at":1576112590},{"id":18,"site":"bestyii","type":"topic","post_meta_id":8,"user_id":2,"title":"Nginx下Yii2程序开启http2及http2_push提速","author":null,"excerpt":null,"image":null,"content":"网上有人说，网站用HTTP2推送接口请求极大的加快的网站访问速度。\r\n其实也没有什么极大的提速，也就是5%左右。不过积少成多也得干。\r\n\r\n三步搞定\r\n===\r\n1. 配置http2\r\n---\r\nHTTP2 和 HTTPS\r\n目前所有支持 HTTP/2 的浏览器都是基于 TLS 1.2 协议之上构建 HTTP/2 的，所以要使用 HTTP/2 `必须开启 HTTPS`.\r\n\r\n开启 HTTP2,只需要在 SSL 后面加上就能开启 HTTP2.\r\n```\r\nlisten 443 ssl http2;\r\n```\r\n\r\n2.安装扩展 yii2-http2-server-push\r\n---\r\n[yii2-http2-server-push](https://github.com/DevGroup-ru/yii2-http2-server-push \"yii2-http2-server-push\")，其功能是自动解析页面中可以被推送的文件，并把LINK信息加入到响应头中。\r\n\r\n```\r\nphp composer.phar require devgroup/yii2-http2-server-push\r\n```\r\n\r\n3.nginx中开启http2_push_preload 指令\r\n---\r\n```\r\nserver{\r\n    http2_push_preload on;\r\n}\r\n```\r\n\r\n用chrome确认过眼神，就是他没错的。\r\n\r\n![添加头信息](https://statics.bestyii.com/aJKxHkhRWb_WZvLF.png \"添加头信息\")\r\n\r\n![PUSH传输](https://statics.bestyii.com/T5LvNe6frDpZYg-v.png)\r\n\r\n百因必有果\r\n====\r\n原理很简单，减少请求次数，利用Push这个机制。\r\nNginx 1.13.9 就增加了 HTTP2_Push 支持。Nginx 开启 HTTP2 推送有两种方法。\r\n\r\n1.http2_push 指令\r\n---\r\n强制推送某 URL。\r\n```\r\nlocation / {\r\n        index  index.html;\r\n        http2_push /css/allinone.min.css;\r\n    }\r\n```\r\n这个方法太硬了，我们需要灵活一点。所以这个方法不是今天的讨论重点。\r\n2.http2_push_preload 指令\r\n---\r\nNginx 会解析预加载 Link 头动态的推送某 URL。\r\n```\r\nserver{\r\n    http2_push_preload on;\r\n    location / {\r\n        index  index.html;\r\n    }\r\n}\r\n```\r\n> 本文由 [ez](https://www.bestyii.com/member/ez) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\r\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"nginx,yii2","last_comment_time":1575342327,"last_comment_username":null,"view_count":4361,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1575342327,"updated_at":1575342463},{"id":19,"site":"bestyii","type":"topic","post_meta_id":9,"user_id":1,"title":"Html5中图片利用img标签srcset属性做retina屏幕适配","author":null,"excerpt":null,"image":null,"content":"`srcset`属性\r\n===\r\n下面是图片（img）元素，同时包含了src和srcset属性.\r\n\r\n当浏览器不支持`srcset`属性的时候`src`属性的值作为默认图片.\r\n\r\n标准分辨率的时候, srcset属性中， 1x 变量对应的图片将作为[1倍图片]. 当屏幕显示每个CSS像素使用2倍设备像素时, 2x v变量对应的图片将作为[2倍图片]. 同理, 这里还设置了3x 和 4x的图片.\r\n\r\n```html\r\n<img src=\"image-src.png\" srcset=\"image-1x.png 1x, image-2x.png 2x, image-3x.png 3x, image-4x.png 4x\">\r\n```\r\n参考文档：\r\n1. [webkit: The srcset Attribute.](https://webkit.org/demos/srcset/)\r\n2. [What Img Srcset Does In HTML5: A Quick & Simple Guide](https://html.com/attributes/img-srcset/)","tags":"html5,responsive","last_comment_time":1575513892,"last_comment_username":null,"view_count":4041,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1575513892,"updated_at":1575513908},{"id":20,"site":"bestyii","type":"topic","post_meta_id":8,"user_id":2,"title":"Yii2如何使用MinIO做为对象存储","author":null,"excerpt":null,"image":null,"content":"MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口，非常适合于存储大容量非结构化的数据，例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等，而一个对象文件可以是任意大小，从几kb到最大5T不等。\r\n\r\n安装MinIO\r\n==\r\n详细步骤参考：[CentOS 7中使用Docker运行MinIO作为对象存储服务器](https://www.bestyii.com/topic/21 \"CentOS 7中使用Docker运行MinIO作为对象存储服务器\")\r\n\r\n安装好以后，我们要使用`亚马逊S3云存储服务接口`来调用这个服务。\r\n\r\n不得不说的是关于文件系统php有个一统天下的神器 [Flysystem](https://github.com/thephpleague/flysystem \"Flysystem\")，yii2也有其相应的扩展可以用。\r\n\r\n安装 Flysystem Extension for Yii 2\r\n==\r\n我们用的是[creocoder/yii2-flysystem](https://github.com/creocoder/yii2-flysystem)\r\n\r\n还是composer 安装，安装慢的时候别忘了改[composer国内源](https://www.bestyii.com/topic/10 \"composer国内源\")\r\n\r\n```\r\ncomposer require creocoder/yii2-flysystem\r\n```\r\n\r\n安装 AWS S3 filesystem 的扩展\r\n==\r\n还得装这么个扩展\r\n```\r\ncomposer require league/flysystem-aws-s3-v3\r\n```\r\n\r\n配置Yii项目\r\n==\r\n```\r\nreturn [\r\n    //...\r\n    'components' => [\r\n        //...\r\n       'fs' => [\r\n            'class' => 'creocoder\\flysystem\\AwsS3Filesystem',\r\n            'key' => 'keykeykeykeykeykeykeykey',\r\n            'secret' => 'secretsecretsecretsecretsecret',\r\n            'bucket' => 'bestyii',\r\n            'region' => 'beijing',\r\n            'version' => 'latest',\r\n            // 'baseUrl' => 'your-base-url',\r\n            //'prefix' => 'webapp',\r\n            // 'options' => [],\r\n            'endpoint' => 'http://oss.bestyii.com',\r\n            'pathStyleEndpoint' => true\r\n        ],\r\n    ],\r\n];\r\n```\r\n\r\n如何使用\r\n==\r\n\r\n写入文件\r\n--\r\n写入字符串到文件\r\n```\r\nYii::$app->fs->write('filename.ext', 'contents');\r\n```\r\n\r\n使用文档流方式写入文件\r\n```\r\n$stream = fopen('/path/to/somefile.ext', 'r+');\r\nYii::$app->fs->writeStream('filename.ext', $stream);\r\n```\r\n更新文件\r\n--\r\nTo update file\r\n```\r\nYii::$app->fs->update('filename.ext', 'contents');\r\n```\r\nTo update file using stream contents\r\n```\r\n$stream = fopen('/path/to/somefile.ext', 'r+');\r\nYii::$app->fs->updateStream('filename.ext', $stream);\r\n```\r\n写入或更新\r\n---\r\nTo write or update file\r\n```\r\nYii::$app->fs->put('filename.ext', 'contents');\r\n```\r\nTo write or update file using stream contents\r\n```\r\n$stream = fopen('/path/to/somefile.ext', 'r+');\r\nYii::$app->fs->putStream('filename.ext', $stream);\r\n```\r\n读取文件\r\n--\r\nTo read file\r\n```\r\n$contents = Yii::$app->fs->read('filename.ext');\r\n```\r\nTo retrieve a read-stream\r\n```\r\n$stream = Yii::$app->fs->readStream('filename.ext');\r\n$contents = stream_get_contents($stream);\r\nfclose($stream);\r\n```\r\n检查文件是否存在\r\n--\r\nTo check if a file exists\r\n```\r\n$exists = Yii::$app->fs->has('filename.ext');\r\n```\r\n删除文件\r\n--\r\nTo delete file\r\n```\r\nYii::$app->fs->delete('filename.ext');\r\n```\r\n读取后并删除文件\r\n--\r\nTo read and delete file\r\n```\r\n$contents = Yii::$app->fs->readAndDelete('filename.ext');\r\n```\r\n文件重命名\r\n--\r\nTo rename file\r\n```\r\nYii::$app->fs->rename('filename.ext', 'newname.ext');\r\n```\r\n\r\n还有更多请参考文档吧 https://github.com/creocoder/yii2-flysystem\r\n\r\n\r\n> 本文由 [ez](https://www.bestyii.com/member/ez) 创作，采用 [知识共享署名 3.0 中国大陆许可协议](http://creativecommons.org/licenses/by/3.0/cn) 进行许可。\r\n可自由转载、引用，但需署名作者且注明文章出处。","tags":"对象存储,MinIO,Flysystem,yii2","last_comment_time":1575879519,"last_comment_username":null,"view_count":4674,"follow_count":0,"comment_count":0,"favorite_count":0,"like_count":0,"thanks_count":0,"hate_count":0,"status":1,"order":999,"created_at":1575879519,"updated_at":1581614178}],"_links":{"self":{"href":"https://www.miinno.com/?page=1"},"first":{"href":"https://www.miinno.com/?page=1"},"last":{"href":"https://www.miinno.com/?page=11"},"next":{"href":"https://www.miinno.com/?page=2"}},"_meta":{"totalCount":202,"pageCount":11,"currentPage":1,"perPage":20}}