diff --git a/.DS_Store b/.DS_Store index dff48db1c..3b8c75e3a 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index c4ef915c3..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,37 +0,0 @@ -version: 2 -jobs: - build: - docker: - - image: circleci/node:9.11.1 - working_directory: ~/repo - steps: - - checkout - - add_ssh_keys: # add SSH key with write access - fingerprints: - - "02:d5:63:28:6b:94:5d:76:08:42:ab:1e:b2:b7:80:bb" - - "c4:87:62:5a:20:92:4e:14:e0:e0:59:4c:41:f3:43:55" - - restore_cache: - keys: - - yarn-packages-{{ checksum "yarn.lock" }} - - run: - name: Install dependencies - command: yarn install --frozen-lockfile - - run: - name: Publish update to GitHub - command: bash ./deploy.sh - - save_cache: - name: Save Yarn Package Cache - key: yarn-packages-{{ checksum "yarn.lock" }} - paths: - - ~/.cache/yarn - -workflows: - version: 2 - build-deploy: - jobs: - - build: - filters: - branches: - only: - - dev - - test \ No newline at end of file diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index f9910f226..000000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,35 +0,0 @@ - -name: Publish to GitHub Pages - -on: - push: - branches: - - dev - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2.3.4 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly. - with: - persist-credentials: false - - - name: Setup Node.js - uses: actions/setup-node@v1 - with: - # choose node.js version to use - node-version: '14' - - - name: Install and Build 🔧 # - run: | - yarn - yarn docs:build - - - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@3.7.1 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages # The branch the action should deploy to. - FOLDER: docs/.vuepress/dist # The folder the action should deploy. - CLEAN: true # Automatically remove deleted files from the deploy branch diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 33652fd76..000000000 --- a/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -node_modules/ -# public/ -DS_Store -dist/ -dist-admin/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -test/unit/coverage -test/e2e/reports -selenium-debug.log -.env -.idea -docs/.vuepress/dist -.DS_Store \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 000000000..b14b64db4 --- /dev/null +++ b/404.html @@ -0,0 +1,32 @@ + + + + + + Documentation + + + + + + + + + + + + +
+ + + diff --git a/README.md b/README.md deleted file mode 100644 index 689c17b46..000000000 --- a/README.md +++ /dev/null @@ -1,20 +0,0 @@ - -[![CircleCI](https://circleci.com/gh/cloudlinux/cloudlinux-doc.svg?style=svg)](https://circleci.com/gh/cloudlinux/cloudlinux-doc) - -# Install dependencies - -``` -$ yarn -``` - -# Start local server - -```sh -$ yarn docs:dev -``` - -# Static assets - -```sh -$ yarn docs:build -``` \ No newline at end of file diff --git a/_translation/additional_packages/README.md b/_translation/additional_packages/README.md deleted file mode 100644 index 97054c164..000000000 --- a/_translation/additional_packages/README.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Additional Packages ---- - -# Additional Packages - -## alt-suexec - -## tuned-profiles-cloudlinux - diff --git a/_translation/apache_mod_lsapi/README.md b/_translation/apache_mod_lsapi/README.md deleted file mode 100644 index a730fafc6..000000000 --- a/_translation/apache_mod_lsapi/README.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Apache mod_lsapi PRO ---- - -# Apache mod_lsapi PRO - -## Configuration References - -## Installation - -### cPanel - -### Plesk - -### DirectAdmin - -### No control panel - -## Uninstall - -### cPanel - -### Plesk - -### DirectAdmin - -### No control panel - -## switch_mod_lsapi tool - -## Troubleshooting - -## FAQ on mod_lsapi - -## CRIU Support - diff --git a/_translation/cagefs/README.md b/_translation/cagefs/README.md deleted file mode 100644 index 0df2baa72..000000000 --- a/_translation/cagefs/README.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: CageFS ---- - -# CageFS - -## Installation - -## Unistalling CageFS - -## Managing Users - -## Command-line Tools - -## Running Command Inside CageFS - -## Sanity Check - -## CageFS Quirks - -## Configuration - -### File System Templates - -### Excluding Files - -### Excluding Users - -### Mount Points - -#### Per user virtual mount points - -#### Split by Username - -#### Mounting user’s home directory inside CageFS - -### Base Home Directory - -### PostgreSQL support - -### PAM Configuration - -### Executing By Proxy - -### Custom /etc files per customer - -### Moving cagefs-skeleton directory - -### Moving /var/cagefs directory - -### TMP Directories - -### Syslog - -### Excluding mount points - -## Control Panel Integration - -### cPanel - -### Plesk - -### ISPManager - diff --git a/_translation/cloudlinux-fchange/README.md b/_translation/cloudlinux-fchange/README.md deleted file mode 100644 index 73cea86f9..000000000 --- a/_translation/cloudlinux-fchange/README.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: File Change API ---- - -# File Change API - -## General - -## Usage and Integration - -## Installation and Configuration - -## Configuration Details - -## Low-level access - diff --git a/_translation/cloudlinux_installation/README.md b/_translation/cloudlinux_installation/README.md deleted file mode 100644 index a6615d773..000000000 --- a/_translation/cloudlinux_installation/README.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Installation ---- - -# Installation - -## Converting Existing Servers - -### Advanced Options for cldeploy - -### Explanation Of Changes - -## Installing new servers - -## CloudLinux OS Images - -### Xen Images - -## Net Install - -## - -### Converting from mod_fastcgi to mod_fcgid - -## Virtuozzo and OpenVZ - -## Getting Trial License - -## Registering CloudLinux Server - -## CloudLinux on DigitalOcean - -## CloudLinux on Linode - -## Servers with LILO boot loader - -## Migrating to EasyApache 4 - -### FAQ - -## Uninstalling CloudLinux - diff --git a/_translation/cloudlinux_life-cycle/README.md b/_translation/cloudlinux_life-cycle/README.md deleted file mode 100644 index ddf534113..000000000 --- a/_translation/cloudlinux_life-cycle/README.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: CloudLinux Life cycle ---- - -# CloudLinux Life cycle - diff --git a/_translation/cloudlinux_network/README.md b/_translation/cloudlinux_network/README.md deleted file mode 100644 index d001c5dbc..000000000 --- a/_translation/cloudlinux_network/README.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: CloudLinux Network ---- - -# CloudLinux Network - diff --git a/_translation/cloudlinux_whmcs_plugin/README.md b/_translation/cloudlinux_whmcs_plugin/README.md deleted file mode 100644 index c94db06e8..000000000 --- a/_translation/cloudlinux_whmcs_plugin/README.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: CloudLinux WHMCS Plugin ---- - -# CloudLinux WHMCS Plugin - -## Overview - -## Installation & Configuration - -### Installation and Update - -### Configuration of Product - -### Configuration of Add-on - -## Management - -### Link Via Add-on. Optional License - -### Link Products Directly - -### Link Via Configurable Options - -### Link Add-ons Directly - -### Order - -### Admin Area - -### Client Area - -### Licenses List - -### Add-on Licenses List - -## Common Problems - diff --git a/_translation/deprecated/README.md b/_translation/deprecated/README.md deleted file mode 100644 index 7f7f478b6..000000000 --- a/_translation/deprecated/README.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Deprecated ---- - -# Deprecated - -## Git for cPanel - -## LVE-Stats 0.x - -### Storing statistics in MySQL - -### Storing statistics in PostgreSQL - -### Compacting in multi-server settings - -## OptimumCache - -### Installation - -### Using without ploop - -### Marking Directories - -### OptimumCache Configuration File - -### - -### cloudlinux-collect: Collect System Load Statistics - -### Uninstall OptimumCache - -### Troubleshooting - diff --git a/_translation/downloading_documentation/README.md b/_translation/downloading_documentation/README.md deleted file mode 100644 index 24368aaeb..000000000 --- a/_translation/downloading_documentation/README.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Downloading Documentation ---- - -# Downloading Documentation - diff --git a/_translation/hardware_compatibility/README.md b/_translation/hardware_compatibility/README.md deleted file mode 100644 index f4321055c..000000000 --- a/_translation/hardware_compatibility/README.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Hardware Compatibility ---- - -# Hardware Compatibility - diff --git a/_translation/inodes_limits/README.md b/_translation/inodes_limits/README.md deleted file mode 100644 index d760fbe82..000000000 --- a/_translation/inodes_limits/README.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: inodes ---- - -# inodes - -## cl-quota - -### General Provisions - -### Setting Limits and Integration with Panel Packages - -### Limits Inheritance - -### Caching and Synchronizing the Limits - -### Quotas DB File - -### CLI Options/Examples - diff --git a/_translation/integration_guide/README.md b/_translation/integration_guide/README.md deleted file mode 100644 index 4d623882a..000000000 --- a/_translation/integration_guide/README.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Integration Guide ---- - -# Integration Guide - -## Detecting and Working with CloudLinux - -## Displaying CPU, Memory & IO limits - -## Integrating LVE Limits with Packages - diff --git a/_translation/kernel_settings/README.md b/_translation/kernel_settings/README.md deleted file mode 100644 index 3a86dcaa0..000000000 --- a/_translation/kernel_settings/README.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Kernel Settings ---- - -# Kernel Settings - -## Kernel Config Variables - -## Virtualized /proc filesystem - -## SecureLinks - -### Symlink Owner Match Protection - -### Link Traversal Protection - -## ptrace Block - -## Xen XVDA - -## TPE Extension (deprecated) - -## IO - -## Hybrid Kernel - -## Reading - -## flashcache - -## OOM Killer - -## File System Quotas - diff --git a/_translation/limits/README.md b/_translation/limits/README.md deleted file mode 100644 index e49695883..000000000 --- a/_translation/limits/README.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Limits ---- - -# Limits - -## Understanding LVE - -## Command-line Tools - -### lvectl - -### lveps - -### lvetop - -### cldetect - -## SPEED Limits - -## CPU Limits - -## Memory Limits - -## IO - -## IOPS - -## Entry Processes - -## Number of Processes - -## Network Traffic Bandwidth Control and Accounting System - -## Compatibility Matrix - -## Integration Components - -### LVE PAM module - -### LVE Wrappers - -### MPM ITK - -### HostingLimits - -#### Redis Support for HostingLimits - -### cPanel/WHM JSON API - -### cPanel LVE Extension - diff --git a/_translation/lve-stats_2/README.md b/_translation/lve-stats_2/README.md deleted file mode 100644 index 9ce9b1301..000000000 --- a/_translation/lve-stats_2/README.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: LVE-Stats 2 ---- - -# LVE-Stats 2 - -## Installation - -## Configuration - -### LVE Stats2 - -### LVE Stats 2 - -### Customize - -## Command-line Tools - -### lveinfo - -### lvechart - -### dbgovchart - -### lve-read-snapshot - -### lve-create-db - -### cloudlinux-top - -### cloudlinux-statistics - -## Plugins - -## Creating a Plugin for - -### Introduction - -### Server Plugin Arrangement - -### Plugin Configuration - -### Types of Plugins - -### Examples of Plugins - -#### Collector - -#### Analizer - -#### Persistor - -#### Notifier - -## File info and format for /var/lve/info file - -## Troubleshooting - diff --git a/_translation/lve_manager/README.md b/_translation/lve_manager/README.md deleted file mode 100644 index 867ce0364..000000000 --- a/_translation/lve_manager/README.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: LVE Manager ---- - -# LVE Manager - -## Dashboard - -## CloudLinux Installation Wizard - -## cPanel LVE Manager - -### LVE Manager Options - -### Server Processes Snapshots - -### LVE Plugins Branding - -## User Message for PHP version - diff --git a/_translation/mod_proctitle/README.md b/_translation/mod_proctitle/README.md deleted file mode 100644 index 9aa6efefc..000000000 --- a/_translation/mod_proctitle/README.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: mod_proctitle ---- - -# mod_proctitle - -## How to Read - -## Tuning Parameters - diff --git a/_translation/mysql_governor/README.md b/_translation/mysql_governor/README.md deleted file mode 100644 index ed18dc4a5..000000000 --- a/_translation/mysql_governor/README.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: MySQL Governor ---- - -# MySQL Governor - -## Installation - -## Removing - -## Modes Of Operation - -## Configuration - -## Starting And Stopping - -## Mapping a User to Database - -## Log Files - -## Change MySQL version - -## Command-line Tools - -### dbtop - -### dbctl - -### lveinfo --dbgov - -### dbgovchart - -## Backing Up MySQL - -## abrt - -## Troubleshooting - diff --git a/_translation/node_js_selector/README.md b/_translation/node_js_selector/README.md deleted file mode 100644 index d42246629..000000000 --- a/_translation/node_js_selector/README.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Node.js Selector ---- - -# Node.js Selector - -## Overview & Requirements - -## Installation - -## Command Line Interface - -## User Interface - -## Node.js Deployment - -### Remote Usage of Node.js Interpreters - -### Remote Usage of the cloudlinux-selector Utility - diff --git a/_translation/partner_portal/README.md b/_translation/partner_portal/README.md deleted file mode 100644 index 4b2f17b95..000000000 --- a/_translation/partner_portal/README.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Partner Portal ---- - -# Partner Portal - diff --git a/_translation/php_selector/README.md b/_translation/php_selector/README.md deleted file mode 100644 index 1444e9ecd..000000000 --- a/_translation/php_selector/README.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: PHP Selector ---- - -# PHP Selector - -## Installation and Update - -### LiteSpeed support - -### ISPmanager - -## Configuration - -### Setting Default Version and Modules - -### Individual PHP.ini files - -### Substitute global php.ini for individual customer - -### Managing interpreter version - -### Including - -### PHP Extensions - -### FFmpeg - -### Native PHP - -## Command-line Tools - -### selectorctl - -### Integrating With Control Panels - -## Removing - -## Using - -## Custom PHP.ini options - -## End user files and directories - -## Compiling your own extensions - -## Roll your own PHP - -## Detect User's PHP Version - -## PHP Selector - -## Configuring " - -## Bundled PHP Extensions - -### PHP 4.4 Extensions - -### PHP 5.1 Extensions - -### PHP 5.2 Extensions - -### PHP 5.3 Extensions - -### PHP 5.4 Extensions - -### PHP 5.5 Extensions - -### PHP 5.6 Extensions - -### PHP 7.0 Extensions - -### PHP 7.1 Extensions - -### PHP 7.2 Extensions - -### PHP 7.3 Extensions - -## Disabling PHP extension globally - -## Control Panel Integration - -### PHP Selector - diff --git a/_translation/python_and_ruby_selector/README.md b/_translation/python_and_ruby_selector/README.md deleted file mode 100644 index 7506fb6ce..000000000 --- a/_translation/python_and_ruby_selector/README.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Python ---- - -# Python - -## Python and Ruby Selector Installation - -## End User Access - -## Command Line - -## Hide Python and Ruby Selector Icons - -## Deploying Trac using Python Selector - -### Trac - -## Deploying Redmine using Ruby Selector - -## Easy Apache 4 - diff --git a/_translation/reseller_limits/README.md b/_translation/reseller_limits/README.md deleted file mode 100644 index 0fc4e4a24..000000000 --- a/_translation/reseller_limits/README.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Reseller Limits ---- - -# Reseller Limits - -## Installation and Requirements - -## How to Enable and Disable Reseller Limits - -## Hoster Interface - -### Current Usage - -### Users - -### Statistics - -### Options - -### Packages - -### Selector - -## Reseller Interface - -### Current Usage - -### Historical Usage - -### Users - -### Statistics - -### Options - -### Packages - diff --git a/algolia-cfg-ru.json b/algolia-cfg-ru.json deleted file mode 100644 index cd3c689e8..000000000 --- a/algolia-cfg-ru.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "index_name": "cloudlinuxos-ru", - "start_urls": [ - "http://docs.cloudlinux.com/ru" - ], - "stop_urls": [ - "/#" - ], - "selectors": { - "lvl0": ".content h1", - "lvl1": ".content h2", - "lvl2": ".content h3", - "lvl3": ".content h4", - "lvl4": ".content h5", - "lvl5": ".content h6", - "text": ".content p, .content li, .content code", - "lang": { - "selector": "/html/@lang", - "type": "xpath", - "global": true, - "default_value": "en-US" - } - }, - "strip_chars": " .,;:#", - "custom_settings": { - "attributesForFaceting": [ - "lang" - ] - }, - "selectors_exclude": [ - ".table-of-contents" - ], - "js_wait": 3, - "js_render": true, - "nb_hits": 4900 -} \ No newline at end of file diff --git a/algolia-cfg.json b/algolia-cfg.json deleted file mode 100644 index b1fab82b2..000000000 --- a/algolia-cfg.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "index_name": "cloudlinuxos", - "start_urls": [ - "http://docs.cloudlinux.com" - ], - "stop_urls": [ - "/#", - "https://docs.cloudlinux.com/ru/" - ], - "selectors": { - "lvl0": ".content h1", - "lvl1": ".content h2", - "lvl2": ".content h3", - "lvl3": ".content h4", - "lvl4": ".content h5", - "lvl5": ".content h6", - "text": ".content p, .content li, .content code", - "lang": { - "selector": "/html/@lang", - "type": "xpath", - "global": true, - "default_value": "en-US" - } - }, - "strip_chars": " .,;:#", - "custom_settings": { - "attributesForFaceting": [ - "lang" - ] - }, - "selectors_exclude": [ - ".table-of-contents" - ], - "scrap_start_urls": false, - "nb_hits": 4691 -} \ No newline at end of file diff --git a/assets/css/0.styles.be606c55.css b/assets/css/0.styles.be606c55.css new file mode 100644 index 000000000..d915b6d51 --- /dev/null +++ b/assets/css/0.styles.be606c55.css @@ -0,0 +1 @@ +.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.home{padding:4rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero img{max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6f91b0}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#2b98f0;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #118bee}.home .hero .action-button:hover{background-color:#40a2f2}.home .features{border-top:1px solid #e8e8e8;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3e5971}.home .feature p{color:#527595}.home .footer{padding:2.5rem;border-top:1px solid #e8e8e8;text-align:center;color:#527595}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.sidebar-button{color:#fff;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #e8e8e8}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#e8e8e8;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#2b98f0;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#314659}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#e8e8e8;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#e8e8e8}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#314659}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{opacity:.5;cursor:text;width:10rem;color:#fff;display:inline-block;border:none;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#2b98f0 url(/assets/img/search.05882e25.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#fff}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:1.5rem;border:1px solid #d1d1d1;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#6388a9}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#2b98f0}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.badge[data-v-17014d78]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-17014d78],.badge.tip[data-v-17014d78],.badge[data-v-17014d78]{background-color:#42b983}.badge.error[data-v-17014d78]{background-color:#da5961}.badge.warn[data-v-17014d78],.badge.warning[data-v-17014d78],.badge.yellow[data-v-17014d78]{background-color:#e7c000}.badge+.badge[data-v-17014d78]{margin-left:5px}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input::-webkit-input-placeholder{color:#aaa}.searchbox__input:-ms-input-placeholder{color:#aaa}.searchbox__input::-ms-input-placeholder{color:#aaa}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;-webkit-animation-name:sbx-reset-in;animation-name:sbx-reset-in;-webkit-animation-duration:.15s;animation-duration:.15s}@-webkit-keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer;color:#fff}.dropdown-wrapper .dropdown-title{display:inline-block;border-top:2px solid #fff}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;color:#314659;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#2b98f0}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #2b98f0;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden;background-color:#fff}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:2.5rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #fff;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:3.7rem;color:#fff}.nav-links a.router-link-active,.nav-links a:hover{color:#2b98f0}.nav-links .nav-item{position:relative;display:inline-block;height:3rem}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links a{line-height:1.25rem}.nav-links .nav-item,.nav-links .repo-link{margin-left:0;height:1rem}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#fff}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #3ca0f1}}.navbar{padding:.7rem 1.5rem;line-height:2.5rem;position:relative;height:1rem;box-shadow:0 3px 7px 0 rgba(0,0,0,.23)}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.4rem;min-width:2.6rem;margin-right:1.5rem;vertical-align:top}.navbar .site-name{font-size:1rem;font-weight:600;color:#fff;position:relative}.navbar .site-name--documentation{border-right:1px solid #fff;padding-right:1rem;line-height:1.2rem}.navbar .links{box-sizing:border-box;background-color:#2b98f0;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:0;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}.navbar .links .nav-links{flex:1}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .btn{margin:.65rem 0 0}}.btn{padding:.7rem 1.6rem;position:relative;background-color:#2b98f0;border:2px solid #fff;border-radius:4px;font-size:.88rem;line-height:1rem;margin:.65rem 1rem 0 0;color:#fff;text-align:center;transition-duration:.4s;text-decoration:none;overflow:hidden;cursor:pointer;font-weight:600}.btn:hover{text-decoration:underline}.btn:after{content:"";background:#fff;display:block;position:absolute;padding-top:300%;padding-left:350%;margin-left:-20px!important;margin-top:-120%;opacity:0;transition:all .8s}.btn:active:after{padding:0;margin:0;opacity:1;transition:0s}.footer[data-v-671babf6]{margin-left:18.5rem;color:#314659;text-align:center;border-top:1px solid #e8e8e8;height:102px;background:#fff;display:flex;flex-flow:row wrap;justify-content:space-around;align-items:center;margin-right:20px}.footer div[data-v-671babf6]{margin:5px;font-size:.8rem;display:inline-flex}.footer a[data-v-671babf6]{display:inline-block;margin-left:10px}.footer a[data-v-671babf6]:hover{text-decoration:underline}.footer img[data-v-671babf6]{border:none;cursor:pointer}.footer .footer-company-title[data-v-671babf6]{font-size:.8rem;color:#d8d8d8}.social[data-v-671babf6]{display:flex;justify-content:center;align-items:center;padding-left:20px}.social .footer-social-text[data-v-671babf6]{margin-right:13px;line-height:20px;padding-left:12px;border-left:1px solid #ccc}.social a[data-v-671babf6]{margin:7px -5px 0 0}.social a .footer-social-logo[data-v-671babf6]{height:42px;width:auto}.sidebar-width[data-v-671babf6]{width:20.5rem}@media (max-width:1024px){.footer[data-v-671babf6]{height:140px}}@media (max-width:719px){.footer[data-v-671babf6]{justify-content:center;margin-left:0;height:140px}.footer div[data-v-671babf6]{display:flex}.footer-social-text[data-v-671babf6]{border:none}}.breadcrumb[data-v-5e0e0acf]{color:#adadad}.breadcrumb[data-v-5e0e0acf]:after{content:">";font-family:inherit;font-size:inherit}.breadcrumb[data-v-5e0e0acf]:last-child{cursor:default}.breadcrumb-title[data-v-5e0e0acf]{color:#adadad;font-weight:600;margin-right:2px}.page-nav{max-width:847px;margin:0 3rem}@media (max-width:959px){.page-nav{margin:0;padding:2rem}}@media (max-width:1024px){.page-nav{margin:0 3rem}}@media (max-width:419px){.page-nav{margin:0;padding:0 1.5rem}}.page-nav{margin:0;padding:0;display:flex;position:absolute;right:0;top:30px}.back-to-top__link[data-v-c64d4a1e]{position:fixed;right:6rem;bottom:10rem;visibility:hidden;opacity:0;transition:visibility 0s,opacity .5s linear;cursor:pointer;z-index:10}.back-to-top__link.active[data-v-c64d4a1e]{visibility:visible;opacity:1}.page-edit{max-width:847px;margin:0 3rem}@media (max-width:959px){.page-edit{margin:0;padding:2rem}}@media (max-width:1024px){.page-edit{margin:0 3rem}}@media (max-width:419px){.page-edit{margin:0;padding:0 1.5rem}}.page{padding-bottom:2rem;padding-top:6rem}.page-breadcrumb{margin-left:3rem}.page-nav-wrapper{max-width:847px;margin:0 3rem;position:relative}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#527595;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#527595}.page-edit .last-updated .time{font-weight:400;color:#aaa}.content h1{max-width:80%}@media (max-width:719px){.page{padding-top:5rem}.page-breadcrumb{margin-left:1.5rem}.page-nav-wrapper{display:none}.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}.content h1{max-width:100%}}.sidebar .sidebar-sub-header{font-size:.95em}.sidebar .sidebar-sub-header.collapsible>div{margin-left:2rem}.sidebar .sidebar-sub-header.collapsible>.sidebar-link-container{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAwCAYAAADgvwGgAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAEN0lEQVRYCb2YSWhUQRCGK5mZZLLvKwRUCGr2xSQnLxpE0IMinvSkJ8GTB3NQMDkoiAdF8KAHQS+C6EFCDq7gcsmeTHYigoQkxuz7TDKT8a8m1XkTJ+OMk7yCmuqqru7v9Xv9ul8PkR/xer0RfsJhhyK39wBQHWKNsPbtdbvqA9AAFfmAQtyuAqQzdHxPKAb7DeVEyQnborMI6CMDYHuxFYHUsEHcATp6aux9fGLS2z/03buxsWEMd8PJDBfIo/JKJ6PjE+ToH8IFEOXlZlPR4XyKiNATcxB5x+GPSX6oVsNGRsepZ2DYp31udiaVFh40An8g4RiAP30Sg3T01LdHR1NkpHZV87Ffv6mzZ4BwS6W7Ayh8xc3Il0AoVo+MG03PzFFbVy95tjpXfWWkp1JFcQFZLPpixlFRixH2q4Qgf7h1veSmpSZTdUUxWS0WCSk7OTWjLsLt8Ug8B4XPGGGZBIKx6umj0XUk35UGcwuL1NrRQ+tut4SUTUlOpCNlRWSzWiU+h8JJjLBZAoGsnmoAXkXiQ6iKLSwuUQuAa+vrPu2TEuOpqryYomw2iS+icBrALxLYyWoYJwB4GeYJVD2cpeUVam53kGttjau1JMTHqdsdHRUlsRUUzgD4XgL+rA+MEwC8APMMqh7c8soqNXc4yOl0cbWWuNgYqqksIZ7Fm8IJ5wFslMB2+xeMEwA8B/MCqu7VqtOpRriy6uRqLbExdqqpKKEY2E3he34RwJcSMFq/ME4A8BTMa6i6dKfLpYA8UqPY7dEKyCPdFJ6ylwB8LgGxO8I4AcBamDfQWPb52fGkWVxaZlcLPzt+ZfhZbgovgVcAfCwBtgFhnADgUZgmaAL765idLZ09NL+wxK4Wm82qRpiYEK9jKFwD8L4E/gnjRACrYd5Ck9nn96+ts5dm5xfY1WK1Wqgar0Vyks8WeBPA25wUFIwTAeTVgqd2Ovu8mrR39dH0LL/XW2LB6lNVVkipKeq6pOIOgDeChnErAAtgPkKz2fd4NqjD0UeT07PsauEFvbK0kDLSUnQMhQchwbglgLziMzCPfd4ReGeYmJxmV0sk9sHykgLKykjTsZBh3BLAfTCfoPuhAHqpu2+QsMuzqwW3jsqKDlFOVoaKqWVJ14ZW0Dt8sM1CHplpt9G0CQKQOVMfIHNeaoDMWa4AMmchBoi3mFdQtVntuMVg8+RN9L+3GIDM2TwBMuezAKBwPnjOYnl6F2g10SsIQOZ8ygFkzkcqQLcw9HoZ/uzcPLXie9/t9khI2TRshpXYFA2f5lOoOIFb1+mTGMAx9WChP9r58NDu6Dcej9Q1Zmemqz3JcJwaQQUfCocDDMJvlYbxS2s4h6nk3T4M+txGPuZ29w0p0F4cc3mLN+0AzzAenTl/TciTBHDv/3QRGFsAG6Aie/d3kkBBqoM2QfU5SOr2xAKk18zdBPwBW0j4Fp8Xa44AAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:left 20px top 17px;background-size:9px 16px;padding-left:2rem;cursor:pointer;margin-left:0}.sidebar .sidebar-sub-header.collapsible>.sidebar-link-container.active{background-color:#e6f7ff}.sidebar .sidebar-sub-header.collapsible>.sidebar-link-container.collapsed{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAbCAYAAAA6aQxyAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAFPUlEQVRYCc1WSUidVxQ+zzpgsQ5YQRTBqhVp3VTQbmwpSTMQbDapq7oSEYeKRiVdBBKyyCrihEHiQkk3gZIu0hIIIS0UKVgsVtTWCppaHNEqzrO+ft/tvT/3/b6nPqUkB47nnO9M333v/69PxCVer9cD7YS65bar9H8Lsfi2ezlicvIcuxRF9/00G+jGsQPOWIBFN8wyP/b+kePRcM9u6u7u9g4MDNgQ/S+PHHKGJGfbywYHB73k4JJ7fleg6I5d2NPT4y0tLfWWl5d7h4eH7dQBghK/Q84AciaUs5VwJ3eTA7m45I5ZFUIHya9gbhmwr69Purq6iMve3p60tbXJ6OioSfM5fIDcFwY4q9WzHmCOesa5izu5mxw6OzuFnCy5BZycJQQOmz6ykorswcGBA+3s7Ehra6uMj48bjAd/iN5rBjit1TMeol99mNzBXdxpBDX2B2jgj8k9xOPxeIF8Dv3RZAoLCyU/P9+Eym5tbUlzc7NMTk4a/A04jzCkwADBWt37CH2cpWZzB3fZQi7kZAm5XiN3dWo47LgK/ZlFiKWoqEjy8vIYOrKxsSFNTU0yMzNjsDA4j0HkUwOc1Oqex6jnDDWTs7nDFnIgF3LSQo5XNef/vjYmAKzDXIH+yjgkJESKi4slJyeHoSOrq6vS2Ngoc3NzBouA8wSEfB5Dk/Rnde0T5NirZnEmZ9vC3eRALlrI7YrmqiAnwwiJFZhL0AHGbCwpKZHs7GyGjiwvL6tDLCwsGOxNOE9B7EMDBLK65iny7BHOIHnOtIU7udsiT06XNEen1OcARFGwCHMB+ifj0NBQwXUmWVlZDB1ZXFxUi5eWlgz2FpxnIPiBAdxW554BZ62wl+Q5yxbu4k7u1kIuFzQ3gyl76ABEUcjn4zz0JeOwsDCprKyUjIwMho7Mz88rAtZXH4vkcxB93ynSjsaeI2SNelxInjNs4Q7u4k4t5HBeczKYY/0egFk0TMOcg04wjoiIkKqqKklNTWXoyOzsrDrE+jpfISVv4+8LEH5Xx7zL6b+AMiesJXn22sLZ3MFdWrj7nOZiMB8b8ACsQuPfMPwm1KbIyEiprq6W5ORkph2ZmppSV+zm5qbBEuH8AOKpVPpQYsKalpYWYY8tnMnZ3KGFO/nJk0NA8QTMWAmQeA/hT1D1Ca6srEhDQ8OhTzA9PV1qamrsT/Av9PD/TBpUtre31UHHxsYYOpKYmCj19fUSHR1tsH/gfALyvxsgkD3yGzBNGPQH/ItQ9cZyUW1trSQkJJgSZUmMPwF2d3cN/g4cRZ4Yc27ynMFZFnnuuHgS8lxyogOwEAN/g7kMVZd1bGysWhwXF8e0IyMjI9Le3q5+xxiQv2mIMWcLe0mes7Rw9mW9y2BH2hMfgFMw+BeYAqj6dxkfHy91dXUSExPDtCNDQ0PS0dEh+/v7SukTs4U97OUMLXyBCvQOgx1rT/QOuKfgneDj9B1UXRfT09PqnVhbW/Mpzc3NVXFvb68PHhUVpZ75pKQkg2/D4c8DXrNByakOwA04xGcw30LVhT0xMaEOYd1ELDskvGX4wqakpJgcXxj+MPveAMHYoB4he7BeWARsnzgJ8Rq07nC7XPnMscYiz96i05Ln0FMfgM1Y/A1MMZRXpaSlpal/ROHh4Qx9hBj/SbFGC3uK9QyDBW3PdABuA4GvYcrN5szMTKmoqLB/xyifGHOWlOteC3qFLt6J61BH+vv7vWVlZUrpu+T6K6QaeDVI3rSJ4vbxUl1yM/CE1yADsnddhO3w7mtA8XgKYNxks9Z+0/GdwVf8C5CVbjgv8seeAAAAAElFTkSuQmCC");background-size:16px 9px;background-position:left 17px top 20px}.sidebar .sidebar-sub-header.collapsible>.sidebar-link-container.collapsed+.sidebar-sub-headers{display:none}.sidebar .sidebar-sub-header.collapsible>.sidebar-link-container .sidebar-link{padding-left:0;margin-left:1rem}.sidebar .sidebar-sub-header .sidebar-sub-headers{margin-left:3rem}.sidebar .sidebar-sub-header .sidebar-sub-headers:first-child{margin-left:0}.sidebar-link{font-weight:400;display:inline-block;color:#314659;margin:0;line-height:1.4;cursor:pointer}.sidebar-link.sidebar-header{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAwCAYAAADgvwGgAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAEN0lEQVRYCb2YSWhUQRCGK5mZZLLvKwRUCGr2xSQnLxpE0IMinvSkJ8GTB3NQMDkoiAdF8KAHQS+C6EFCDq7gcsmeTHYigoQkxuz7TDKT8a8m1XkTJ+OMk7yCmuqqru7v9Xv9ul8PkR/xer0RfsJhhyK39wBQHWKNsPbtdbvqA9AAFfmAQtyuAqQzdHxPKAb7DeVEyQnborMI6CMDYHuxFYHUsEHcATp6aux9fGLS2z/03buxsWEMd8PJDBfIo/JKJ6PjE+ToH8IFEOXlZlPR4XyKiNATcxB5x+GPSX6oVsNGRsepZ2DYp31udiaVFh40An8g4RiAP30Sg3T01LdHR1NkpHZV87Ffv6mzZ4BwS6W7Ayh8xc3Il0AoVo+MG03PzFFbVy95tjpXfWWkp1JFcQFZLPpixlFRixH2q4Qgf7h1veSmpSZTdUUxWS0WCSk7OTWjLsLt8Ug8B4XPGGGZBIKx6umj0XUk35UGcwuL1NrRQ+tut4SUTUlOpCNlRWSzWiU+h8JJjLBZAoGsnmoAXkXiQ6iKLSwuUQuAa+vrPu2TEuOpqryYomw2iS+icBrALxLYyWoYJwB4GeYJVD2cpeUVam53kGttjau1JMTHqdsdHRUlsRUUzgD4XgL+rA+MEwC8APMMqh7c8soqNXc4yOl0cbWWuNgYqqksIZ7Fm8IJ5wFslMB2+xeMEwA8B/MCqu7VqtOpRriy6uRqLbExdqqpKKEY2E3he34RwJcSMFq/ME4A8BTMa6i6dKfLpYA8UqPY7dEKyCPdFJ6ylwB8LgGxO8I4AcBamDfQWPb52fGkWVxaZlcLPzt+ZfhZbgovgVcAfCwBtgFhnADgUZgmaAL765idLZ09NL+wxK4Wm82qRpiYEK9jKFwD8L4E/gnjRACrYd5Ck9nn96+ts5dm5xfY1WK1Wqgar0Vyks8WeBPA25wUFIwTAeTVgqd2Ovu8mrR39dH0LL/XW2LB6lNVVkipKeq6pOIOgDeChnErAAtgPkKz2fd4NqjD0UeT07PsauEFvbK0kDLSUnQMhQchwbglgLziMzCPfd4ReGeYmJxmV0sk9sHykgLKykjTsZBh3BLAfTCfoPuhAHqpu2+QsMuzqwW3jsqKDlFOVoaKqWVJ14ZW0Dt8sM1CHplpt9G0CQKQOVMfIHNeaoDMWa4AMmchBoi3mFdQtVntuMVg8+RN9L+3GIDM2TwBMuezAKBwPnjOYnl6F2g10SsIQOZ8ygFkzkcqQLcw9HoZ/uzcPLXie9/t9khI2TRshpXYFA2f5lOoOIFb1+mTGMAx9WChP9r58NDu6Dcej9Q1Zmemqz3JcJwaQQUfCocDDMJvlYbxS2s4h6nk3T4M+txGPuZ29w0p0F4cc3mLN+0AzzAenTl/TciTBHDv/3QRGFsAG6Aie/d3kkBBqoM2QfU5SOr2xAKk18zdBPwBW0j4Fp8Xa44AAAAASUVORK5CYII=");background-repeat:no-repeat;background-position:left 5px center;background-size:9px 16px}.sidebar-link.sidebar-header+.sidebar-sub-headers{display:none}.sidebar-link.sidebar-header.collapsed{border-left-color:#2b98f0;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAbCAYAAAA6aQxyAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAFPUlEQVRYCc1WSUidVxQ+zzpgsQ5YQRTBqhVp3VTQbmwpSTMQbDapq7oSEYeKRiVdBBKyyCrihEHiQkk3gZIu0hIIIS0UKVgsVtTWCppaHNEqzrO+ft/tvT/3/b6nPqUkB47nnO9M333v/69PxCVer9cD7YS65bar9H8Lsfi2ezlicvIcuxRF9/00G+jGsQPOWIBFN8wyP/b+kePRcM9u6u7u9g4MDNgQ/S+PHHKGJGfbywYHB73k4JJ7fleg6I5d2NPT4y0tLfWWl5d7h4eH7dQBghK/Q84AciaUs5VwJ3eTA7m45I5ZFUIHya9gbhmwr69Purq6iMve3p60tbXJ6OioSfM5fIDcFwY4q9WzHmCOesa5izu5mxw6OzuFnCy5BZycJQQOmz6ykorswcGBA+3s7Ehra6uMj48bjAd/iN5rBjit1TMeol99mNzBXdxpBDX2B2jgj8k9xOPxeIF8Dv3RZAoLCyU/P9+Eym5tbUlzc7NMTk4a/A04jzCkwADBWt37CH2cpWZzB3fZQi7kZAm5XiN3dWo47LgK/ZlFiKWoqEjy8vIYOrKxsSFNTU0yMzNjsDA4j0HkUwOc1Oqex6jnDDWTs7nDFnIgF3LSQo5XNef/vjYmAKzDXIH+yjgkJESKi4slJyeHoSOrq6vS2Ngoc3NzBouA8wSEfB5Dk/Rnde0T5NirZnEmZ9vC3eRALlrI7YrmqiAnwwiJFZhL0AHGbCwpKZHs7GyGjiwvL6tDLCwsGOxNOE9B7EMDBLK65iny7BHOIHnOtIU7udsiT06XNEen1OcARFGwCHMB+ifj0NBQwXUmWVlZDB1ZXFxUi5eWlgz2FpxnIPiBAdxW554BZ62wl+Q5yxbu4k7u1kIuFzQ3gyl76ABEUcjn4zz0JeOwsDCprKyUjIwMho7Mz88rAtZXH4vkcxB93ynSjsaeI2SNelxInjNs4Q7u4k4t5HBeczKYY/0egFk0TMOcg04wjoiIkKqqKklNTWXoyOzsrDrE+jpfISVv4+8LEH5Xx7zL6b+AMiesJXn22sLZ3MFdWrj7nOZiMB8b8ACsQuPfMPwm1KbIyEiprq6W5ORkph2ZmppSV+zm5qbBEuH8AOKpVPpQYsKalpYWYY8tnMnZ3KGFO/nJk0NA8QTMWAmQeA/hT1D1Ca6srEhDQ8OhTzA9PV1qamrsT/Av9PD/TBpUtre31UHHxsYYOpKYmCj19fUSHR1tsH/gfALyvxsgkD3yGzBNGPQH/ItQ9cZyUW1trSQkJJgSZUmMPwF2d3cN/g4cRZ4Yc27ynMFZFnnuuHgS8lxyogOwEAN/g7kMVZd1bGysWhwXF8e0IyMjI9Le3q5+xxiQv2mIMWcLe0mes7Rw9mW9y2BH2hMfgFMw+BeYAqj6dxkfHy91dXUSExPDtCNDQ0PS0dEh+/v7SukTs4U97OUMLXyBCvQOgx1rT/QOuKfgneDj9B1UXRfT09PqnVhbW/Mpzc3NVXFvb68PHhUVpZ75pKQkg2/D4c8DXrNByakOwA04xGcw30LVhT0xMaEOYd1ELDskvGX4wqakpJgcXxj+MPveAMHYoB4he7BeWARsnzgJ8Rq07nC7XPnMscYiz96i05Ln0FMfgM1Y/A1MMZRXpaSlpal/ROHh4Qx9hBj/SbFGC3uK9QyDBW3PdABuA4GvYcrN5szMTKmoqLB/xyifGHOWlOteC3qFLt6J61BH+vv7vWVlZUrpu+T6K6QaeDVI3rSJ4vbxUl1yM/CE1yADsnddhO3w7mtA8XgKYNxks9Z+0/GdwVf8C5CVbjgv8seeAAAAAElFTkSuQmCC");background-size:16px 9px;background-position:0}.sidebar-link:hover{color:#2b98f0}.sidebar-link.active{font-weight:600;color:#3a3d3f}.sidebar-link.collapsed+.sidebar-sub-headers{display:block}.sidebar-group .sidebar-link{padding:1rem 0 1rem 1rem}.sidebar-group .sidebar-link.sidebar-header{padding:0 0 0 2rem}.sidebar-header .sidebar-link{margin:0;padding:1rem 0}.sidebar-sub-headers .sidebar-link.active{font-weight:500;border-right:3px solid #2b98f0;background-color:#e6f7ff}.sidebar-header--empty{background-image:none!important}.sidebar-group:not(.first){margin-top:1em}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading{cursor:auto;color:inherit}.sidebar-heading{color:#3a3d3f;cursor:pointer;font-size:.95em;padding:0 1.5rem;margin:0 1.2rem 1.5rem 1.6rem;height:41px;line-height:41px;background-color:#f2f4f5;border-radius:4px;font-weight:600}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading:.open .arrow{top:-.18em}.sidebar-group-items{transition:height .1s ease-out;overflow:hidden}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:block}.sidebar .sidebar-group-items{margin-left:2rem;margin-right:2rem}.sidebar .nav-links{display:none;border-bottom:1px solid #e8e8e8;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .nav-links .nav-item .dropdown-wrapper,.sidebar .nav-links .repo-link .dropdown-wrapper{color:#314659}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-links{padding:1rem 0}}.sw-update-popup{position:fixed;right:1em;bottom:1em;padding:1em;border:1px solid #2b98f0;border-radius:3px;background:#fff;box-shadow:0 4px 16px rgba(0,0,0,.5);text-align:center}.sw-update-popup button{margin-top:.5em;padding:.25em 2em}.sw-update-popup-enter-active,.sw-update-popup-leave-active{transition:opacity .3s,transform .3s}.sw-update-popup-enter,.sw-update-popup-leave-to{opacity:0;transform:translateY(50%) scale(.5)}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}#nprogress{pointer-events:none}#nprogress .bar{background:#2b98f0;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #2b98f0,0 0 5px #2b98f0;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#2b98f0 transparent transparent #2b98f0;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.content code{color:#4b6c89;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.content pre,.content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#2c2c34;border-radius:6px;overflow:auto}.content pre[class*=language-] code,.content pre code{color:#dfe4e6;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#2c2c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#2c2c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{font-size:.85rem;padding:.1rem 1.5rem;border-radius:6px;margin:1rem 0}.custom-block.tip{background-color:#ffeedb}.custom-block.warning{background-color:#ffdede}.custom-block.warning a{color:#314659}.custom-block.danger{background-color:#ffe6e6}.custom-block.danger a{color:#314659}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #fff}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #fff}.arrow.right{border-left:6px solid #fff}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #fff}.nav-arrow{display:block;font-weight:200}.nav-arrow.top{height:4rem;width:4rem;background:url(/assets/img/arrow-up.acb47294.svg) no-repeat 50%}.nav-arrow.left{height:3rem;width:3rem;background:url(/assets/img/arrow-left.c10ac3ba.svg) no-repeat 50%}.nav-arrow.right{height:3rem;width:3rem;background:url(/assets/img/arrow-right.b460cbd1.svg) no-repeat 50%}.nav-arrow:active,.nav-arrow:hover{opacity:.8}.content:not(.custom){max-width:847px;margin:0 3rem}@media (max-width:959px){.content:not(.custom){margin:0;padding:2rem}}@media (max-width:1024px){.content:not(.custom){margin:0 3rem}}@media (max-width:419px){.content:not(.custom){margin:0;padding:0 1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:14px;color:#314659}#app{height:100%}.page{padding-left:18.5rem;padding-bottom:10rem}.navbar{z-index:20;right:0;height:4rem;background-color:#2b98f0;box-sizing:border-box;border-bottom:1px solid #e8e8e8}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:15px;background-color:#fff;width:18.5rem;position:fixed;z-index:10;margin:0;top:4rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #e8e8e8;overflow-y:auto}.content:not(.custom) a:hover{text-decoration:underline}.content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content:not(.custom) img{max-width:100%}.content.custom{padding:0;margin:0}.content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#2b98f0}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1.2rem;color:#999;border-left:.25rem solid #dfe2e5;margin-left:0;padding-left:1rem}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{line-height:1.25;font-weight:400;color:#0d1a26}.content:not(.custom)>h1,.content:not(.custom)>h2,.content:not(.custom)>h3,.content:not(.custom)>h4,.content:not(.custom)>h5,.content:not(.custom)>h6{margin-bottom:0}.content:not(.custom)>h1:first-child,.content:not(.custom)>h2:first-child,.content:not(.custom)>h3:first-child,.content:not(.custom)>h4:first-child,.content:not(.custom)>h5:first-child,.content:not(.custom)>h6:first-child{margin-bottom:1rem}.content:not(.custom)>h1:first-child+.custom-block,.content:not(.custom)>h1:first-child+p,.content:not(.custom)>h1:first-child+pre,.content:not(.custom)>h2:first-child+.custom-block,.content:not(.custom)>h2:first-child+p,.content:not(.custom)>h2:first-child+pre,.content:not(.custom)>h3:first-child+.custom-block,.content:not(.custom)>h3:first-child+p,.content:not(.custom)>h3:first-child+pre,.content:not(.custom)>h4:first-child+.custom-block,.content:not(.custom)>h4:first-child+p,.content:not(.custom)>h4:first-child+pre,.content:not(.custom)>h5:first-child+.custom-block,.content:not(.custom)>h5:first-child+p,.content:not(.custom)>h5:first-child+pre,.content:not(.custom)>h6:first-child+.custom-block,.content:not(.custom)>h6:first-child+p,.content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1,h2,h3,h4,h5,h6{margin-top:2.4rem}h1:before,h2:before,h3:before,h4:before,h5:before,h6:before{display:block;content:" ";margin-top:-6rem;height:6rem;visibility:hidden;pointer-events:none}h1{font-size:2.14rem}h2{font-size:1.28rem;padding-bottom:.3rem}h3{font-size:1.14rem}h4{font-size:1.05rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #e8e8e8}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.custom-layout{padding-top:4rem}.theme-container{min-height:100%;position:relative}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}.theme-container.no-navbar .custom-layout{padding-top:0}.footer{position:absolute;bottom:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (min-width:719px){.sidebar{margin-top:2rem}}@media (max-width:959px){.sidebar{font-size:15px;width:15.17rem}.page{padding-left:15.17rem}}@media (max-width:719px){.sidebar{top:0;padding-top:4rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}} \ No newline at end of file diff --git a/docs/cloudlinux-os-plus/images/awp/AWPAdmin.png b/assets/img/AWPAdmin.42285fee.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPAdmin.png rename to assets/img/AWPAdmin.42285fee.png diff --git a/docs/.vuepress/public/images/AWPBrokenPHP.png b/assets/img/AWPBrokenPHP.d69c93c1.png similarity index 100% rename from docs/.vuepress/public/images/AWPBrokenPHP.png rename to assets/img/AWPBrokenPHP.d69c93c1.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPDisable.png b/assets/img/AWPDisable.8d6e3701.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPDisable.png rename to assets/img/AWPDisable.8d6e3701.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPDisablePremiumOnly.png b/assets/img/AWPDisablePremiumOnly.29475d2a.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPDisablePremiumOnly.png rename to assets/img/AWPDisablePremiumOnly.29475d2a.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPFilters.png b/assets/img/AWPFilters.2aacaaca.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPFilters.png rename to assets/img/AWPFilters.2aacaaca.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPGettingStarted.png b/assets/img/AWPGettingStarted.81a4833d.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPGettingStarted.png rename to assets/img/AWPGettingStarted.81a4833d.png diff --git a/docs/.vuepress/public/images/AWPNoRedis.png b/assets/img/AWPNoRedis.8fb30039.png similarity index 100% rename from docs/.vuepress/public/images/AWPNoRedis.png rename to assets/img/AWPNoRedis.8fb30039.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPPremiumManage.png b/assets/img/AWPPremiumManage.ed2f129a.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPPremiumManage.png rename to assets/img/AWPPremiumManage.ed2f129a.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPStats.png b/assets/img/AWPStats.60587811.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPStats.png rename to assets/img/AWPStats.60587811.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPStatsPremium.png b/assets/img/AWPStatsPremium.79e89ac5.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPStatsPremium.png rename to assets/img/AWPStatsPremium.79e89ac5.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPUpgradeLink.png b/assets/img/AWPUpgradeLink.f34baf60.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPUpgradeLink.png rename to assets/img/AWPUpgradeLink.f34baf60.png diff --git a/docs/cloudlinux-os-plus/images/awp/AWPUpgradeNoLink.png b/assets/img/AWPUpgradeNoLink.914ceca7.png similarity index 100% rename from docs/cloudlinux-os-plus/images/awp/AWPUpgradeNoLink.png rename to assets/img/AWPUpgradeNoLink.914ceca7.png diff --git a/assets/img/arrow-left.c10ac3ba.svg b/assets/img/arrow-left.c10ac3ba.svg new file mode 100644 index 000000000..385777f01 --- /dev/null +++ b/assets/img/arrow-left.c10ac3ba.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/img/arrow-right.b460cbd1.svg b/assets/img/arrow-right.b460cbd1.svg new file mode 100644 index 000000000..5e125b83b --- /dev/null +++ b/assets/img/arrow-right.b460cbd1.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/img/arrow-up.acb47294.svg b/assets/img/arrow-up.acb47294.svg new file mode 100644 index 000000000..7241f8da0 --- /dev/null +++ b/assets/img/arrow-up.acb47294.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs/cloudlinux_installation/images/installation_available.png b/assets/img/installation_available.11c6d699.png similarity index 100% rename from docs/cloudlinux_installation/images/installation_available.png rename to assets/img/installation_available.11c6d699.png diff --git a/docs/cloudlinux_installation/images/installation_done.png b/assets/img/installation_done.84c286f5.png similarity index 100% rename from docs/cloudlinux_installation/images/installation_done.png rename to assets/img/installation_done.84c286f5.png diff --git a/docs/cloudlinux_installation/images/installation_iso_source.png b/assets/img/installation_iso_source.b56e7dee.png similarity index 100% rename from docs/cloudlinux_installation/images/installation_iso_source.png rename to assets/img/installation_iso_source.b56e7dee.png diff --git a/docs/cloudlinux_installation/images/installation_source_gray_done.png b/assets/img/installation_source_gray_done.af08e8ba.png similarity index 100% rename from docs/cloudlinux_installation/images/installation_source_gray_done.png rename to assets/img/installation_source_gray_done.af08e8ba.png diff --git a/docs/cloudlinux_installation/images/installation_source_gray_network.png b/assets/img/installation_source_gray_network.0c3a5a07.png similarity index 100% rename from docs/cloudlinux_installation/images/installation_source_gray_network.png rename to assets/img/installation_source_gray_network.0c3a5a07.png diff --git a/docs/cloudlinux_installation/images/installation_source_gray_working.png b/assets/img/installation_source_gray_working.8674a127.png similarity index 100% rename from docs/cloudlinux_installation/images/installation_source_gray_working.png rename to assets/img/installation_source_gray_working.8674a127.png diff --git a/docs/cloudlinux_installation/images/installation_source_network_address.png b/assets/img/installation_source_network_address.45dd1fe1.png similarity index 100% rename from docs/cloudlinux_installation/images/installation_source_network_address.png rename to assets/img/installation_source_network_address.45dd1fe1.png diff --git a/docs/cloudlinux_installation/images/installation_summary.png b/assets/img/installation_summary.04369970.png similarity index 100% rename from docs/cloudlinux_installation/images/installation_summary.png rename to assets/img/installation_summary.04369970.png diff --git a/assets/img/search.05882e25.svg b/assets/img/search.05882e25.svg new file mode 100644 index 000000000..05bf7ef1d --- /dev/null +++ b/assets/img/search.05882e25.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/cloudlinux_installation/images/software_selection.png b/assets/img/software_selection.5076e952.png similarity index 100% rename from docs/cloudlinux_installation/images/software_selection.png rename to assets/img/software_selection.5076e952.png diff --git a/assets/img/we-are-cloudlinux.783ed390.svg b/assets/img/we-are-cloudlinux.783ed390.svg new file mode 100644 index 000000000..34af6cfe7 --- /dev/null +++ b/assets/img/we-are-cloudlinux.783ed390.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/cloudlinux_installation/images/welcome_page.png b/assets/img/welcome_page.a9e3b3ef.png similarity index 100% rename from docs/cloudlinux_installation/images/welcome_page.png rename to assets/img/welcome_page.a9e3b3ef.png diff --git a/assets/js/1.dcfd61ad.js b/assets/js/1.dcfd61ad.js new file mode 100644 index 000000000..67455e659 --- /dev/null +++ b/assets/js/1.dcfd61ad.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[1,8,12,18],{271:function(t,n,e){"use strict";e.d(n,"a",function(){return s}),e.d(n,"i",function(){return o}),e.d(n,"h",function(){return a}),e.d(n,"e",function(){return u}),e.d(n,"f",function(){return l}),e.d(n,"g",function(){return c}),e.d(n,"b",function(){return f}),e.d(n,"d",function(){return p}),e.d(n,"k",function(){return h}),e.d(n,"l",function(){return g}),e.d(n,"c",function(){return v}),e.d(n,"j",function(){return d});e(22),e(79),e(138),e(278),e(137),e(54),e(53),e(277),e(78),e(272),e(80);var r=/#.*$/,i=/\.(md|html)$/,s=/\/$/,o=/^(https?:|mailto:|tel:)/;function a(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return o.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function f(t){if(u(t))return t;var n=t.match(r),e=n?n[0]:"",i=a(t);return s.test(i)?t:i+".html"+e}function p(t,n){var e=t.hash,i=function(t){var n=t.match(r);if(n)return n[0]}(n);return(!i||e===i)&&a(t.path)===a(n)}function h(t,n,e){e&&(n=function(t,n,e){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;var i=n.split("/");e&&i[i.length-1]||i.pop();for(var s=t.replace(/^\//,"").split("/"),o=0;o1||"".split(/.?/).length?function(t,e){var r=String(o(this)),s=void 0===e?4294967295:e>>>0;if(0===s)return[];if(void 0===t)return[r];if(!i(t))return n.call(r,t,s);for(var a,u,l,c=[],p=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),g=0,v=new RegExp(t.source,p+"g");(a=f.call(v,r))&&!((u=v.lastIndex)>g&&(c.push(r.slice(g,a.index)),a.length>1&&a.index=s));)v.lastIndex===a.index&&v.lastIndex++;return g===r.length?!l&&v.test("")||c.push(""):c.push(r.slice(g)),c.length>s?c.slice(0,s):c}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,e){var i=o(this),s=null==n?void 0:n[t];return void 0!==s?s.call(n,i,e):r.call(String(i),n,e)},function(t,i){var o=e(r,t,this,i,r!==n);if(o.done)return o.value;var f=s(t),p=String(this),h=a(f,RegExp),d=f.unicode,m=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(v?"y":"g"),b=new h(v?f:"^(?:"+f.source+")",m),k=void 0===i?4294967295:i>>>0;if(0===k)return[];if(0===p.length)return null===c(b,p)?[p]:[];for(var x=0,y=0,w=[];y1?arguments[1]:void 0)}})},274:function(t,n,e){var r=e(13),i=e(81),s=e(3)("species");t.exports=function(t,n){var e,o=r(t).constructor;return void 0===o||null==(e=r(o)[s])?n:i(e)}},275:function(t,n,e){},277:function(t,n,e){"use strict";var r=e(134),i=e(13),s=e(15),o=e(18),a=e(136),u=e(135);r("match",1,function(t,n,e){return[function(n){var e=o(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,e):new RegExp(n)[t](String(e))},function(t){var r=e(n,t,this);if(r.done)return r.value;var o=i(t),l=String(this);if(!o.global)return u(o,l);var c=o.unicode;o.lastIndex=0;for(var f,p=[],h=0;null!==(f=u(o,l));){var g=String(f[0]);p[h]=g,""===g&&(o.lastIndex=a(l,s(o.lastIndex),c)),h++}return 0===h?null:p}]})},278:function(t,n,e){e(1)({target:"Array",stat:!0},{isArray:e(34)})},285:function(t,n,e){"use strict";e.r(n);e(273),e(82),e(288);var r=e(271),i={props:{item:{required:!0}},computed:{link:function(){return Object(r.b)(this.item.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some(function(n){return n===t.link}):"/"===this.link}},methods:{isExternal:r.e,isMailto:r.f,isTel:r.g}},s=e(32),o=Object(s.a)(i,function(){var t=this,n=t.$createElement,e=t._self._c||n;return t.isExternal(t.link)?e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.isMailto(t.link)||t.isTel(t.link)?null:"_blank",rel:t.isMailto(t.link)||t.isTel(t.link)?null:"noopener noreferrer"}},[t._v("\n "+t._s(t.item.text)+"\n "),e("OutboundLink")],1):e("router-link",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact}},[t._v(t._s(t.item.text))])},[],!1,null,null,null);n.default=o.exports},286:function(t,n,e){"use strict";e.r(n);var r={name:"DropdownTransition",methods:{setHeight:function(t){t.style.height=t.scrollHeight+"px"},unsetHeight:function(t){t.style.height=""}}},i=(e(291),e(32)),s=Object(i.a)(r,function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)},[],!1,null,null,null);n.default=s.exports},288:function(t,n,e){"use strict";var r=e(1),i=e(289);r({target:"String",proto:!0,forced:e(290)("link")},{link:function(t){return i(this,"a","href",t)}})},289:function(t,n,e){var r=e(18),i=/"/g;t.exports=function(t,n,e,s){var o=String(r(t)),a="<"+n;return""!==e&&(a+=" "+e+'="'+String(s).replace(i,""")+'"'),a+">"+o+""}},290:function(t,n,e){var r=e(2);t.exports=function(t){return r(function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3})}},291:function(t,n,e){"use strict";var r=e(275);e.n(r).a},292:function(t,n,e){},312:function(t,n,e){var r=e(6),i=e(143);t.exports=function(t,n,e){var s,o;return i&&"function"==typeof(s=n.constructor)&&s!==e&&r(o=s.prototype)&&o!==e.prototype&&i(t,o),t}},315:function(t,n,e){"use strict";e.r(n);e(142),e(54),e(273),e(82),e(346),e(53),e(348),e(277),e(78);var r=e(30),i=e(338),s=e(271),o={components:{NavLink:e(285).default,DropdownLink:i.default},computed:{userNav:function(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav:function(){var t=this,n=this.$site.locales;if(n&&Object.keys(n).length>1){var e=this.$page.path,i=this.$router.options.routes,s=this.$site.themeConfig.locales||{},o={title:this.$themeLocaleConfig.title||"Language",text:this.$themeLocaleConfig.selectText||"En",items:Object.keys(n).map(function(r){var o,a=n[r],u=s[r]&&s[r].label||a.lang;return a.lang===t.$lang?o=e:(o=e.replace(t.$localeConfig.path,r),i.some(function(t){return t.path===o})||(o=r)),{text:u,link:o}})};return[].concat(Object(r.a)(this.userNav),[o])}return this.userNav},userLinks:function(){return(this.nav||[]).map(function(t){return Object.assign(Object(s.j)(t),{items:(t.items||[]).map(s.j)})})},repoLink:function(){var t=this.$site.themeConfig.repo;if(t)return/^https?:/.test(t)?t:"https://github.com/".concat(t)},repoLabel:function(){if(this.repoLink){if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;for(var t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],n=["GitHub","GitLab","Bitbucket"],e=0;e-1)&&(n=n.replace(/y/g,""));var a=o(y?new m(t,n):m(t,n),r?this:b,_);return w&&e&&g(a,{sticky:e}),a},C=function(t){t in _||a(_,t,{configurable:!0,get:function(){return m[t]},set:function(n){m[t]=n}})},L=u(m),$=0;L.length>$;)C(L[$++]);b.constructor=_,_.prototype=b,p(i,"RegExp",_)}v("RegExp")},347:function(t,n,e){"use strict";var r=e(39),i=e(8),s=e(3),o=e(7),a=s("species");t.exports=function(t){var n=r(t),e=i.f;o&&n&&!n[a]&&e(n,a,{configurable:!0,get:function(){return this}})}},348:function(t,n,e){"use strict";var r=e(20),i=e(13),s=e(2),o=e(144),a=RegExp.prototype,u=a.toString,l=s(function(){return"/a/b"!=u.call({source:"a",flags:"b"})}),c="toString"!=u.name;(l||c)&&r(RegExp.prototype,"toString",function(){var t=i(this),n=String(t.source),e=t.flags;return"/"+n+"/"+String(void 0===e&&t instanceof RegExp&&!("flags"in a)?o.call(t):e)},{unsafe:!0})},349:function(t,n,e){"use strict";var r=e(325);e.n(r).a}}]); \ No newline at end of file diff --git a/assets/js/10.f70a52ea.js b/assets/js/10.f70a52ea.js new file mode 100644 index 000000000..7e5e511b5 --- /dev/null +++ b/assets/js/10.f70a52ea.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10,12],{271:function(t,n,e){"use strict";e.d(n,"a",function(){return a}),e.d(n,"i",function(){return s}),e.d(n,"h",function(){return u}),e.d(n,"e",function(){return l}),e.d(n,"f",function(){return o}),e.d(n,"g",function(){return c}),e.d(n,"b",function(){return f}),e.d(n,"d",function(){return d}),e.d(n,"k",function(){return h}),e.d(n,"l",function(){return p}),e.d(n,"c",function(){return v}),e.d(n,"j",function(){return g});e(22),e(79),e(138),e(278),e(137),e(54),e(53),e(277),e(78),e(272),e(80);var r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^(https?:|mailto:|tel:)/;function u(t){return decodeURI(t).replace(r,"").replace(i,"")}function l(t){return s.test(t)}function o(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function f(t){if(l(t))return t;var n=t.match(r),e=n?n[0]:"",i=u(t);return a.test(i)?t:i+".html"+e}function d(t,n){var e=t.hash,i=function(t){var n=t.match(r);if(n)return n[0]}(n);return(!i||e===i)&&u(t.path)===u(n)}function h(t,n,e){e&&(n=function(t,n,e){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return n+t;var i=n.split("/");e&&i[i.length-1]||i.pop();for(var a=t.replace(/^\//,"").split("/"),s=0;s1||"".split(/.?/).length?function(t,e){var r=String(s(this)),a=void 0===e?4294967295:e>>>0;if(0===a)return[];if(void 0===t)return[r];if(!i(t))return n.call(r,t,a);for(var u,l,o,c=[],d=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),p=0,v=new RegExp(t.source,d+"g");(u=f.call(v,r))&&!((l=v.lastIndex)>p&&(c.push(r.slice(p,u.index)),u.length>1&&u.index=a));)v.lastIndex===u.index&&v.lastIndex++;return p===r.length?!o&&v.test("")||c.push(""):c.push(r.slice(p)),c.length>a?c.slice(0,a):c}:"0".split(void 0,0).length?function(t,e){return void 0===t&&0===e?[]:n.call(this,t,e)}:n,[function(n,e){var i=s(this),a=null==n?void 0:n[t];return void 0!==a?a.call(n,i,e):r.call(String(i),n,e)},function(t,i){var s=e(r,t,this,i,r!==n);if(s.done)return s.value;var f=a(t),d=String(this),h=u(f,RegExp),g=f.unicode,m=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(v?"y":"g"),b=new h(v?f:"^(?:"+f.source+")",m),k=void 0===i?4294967295:i>>>0;if(0===k)return[];if(0===d.length)return null===c(b,d)?[d]:[];for(var x=0,_=0,y=[];_1?arguments[1]:void 0)}})},274:function(t,n,e){var r=e(13),i=e(81),a=e(3)("species");t.exports=function(t,n){var e,s=r(t).constructor;return void 0===s||null==(e=r(s)[a])?n:i(e)}},277:function(t,n,e){"use strict";var r=e(134),i=e(13),a=e(15),s=e(18),u=e(136),l=e(135);r("match",1,function(t,n,e){return[function(n){var e=s(this),r=null==n?void 0:n[t];return void 0!==r?r.call(n,e):new RegExp(n)[t](String(e))},function(t){var r=e(n,t,this);if(r.done)return r.value;var s=i(t),o=String(this);if(!s.global)return l(s,o);var c=s.unicode;s.lastIndex=0;for(var f,d=[],h=0;null!==(f=l(s,o));){var p=String(f[0]);d[h]=p,""===p&&(s.lastIndex=u(o,a(s.lastIndex),c)),h++}return 0===h?null:d}]})},278:function(t,n,e){e(1)({target:"Array",stat:!0},{isArray:e(34)})},285:function(t,n,e){"use strict";e.r(n);e(273),e(82),e(288);var r=e(271),i={props:{item:{required:!0}},computed:{link:function(){return Object(r.b)(this.item.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some(function(n){return n===t.link}):"/"===this.link}},methods:{isExternal:r.e,isMailto:r.f,isTel:r.g}},a=e(32),s=Object(a.a)(i,function(){var t=this,n=t.$createElement,e=t._self._c||n;return t.isExternal(t.link)?e("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.isMailto(t.link)||t.isTel(t.link)?null:"_blank",rel:t.isMailto(t.link)||t.isTel(t.link)?null:"noopener noreferrer"}},[t._v("\n "+t._s(t.item.text)+"\n "),e("OutboundLink")],1):e("router-link",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact}},[t._v(t._s(t.item.text))])},[],!1,null,null,null);n.default=s.exports},288:function(t,n,e){"use strict";var r=e(1),i=e(289);r({target:"String",proto:!0,forced:e(290)("link")},{link:function(t){return i(this,"a","href",t)}})},289:function(t,n,e){var r=e(18),i=/"/g;t.exports=function(t,n,e,a){var s=String(r(t)),u="<"+n;return""!==e&&(u+=" "+e+'="'+String(a).replace(i,""")+'"'),u+">"+s+""}},290:function(t,n,e){var r=e(2);t.exports=function(t){return r(function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3})}},294:function(t,n,e){},322:function(t,n,e){"use strict";var r=e(294);e.n(r).a},340:function(t,n,e){"use strict";e.r(n);var r={components:{NavLink:e(285).default},computed:{data:function(){return this.$page.frontmatter},actionLink:function(){return{link:this.data.actionLink,text:this.data.actionText}}}},i=(e(322),e(32)),a=Object(i.a)(r,function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("div",{staticClass:"home"},[e("div",{staticClass:"hero"},[t.data.heroImage?e("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:"hero"}}):t._e(),t._v(" "),e("h1",[t._v(t._s(t.data.heroText||t.$title||"Hello"))]),t._v(" "),e("p",{staticClass:"description"},[t._v("\n "+t._s(t.data.tagline||t.$description||"Welcome to your VuePress site")+"\n ")]),t._v(" "),t.data.actionText&&t.data.actionLink?e("p",{staticClass:"action"},[e("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?e("div",{staticClass:"features"},t._l(t.data.features,function(n,r){return e("div",{key:r,staticClass:"feature"},[e("h2",[t._v(t._s(n.title))]),t._v(" "),e("p",[t._v(t._s(n.details))])])}),0):t._e(),t._v(" "),e("Content",{attrs:{custom:""}}),t._v(" "),t.data.footer?e("div",{staticClass:"footer"},[t._v("\n "+t._s(t.data.footer)+"\n ")]):t._e()],1)},[],!1,null,null,null);n.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/11.a6b6a413.js b/assets/js/11.a6b6a413.js new file mode 100644 index 000000000..8b095f547 --- /dev/null +++ b/assets/js/11.a6b6a413.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{352:function(e,t,a){e.exports=a.p+"assets/img/AWPGettingStarted.81a4833d.png"},353:function(e,t,a){e.exports=a.p+"assets/img/AWPAdmin.42285fee.png"},354:function(e,t,a){e.exports=a.p+"assets/img/AWPStats.60587811.png"},355:function(e,t,a){e.exports=a.p+"assets/img/AWPPremiumManage.ed2f129a.png"},356:function(e,t,a){e.exports=a.p+"assets/img/AWPStatsPremium.79e89ac5.png"},357:function(e,t,a){e.exports=a.p+"assets/img/AWPFilters.2aacaaca.png"},358:function(e,t,a){e.exports=a.p+"assets/img/AWPUpgradeNoLink.914ceca7.png"},359:function(e,t,a){e.exports=a.p+"assets/img/AWPUpgradeLink.f34baf60.png"},360:function(e,t,a){e.exports=a.p+"assets/img/AWPDisablePremiumOnly.29475d2a.png"},361:function(e,t,a){e.exports=a.p+"assets/img/AWPDisable.8d6e3701.png"},362:function(e,t,a){e.exports=a.p+"assets/img/AWPNoRedis.8fb30039.png"},363:function(e,t,a){e.exports=a.p+"assets/img/AWPBrokenPHP.d69c93c1.png"},387:function(e,t,a){"use strict";a.r(t);var s=a(32),r=Object(s.a)({},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"cloudlinux-os-shared-pro"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#cloudlinux-os-shared-pro","aria-hidden":"true"}},[e._v("#")]),e._v(" CloudLinux OS Shared Pro")]),e._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#x-ray"}},[e._v("X-Ray")]),s("ul",[s("li",[s("a",{attrs:{href:"#description"}},[e._v("Description")])]),s("li",[s("a",{attrs:{href:"#known-limitations"}},[e._v("Known limitations")])]),s("li",[s("a",{attrs:{href:"#installation"}},[e._v("Installation")])]),s("li",[s("a",{attrs:{href:"#how-to-manage-x-ray"}},[e._v("How to manage X-Ray")])]),s("li",[s("a",{attrs:{href:"#managing-tracing-task"}},[e._v("Managing tracing task")])]),s("li",[s("a",{attrs:{href:"#managing-continuous-tasks"}},[e._v("Managing continuous tasks")])]),s("li",[s("a",{attrs:{href:"#x-ray-autotracing"}},[e._v("X-Ray Autotracing")])]),s("li",[s("a",{attrs:{href:"#x-ray-smart-advice"}},[e._v("X-Ray Smart Advice")])]),s("li",[s("a",{attrs:{href:"#end-user-x-ray-plugin"}},[e._v("End-user X-Ray plugin")])]),s("li",[s("a",{attrs:{href:"#x-ray-automated-throttling-detection"}},[e._v("X-Ray automated throttling detection")])]),s("li",[s("a",{attrs:{href:"#x-ray-client"}},[e._v("X-Ray client")])]),s("li",[s("a",{attrs:{href:"#x-ray-agent"}},[e._v("X-Ray agent")])]),s("li",[s("a",{attrs:{href:"#faq"}},[e._v("FAQ")])])])]),s("li",[s("a",{attrs:{href:"#centralized-monitoring"}},[e._v("Centralized Monitoring")]),s("ul",[s("li",[s("a",{attrs:{href:"#description"}},[e._v("Description")])]),s("li",[s("a",{attrs:{href:"#installation"}},[e._v("Installation")])]),s("li",[s("a",{attrs:{href:"#centralized-monitoring-mode-without-session-expired"}},[e._v("Centralized Monitoring: mode without session expired")])]),s("li",[s("a",{attrs:{href:"#centralized-monitoring-user-interface"}},[e._v("Centralized Monitoring user interface")])]),s("li",[s("a",{attrs:{href:"#alert-manager"}},[e._v("Alert Manager")])]),s("li",[s("a",{attrs:{href:"#faq"}},[e._v("FAQ")])]),s("li",[s("a",{attrs:{href:"#troubleshooting"}},[e._v("Troubleshooting")])]),s("li",[s("a",{attrs:{href:"#known-issues"}},[e._v("Known issues")])])])]),s("li",[s("a",{attrs:{href:"#acceleratewp"}},[e._v("AccelerateWP")]),s("ul",[s("li",[s("a",{attrs:{href:"#get-started"}},[e._v("Get started")])]),s("li",[s("a",{attrs:{href:"#limitations"}},[e._v("Limitations")])]),s("li",[s("a",{attrs:{href:"#administrator-interface"}},[e._v("Administrator interface")])]),s("li",[s("a",{attrs:{href:"#activate-free-acceleratewp-for-all-wordpress-sites-on-the-server"}},[e._v("Activate free AccelerateWP for all WordPress sites on the server")])]),s("li",[s("a",{attrs:{href:"#enable-acceleratewp-cdn-pro"}},[e._v("Enable AccelerateWP CDN Pro")])]),s("li",[s("a",{attrs:{href:"#disable-acceleratewp-for-a-particular-user"}},[e._v("Disable AccelerateWP for a particular user")])]),s("li",[s("a",{attrs:{href:"#useful-acceleratewp-cli-commands"}},[e._v("Useful AccelerateWP CLI commands")])]),s("li",[s("a",{attrs:{href:"#whmcs-billing"}},[e._v("WHMCS billing")])]),s("li",[s("a",{attrs:{href:"#other-billing-integration"}},[e._v("Other billing integration")])]),s("li",[s("a",{attrs:{href:"#setup-upgrade-url-for-acceleratewp-premium"}},[e._v("Setup upgrade URL for AccelerateWP Premium")])]),s("li",[s("a",{attrs:{href:"#disable-acceleratewp-premium"}},[e._v("Disable AccelerateWP Premium")])]),s("li",[s("a",{attrs:{href:"#disable-acceleratewp"}},[e._v("Disable AccelerateWP")])]),s("li",[s("a",{attrs:{href:"#logs"}},[e._v("Logs")])]),s("li",[s("a",{attrs:{href:"#faq"}},[e._v("FAQ")])]),s("li",[s("a",{attrs:{href:"#my-users-are-complaining-that-their-feature-are-not-installed-automatically-after-subscription-upgrade"}},[e._v("My users are complaining that their feature are not installed automatically after subscription upgrade")])]),s("li",[s("a",{attrs:{href:"#troubleshooting"}},[e._v("Troubleshooting")])])])])])]),s("p"),e._v(" "),s("h2",{attrs:{id:"x-ray"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#x-ray","aria-hidden":"true"}},[e._v("#")]),e._v(" X-Ray")]),e._v(" "),s("ul",[s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#description"}},[e._v("Description")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#installation"}},[e._v("Installation")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#how-to-manage-x-ray"}},[e._v("How to manage "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")])])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#x-ray-client"}},[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" client")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#x-ray-agent"}},[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" service")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#faq"}},[e._v("FAQ")])],1)]),e._v(" "),s("h3",{attrs:{id:"description"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#description","aria-hidden":"true"}},[e._v("#")]),e._v(" Description")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning!")]),s("p",[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" is available out of the box for cPanel, Plesk, and DirectAdmin. For other control panels you should implement integration as described "),s("RouterLink",{attrs:{to:"/control_panel_integration/#how-to-integrate-x-ray-with-a-control-panel"}},[e._v("here")])],1)]),s("p",[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" is a tool developed for website performance monitoring and performance issues detection.")]),e._v(" "),s("p",[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" can gather and visualize information about top N slowest system functions, external requests, software modules and database queries of the client’s website.")]),e._v(" "),s("h3",{attrs:{id:"known-limitations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#known-limitations","aria-hidden":"true"}},[e._v("#")]),e._v(" Known limitations")]),e._v(" "),s("p",[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" is not compatible with Opcahce JIT optimization.\nOnce "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" tracing task is running for the site the Opcache JIT optimization will be disabled until tracing task completed.")]),e._v(" "),s("h3",{attrs:{id:"installation"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation","aria-hidden":"true"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),s("ol",[s("li",[s("p",[e._v("Make sure you have CloudLinux OS Shared Pro subscription (only non-reseller accounts apply)")])]),e._v(" "),s("li",[s("p",[e._v("Make sure you have installed "),s("strong",[e._v("LVE Manager version 6.2 or later")]),e._v(". You can install or update it with the following commands:")]),e._v(" "),s("ul",[s("li",[e._v("installation")])]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# yum install lvemanager\n")])])])]),e._v(" "),s("ul",[s("li",[e._v("update")])]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# yum update lvemanager\n")])])])])]),e._v(" "),s("li",[s("p",[e._v("X-Ray will be activated on all your servers during 4 hours. You will see the X-Ray tab in the LVE Manager UI.")])]),e._v(" "),s("li",[s("p",[e._v("For instant activation, run the following command:")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# rhn_check\n")])])])]),e._v(" "),s("p",[e._v("If the "),s("code",[e._v("rhn_check")]),e._v(" command is not found, run the following command:")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# yum install rhn-check rhn-setup\n")])])])])]),e._v(" "),s("li",[s("p",[e._v("Then install the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("alt-php-xray")])]),e._v(" package")]),e._v(" "),s("ul",[s("li",[s("p",[e._v("Via user interface")]),e._v(" "),s("ul",[s("li",[e._v("Go to the "),s("span",{staticClass:"notranslate"},[s("em",[e._v("X-Ray")])]),e._v(" tab.")]),e._v(" "),s("li",[e._v("Click "),s("span",{staticClass:"notranslate"},[s("em",[e._v("Install")])]),e._v(" to start installation.")])]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayUI.png",alt:""}})])]),e._v(" "),s("li",[s("p",[e._v("Via SSH by running the following command:")])])]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# yum install lvemanager alt-php-xray\n")])])])])]),e._v(" "),s("li",[s("p",[e._v("After installation, use the "),s("span",{staticClass:"notranslate"},[s("em",[e._v("Start tracing")])]),e._v(" button to create your first tracing task for a slow site.")])])]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayStartTracing.png",alt:""}})]),e._v(" "),s("h3",{attrs:{id:"how-to-manage-x-ray"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manage-x-ray","aria-hidden":"true"}},[e._v("#")]),e._v(" How to manage X-Ray")]),e._v(" "),s("p",[e._v("X-Ray provides several options for monitoring domain requests speed: Manual Tracing task, X-Ray Autotracing and Continuous tracing.")]),e._v(" "),s("ul",[s("li",[s("p",[s("strong",[e._v("Manual Tracing task")]),e._v(" is a task that you can create for a specific URL to collect server requests. The task will end either after a specified number of requests to the URL or after a specified time (maximum after two days). It is not possible here to automatically email a report but it is possible to export the report in PDF and send to a user.")])]),e._v(" "),s("li",[s("p",[s("strong",[e._v("Autotracing task")]),e._v(" is a task that will be created automatically at the end of each day for slow URLs that were found during that day by the "),s("RouterLink",{attrs:{to:"/lve_manager/#website-monitoring-tool-and-slow-site-analyzer"}},[e._v("PHP Slow Site Analyzer")]),e._v(" (SSA).\nNeed to be enabled separately, see "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#how-to-enable-x-ray-autotracing"}},[e._v("How to enable X-Ray Autotracing")]),e._v(".")],1)]),e._v(" "),s("li",[s("p",[s("strong",[e._v("Continuous tracing")]),e._v(" is a task that initiates daily hourly tracing requests for a specified domain and email a monitoring report. Continuous task can't stop automatically, you need to stop it manually. In fact, continuous task allows to automatically create a tracing task for each new day, with the ability to get a report for the past day.")])])]),e._v(" "),s("h4",{attrs:{id:"tracing-tasks-tab"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tracing-tasks-tab","aria-hidden":"true"}},[e._v("#")]),e._v(" Tracing tasks tab")]),e._v(" "),s("p",[e._v("The "),s("em",[e._v("Tracing tasks")]),e._v(" tab contains a list of all tracing tasks created both manually and automatically via continuous tasks.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayTracingTaskCreated.png",alt:""}})]),e._v(" "),s("p",[e._v("The "),s("em",[e._v("Created")]),e._v(" column shows how a task was created – automatically (by continuous task) or manually.")]),e._v(" "),s("h4",{attrs:{id:"continuous-tracing-tab"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#continuous-tracing-tab","aria-hidden":"true"}},[e._v("#")]),e._v(" Continuous tracing tab")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning")]),s("p",[e._v("To use Continuous task, update your LVE Manager and alt-PHP-X-Ray packages to versions lvemanager-6.2.9-1 and alt-php-xray-0.2-1 by running the following command:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("yum update lvemanager alt-php-xray\n")])])])]),s("p",[e._v("The "),s("em",[e._v("Continuous tracing")]),e._v(" tab contains a list of continuous tasks for which tracing tasks will be created automatically for a new day for a specific domain.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTasksList.png",alt:""}})]),e._v(" "),s("h3",{attrs:{id:"managing-tracing-task"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#managing-tracing-task","aria-hidden":"true"}},[e._v("#")]),e._v(" Managing tracing task")]),e._v(" "),s("h4",{attrs:{id:"creating-a-new-tracing-task"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-tracing-task","aria-hidden":"true"}},[e._v("#")]),e._v(" Creating a new tracing task")]),e._v(" "),s("ol",[s("li",[e._v("Go to the "),s("span",{staticClass:"notranslate"},[s("em",[e._v("X-Ray")])]),e._v(" tab")]),e._v(" "),s("li",[e._v("Click the "),s("span",{staticClass:"notranslate"},[s("em",[e._v("Start tracing")])]),e._v(" button to create a new task")]),e._v(" "),s("li",[e._v("In the opened popup specify a website URL to trace")]),e._v(" "),s("li",[e._v("Click the "),s("span",{staticClass:"notranslate"},[s("em",[e._v("Run")])]),e._v(" button")]),e._v(" "),s("li",[e._v("Tracing will run in the default mode. In the default mode "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" traces the first 20 requests for a specified URL")])]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayTracingTask.png",alt:""}})]),e._v(" "),s("ul",[s("li",[s("p",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("URL")])]),e._v(" should be a valid URL of the domain which exists on the current hosting server. The URL field supports wildcard matching. To learn more about wildcard matching, click "),s("em",[e._v("How to use special characters")]),e._v(".")])]),e._v(" "),s("li",[s("p",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Advanced settings")])]),e._v(" allow you to set an IP address and tracing options: by time or by number of queries.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayAdvanced.png",alt:""}})])])]),e._v(" "),s("p",[s("strong",[e._v("Advanced settings")])]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Client’s IP")])]),e._v(": it is an IPv4 address of a machine to trace. For example, if you have a production website that processes requests from different IP addresses and you do not want to add these requests to the tracing task. So, you can set a specific IP address and "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" will analyze requests only from this specific IP address.\nRecord for")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Time period")])]),e._v(": how much time "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" collect the requests (2 days max)")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Requests")])]),e._v(": the amount of requests that "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" will collect")])]),e._v(" "),s("p",[e._v("After creating, the task appears in the list of tracing tasks.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayTrcingTaskList.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"viewing-tracing-tasks-list"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#viewing-tracing-tasks-list","aria-hidden":"true"}},[e._v("#")]),e._v(" Viewing tracing tasks list")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayTrcingTaskList1.png",alt:""}})]),e._v(" "),s("p",[e._v("Tasks created "),s("em",[e._v("Manually")]),e._v(" are simply tracing tasks.")]),e._v(" "),s("h4",{attrs:{id:"tracing-status"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tracing-status","aria-hidden":"true"}},[e._v("#")]),e._v(" Tracing status")]),e._v(" "),s("p",[e._v("A tracing task can have the following statuses:")]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Running")])]),e._v(" – tracing is in progress")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Stopped")])]),e._v(" – tracing was stopped by administrator")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("On hold")])]),e._v(" – the same URL already exists in the lists. Task processing will not start automatically. Administrator should start it manually.")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Completed")])]),e._v(" – period of time is finished or number of requests is reached.")])]),e._v(" "),s("h4",{attrs:{id:"collected-requests-for-tracing-task"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#collected-requests-for-tracing-task","aria-hidden":"true"}},[e._v("#")]),e._v(" Collected requests for tracing task")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning!")]),s("p",[e._v("Collected requests are available in the UI for two weeks.")])]),s("p",[e._v("Click "),s("img",{attrs:{src:"/images/XRayView.png",alt:""}}),e._v(" to open a list of collected requests.")]),e._v(" "),s("h4",{attrs:{id:"tracing-tasks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tracing-tasks","aria-hidden":"true"}},[e._v("#")]),e._v(" Tracing tasks")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayCollectedRequests.png",alt:""}})]),e._v(" "),s("p",[e._v("The slowest request is highlighted.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRaySlowestRequest.png",alt:""}})]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Total")])]),e._v(" displays how many requests were collected according to tasks requirements.")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Pending")])]),e._v(" displays how many of collected requests are not visible in the table yet.")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Throttled")])]),e._v(" displays the number of requests during the execution of which the LVE limits were exceeded.")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Slow")])]),e._v(" displays the number of requests lasting more than one second.")])]),e._v(" "),s("p",[e._v("There are filters for the request types and the indicator of a filter used now.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/FilterIndicator.png",alt:""}})]),e._v(" "),s("p",[e._v("If slow requests were not detected during the tracing task, the following is displayed. Here, you can also view all requests.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/RecordedSession.png",alt:""}})]),e._v(" "),s("p",[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" collects the following data for each request:")]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Top issues")])]),e._v(" – the slowest items of a request")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Software modules/plugins")])]),e._v(" by execution time (only for WordPress plugins)")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Database queries")])]),e._v(" by execution time")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("External requests")])]),e._v(" by execution time")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Other system functions")])]),e._v(" by execution time")])]),e._v(" "),s("h4",{attrs:{id:"software-modules-plugins"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#software-modules-plugins","aria-hidden":"true"}},[e._v("#")]),e._v(" Software modules/plugins")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRaySoftwareModulesPlugins.png",alt:""}})]),e._v(" "),s("p",[e._v("The "),s("span",{staticClass:"notranslate"},[s("em",[e._v("Software modules/plugins")])]),e._v(" section displays the following data:")]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Software type")])]),e._v(" – a type a module/plugin. For now, "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" can analyze only WordPress software")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Software module")])]),e._v(" – a name of the WordPress plugin")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Duration")])]),e._v(" – plugin execution time")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Duration (%)")])]),e._v(" – plugin execution time as a percentage of the total duration of the request")])]),e._v(" "),s("h4",{attrs:{id:"database-queries"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#database-queries","aria-hidden":"true"}},[e._v("#")]),e._v(" Database queries")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayDatabaseQueries.png",alt:""}})]),e._v(" "),s("p",[e._v("The "),s("span",{staticClass:"notranslate"},[s("em",[e._v("Database queries")])]),e._v(" section displays the following data:")]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Query")])]),e._v(" – the executed SQL-query")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("File")])]),e._v(" – the file and the line of the executed query and backtrace")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Software module")])]),e._v(" – a WordPress plugin name from which the request was completed. If the request does not belong to any of the WordPress plugin, the name of the function that executed the given request is displayed")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Calls")])]),e._v(" – the number of identical SQL queries")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Duration")])]),e._v(" – execution time as a percentage of the total duration of a request and the function processing time (in brackets)")])]),e._v(" "),s("h4",{attrs:{id:"external-requests"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#external-requests","aria-hidden":"true"}},[e._v("#")]),e._v(" External requests")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayExternalRequests.png",alt:""}})]),e._v(" "),s("p",[e._v("The "),s("span",{staticClass:"notranslate"},[s("em",[e._v("External requests")])]),e._v(" section displays the following data:")]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("URL")])]),e._v(" – the URL of the executed request")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("File")])]),e._v(" – the file and the line of the executed request and backtrace")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Duration")])]),e._v(" – execution time as a percentage of the total duration of a request and the function processing time (in brackets)")])]),e._v(" "),s("h4",{attrs:{id:"system-functions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#system-functions","aria-hidden":"true"}},[e._v("#")]),e._v(" System functions")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRaySystemFunctions.png",alt:""}})]),e._v(" "),s("p",[e._v("The "),s("span",{staticClass:"notranslate"},[s("em",[e._v("System functions")])]),e._v(" section displays the following data:")]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Function")])]),e._v(" – the executed function")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("File")])]),e._v(" – the file and the line of the executed request")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Duration")])]),e._v(" – execution time as a percentage of the total duration of a request and the function processing time (in brackets)")])]),e._v(" "),s("h4",{attrs:{id:"stopping-tracing-task"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#stopping-tracing-task","aria-hidden":"true"}},[e._v("#")]),e._v(" Stopping tracing task")]),e._v(" "),s("p",[e._v("Click "),s("img",{attrs:{src:"/images/XRayStop.png",alt:""}}),e._v(" to stop the tracing task.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayStopped.png",alt:""}})]),e._v(" "),s("p",[e._v("The tracing task status will be changed to "),s("span",{staticClass:"notranslate"},[s("strong",[e._v("Stopped")])]),e._v(". Data will not be collected anymore but you can see already collected information or continue tracing later by clicking "),s("img",{attrs:{src:"/images/XRayStart.png",alt:""}}),e._v(".")]),e._v(" "),s("h4",{attrs:{id:"deleting-tracing-task"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#deleting-tracing-task","aria-hidden":"true"}},[e._v("#")]),e._v(" Deleting tracing task")]),e._v(" "),s("p",[e._v("Click "),s("img",{attrs:{src:"/images/XRayDelete.png",alt:""}}),e._v(" to delete the tracing task.")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning!")]),s("p",[e._v("When you have deleted a tracing task, all collected data will be unavailable.")])]),s("h3",{attrs:{id:"managing-continuous-tasks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#managing-continuous-tasks","aria-hidden":"true"}},[e._v("#")]),e._v(" Managing continuous tasks")]),e._v(" "),s("h4",{attrs:{id:"creating-a-new-continuous-task"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-continuous-task","aria-hidden":"true"}},[e._v("#")]),e._v(" Creating a new continuous task")]),e._v(" "),s("ol",[s("li",[e._v("Click the "),s("em",[e._v("Create continuous tracing")]),e._v(" button")])]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayCreateContinuousTaskBtn.png",alt:""}})]),e._v(" "),s("ol",{attrs:{start:"2"}},[s("li",[e._v("Specify URL in the "),s("em",[e._v("Domain")]),e._v(" field and email in the "),s("em",[e._v("Email for reports")]),e._v(" field and click the "),s("em",[e._v("Create")]),e._v(" button.")])]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayCreateContinuousTaskForm.png",alt:""}})]),e._v(" "),s("ol",{attrs:{start:"3"}},[s("li",[e._v("You can see a new task in the "),s("em",[e._v("Continuous tracing")]),e._v(" tab in the X-Ray UI.")])]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTracingTab.png",alt:""}})]),e._v(" "),s("ol",{attrs:{start:"4"}},[s("li",[s("p",[e._v("If you stop a continuous tracing task, a new task for the next 24 hours will not be created. The task for the current day will be finished at midnight and the report will be emailed.")])]),e._v(" "),s("li",[s("p",[e._v("If you delete a continuous tracing task, the task for the current day will be finished at midnight and the report will be emailed.")])])]),e._v(" "),s("h4",{attrs:{id:"viewing-continuous-tasks-list"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#viewing-continuous-tasks-list","aria-hidden":"true"}},[e._v("#")]),e._v(" Viewing continuous tasks list")]),e._v(" "),s("p",[e._v("You can find a list of continuous tracing tasks in the "),s("em",[e._v("Continuous tracing")]),e._v(" tab.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTracingTasksList.png",alt:""}})]),e._v(" "),s("p",[e._v("You can find automatically created tasks in the "),s("em",[e._v("Tracing tasks")]),e._v(" tab marked as "),s("em",[e._v("Automatically")]),e._v(" in the "),s("em",[e._v("Created")]),e._v(" column.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTracingTasksListCreated.png",alt:""}})]),e._v(" "),s("p",[e._v("The "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#tracing-status"}},[e._v("statuses for automatically created tasks")]),e._v(" are the same as for tracing task.")],1),e._v(" "),s("p",[e._v("To view detailed info about an automatically created task, click "),s("img",{attrs:{src:"/images/XRayView1.png",alt:""}}),e._v(". You will get requests grouped by hour.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTracingTasksListGrouped.png",alt:""}})]),e._v(" "),s("p",[e._v("Click to a group to open a list of the requests.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTracingTasksRequestsList.png",alt:""}})]),e._v(" "),s("p",[e._v("The following data is collected for each request:")]),e._v(" "),s("ul",[s("li",[e._v("Software modules/plugins by execution time (only for WordPress plugins)")]),e._v(" "),s("li",[e._v("Database queries by execution time")]),e._v(" "),s("li",[e._v("External requests by execution time")]),e._v(" "),s("li",[e._v("Other system functions by execution time")])]),e._v(" "),s("h4",{attrs:{id:"stopping-automatic-tracing-task"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#stopping-automatic-tracing-task","aria-hidden":"true"}},[e._v("#")]),e._v(" Stopping automatic tracing task")]),e._v(" "),s("p",[e._v("Stopping automatic tracing task (a part of continuous tracing task) affects only the automatic tracing task for the current day. A new task for the next day will be created at the end of the day.")]),e._v(" "),s("p",[e._v("To stop the continuous tracing task completely, see "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#creating-a-new-continuous-task"}},[e._v("Creating a new continuous task, paragraph 4")]),e._v(".")],1),e._v(" "),s("h4",{attrs:{id:"deleting-automatic-tracing-task"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#deleting-automatic-tracing-task","aria-hidden":"true"}},[e._v("#")]),e._v(" Deleting automatic tracing task")]),e._v(" "),s("p",[e._v("Deleting automatic tracing task (a part of continuous tracing task) affects only the automatic tracing task for the current day. A new task for the next day will be created at the end of the day.")]),e._v(" "),s("p",[e._v("To delete the continuous tracing task completely, see "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#creating-a-new-continuous-task"}},[e._v("Creating a new continuous task, paragraph 5")]),e._v(".")],1),e._v(" "),s("h4",{attrs:{id:"continuous-task-daily-report"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#continuous-task-daily-report","aria-hidden":"true"}},[e._v("#")]),e._v(" Continuous task daily report")]),e._v(" "),s("ol",[s("li",[s("p",[e._v("Users get daily reports on their emails. An example of a report is shown below:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTaskDaylyReportExample.png",alt:""}})])]),e._v(" "),s("li",[s("p",[e._v("Click the link in the email to show the detailed report:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTaskDaylyReportCollectedRequests.png",alt:""}})])]),e._v(" "),s("li",[s("p",[e._v("You can view requests grouped by hour:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTaskDaylyReportByHourRequests.png",alt:""}})])]),e._v(" "),s("li",[s("p",[e._v("You can also view the detailed information about request:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayContinuousTaskDaylyReportRequestDetails.png",alt:""}})])])]),e._v(" "),s("h3",{attrs:{id:"x-ray-autotracing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#x-ray-autotracing","aria-hidden":"true"}},[e._v("#")]),e._v(" X-Ray Autotracing")]),e._v(" "),s("p",[e._v("X-Ray Autotracing automatically creates tracing tasks for slow URLs that were found during a day by the "),s("RouterLink",{attrs:{to:"/lve_manager/#website-monitoring-tool-and-slow-site-analyzer"}},[e._v("PHP Slow Site Analyzer")]),e._v(" (SSA).")],1),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning")]),s("p",[e._v("To use X-Ray Autotracing, update your alt-php-ssa and alt-php-xray packages to versions alt-php-ssa-0.2-1 and alt-php-xray-0.4-1 or higher by running the following command:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# yum update alt-php-ssa alt-php-xray --enablerepo=cloudlinux-updates-testing\n")])])])]),s("h4",{attrs:{id:"how-to-enable-x-ray-autotracing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-x-ray-autotracing","aria-hidden":"true"}},[e._v("#")]),e._v(" How to enable X-Ray Autotracing")]),e._v(" "),s("p",[e._v("To enable X-Ray Autotracing, run the following commands via SSH:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# /usr/sbin/cloudlinux-ssa-manager enable-ssa\n# /usr/sbin/cloudlinux-autotracing enable --all\n")])])]),s("p",[e._v("Check "),s("RouterLink",{attrs:{to:"/command-line_tools/#x-ray-autotracing"}},[e._v("CLI documentation")]),e._v(" for a description of the "),s("code",[e._v("/usr/sbin/cloudlinux-autotracing")]),e._v(" CLI utility.")],1),e._v(" "),s("h4",{attrs:{id:"requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#requirements","aria-hidden":"true"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),s("ul",[s("li",[e._v("CloudLinux OS Shared Pro or CloudLinux OS Solo or CloudLinux OS Admin")]),e._v(" "),s("li",[e._v("alt-php-ssa > 0.2-1 version")]),e._v(" "),s("li",[e._v("alt-php-xray > 0.4-1 version")]),e._v(" "),s("li",[e._v("Enabled PHP SSA on the server")])]),e._v(" "),s("h4",{attrs:{id:"autotracing-interface"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#autotracing-interface","aria-hidden":"true"}},[e._v("#")]),e._v(" Autotracing Interface")]),e._v(" "),s("p",[e._v("A new tab for Autotracing tasks was added to the X-Ray UI:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayAutotracingtaskstab.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"autotracing-faq"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#autotracing-faq","aria-hidden":"true"}},[e._v("#")]),e._v(" Autotracing FAQ")]),e._v(" "),s("p",[e._v("Q: Why are the slow URLs in the Slow Site Analyzer report different from those on which the autotracing tasks were created?")]),e._v(" "),s("p",[e._v("A: Because the autotracing decision module uses rules and thresholds different from Slow Site Analyzer, which are configured by the CloudLinux team.")]),e._v(" "),s("p",[e._v("Q: How often autotracing tasks will be generated?")]),e._v(" "),s("p",[e._v("A: Once a day at the same time as a Slow Site Analyzer report.")]),e._v(" "),s("h3",{attrs:{id:"x-ray-smart-advice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#x-ray-smart-advice","aria-hidden":"true"}},[e._v("#")]),e._v(" X-Ray Smart Advice")]),e._v(" "),s("p",[e._v("Smart advice is a new feature of X-Ray that is designed to find and propose solutions to fix performance issues and speed up the performance of a sites.")]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("Smart Advice will work only for CloudLinux OS Shared Pro servers with cPanel Control Panel for now.")]),e._v(" "),s("p",[e._v("At the moment, Smart Advise is focused only on WordPress sites.")])]),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning")]),s("p",[e._v("To use X-Ray Smart Advice, update your alt-php-ssa and alt-php-xray packages to versions alt-php-ssa-0.2-3 and alt-php-xray-0.5-1 or higher by running the following command:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# yum update alt-php-ssa alt-php-xray lve-utils lvemanager --enablerepo=cloudlinux-updates-testing\n")])])])]),s("h4",{attrs:{id:"how-to-enable-x-ray-smart-advice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-x-ray-smart-advice","aria-hidden":"true"}},[e._v("#")]),e._v(" How to enable X-Ray Smart Advice")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Attention!")]),s("p",[e._v("If you'd like to try Smart Advice and AccelerateWP you should participate in the Beta tester program. To become a beta tester, please send your request at our Beta program page with the signup form "),s("a",{attrs:{href:"https://www.cloudlinux.com/wp-performance/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),s("OutboundLink")],1),e._v(". Once you submit the request, we will send you a confirmation email with program details and terms of use.")])]),s("h4",{attrs:{id:"requirements-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#requirements-2","aria-hidden":"true"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),s("ul",[s("li",[e._v("CloudLinux OS Shared Pro or CloudLinux OS Solo")]),e._v(" "),s("li",[e._v("alt-php-xray > 0.5-1 version")]),e._v(" "),s("li",[e._v("lve-utils > 6.3.2-1 version")]),e._v(" "),s("li",[e._v("lvemanager > 7.6.1-1 version")]),e._v(" "),s("li",[e._v("cloudlinux-site-optimization-module > 0.1-1 version")])]),e._v(" "),s("p",[e._v("We Recommend:")]),e._v(" "),s("ul",[s("li",[e._v("Enable "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/cloudlinux-os-plus/#x-ray-autotracing"}},[e._v("X-Ray Autotracing")]),e._v(" on the server")],1),e._v(" "),s("li",[e._v("Use alt-php-ssa > 0.2-3 version")])]),e._v(" "),s("h4",{attrs:{id:"how-x-ray-smart-advice-works"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-x-ray-smart-advice-works","aria-hidden":"true"}},[e._v("#")]),e._v(" How X-Ray Smart Advice works")]),e._v(" "),s("p",[e._v("The main process of looking for advice is X-Ray tracing tasks. The best way for doing this is to enable X-Ray Autotracing.\nThis will allow you to most effectively find Smart Advice for sites that have performance issues without your manual participation.\nYou can find information on how to enable X-Ray Autotracing "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#how-to-enable-x-ray-autotracing"}},[e._v("here")]),e._v(".\nOn the other hand, you can create tracing tasks manually or use continuous X-Ray but we suggest you use X-Ray Autotracing for this purpose.")],1),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("Advice will not be generated by old tracing tasks.")])]),s("p",[e._v("While the tracing task is running, X-Ray will look for places where advice can be applied. New advice will be displayed on the "),s("em",[e._v("Smart Advice")]),e._v(" tab.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRaySmartAdviceMainTab.png",alt:""}})]),e._v(" "),s("p",[e._v("After the X-Ray finds advice you will see new advice in the "),s("em",[e._v("Review")]),e._v(" status on the "),s("em",[e._v("Smart Advice")]),e._v(" tab.\nThen you may use the "),s("em",[e._v("Details")]),e._v(" button to see which URLs were found by X-Ray that will be speed up by that advice and use "),s("em",[e._v("Quick Action")]),e._v(" to enable advice for a site.")]),e._v(" "),s("p",[e._v("Example of details:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRaySmartAdviceDetails.png",alt:""}})]),e._v(" "),s("p",[e._v("After you apply the advice by using "),s("em",[e._v("Quick Action")]),e._v(", the status will change to the "),s("em",[e._v("Applied")]),e._v(".")]),e._v(" "),s("p",[e._v("If a long time has passed since the last time the advice was updated for a site, it will be moved to the "),s("em",[e._v("Outdated")]),e._v(" status.")]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("New X-Ray task may update "),s("em",[e._v("Outdated")]),e._v(" advice if X-Ray finds performance issues that may be fixed by that advice. Then the status of advice becomes "),s("em",[e._v("Review")]),e._v(".")])]),s("p",[e._v("If the process of applying advice fails you will see an error log with a detailed error, you may try to fix it manually and try again or "),s("a",{attrs:{href:"https://cloudlinux.zendesk.com/hc/en-us",target:"_blank",rel:"noopener noreferrer"}},[e._v("contact our support team for help"),s("OutboundLink")],1),e._v(".")]),e._v(" "),s("p",[e._v("Example when an error appears during advice applying:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRaySmartAdviceError.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"smart-advice-faq"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#smart-advice-faq","aria-hidden":"true"}},[e._v("#")]),e._v(" Smart Advice FAQ")]),e._v(" "),s("p",[e._v("Q: Why I can't see new advice on the "),s("em",[e._v("Smart Advice")]),e._v(" tab?")]),e._v(" "),s("p",[e._v("A: For the generating of advice, it is necessary to run X-Ray tracing tasks, the best way to do it without manual interaction is to use X-Ray Autoracing. You can find more information on how to enable X-Ray Autotracing "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#how-to-enable-x-ray-autotracing"}},[e._v("here")]),e._v(".")],1),e._v(" "),s("h4",{attrs:{id:"useful-smart-advice-cli-commands"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#useful-smart-advice-cli-commands","aria-hidden":"true"}},[e._v("#")]),e._v(" Useful Smart Advice CLI commands")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning!")]),s("p",[e._v("This is an experimental feature. The backwards compatibility is not guaranteed.")])]),s("p",[e._v("To obtain the full list of advice generated for your server use the following CLI command:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cl-smart-advice list\n")])])]),s("p",[e._v("For each advice in the list the CLI command returns the following information:")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("metadata")]),e._v(", which includes information about "),s("code",[e._v("username")]),e._v(", "),s("code",[e._v("domain")]),e._v(" and "),s("code",[e._v("website")]),e._v(" for which the advice is issued")]),e._v(" "),s("li",[s("code",[e._v("advice")]),e._v(" information:\n"),s("ul",[s("li",[e._v("its identifier "),s("code",[e._v("id")])]),e._v(" "),s("li",[e._v("its "),s("code",[e._v("type")])]),e._v(" "),s("li",[e._v("its "),s("code",[e._v("status")]),e._v(" -- "),s("code",[e._v("review")]),e._v(" or "),s("code",[e._v("applied")])]),e._v(" "),s("li",[e._v("if advice is Premium "),s("code",[e._v("is_premium")])]),e._v(" "),s("li",[e._v("other internal informational fields")])])])]),e._v(" "),s("p",[e._v("The example output is given below:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('{\n "data": [\n {\n "created_at": "2023-04-11T07:33:48.191870+00:00",\n "updated_at": "2023-04-11T07:33:48.191870+00:00",\n "metadata": {\n "username": "user16",\n "domain": "user16.com",\n "website": "/wordpress"\n },\n "advice": {\n "id": 23484,\n "type": "OBJECT_CACHE",\n "status": "review",\n "description": "Turn on Object Caching",\n "is_premium": true,\n "module_name": "object_cache",\n "subscription": {\n "status": "no",\n "upgrade_url": null\n },\n "total_stages": 0,\n "completed_stages": 0,\n "detailed_description": "To improve site performance, enable the Object Caching We recommend applying the advice if you see it frequen\ntly for the most valuable URLs of your site."\n }\n },\n {\n "created_at": "2023-04-11T07:33:48.297784+00:00",\n "updated_at": "2023-04-11T08:51:42.362117+00:00",\n "metadata": {\n "username": "user16",\n "domain": "user16.com",\n "website": "/wordpress"\n },\n "advice": {\n "id": 23485,\n "type": "SITE_OPTIMIZATION",\n "status": "applied",\n "description": "Turn on AccelerateWP feature",\n "is_premium": false,\n "module_name": "accelerate_wp",\n "total_stages": 0,\n "completed_stages": 0,\n "detailed_description": "To improve site performance, enable the AccelerateWP optimization feature. We recommend applying the advice if you see it frequently for the most valuable URLs of your site."\n }\n }\n ],\n "result": "success",\n "timestamp": 1681203110\n}\n')])])]),s("h3",{attrs:{id:"end-user-x-ray-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#end-user-x-ray-plugin","aria-hidden":"true"}},[e._v("#")]),e._v(" End-user X-Ray plugin")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning")]),s("p",[e._v("To use the end-user X-Ray plugin, update your LVE Manager and X-Ray packages to the "),s("code",[e._v("lvemanager-6.3.9-1")]),e._v(" (or later) and "),s("code",[e._v("alt-php-xray-0.3-1")]),e._v(" (or later) by running the following command:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# yum update lvemanager alt-php-xray\n")])])])]),s("h4",{attrs:{id:"how-to-enable-disable-the-end-user-x-ray-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-disable-the-end-user-x-ray-plugin","aria-hidden":"true"}},[e._v("#")]),e._v(" How to enable/disable the end-user X-Ray plugin")]),e._v(" "),s("p",[e._v("You can hide or show the end-user X-Ray plugin icon by ticking or unticking the proper checkbox in the LVE Manager.")]),e._v(" "),s("p",[e._v("Go to "),s("em",[e._v("LVE Manager → Options Tab → User interface settings")]),e._v(".")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/HideXRayAppCheckbox.png",alt:""}})]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("The X-Ray plugin icon in the end-user interface is hidden when the checkbox is ticked.")])]),s("p",[s("img",{attrs:{src:"/images/XRayAppUIIcon.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"how-to-manage-the-end-user-x-ray-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manage-the-end-user-x-ray-plugin","aria-hidden":"true"}},[e._v("#")]),e._v(" How to manage the end-user X-Ray plugin")]),e._v(" "),s("p",[e._v("The web interface of the end-user X-Ray plugin is almost the same as the X-Ray administrator interface.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayEndUserUI.png",alt:""}})]),e._v(" "),s("p",[e._v("But there are some differences and they are described further.")]),e._v(" "),s("ul",[s("li",[e._v("End-users can create tasks only for their domains from the drop-down list:\n"),s("img",{attrs:{src:"/images/XRayEndUserUIStart.png",alt:""}})]),e._v(" "),s("li",[e._v("To specify URL or wildcard, end-users should use the input field next to the domain:\n"),s("img",{attrs:{src:"/images/XRayEndUserUiSpecifyURL.png",alt:""}})])]),e._v(" "),s("p",[e._v("You can read about all other basic interface elements and managing tracing tasks in the "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#managing-tracing-task"}},[e._v("Managing tracing task section")]),e._v(".")],1),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("Tracing tasks created by an end-user will also be displayed in the administrator interface and administrators can manage the end-user's tasks the same way as they manage their own. At the same time, tasks created by the administrator or other end-users will not be displayed in the UI of the current user.")])]),s("h4",{attrs:{id:"end-user-x-ray-plugin-limitations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#end-user-x-ray-plugin-limitations","aria-hidden":"true"}},[e._v("#")]),e._v(" End-user X-Ray plugin limitations")]),e._v(" "),s("ul",[s("li",[s("p",[e._v("The end-user X-Ray plugin does not support creating continuous tasks.")])]),e._v(" "),s("li",[s("p",[e._v("The end-user has a limit of tracing tasks running at a time. Before starting the next task, the end-user should wait for the completion of the previous ones or forcefully stop the running ones. Otherwise, the user will get the next error:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayEndUserUIError.png",alt:""}})]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("The current limit is one tracing task per user.")])])]),e._v(" "),s("li",[s("p",[e._v("The administrator and the end-user can’t run the tracing task for the same Domain/URL at the same time. Once, the administrator started a specific tracing task, the end-user will not be able to duplicate it. And the same is true for the administrators – they will just see the running task for the specific domain and see the notification that they're trying to create a tracing task with a duplicated URL.")])]),e._v(" "),s("li",[s("p",[e._v("If continuous tracing is enabled for the domain, the end-user will not be able to create a new task for this domain because the same rule works - it will be a duplicate of the existing tracing tasks. The next warning will appear:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayEndUserUIWarning.png",alt:""}})]),e._v(" "),s("p",[e._v("To solve this, the existing running tasks for the same Domain/URL should be stopped or completed. You can find more details about this in the "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#what-should-i-do-if-i-see-the-warning-task-is-duplicated-by-url"}},[e._v("FAQ")]),e._v(".")],1)]),e._v(" "),s("li",[s("p",[e._v("If a user's tracing task was created for a domain which is using the FPM handler there's an additional limitation. To avoid frequent reloads of the particular FPM service, "),s("strong",[e._v("Start tracing")]),e._v(" , "),s("strong",[e._v("Stop tracing")]),e._v(" or "),s("strong",[e._v("Continue tracing")]),e._v(" action would be blocked in case if the latest reload of a corresponding FPM service was done less than 1 minute ago."),s("br"),e._v("\nIf a user gets such an error message - it means that 1 reload in 1 minute for a particular FPM service has been already done. Just try performing the same operation once again in a while.")])])]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayEndUserFPMerror.png",alt:""}})]),e._v(" "),s("h3",{attrs:{id:"x-ray-automated-throttling-detection"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#x-ray-automated-throttling-detection","aria-hidden":"true"}},[e._v("#")]),e._v(" X-Ray automated throttling detection")]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[s("strong",[e._v("CPU throttling detection")]),e._v(" is available since "),s("code",[e._v("alt-php-xray-0.3-2")]),e._v(" and "),s("code",[e._v("lvemanager-xray-0.5-2")]),e._v(".")]),e._v(" "),s("p",[s("strong",[e._v("IO/IOPS throttling detection")]),e._v(" is available since "),s("code",[e._v("alt-php-xray-0.3-7")]),e._v(" and "),s("code",[e._v("lvemanager-xray-0.7-1")]),e._v(".")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("kmod-lve-2.0-23")]),e._v(" (and later) for CloudLinux OS Shared 8 or CloudLinux OS Shared 7 hybrid")]),e._v(" "),s("li",[s("code",[e._v("kernel-1.5-58")]),e._v(" (and later) for CloudLinux OS Shared 7 or CloudLinux OS Shared 6 hybrid")])]),e._v(" "),s("p",[e._v("are also required to utilize the feature of "),s("strong",[e._v("IO/IOPS throttling detection")]),e._v(".")])]),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning")]),s("p",[e._v("X-Ray automated throttling detection feature is not supported for CloudLinux OS Shared 6")])]),s("p",[e._v("The X-Ray automated throttling detection system checks if the account exceeds LVE limits by CPU or by IO/IOPS during the HTTP request execution. Requests with exceeded LVE limits are indicated in both X-Ray Administrator and X-Ray User plugins.")]),e._v(" "),s("p",[e._v("If CPU limiting was detected for a particular request, it is indicated in the X-Ray UI that the system itself has slowed down the request processing due to CPU throttling and this is apparently not a performance issue in the PHP code.")]),e._v(" "),s("p",[e._v("If limiting by IO and IOPS in total was detected for a particular request, it is indicated in the X-Ray UI in the same manner, except for the cause of slowing down the request -- IO throttling.")]),e._v(" "),s("p",[e._v("The case of both limiting for the request is also possible.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CPUIOLimiting.png",alt:""}})]),e._v(" "),s("p",[e._v("Requests with exceeded LVE limits are also marked in the request detailed view.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/RequestDetails.png",alt:""}})]),e._v(" "),s("p",[e._v("Requests with exceeded LVE limits are marked in the PDF report as well.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/PDFReport.png",alt:""}})]),e._v(" "),s("h3",{attrs:{id:"x-ray-client"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#x-ray-client","aria-hidden":"true"}},[e._v("#")]),e._v(" X-Ray client")]),e._v(" "),s("p",[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" client is a PHP extension named "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.so")])]),e._v(". It analyzes the processing time of the entire request and its parts and then sends the data to the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent.")]),e._v(" "),s("h4",{attrs:{id:"list-of-supported-php-versions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#list-of-supported-php-versions","aria-hidden":"true"}},[e._v("#")]),e._v(" List of supported PHP versions")]),e._v(" "),s("p",[e._v("The list of currently supported PHP versions:")]),e._v(" "),s("table",[s("thead",[s("tr",[s("th"),e._v(" "),s("th"),e._v(" "),s("th"),e._v(" "),s("th"),e._v(" "),s("th")])]),e._v(" "),s("tbody",[s("tr",[s("td",[s("strong",[e._v("ALT PHP")]),e._v(":")]),e._v(" "),s("td",[s("strong",[e._v("EA PHP")]),e._v(":")]),e._v(" "),s("td",[s("strong",[e._v("Plesk PHP")])]),e._v(" "),s("td",[s("strong",[e._v("DirectAdmin PHP")])]),e._v(" "),s("td",[s("strong",[e._v("Other panels PHP")])])]),e._v(" "),s("tr",[s("td",[s("ul",[s("li",[e._v("alt-php54")]),s("li",[e._v("alt-php55")]),s("li",[e._v("alt-php56")]),s("li",[e._v("alt-php70")]),s("li",[e._v("alt-php71")]),s("li",[e._v("alt-php72")]),s("li",[e._v("alt-php73")]),s("li",[e._v("alt-php74")]),s("li",[e._v("alt-php80")]),s("li",[e._v("alt-php81")])])]),e._v(" "),s("td",[s("ul",[s("li",[e._v("ea-php54")]),s("li",[e._v("ea-php55")]),s("li",[e._v("ea-php56")]),s("li",[e._v("ea-php70")]),s("li",[e._v("ea-php71")]),s("li",[e._v("ea-php72")]),s("li",[e._v("ea-php73")]),s("li",[e._v("ea-php74")])])]),e._v(" "),s("td",[s("ul",[s("li",[e._v("php54")]),s("li",[e._v("php55")]),s("li",[e._v("php56")]),s("li",[e._v("php70")]),s("li",[e._v("php71")]),s("li",[e._v("php72")]),s("li",[e._v("php73")]),s("li",[e._v("php74")])])]),e._v(" "),s("td",[s("ul",[s("li",[e._v("php54")]),s("li",[e._v("php55")]),s("li",[e._v("php56")]),s("li",[e._v("php70")]),s("li",[e._v("php71")]),s("li",[e._v("php72")]),s("li",[e._v("php73")]),s("li",[e._v("php74")])])]),e._v(" "),s("td",[s("ul",[s("li",[e._v("54")]),s("li",[e._v("55")]),s("li",[e._v("56")]),s("li",[e._v("70")]),s("li",[e._v("71")]),s("li",[e._v("72")]),s("li",[e._v("73")]),s("li",[e._v("74")])])])])])]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning!")]),s("p",[s("span",{staticClass:"notranslate"},[s("RouterLink",{attrs:{to:"/cloudlinux_os_components/#how-to-configure-alt-php72-zts-to-use-with-php-selector"}},[e._v("php-zts")])],1),e._v(" and "),s("RouterLink",{attrs:{to:"/cloudlinux_os_components/#roll-your-own-php"}},[e._v("custom PHPs, rolled in selector")]),e._v(", are not supported")],1)]),s("h4",{attrs:{id:"functions-that-x-ray-client-can-hook"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#functions-that-x-ray-client-can-hook","aria-hidden":"true"}},[e._v("#")]),e._v(" Functions that X-Ray client can hook")]),e._v(" "),s("h4",{attrs:{id:"database-queries-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#database-queries-2","aria-hidden":"true"}},[e._v("#")]),e._v(" Database queries")]),e._v(" "),s("ul",[s("li",[e._v("Functions from the "),s("a",{attrs:{href:"https://www.php.net/manual/ru/book.mysql.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQL"),s("OutboundLink")],1),e._v(" extension:\n"),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysql_query")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysql_db_query")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysql_unbuffered_query")])])])])]),e._v(" "),s("li",[e._v("Functions from the "),s("a",{attrs:{href:"https://www.php.net/manual/ru/book.mysqli.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySQLi"),s("OutboundLink")],1),e._v(" extension:\n"),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysqli_query")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysqli::query")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysqli_multi_query")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysqli::multi_query")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysqli_real_query")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("mysqli::real_query")])])])])]),e._v(" "),s("li",[e._v("Functions from the "),s("a",{attrs:{href:"https://www.php.net/manual/ru/book.pdo.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("PDO"),s("OutboundLink")],1),e._v(" extension:\n"),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("PDO::exec")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("PDO::query")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("PDOStatement::execute")])])])])])]),e._v(" "),s("h4",{attrs:{id:"external-requests-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#external-requests-2","aria-hidden":"true"}},[e._v("#")]),e._v(" External requests")]),e._v(" "),s("ul",[s("li",[e._v("Function "),s("a",{attrs:{href:"https://www.php.net/manual/ru/function.exec",target:"_blank",rel:"noopener noreferrer"}},[e._v("curl_exec"),s("OutboundLink")],1)])]),e._v(" "),s("h4",{attrs:{id:"system-php-functions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#system-php-functions","aria-hidden":"true"}},[e._v("#")]),e._v(" System PHP functions")]),e._v(" "),s("p",[e._v("It may be any PHP system function which can be related to a PHP engine or other PHP extension, for example "),s("span",{staticClass:"notranslate"},[s("code",[e._v("fopen()")])]),e._v(" or "),s("span",{staticClass:"notranslate"},[s("code",[e._v("json_encode()")])]),e._v(". A list of these functions can be found "),s("a",{attrs:{href:"https://www.php.net/manual/en/indexes.functions.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),s("OutboundLink")],1),e._v(".")]),e._v(" "),s("h4",{attrs:{id:"configuration-options"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-options","aria-hidden":"true"}},[e._v("#")]),e._v(" Configuration Options")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-enabled"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-enabled","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.enabled")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.enabled=On/Off")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("On")])]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": Enable or disable "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" extension from php.ini")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-database-queries"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-database-queries","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.database_queries")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.database_queries=[number]")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": 20")]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": The number of the slowest SQL queries which will be sent to the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent. The min value is 0 and the max value is 100. If the variable value is more, the default value will be used.")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-external-requests"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-external-requests","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.external_requests")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.external_requests=[number]")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": 20")]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": The number of the slowest external requests (the curl_exec function) which will be sent to the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent. The min value is 0 and the max value is 100. If the variable value is more, the default value will be used.")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-system-functions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-system-functions","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.system_functions")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.system_functions=[number]")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": 20")]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": The number of the slowest system functions which will be sent to the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent.\nThe min value is 0 and the max value is 100. If the variable value is more, the default value will be used.")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-backtrace-depth"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-backtrace-depth","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.backtrace_depth")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.backtrace_depth=[number]")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": 10")]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": The backtrace depth to the main() function which will be sent to the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent. The min value is 0 and the max value is 20. If the variable value is more, the default value will be used.")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-processor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-processor","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.processor")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.processor=[processor_name]")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("xray")])]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": Tells the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" client which processor to use. The new processors may be added in the future. The default processor is xray which means to send data to the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent.")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-tasks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-tasks","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.tasks")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.tasks=host:uri:ip:id")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("no value")])]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": The current tracing tasks for the given PHP request. This directive is added automatically by the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" manager when creating a task. It is not allowed to edit manually, as "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" may stop working.")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-to-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-to-file","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.to_file")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.to_file=On/Off")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("Off")])]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": Only for debug purposes. Writes to a file data which is sent to the processor.")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-debug"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-debug","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.debug")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.debug=On/Off")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("Off")])]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": Only for debug purposes. Enables debug output during request processing. In the On mode can slow down the domain.")]),e._v(" "),s("hr"),e._v(" "),s("div",{staticClass:"notranslate"},[s("h4",{attrs:{id:"xray-debug-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#xray-debug-file","aria-hidden":"true"}},[e._v("#")]),e._v(" xray.debug_file")])]),e._v(" "),s("p",[s("strong",[e._v("Syntax")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.debug_file=[path_to_file]")])])]),e._v(" "),s("p",[s("strong",[e._v("Default")]),e._v(": "),s("span",{staticClass:"notranslate"},[s("code",[e._v("/tmp/xray-debug.log")])])]),e._v(" "),s("p",[s("strong",[e._v("Changeable")]),e._v(": "),s("span",{staticClass:"notranslate"},[e._v("PHP_INI_SYSTEM")])]),e._v(" "),s("p",[s("strong",[e._v("Description")]),e._v(": Only for debug purposes. Specifies a file for logging debug information.")]),e._v(" "),s("h3",{attrs:{id:"x-ray-agent"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#x-ray-agent","aria-hidden":"true"}},[e._v("#")]),e._v(" X-Ray agent")]),e._v(" "),s("p",[e._v("This is a service that receives data from the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" client and sends it to the remote storage.")]),e._v(" "),s("h4",{attrs:{id:"managing-x-ray-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#managing-x-ray-service","aria-hidden":"true"}},[e._v("#")]),e._v(" Managing X-Ray service")]),e._v(" "),s("p",[e._v("The "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent is managed by the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("service")])]),e._v(" utility.")]),e._v(" "),s("ul",[s("li",[s("p",[e._v("To start the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent, run the following command:")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# service xray-agent start\n")])])])])]),e._v(" "),s("li",[s("p",[e._v("To stop the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent, run the following command:")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# service xray-agent stop\n")])])])])]),e._v(" "),s("li",[s("p",[e._v("To restart the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent, run the following command:")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# service xray-agent restart\n")])])])])])]),e._v(" "),s("h3",{attrs:{id:"faq"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#faq","aria-hidden":"true"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),s("h4",{attrs:{id:"does-x-ray-affect-website-performance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#does-x-ray-affect-website-performance","aria-hidden":"true"}},[e._v("#")]),e._v(" Does X-Ray affect website performance?")]),e._v(" "),s("p",[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" affects website performance. Our tests show 5-10 % overhead from a website loading time with "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" tracing enabled.\n"),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" allows you to find website performance issues and should not be enabled permanently. If your website is very slow, you can enable "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" to find the cause and then disable it.")]),e._v(" "),s("h4",{attrs:{id:"what-should-i-do-if-i-see-the-warning-task-is-duplicated-by-url"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#what-should-i-do-if-i-see-the-warning-task-is-duplicated-by-url","aria-hidden":"true"}},[e._v("#")]),e._v(' What should I do if I see the warning "Task is duplicated by URL"?')]),e._v(" "),s("p",[e._v("This warning means that you already have a task to trace this URL in the list of your tracing tasks. If you see this warning, a new task can be created only with the "),s("span",{staticClass:"notranslate"},[s("em",[e._v("On hold")])]),e._v(" status and you will be able to run it only when the previous task with the same URL will be completed.")]),e._v(" "),s("p",[e._v("Note that the URL field supports wildcard matching and you can have a case when "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" is tracing the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("URL=domain.com/*")])]),e._v(" and you are trying to create a new task with "),s("span",{staticClass:"notranslate"},[s("code",[e._v("URL=domain.com/xray.php")])]),e._v(". In this case, you will see that warning because the "),s("code",[e._v("*")]),e._v(" URLs array includes "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.php")])]),e._v(".")]),e._v(" "),s("h4",{attrs:{id:"i-started-a-tracing-task-and-made-requests-to-url-but-did-not-see-any-results-in-the-ui-what-should-i-do"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#i-started-a-tracing-task-and-made-requests-to-url-but-did-not-see-any-results-in-the-ui-what-should-i-do","aria-hidden":"true"}},[e._v("#")]),e._v(" I started a tracing task and made requests to URL but did not see any results in the UI. What should I do?")]),e._v(" "),s("ol",[s("li",[s("p",[s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" may not send data if a site uses a caching plugin, as the caching plugin is outputting HTML, thus there are no PHP scripts to examine. We encountered such issues with sites that use "),s("span",{staticClass:"notranslate"},[e._v("LSCache")]),e._v(" and "),s("span",{staticClass:"notranslate"},[e._v("WP Super Cache")]),e._v(" plugins. Check that your site does not use caching plugins. If so, disable it while tracing a site to get information from "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(". Moreover, it can also be because of caching on server side, for example NGINX Cache. Or when using CDN because requests are processed from another host. In such cases, during tracing, caching must also be disabled.")])]),e._v(" "),s("li",[s("p",[e._v("If you set a client’s IP when creating the tracing task, check that your requests come to the server with this IP via phpinfo (since there may be NAT between your local machine and the server).")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayPHPInfoRemoteAddr.png",alt:""}})])]),e._v(" "),s("li",[s("p",[e._v("Check that "),s("span",{staticClass:"notranslate"},[s("strong",[e._v("xray")])]),e._v(" extension is enabled for the domain. To do so, go to the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("phpinfo()")])]),e._v(" page and make a request. In the phpinfo output try to find the following section:")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayPHPInfo.png",alt:""}})])])]),e._v(" "),s("p",[e._v("If you cannot see that section, try to restart PHP processes for that user (the simplest way is to restart Apache) and check that you can see the "),s("span",{staticClass:"notranslate"},[s("strong",[e._v("xray")])]),e._v(" extension.")]),e._v(" "),s("ol",{attrs:{start:"4"}},[s("li",[s("p",[e._v("If you can see the "),s("span",{staticClass:"notranslate"},[s("strong",[e._v("xray")])]),e._v(" extension in the phpinfo, check that "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" agent service is running with the service xray-agent status command. If it is not running, start it with the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("service xray-agent start")])]),e._v(" command.")])]),e._v(" "),s("li",[s("p",[e._v("If, after checking the previous items, the issue persists, "),s("a",{attrs:{href:"https://cloudlinux.zendesk.com/hc/en-us/requests/new",target:"_blank",rel:"noopener noreferrer"}},[e._v("contact our support team"),s("OutboundLink")],1),e._v(".")])])]),e._v(" "),s("h4",{attrs:{id:"what-to-do-if-x-ray-is-not-found-in-the-phpinfo-page"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#what-to-do-if-x-ray-is-not-found-in-the-phpinfo-page","aria-hidden":"true"}},[e._v("#")]),e._v(" What to do if X-Ray is not found in the phpinfo() page?")]),e._v(" "),s("p",[e._v("If you managed to create a tracing task, this means that the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.ini")])]),e._v(" file was created in a system. Therefore, there may be two reasons why it did not appear in the phpinfo page of the domain.")]),e._v(" "),s("ol",[s("li",[s("p",[e._v("PHP process wasn't reloaded after adding the xray.ini. To solve this, you should restart the Apache or fpm service for the domain on which the tracing was started. At the moment, this is done automatically by the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" manager after creating the task.")])]),e._v(" "),s("li",[s("p",[e._v("Your domain uses a PHP version different from the one which was detected by the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" manager. To solve this, check the scan dir for additional ini files for your domain.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/XRayScanDir.png",alt:""}})]),e._v(" "),s("p",[e._v("Then check the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("ini_location")])]),e._v(" that was passed to the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" manager by running the following command:")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# cat /usr/share/alt-php-xray/manager.log | grep ini_location\n")])])])]),e._v(" "),s("p",[e._v("Find your tracing task in the output and check that the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("xray.ini")])]),e._v(" exists in this directory, also check that the "),s("code",[e._v("ini")]),e._v(" path is the same in the phpinfo page output and in the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("ini_location")])]),e._v(" directive for your tracing task. If they are the same, you should reload your PHP. If they are different that means that the "),s("span",{staticClass:"notranslate"},[e._v("X-Ray")]),e._v(" manager could not correctly determine the PHP version your domain uses. In this case, contact our support team at "),s("a",{attrs:{href:"https://cloudlinux.zendesk.com/hc/requests/new",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cloudlinux.zendesk.com/hc/requests/new"),s("OutboundLink")],1),e._v(".")])])]),e._v(" "),s("h4",{attrs:{id:"i-use-litespeed-x-ray-is-enabled-and-it-is-shown-in-the-phpinfo-page-but-does-not-collect-data-when-sending-requests-to-a-site-what-to-do"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#i-use-litespeed-x-ray-is-enabled-and-it-is-shown-in-the-phpinfo-page-but-does-not-collect-data-when-sending-requests-to-a-site-what-to-do","aria-hidden":"true"}},[e._v("#")]),e._v(" I use LiteSpeed, X-Ray is enabled and it is shown in the phpinfo() page but does not collect data when sending requests to a site. What to do?")]),e._v(" "),s("p",[e._v("Check for the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("CacheLookup on")])]),e._v(" option in the "),s("code",[e._v("htaccess")]),e._v(" file for your domain.\nIf the option is there, LiteSpeed processes requests bypassing the PHP X-Ray extension.\nIn this case, to get tracing information, you should remove the "),s("span",{staticClass:"notranslate"},[s("code",[e._v("CacheLookup on")])]),e._v(" option.")]),e._v(" "),s("h4",{attrs:{id:"what-is-the-proper-format-for-the-url"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-proper-format-for-the-url","aria-hidden":"true"}},[e._v("#")]),e._v(" What is the proper format for the URL?")]),e._v(" "),s("p",[e._v("All of the examples below are correct:")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("http://domain.com")])]),e._v(" "),s("li",[s("code",[e._v("http://domain.com/")])]),e._v(" "),s("li",[s("code",[e._v("https://domain.com")])]),e._v(" "),s("li",[s("code",[e._v("https://domain.com/")])])]),e._v(" "),s("p",[e._v("You can use any of them with a prefix "),s("code",[e._v("www.")]),e._v(" and it is also correct.")]),e._v(" "),s("h4",{attrs:{id:"what-packages-are-required-for-x-ray"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#what-packages-are-required-for-x-ray","aria-hidden":"true"}},[e._v("#")]),e._v(" What packages are required for X-Ray?")]),e._v(" "),s("p",[e._v("Required packages:")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("lvemanager")]),e._v(" >= 6.2.10-1")]),e._v(" "),s("li",[s("code",[e._v("alt-php-xray")]),e._v(" >= 0.2-1")])]),e._v(" "),s("h2",{attrs:{id:"centralized-monitoring"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#centralized-monitoring","aria-hidden":"true"}},[e._v("#")]),e._v(" Centralized Monitoring")]),e._v(" "),s("ul",[s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#description-2"}},[e._v("Description")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#installation-2"}},[e._v("Installation")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#centralized-monitoring-mode-without-session-expired"}},[e._v("Centralized Monitoring: mode without session expired")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#centralized-monitoring-user-interface"}},[e._v("Centralized Monitoring user interface")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#alert-manager"}},[e._v("Alert Manager")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#faq-2"}},[e._v("FAQ")])],1),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#troubleshooting"}},[e._v("Troubleshooting")])],1)]),e._v(" "),s("h3",{attrs:{id:"description-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#description-2","aria-hidden":"true"}},[e._v("#")]),e._v(" Description")]),e._v(" "),s("p",[s("span",{staticClass:"notranslate"},[e._v("Centralized Monitoring")]),e._v(" is a tool that allows hosting administrators to monitor load for all their servers and users.")]),e._v(" "),s("p",[s("span",{staticClass:"notranslate"},[e._v("Centralized Monitoring")]),e._v(" allows you to:")]),e._v(" "),s("ul",[s("li",[e._v("View system metrics for all clients’ end servers")]),e._v(" "),s("li",[e._v("View the LVE statistics per user for all clients’ end servers")])]),e._v(" "),s("h3",{attrs:{id:"installation-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation-2","aria-hidden":"true"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("Make sure that "),s("code",[e._v("cm.cloudlinux.com")]),e._v(" is available on your end server.")])]),s("ol",[s("li",[e._v("Make sure you have a CloudLinux OS Shared Pro subscription.")]),e._v(" "),s("li",[e._v("Make sure you have installed the "),s("strong",[e._v("lve-utils")]),e._v(" package version 4.2.21-2 or later. You can install or update it with the following commands:\n"),s("ul",[s("li",[e._v("installation")])]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("yum install lve-utils\n")])])]),s("ul",[s("li",[e._v("update")])]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("yum update lve-utils\n")])])])]),e._v(" "),s("li",[e._v("Log in to the "),s("a",{attrs:{href:"https://cm.cloudlinux.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cm.cloudlinux.com/"),s("OutboundLink")],1),e._v(" using CLN credentials (if you are already logged in via CLN, authorization via CM is not necessary, it uses SSO).")]),e._v(" "),s("li",[e._v("Activate statistics collection on all your servers via the Centralized Monitoring UI ("),s("a",{attrs:{href:"https://cm.cloudlinux.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cm.cloudlinux.com"),s("OutboundLink")],1),e._v(") or via the CLN UI "),s("a",{attrs:{href:"https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring"),s("OutboundLink")],1),e._v(".\n"),s("img",{attrs:{src:"/images/CMInstallationProd.png",alt:""}})]),e._v(" "),s("li",[e._v("Within 5 hours from the activation, statistics collection and sending to the central server will be set up automatically: all required packages and components will be installed. For new, just registered servers, statistics collection and sending will be set up automatically within 5 hours.")]),e._v(" "),s("li",[e._v("Make sure you have activated statistics collection (see paragraph 4) otherwise you will not be able to set up your servers. For instant set up of a registered server after statistics collection was enabled, run the following commands for all servers:"),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# rhn_check\t\n# /usr/share/cloudlinux/cl_plus/manage_clplus enable\n")])])]),s("strong",[e._v("Note")]),e._v(": If the "),s("code",[e._v("rhn_check")]),e._v(" command is not found, run the following command:"),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("# yum install/update rhn-check rhn-setup\n")])])])]),e._v(" "),s("li",[e._v("After 5 hours (or after the manual setup), check that statistics for all registered servers is collected via "),s("a",{attrs:{href:"https://cm.cloudlinux.com/#/servers",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cm.cloudlinux.com/#/servers"),s("OutboundLink")],1),e._v(". And check that user statistics on the servers is collected via "),s("a",{attrs:{href:"https://cm.cloudlinux.com/#/users",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cm.cloudlinux.com/#/users"),s("OutboundLink")],1),e._v("."),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("User statistics will be available only for users that were loaded starting from connecting the server to the Centralized Monitoring.")])])])]),e._v(" "),s("h3",{attrs:{id:"centralized-monitoring-mode-without-session-expired"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#centralized-monitoring-mode-without-session-expired","aria-hidden":"true"}},[e._v("#")]),e._v(" Centralized Monitoring: mode without session expired")]),e._v(" "),s("p",[e._v("Users can monitor server’s or user’s load for a long time using the mode without session expired.")]),e._v(" "),s("p",[e._v("To turn on the mode without session expired, follow the next steps:")]),e._v(" "),s("ol",[s("li",[s("p",[e._v("Log in to the "),s("a",{attrs:{href:"https://cln.cloudlinux.com/console/",target:"_blank",rel:"noopener noreferrer"}},[e._v("cln.cloudlinux.com"),s("OutboundLink")],1),e._v(" via your account")])]),e._v(" "),s("li",[s("p",[e._v("Open the "),s("a",{attrs:{href:"https://cm.cloudlinux.com/#/servers",target:"_blank",rel:"noopener noreferrer"}},[e._v("cm.cloudlinux.com"),s("OutboundLink")],1),e._v(" in a new browser tab/window (please, use the same browser as in step 1)")])]),e._v(" "),s("li",[s("p",[e._v("Use the toggle to turn on/off 10 min auto logout")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/AutoLogout.png",alt:""}})])])]),e._v(" "),s("p",[e._v("Your session in the "),s("a",{attrs:{href:"https://cln.cloudlinux.com/console/",target:"_blank",rel:"noopener noreferrer"}},[e._v("cln.cloudlinux.com"),s("OutboundLink")],1),e._v(" will expire in 10 min. But your session in the "),s("a",{attrs:{href:"https://cm.cloudlinux.com/#/servers",target:"_blank",rel:"noopener noreferrer"}},[e._v("cm.cloudlinux.com"),s("OutboundLink")],1),e._v(" will not expire while your browser tab remains open.")]),e._v(" "),s("h3",{attrs:{id:"centralized-monitoring-user-interface"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#centralized-monitoring-user-interface","aria-hidden":"true"}},[e._v("#")]),e._v(" Centralized Monitoring user interface")]),e._v(" "),s("p",[e._v("You can access "),s("span",{staticClass:"notranslate"},[e._v("Centralized Monitoring")]),e._v(" in your "),s("a",{attrs:{href:"https://cln.cloudlinux.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN account"),s("OutboundLink")],1),e._v(".\nClick "),s("span",{staticClass:"notranslate"},[e._v("C-Monitoring")]),e._v(" in the left menu.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMCLNAccount.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"servers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#servers","aria-hidden":"true"}},[e._v("#")]),e._v(" Servers")]),e._v(" "),s("p",[e._v("This page contains the list of all clients’ end servers. The server appears in the list after finishing "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#installation-2"}},[e._v("Installation")]),e._v(". By default, there is a descending sort by CPU usage.")],1),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMAllServers.png",alt:""}})]),e._v(" "),s("p",[e._v("The following values are available for each server:")]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Load Avg 15m")])]),e._v(" – average system load for the last 15 min")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("CPU Usage")])]),e._v(" – CPU usage for the last 15 min (the number of cores can be found in the hint)")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Memory Usage")])]),e._v(" – free available memory, the second value is the total memory for the last 15 min")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("IO read/write")])]),e._v(" – disk read bytes/disk written bytes for the last 15 min")])]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("The values are calculated using a 15 min time period but the metric state is updated automatically every minute by default or you can choose from one of the predefined periods.")])]),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("Idle state")])]),e._v(" – there were no statistics for the server for the last minute.")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("strong",[e._v("N/A state")])]),e._v(" – there were no statistics for the server for the last 30 days. This can happen if a new server was added but statistics sending was not configured.")])]),e._v(" "),s("p",[e._v("There is no pagination on the "),s("span",{staticClass:"notranslate"},[s("em",[e._v("All servers")])]),e._v(" page and all columns can be sorted by absolute value.\nUse the search tool to operate with the data.")]),e._v(" "),s("h4",{attrs:{id:"servers-details"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#servers-details","aria-hidden":"true"}},[e._v("#")]),e._v(" Servers details")]),e._v(" "),s("p",[e._v("To get the detailed statistics for the server via charts, click a desired server line in the table.\nAll charts are auto-refreshed and there is an ability to select the period for metrics data to be updated for the chart.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMUPdates.png",alt:""}})]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("We store the metrics data for one month only.")])]),s("h4",{attrs:{id:"charts-for-server-metrics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#charts-for-server-metrics","aria-hidden":"true"}},[e._v("#")]),e._v(" Charts for server metrics")]),e._v(" "),s("h4",{attrs:{id:"visualization-of-the-most-popular-server-states"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#visualization-of-the-most-popular-server-states","aria-hidden":"true"}},[e._v("#")]),e._v(" Visualization of the most popular server states")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMMostPopularStates.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"disk-space-usage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disk-space-usage","aria-hidden":"true"}},[e._v("#")]),e._v(" Disk space usage")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMDiskSpaceUsage.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"open-file-descriptor-context-switches"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#open-file-descriptor-context-switches","aria-hidden":"true"}},[e._v("#")]),e._v(" Open file descriptor/Context switches")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMOpenFileDescriptorContextSwitches.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"system-load-1m-5m-15m"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#system-load-1m-5m-15m","aria-hidden":"true"}},[e._v("#")]),e._v(" System load 1m , 5m, 15m")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMSystemLoad.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"cpu-usage-total-system-user-iowait-steal"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#cpu-usage-total-system-user-iowait-steal","aria-hidden":"true"}},[e._v("#")]),e._v(" CPU usage (total, system, user, iowait, steal)")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMSCPUUsag.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"network-traffic-usage"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#network-traffic-usage","aria-hidden":"true"}},[e._v("#")]),e._v(" Network traffic usage")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMNetworkTrafficUsage.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"disk-space-usage-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disk-space-usage-2","aria-hidden":"true"}},[e._v("#")]),e._v(" Disk space usage")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMDiskSpaceUsageBasics.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"memory-usage-total-used-available"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#memory-usage-total-used-available","aria-hidden":"true"}},[e._v("#")]),e._v(" Memory usage (total, used, available)")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMMemoryUsage.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"time-spent-doing-i-os"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#time-spent-doing-i-os","aria-hidden":"true"}},[e._v("#")]),e._v(" Time spent doing I/Os")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMTimeSpentDoingIO.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"disk-iops-completed"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disk-iops-completed","aria-hidden":"true"}},[e._v("#")]),e._v(" Disk IOps Completed")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMDiskIOpsCompleted.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"disk-read-write-data"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disk-read-write-data","aria-hidden":"true"}},[e._v("#")]),e._v(" Disk read/write data")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMDiskReadWriteData.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"disk-read-write-time"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disk-read-write-time","aria-hidden":"true"}},[e._v("#")]),e._v(" Disk read/write time")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMDiskReadWriteTime.png",alt:""}})]),e._v(" "),s("h4",{attrs:{id:"apache-connections-number-number-of-requests-per-minute-max-connections"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#apache-connections-number-number-of-requests-per-minute-max-connections","aria-hidden":"true"}},[e._v("#")]),e._v(" Apache connections (number)/Number of requests per minute/Max connections")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("In the current version, we collect these metrics for the cPanel end servers only. We are planning to add other panels support soon.")])]),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("In the current version, we collect these metrics only for Apache (NOT for LiteSpeed, Nginx, etc.). The charts will be empty for LiteSpeed, Nginx, etc..")])]),s("h4",{attrs:{id:"mysql-queries"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mysql-queries","aria-hidden":"true"}},[e._v("#")]),e._v(" MySQL queries")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMMySQLQueries.png",alt:""}})]),e._v(" "),s("p",[e._v('MySQL queries collector gets number of queries executed on the server per minute. It takes data from the MySQL server variable "Questions". You may manually check variable value by executing query '),s("code",[e._v("SHOW GLOBAL STATUS LIKE 'Questions';")]),e._v(". For more information about MySQL server variables - please, see MySQL documentation.")]),e._v(" "),s("h4",{attrs:{id:"the-most-loaded-server-users-for-the-last-minute"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#the-most-loaded-server-users-for-the-last-minute","aria-hidden":"true"}},[e._v("#")]),e._v(" The most loaded server users for the last minute")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMMostLoadedUsers.png",alt:""}})]),e._v(" "),s("p",[e._v("We calculate the user’s load by LVE statistics that we collect on the end server.\nThe idle state for the user means that the LVE statistics were not collected for the last minute for some reason.")]),e._v(" "),s("p",[e._v("In each cell there are current usage/limit values for the basic LVE limits:")]),e._v(" "),s("ul",[s("li",[e._v("CPU Usage")]),e._v(" "),s("li",[e._v("Entry Processes")]),e._v(" "),s("li",[e._v("Physical Memory Usage")]),e._v(" "),s("li",[e._v("IOPS")]),e._v(" "),s("li",[e._v("IO Usage")]),e._v(" "),s("li",[e._v("Number of Processes")]),e._v(" "),s("li",[e._v("MySQL CPU")]),e._v(" "),s("li",[e._v("MySQL IO")])]),e._v(" "),s("p",[e._v("In the hint, there is a number of faults for each limit. The values in the columns are underlined (it is red if load-to-limit ratio >=90% and it is yellow if load-to-limit ratio >= 50%). For the current implementation, the only sort by the load-to-limit ratio is available.\nBy default, there is a descending sort by the CPU usage column.")]),e._v(" "),s("p",[e._v("When sorting by a column, the lines with the load-to-limit ratio >=90% for this column will have the red background color, and lines with the load-to-limit ratio >=50% for this column will have the yellow background color.")]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("The users with unlimited resources (∞) will be at the bottom of the table.")])]),s("h4",{attrs:{id:"users"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#users","aria-hidden":"true"}},[e._v("#")]),e._v(" Users")]),e._v(" "),s("p",[e._v("This page contains all users for the all server of the client and their LVE statistics for the last minute. You can select the number of users on this page and search by user’s data.")]),e._v(" "),s("p",[e._v("The description of this page is the same as "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#the-most-loaded-server-users-for-the-last-minute"}},[s("em",[e._v("The most loaded server users for the last minute")])]),e._v(" of the top 5 loaded users.")],1),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMUsers.png",alt:""}})]),e._v(" "),s("p",[e._v("User’s metrics data can be sorted by the load-to-limit ratio and by the absolute value.")]),e._v(" "),s("p",[e._v("The absolute value is used to analyse the load produced by unlimited users.")]),e._v(" "),s("p",[e._v("The value of the load-to-limit ratio is convenient to use in the analysis of how many resources the users consume and whether they need to change the limits.")]),e._v(" "),s("p",[e._v("The values like this "),s("img",{attrs:{src:"/images/CMvalue.png",alt:""}}),e._v(" means that the resource is unlimited and 500.2 MB is the current usage of it.")]),e._v(" "),s("p",[e._v("Metrics data of "),s("em",[e._v("Idle users")]),e._v(" is not used in the sorting, so such users always will be at the end of the list. The sorting can be done for only one metric.")]),e._v(" "),s("h4",{attrs:{id:"charts-for-users-metrics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#charts-for-users-metrics","aria-hidden":"true"}},[e._v("#")]),e._v(" Charts for Users metrics")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("We store the metrics data for one month only.")])]),s("p",[e._v("On the user details page, the admin can find the charts for all LVE limits.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMUsersCharts.png",alt:""}})]),e._v(" "),s("h3",{attrs:{id:"alert-manager"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#alert-manager","aria-hidden":"true"}},[e._v("#")]),e._v(" Alert Manager")]),e._v(" "),s("p",[e._v("Alert Manager allows you to create a server or user alert for selected metrics and email the triggered events.")]),e._v(" "),s("h4",{attrs:{id:"alert-manager-page"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#alert-manager-page","aria-hidden":"true"}},[e._v("#")]),e._v(" Alert Manager page")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMAlertManager1.png",alt:""}})]),e._v(" "),s("p",[e._v("The Alert Manager page contains a table with the following:")]),e._v(" "),s("ul",[s("li",[s("strong",[e._v("Alert name")]),e._v(" - a unique alert name")]),e._v(" "),s("li",[s("strong",[e._v("Tracking metric")]),e._v(" - a name of a server/user metric which will trigger the alert notification")]),e._v(" "),s("li",[s("strong",[e._v("# of servers")]),e._v(" - number of servers on which the metric will be tracked\n"),s("ul",[s("li",[e._v("click "),s("img",{attrs:{src:"/images/CMAlertManager2.png",alt:""}}),e._v(" to view a list of servers host names")])])]),e._v(" "),s("li",[s("strong",[e._v("# of users")]),e._v(" - number of users for which the metric will be tracked\n"),s("ul",[s("li",[e._v("click "),s("img",{attrs:{src:"/images/CMAlertManager2.png",alt:""}}),e._v(" to view a list of users names")])])]),e._v(" "),s("li",[s("strong",[e._v("Value")]),e._v(" - a condition for the alert rule which will be applied to the tracking metrics")]),e._v(" "),s("li",[s("strong",[e._v("Email")]),e._v(" - email to send the triggered events notifications")]),e._v(" "),s("li",[s("strong",[e._v("Type")]),e._v(" - a type of the alert rule")]),e._v(" "),s("li",[s("strong",[e._v("# of triggered events")]),e._v(" - the number of events from the time, when alert rule was created\n"),s("ul",[s("li",[s("img",{attrs:{src:"/images/CMAlertManager3.png",alt:""}}),e._v(" the event is still firing")])])]),e._v(" "),s("li",[s("strong",[e._v("Time of the last trigger")]),e._v(" - the time of last triggered event, it is the time in your browser time zone")]),e._v(" "),s("li",[s("strong",[e._v("Actions")]),e._v(" - click "),s("img",{attrs:{src:"/images/CMAlertManager4.png",alt:""}}),e._v(" to edit and "),s("img",{attrs:{src:"/images/CMAlertManager5.png",alt:""}}),e._v(" to delete the alert rule")])]),e._v(" "),s("p",[s("strong",[e._v("Color Codes")])]),e._v(" "),s("ul",[s("li",[s("strong",[e._v("Red")]),e._v(' color means that the event with the condition "more than" is still firing.')]),e._v(" "),s("li",[s("strong",[e._v("Green")]),e._v(' color means that the event with the condition "less than" is still firing.')])]),e._v(" "),s("h4",{attrs:{id:"creating-an-alert"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#creating-an-alert","aria-hidden":"true"}},[e._v("#")]),e._v(" Creating an alert")]),e._v(" "),s("p",[e._v("To create a new alert, click the "),s("em",[e._v("Create alert")]),e._v(" button.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMAlertManager7.png",alt:""}})]),e._v(" "),s("p",[e._v("Next, fill out the opened popup.")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMAlertManager6.png",alt:""}})]),e._v(" "),s("ul",[s("li",[s("strong",[e._v("Name of alert")]),e._v(" - a unique alert name")]),e._v(" "),s("li",[s("strong",[e._v("Alert type")]),e._v(" - an admin can create a "),s("strong",[e._v("user")]),e._v(" or a "),s("strong",[e._v("server")]),e._v(" alert. "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#difference-between-the-server-alert-and-the-user-alert"}},[e._v("What is the difference between them?")])],1),e._v(" "),s("li",[s("strong",[e._v("Select user/server")]),e._v(" - admin will see such dropdown depending on a "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#cases-of-alert-creating"}},[e._v("case of alert creating")])],1),e._v(" "),s("li",[s("strong",[e._v("Notify me")]),e._v(" - the condition of the alert trigger")]),e._v(" "),s("li",[s("strong",[e._v("Duration")]),e._v(" - how much time the condition should be actual to trigger the notification")]),e._v(" "),s("li",[s("strong",[e._v("Notify me on email")]),e._v(" - the email to send notifications")])]),e._v(" "),s("h4",{attrs:{id:"editing-an-alert"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#editing-an-alert","aria-hidden":"true"}},[e._v("#")]),e._v(" Editing an alert")]),e._v(" "),s("p",[e._v("An admin can edit any field in the Alert except the Alert type.")]),e._v(" "),s("h4",{attrs:{id:"difference-between-the-server-alert-and-the-user-alert"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#difference-between-the-server-alert-and-the-user-alert","aria-hidden":"true"}},[e._v("#")]),e._v(" Difference between the server alert and the user alert")]),e._v(" "),s("p",[e._v("The "),s("strong",[e._v("server alert")]),e._v(" is used to track the state of the whole server, it does not track user state on the server.\nThe "),s("strong",[e._v("server alert")]),e._v(" tracks the next list of metrics:")]),e._v(" "),s("ol",[s("li",[e._v("Context switches")]),e._v(" "),s("li",[e._v("System load (1m)")]),e._v(" "),s("li",[e._v("System load (5m)")]),e._v(" "),s("li",[e._v("System load (15m)")]),e._v(" "),s("li",[e._v("CPU Basic (total)")]),e._v(" "),s("li",[e._v("CPU Basic (system)")]),e._v(" "),s("li",[e._v("CPU Basic (user)")]),e._v(" "),s("li",[e._v("CPU Basic (iowait)")]),e._v(" "),s("li",[e._v("CPU Basic (steal)")]),e._v(" "),s("li",[e._v("Network Traffic Basic ("),s("code",[e._v("eht0_receive")]),e._v(")")]),e._v(" "),s("li",[e._v("Network Traffic Basic ("),s("code",[e._v("eht0_transmit")]),e._v(")")]),e._v(" "),s("li",[e._v("Network Traffic Basic ("),s("code",[e._v("ehtN_receive")]),e._v(")")]),e._v(" "),s("li",[e._v("Network Traffic Basic ("),s("code",[e._v("ehtN_transmit")]),e._v(")")]),e._v(" "),s("li",[e._v("Disk Space Used Basic ("),s("code",[e._v("mountpoint: <0>")]),e._v(")")]),e._v(" "),s("li",[e._v("Disk Space Used Basic ("),s("code",[e._v("mountpoint: <1>")]),e._v(")")]),e._v(" "),s("li",[e._v("Disk Space Used Basic ("),s("code",[e._v("mountpoint: ")]),e._v(")")]),e._v(" "),s("li",[e._v("Memory Basic (available)")]),e._v(" "),s("li",[e._v("Memory Basic (used)")]),e._v(" "),s("li",[e._v("Time spent Doing I/Os")]),e._v(" "),s("li",[e._v("Disk IOps Writes Completed")]),e._v(" "),s("li",[e._v("Disk IOps Reads Completed")]),e._v(" "),s("li",[e._v("Disk Read Data")]),e._v(" "),s("li",[e._v("Disk Write Data")]),e._v(" "),s("li",[e._v("Disk Read Time")]),e._v(" "),s("li",[e._v("Disk Write Time")]),e._v(" "),s("li",[e._v("Apache connections")]),e._v(" "),s("li",[e._v("Number of requests per minute")]),e._v(" "),s("li",[e._v("MySQL queries")]),e._v(" "),s("li",[e._v("Hardware Temperature ("),s("code",[e._v("chip<0>")]),e._v(")")]),e._v(" "),s("li",[e._v("Hardware Temperature ("),s("code",[e._v("sensor<0>")]),e._v(")")]),e._v(" "),s("li",[e._v("Hardware Temperature ("),s("code",[e._v("chip")]),e._v(")")]),e._v(" "),s("li",[e._v("Hardware Temperature ("),s("code",[e._v("sensor")]),e._v(")")]),e._v(" "),s("li",[e._v("Open File Description")])]),e._v(" "),s("p",[e._v("During creating a server alert an admin should select the type of metrics as the first step. The list of servers will be collected according to the availability of these metrics on the server.")]),e._v(" "),s("p",[e._v("For example, for now, we do not collect Apache metrics for non-cPanel servers, so you will get only cPanel servers as a list of servers for these metrics.")]),e._v(" "),s("p",[e._v("We're planning to implement support for other panels/web servers in the next releases.")]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Small limitation")]),s("p",[e._v("We collect the server list according to having their statistics in our database (this behavior will be changed in the next releases).")])]),s("p",[e._v("For example, if server state is N/A or idle more than 24 hours, it will not be visible in the list for the alert.")]),e._v(" "),s("p",[e._v("The "),s("strong",[e._v("user alert")]),e._v(" tracks the next list of LVE metrics:")]),e._v(" "),s("ol",[s("li",[e._v("CPU Usage (current usage)")]),e._v(" "),s("li",[e._v("CPU Usage (faults)")]),e._v(" "),s("li",[e._v("Entry Processes (current usage)")]),e._v(" "),s("li",[e._v("Entry Processes (faults)")]),e._v(" "),s("li",[e._v("Physical Memory Usage (current usage)")]),e._v(" "),s("li",[e._v("Physical Memory Usage (faults)")]),e._v(" "),s("li",[e._v("IOPS (current usage)")]),e._v(" "),s("li",[e._v("IOPS (faults)")]),e._v(" "),s("li",[e._v("IO Usage (current usage)")]),e._v(" "),s("li",[e._v("IO Usage (faults)")]),e._v(" "),s("li",[e._v("Number of Processes (current usage)")]),e._v(" "),s("li",[e._v("Number of Processes (faults)")]),e._v(" "),s("li",[e._v("MySQL CPU (current usage)")]),e._v(" "),s("li",[e._v("MySQL CPU (faults)")]),e._v(" "),s("li",[e._v("MySQL IO (current usage)")])]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Small limitation")]),s("p",[e._v("We collect the server list according to having their statistics in our database (this behavior will be changed in the next releases).")])]),s("p",[e._v("For example, if the user state is N/A or idle more than 24 hours, it will not be visible in the list for the alert.")]),e._v(" "),s("h4",{attrs:{id:"cases-of-alert-creating"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#cases-of-alert-creating","aria-hidden":"true"}},[e._v("#")]),e._v(" Cases of alert creating")]),e._v(" "),s("ul",[s("li",[e._v("Creating a server alert for the selected metrics for one server")]),e._v(" "),s("li",[e._v("Creating a server alert for the selected metrics for all servers (the default value)")])]),e._v(" "),s("p",[e._v("In this two cases, you will not see the dropdown for selecting users because the metrics will track the server state.")]),e._v(" "),s("ul",[s("li",[e._v("Creating a user alert for one user, so admin can select a server and a user.")]),e._v(" "),s("li",[e._v("Creating a user alert for all users on several servers/all servers (in this case admin can't select users - all users will be selected automatically)")])]),e._v(" "),s("h4",{attrs:{id:"what-is-the-firing-state-of-the-alert"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-firing-state-of-the-alert","aria-hidden":"true"}},[e._v("#")]),e._v(" What is the Firing state of the alert?")]),e._v(" "),s("p",[e._v("This is the state of an alert that has been active for longer than the configured threshold duration.")]),e._v(" "),s("h4",{attrs:{id:"alert-notifications"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#alert-notifications","aria-hidden":"true"}},[e._v("#")]),e._v(" Alert notifications")]),e._v(" "),s("p",[s("img",{attrs:{src:"/images/CMAlertManager8.png",alt:""}})]),e._v(" "),s("ul",[s("li",[s("strong",[e._v("Alert name")]),e._v(" - the link to the alert page")]),e._v(" "),s("li",[s("strong",[e._v("Firing target")]),e._v(" - the link to the server details page")])]),e._v(" "),s("h3",{attrs:{id:"faq-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#faq-2","aria-hidden":"true"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),s("h4",{attrs:{id:"how-can-i-disable-collecting-and-sending-statistics-on-a-client-s-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-disable-collecting-and-sending-statistics-on-a-client-s-server","aria-hidden":"true"}},[e._v("#")]),e._v(" How can I disable collecting and sending statistics on a client’s server?")]),e._v(" "),s("p",[e._v("Run this command:")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("/usr/share/cloudlinux/cl_plus/manage_clplus disable\n")])])])]),e._v(" "),s("h4",{attrs:{id:"where-can-i-view-all-my-servers-load"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-view-all-my-servers-load","aria-hidden":"true"}},[e._v("#")]),e._v(" Where can I view all my servers load?")]),e._v(" "),s("p",[e._v("You can find all your servers load in your CM personal account here: "),s("a",{attrs:{href:"https://cm.cloudlinux.com/#/servers",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cm.cloudlinux.com/#/servers"),s("OutboundLink")],1),e._v(" or in your CLN personal account here: "),s("a",{attrs:{href:"https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring"),s("OutboundLink")],1),e._v(".")]),e._v(" "),s("h4",{attrs:{id:"where-can-i-view-all-my-users-load"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-view-all-my-users-load","aria-hidden":"true"}},[e._v("#")]),e._v(" Where can I view all my users load?")]),e._v(" "),s("p",[e._v("You can find all your users load in your CM personal account here: "),s("a",{attrs:{href:"https://cm.cloudlinux.com/#/users",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cm.cloudlinux.com/#/users"),s("OutboundLink")],1),e._v(" or in your CLN personal account here: "),s("a",{attrs:{href:"https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring"),s("OutboundLink")],1)]),e._v(" "),s("h4",{attrs:{id:"where-can-i-view-a-server-load-details-for-a-period"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-view-a-server-load-details-for-a-period","aria-hidden":"true"}},[e._v("#")]),e._v(" Where can I view a server load details for a period?")]),e._v(" "),s("p",[e._v("Click the desired server in the server list in the UI.")]),e._v(" "),s("h4",{attrs:{id:"where-can-i-view-a-user-load-details-for-the-period"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-view-a-user-load-details-for-the-period","aria-hidden":"true"}},[e._v("#")]),e._v(" Where can I view a user load details for the period?")]),e._v(" "),s("p",[e._v("Click the desired user in the user list in the UI.")]),e._v(" "),s("h4",{attrs:{id:"how-long-are-statistics-stored-in-the-central-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-long-are-statistics-stored-in-the-central-database","aria-hidden":"true"}},[e._v("#")]),e._v(" How long are statistics stored in the central database?")]),e._v(" "),s("p",[e._v("30 days.")]),e._v(" "),s("h4",{attrs:{id:"how-can-i-change-the-charts-period-on-the-details-page"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-change-the-charts-period-on-the-details-page","aria-hidden":"true"}},[e._v("#")]),e._v(" How can I change the charts period on the details page?")]),e._v(" "),s("p",[e._v("Choose the desired period in the upper right corner or select it directly on the chart.")]),e._v(" "),s("h4",{attrs:{id:"i-don-t-understand-how-to-read-the-user-load-chart"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#i-don-t-understand-how-to-read-the-user-load-chart","aria-hidden":"true"}},[e._v("#")]),e._v(" I don’t understand how to read the user load chart.")]),e._v(" "),s("p",[e._v("The user load chart contains three lines:")]),e._v(" "),s("ul",[s("li",[e._v("limit")]),e._v(" "),s("li",[e._v("current load")]),e._v(" "),s("li",[e._v("count of faults")])]),e._v(" "),s("p",[e._v("Limit and current load are drawing regarding the left vertical axis, the count of faults is drawing regarding the right vertical axis. You can focus on a particular line by clicking a required legend.")]),e._v(" "),s("h3",{attrs:{id:"troubleshooting"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting","aria-hidden":"true"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),s("h4",{attrs:{id:"i-can-t-see-a-server-statistics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#i-can-t-see-a-server-statistics","aria-hidden":"true"}},[e._v("#")]),e._v(" I can't see a server statistics")]),e._v(" "),s("ol",[s("li",[e._v("Check that your server is registered by key or by IP license of the CloudLinux+ account, i.e., it should be seen in the list of servers in your CLN account here: "),s("a",{attrs:{href:"https://cln.cloudlinux.com/console/auth/login",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://cln.cloudlinux.com/console/auth/login"),s("OutboundLink")],1)]),e._v(" "),s("li",[e._v("Check that the following required packages are installed on the end server:")])]),e._v(" "),s("ul",[s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("cl-end-server-tools")])]),e._v(" >= 1.0.7-1")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("cl-node-exporter")])]),e._v(" >= 1.1.0-2")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("rhn-client-tools")])]),e._v(" "),s("ul",[s("li",[e._v("CloudLinux OS Shared 6 >= 1.1.15-3.el6.cloudlinux.26")]),e._v(" "),s("li",[e._v("CloudLinux OS Shared 7 >= 2.0.2-31.el7.clouldinux")]),e._v(" "),s("li",[e._v("CloudLinux OS Shared 8 >= 2.8.16-14.module_el8.1.0+6074+9dc6073e.cloudlinux.2")])])]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("lve-stats")])]),e._v(" >= 3.0.7-2")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("lve-utils")])]),e._v(" >= 4.2.21-2")]),e._v(" "),s("li",[s("span",{staticClass:"notranslate"},[s("code",[e._v("alt-python27-cllib")])]),e._v(" >= 2.1.13-1")]),e._v(" "),s("li",[s("code",[e._v("lvemanager")]),e._v(" >= 6.2.10-1")])]),e._v(" "),s("ol",{attrs:{start:"3"}},[s("li",[e._v("Check that service collecting and sending statistics is running:")])]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("service cl_plus_sender status\n")])])])]),e._v(" "),s("ol",{attrs:{start:"4"}},[s("li",[e._v("Check that log of the "),s("span",{staticClass:"notranslate"},[s("em",[e._v("cl_plus_sender")])]),e._v(" service doesn't contain errors:")])]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("/var/log/clplus_sender.log\n")])])])]),e._v(" "),s("h4",{attrs:{id:"where-can-i-view-the-events-log-on-the-client-s-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-view-the-events-log-on-the-client-s-server","aria-hidden":"true"}},[e._v("#")]),e._v(" Where can I view the events log on the client's server?")]),e._v(" "),s("p",[e._v("You can view the events log on the client's server here:")]),e._v(" "),s("div",{staticClass:"notranslate"},[s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("/var/log/clplus_sender.log\n")])])])]),e._v(" "),s("h4",{attrs:{id:"can-i-get-monitoring-metrics-from-litespeed-nginx-or-other-not-apache-web-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#can-i-get-monitoring-metrics-from-litespeed-nginx-or-other-not-apache-web-server","aria-hidden":"true"}},[e._v("#")]),e._v(" Can I get monitoring metrics from LiteSpeed, Nginx or other (Not Apache) web server?")]),e._v(" "),s("p",[e._v("Starting from end-server-tools-1.0.7, it supports collecting and sending statistics from the Apache and LiteSpeed web servers.")]),e._v(" "),s("p",[e._v("LiteSpeed is supported on cPanel and DirectAdmin control panels.")]),e._v(" "),s("p",[e._v("Each minute the statistics collection daemon checks which web server is started. If LiteSpeed is started, the daemon will collect data from it, otherwise, it checks if Apache is started.")]),e._v(" "),s("p",[e._v("When the daemon detects that the server is changed, it writes the following line into the statistics collection daemon log "),s("code",[e._v("/var/log/clplus_sender.log")]),e._v(":")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("2020-10-09 17:25:31,462: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Using Apache\n")])])]),s("p",[e._v("or")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("2020-10-09 18:13:03,897: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Using Litespeed\n")])])]),s("p",[e._v("If the daemon can't detect either Apache or LiteSpeed, it writes to the log the following:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("2020-10-09 17:33:38,399: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Apache or Litespeed stopped or absent, collector will not work\n")])])]),s("p",[e._v("The statistics collection daemon reacts to the server changing automatically, no need to restart it.")]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning")]),s("p",[e._v("Please note that the daemon checks the server type once in a minute, so the data sent on a minute of switching can be unreliable.")])]),s("h4",{attrs:{id:"logging-data-sent-to-pushgateway-to-the-statistics-collection-daemon-log"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#logging-data-sent-to-pushgateway-to-the-statistics-collection-daemon-log","aria-hidden":"true"}},[e._v("#")]),e._v(" Logging data sent to pushgateway to the statistics collection daemon log")]),e._v(" "),s("p",[e._v("Starting from "),s("code",[e._v("cl-end-server-tools")]),e._v(" v.1.0.6-1, the statistics collection daemon allows to log data sent to pushgateway to its log "),s("code",[e._v("/var/log/clplus_sender.log")]),e._v(".")]),e._v(" "),s("p",[e._v("To start logging, run the following command:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("touch /var/lve/cmt_debug_logging\n")])])]),s("p",[e._v("To stop logging, run the following command:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("rm -f /var/lve/cmt_debug_logging\n")])])]),s("p",[e._v('You don\'t need to restart the daemon after starting/stopping logging. The presence of a control file is evaluated "on the fly".')]),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning")]),s("p",[e._v("Use this logging with caution because when it is enabled, the size of the daemon log "),s("code",[e._v("/var/log/clplus_sender.log")]),e._v(" will increase each minute minimum on 3-4 KB. The actual increase size depends on the number of active users' processes on a server.")])]),s("h3",{attrs:{id:"known-issues"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#known-issues","aria-hidden":"true"}},[e._v("#")]),e._v(" Known issues")]),e._v(" "),s("ul",[s("li",[e._v("MySQL Governor statistics in some cases is collected incorrectly")]),e._v(" "),s("li",[e._v("Sorting by MySQL Governor statistics ignores idle users")]),e._v(" "),s("li",[e._v("Sorting from the search result set does not work")]),e._v(" "),s("li",[e._v("Sorting by ratio for unlimited users works incorrectly")])]),e._v(" "),s("h2",{attrs:{id:"acceleratewp"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#acceleratewp","aria-hidden":"true"}},[e._v("#")]),e._v(" AccelerateWP")]),e._v(" "),s("h3",{attrs:{id:"get-started"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#get-started","aria-hidden":"true"}},[e._v("#")]),e._v(" Get started")]),e._v(" "),s("p",[e._v("AccelerateWP carries a suite of optimization features that can be enabled and automatically configured for the end-user's site.")]),e._v(" "),s("p",[e._v("There are AccelerateWP, AccelerateWP Premium and AccelerateWP CDN features suites.")]),e._v(" "),s("p",[e._v('AccelerateWP suite is always enabled when AccelerateWP is turned on. Choose whether you want to offer AccelerateWP Premium\nor CDN (Content Delivery Network) for your users (by opting in) and click "Turn on" to start exploring AccelerateWP.')]),e._v(" "),s("p",[s("img",{attrs:{src:a(352),alt:""}})]),e._v(" "),s("p",[e._v("Once the AccelerateWP suite is enabled by administrator,\nend-users will see an AccelerateWP tab in their control panel interface and be able to activate the optimization feature.")]),e._v(" "),s("p",[e._v("When AccelerateWP CDN suite enabled by administrator, end-users will get 1 GB of CDN traffic and be able to activate\nfeature to use until limit is reached. Once 1GB limit is reached - end-user will be suggested to extend CDN limit by\npurchasing CDN plan using "),s("a",{attrs:{href:"#billing-integration"}},[e._v("WHMCS or 3'd party billing")])]),e._v(" "),s("p",[e._v("When AccelerateWP Premium suite enabled by administrator,\nend-users will see the Object Caching, Image Optimization and Critical CSS features in their interface,\nbut cannot activate the feature unless they purchase the feature using "),s("a",{attrs:{href:"#billing-integration"}},[e._v("WHMCS or 3'd party billing")]),e._v(".")]),e._v(" "),s("h4",{attrs:{id:"acceleratewp-suite"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#acceleratewp-suite","aria-hidden":"true"}},[e._v("#")]),e._v(" AccelerateWP suite")]),e._v(" "),s("p",[e._v("This is a basic suite which includes "),s("a",{attrs:{href:"https://user-docs.cloudlinux.com/wpos-plugin/#acceleratewp-feature-wordpress-optimization-plugin",target:"_blank",rel:"noopener noreferrer"}},[e._v("AccelerateWP base feature"),s("OutboundLink")],1),e._v(":\na WordPress optimization plugin that provides full page caching, GZIP compression and some other useful optimizations.")]),e._v(" "),s("p",[s("strong",[e._v("AccelerateWP suite limitations")])]),e._v(" "),s("ul",[s("li",[e._v("the website must be served with Apache web server;")]),e._v(" "),s("li",[e._v("the website must use PHP version 7.2 or higher.")]),e._v(" "),s("li",[e._v("the WordPress version must be 5.6 and higher.")]),e._v(" "),s("li",[e._v("the other WordPress Caching plugins must not be installed.")]),e._v(" "),s("li",[e._v("the WordPress should not run in Multisite mode.")])]),e._v(" "),s("h4",{attrs:{id:"acceleratewp-premium-suite"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#acceleratewp-premium-suite","aria-hidden":"true"}},[e._v("#")]),e._v(" AccelerateWP Premium suite")]),e._v(" "),s("p",[e._v("This is a premium suite which includes "),s("a",{attrs:{href:"https://user-docs.cloudlinux.com/wpos-plugin/#acceleratewp-premium-object-caching-feature",target:"_blank",rel:"noopener noreferrer"}},[e._v("Object Caching feature"),s("OutboundLink")],1),e._v(".")]),e._v(" "),s("p",[e._v("The Object Caching mechanism stores database query results in additional storage for quick access.\nThis mechanism is really helpful in case if website needs to process multiple pages per second as\nrequests come in and may be helpful in case when full page caching cannot be used, e.g. on personalized pages.")]),e._v(" "),s("p",[s("a",{attrs:{href:"https://user-docs.cloudlinux.com/wpos-plugin/#image-optimization",target:"_blank",rel:"noopener noreferrer"}},[e._v("Image Optimization feature"),s("OutboundLink")],1)]),e._v(" "),s("p",[s("a",{attrs:{href:"https://user-docs.cloudlinux.com/wpos-plugin/#css-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("Critical CSS feature"),s("OutboundLink")],1)]),e._v(" "),s("p",[s("strong",[e._v("Premium suite limitations")])]),e._v(" "),s("ul",[s("li",[e._v("the website must be served with Apache web server;")]),e._v(" "),s("li",[e._v("the website must use one of the following PHP handlers:\n"),s("ul",[s("li",[s("a",{attrs:{href:"https://blog.cpanel.com/how-to-use-php-fpm-with-cpanel/",target:"_blank",rel:"noopener noreferrer"}},[e._v("php-fpm"),s("OutboundLink")],1)]),e._v(" "),s("li",[s("RouterLink",{attrs:{to:"/cloudlinux_os_components/#apache-mod-lsapi-pro"}},[e._v("lsapi")])],1)])]),e._v(" "),s("li",[e._v("the website must use ea-PHP version 7.4 or 8.0.")]),e._v(" "),s("li",[e._v("the WordPress version must be 3.7 and higher.")]),e._v(" "),s("li",[e._v("the other WordPress Caching plugins must not be installed.")]),e._v(" "),s("li",[e._v("the "),s("a",{attrs:{href:"https://snuffleupagus.readthedocs.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Snuffleupagus"),s("OutboundLink")],1),e._v(" must be turned off.")]),e._v(" "),s("li",[e._v("the WordPress should not run in Multisite mode.")])]),e._v(" "),s("h4",{attrs:{id:"acceleratewp-premium-cdn-suite"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#acceleratewp-premium-cdn-suite","aria-hidden":"true"}},[e._v("#")]),e._v(" AccelerateWP Premium CDN suite")]),e._v(" "),s("p",[e._v("This suite includes "),s("a",{attrs:{href:"https://user-docs.cloudlinux.com/wpos-plugin/#cdn",target:"_blank",rel:"noopener noreferrer"}},[e._v("CDN feature"),s("OutboundLink")],1)]),e._v(" "),s("p",[e._v("CDN (Content Delivery Network) is the feature which speeds up resource loading for WordPress site customers.\n"),s("a",{attrs:{href:"#acceleratewp-suite"}},[e._v("CDN suite limitations")]),e._v(" are the same as for AccelerateWP feature.")]),e._v(" "),s("h3",{attrs:{id:"limitations"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#limitations","aria-hidden":"true"}},[e._v("#")]),e._v(" Limitations")]),e._v(" "),s("p",[e._v("There are the following requirements to use AccelerateWP:")]),e._v(" "),s("ul",[s("li",[e._v("the server must have CloudLinux Shared PRO license;")]),e._v(" "),s("li",[e._v("the server must be powered with cPanel or Plesk.")])]),e._v(" "),s("h3",{attrs:{id:"administrator-interface"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#administrator-interface","aria-hidden":"true"}},[e._v("#")]),e._v(" Administrator interface")]),e._v(" "),s("h4",{attrs:{id:"overview"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#overview","aria-hidden":"true"}},[e._v("#")]),e._v(" Overview")]),e._v(" "),s("p",[e._v("In the "),s("em",[e._v("CloudLinux Manager → AccelerateWP")]),e._v(" tab an administrator has the opportunity to provide end-users with a suite of features, which on its turn could be activated by end-users.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(353),alt:""}})]),e._v(" "),s("p",[e._v("Once the feature suite is enabled by administrator, end-users will see an AccelerateWP tab in their control panel interface and be able to activate the optimization feature.")]),e._v(" "),s("h4",{attrs:{id:"suites-usage-statistics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#suites-usage-statistics","aria-hidden":"true"}},[e._v("#")]),e._v(" Suites usage statistics")]),e._v(" "),s("p",[e._v("When AccelerateWP is enabled, the AccelerateWP usage statistics is shown.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(354),alt:""}})]),e._v(" "),s("p",[e._v("It includes:")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("Active Users")]),e._v(" block with total number of users and number of users who has activated the optimization feature/total users")]),e._v(" "),s("li",[s("code",[e._v("Wordpress sites on server")]),e._v(" block with total number of WordPress sites and WordPress sites optimized by the feature")]),e._v(" "),s("li",[e._v("statistics table")])]),e._v(" "),s("p",[e._v("Each row in the statistics table represents a particular user.")]),e._v(" "),s("p",[e._v("The first column "),s("code",[e._v("#of Wordpress sites")]),e._v(" shows total number of user's WordPress sites.")]),e._v(" "),s("p",[e._v("The second column "),s("code",[e._v("AccelerateWP")]),e._v(" shows number of user's WordPress sites, optimized by the feature.")]),e._v(" "),s("p",[e._v('To enable premium features, click on the "Activate premium features" link and select the options you want. To integrate functions with billing, you must specify the base URL for the purchase of the function by end users.')]),e._v(" "),s("p",[s("img",{attrs:{src:a(355),alt:""}})]),e._v(" "),s("p",[e._v("In case if both AccelerateWP and AccelerateWP Premium feature suites are enabled,\nthe statistics is extended with AccelerateWP Premium metrics.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(356),alt:""}})]),e._v(" "),s("p",[e._v("Please notice the "),s("code",[e._v("AccelerateWP Premium")]),e._v(" rows in the "),s("code",[e._v("Active Users")]),e._v(" and the "),s("code",[e._v("Wordpress sites on server")]),e._v("\nblocks, and also the "),s("code",[e._v("AccelerateWP Premium")]),e._v(" column in statistics table.")]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v('Newly created users will be accounted for 10 min after adding.\nIf you want to get updated statistics immediately, use the "Rescan users websites" button.')])]),s("h4",{attrs:{id:"filters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#filters","aria-hidden":"true"}},[e._v("#")]),e._v(" Filters")]),e._v(" "),s("p",[e._v("You may use the following filters to browse AccelerateWP statistics slices.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(357),alt:""}})]),e._v(" "),s("ul",[s("li",[s("code",[e._v("Users with WordPress sites only")]),e._v(" filter will show statistics for users which already have WordPress sites; users without WordPress installations will be hidden")]),e._v(" "),s("li",[s("code",[e._v("Users with AccelerateWP only")]),e._v(" filter will show statistics for users who utilizes the AccelerateWP optimization feature; users who did not activated AccelerateWP feature will be hidden")]),e._v(" "),s("li",[s("code",[e._v("Users with AccelerateWP Premium only")]),e._v(" filter will show statistics for users who utilizes AccelerateWP Premium (Object Caching) feature; users who did not activated AccelerateWP Premium feature will be hidden")]),e._v(" "),s("li",[s("code",[e._v("Users with CDN Free only")]),e._v(" filter will show statistics for users who utilizes AccelerateWP CDN feature")]),e._v(" "),s("li",[s("code",[e._v("Users with CDN Pro only")]),e._v(" filter will show statistics for users who utilize AccelerateWP CDN Pro feature")])]),e._v(" "),s("h3",{attrs:{id:"activate-free-acceleratewp-for-all-wordpress-sites-on-the-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#activate-free-acceleratewp-for-all-wordpress-sites-on-the-server","aria-hidden":"true"}},[e._v("#")]),e._v(" Activate free AccelerateWP for all WordPress sites on the server")]),e._v(" "),s("p",[e._v("Use the "),s("code",[e._v("cloudlinux-awp-admin enable-feature")]),e._v(" CLI command to\nensure the best performance for every end-user. CLI command\nscans a server for all WordPress sites and activates the AccelerateWP\nfeature suite. It can take up to 2 minutes for a single site. CLI command skips activation for WordPress sites with\npage caching or feature incompatibilities.")]),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Note")]),s("p",[e._v("Please make sure your AccelerateWP version is >= 1.2-2 before proceed.")])]),s("p",[e._v("Scan the server in background mode and activate AccelerateWP\non those WordPress sites where it is possible:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin enable-feature --all\n")])])]),s("p",[e._v("The output will state the number of users for the scan and the\nprogress state of the process.")]),e._v(" "),s("p",[e._v("Check activation status:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin enable-feature --status\n")])])]),s("p",[e._v("The output will be either:")]),e._v(" "),s("ul",[s("li",[e._v("Activation is still in progress,")]),e._v(" "),s("li",[e._v("Activation is done. The message will state how many users\nwere initially for the scan, a number of WordPress sites with\nsuccessfully activated suite, and the total number of WordPress sites\nscanned.")])]),e._v(" "),s("h3",{attrs:{id:"enable-acceleratewp-cdn-pro"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#enable-acceleratewp-cdn-pro","aria-hidden":"true"}},[e._v("#")]),e._v(" Enable AccelerateWP CDN Pro")]),e._v(" "),s("p",[e._v("To enable CDN Pro for all users:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suites accelerate_wp_cdn_pro --users all --allowed-for-all\n")])])]),s("p",[e._v("To enable CDN Pro for a particular user:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suites accelerate_wp_cdn_pro --allowed --users=\n")])])]),s("h3",{attrs:{id:"disable-acceleratewp-for-a-particular-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#disable-acceleratewp-for-a-particular-user","aria-hidden":"true"}},[e._v("#")]),e._v(" Disable AccelerateWP for a particular user")]),e._v(" "),s("p",[e._v("Use CLI commands to disable undesired optimization suites for a single user.")]),e._v(" "),s("p",[e._v("To disable AccelerateWP suite:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suites=accelerate_wp --disallowed --users=\n")])])]),s("p",[e._v("To disable AccelerateWP Premium suite:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --disallowed --users=\n")])])]),s("p",[e._v("To disable AccelerateWP CDN suite:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suite=accelerate_wp_cdn --disallowed --users=\n")])])]),s("p",[e._v("To disable AccelerateWP CDN Pro suite:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suite=accelerate_wp_cdn_pro --disallowed --users=\n")])])]),s("p",[e._v("To disable all suites:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suites=accelerate_wp,accelerate_wp_premium,accelerate_wp_cdn,accelerate_wp_cdn_pro --disallowed --users=\n")])])]),s("h3",{attrs:{id:"useful-acceleratewp-cli-commands"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#useful-acceleratewp-cli-commands","aria-hidden":"true"}},[e._v("#")]),e._v(" Useful AccelerateWP CLI commands")]),e._v(" "),s("p",[e._v("Use CLI commands to check AccelerateWP features status.")]),e._v(" "),s("p",[e._v("If you are also interested in Smart Advice CLI command, they could be found "),s("RouterLink",{attrs:{to:"/cloudlinux-os-plus/#useful-smart-advice-cli-commands"}},[e._v("here")]),e._v(".")],1),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("Warning!")]),s("p",[e._v("This is an experimental feature. The backwards compatibility is not guaranteed.")])]),s("h4",{attrs:{id:"acceleratewp-suites-statistics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#acceleratewp-suites-statistics","aria-hidden":"true"}},[e._v("#")]),e._v(" AccelerateWP suites statistics")]),e._v(" "),s("p",[e._v("Get suites statistics for all users:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin get-report --all\n")])])]),s("p",[e._v("or for a particular user:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin get-report --users=\n")])])]),s("p",[e._v("This CLI command returns the following information:")]),e._v(" "),s("ul",[s("li",[e._v("total number of users in the report -- "),s("code",[e._v("total_users_count")])]),e._v(" "),s("li",[e._v("total number of websites in the report -- "),s("code",[e._v("total_wordpress_count")])]),e._v(" "),s("li",[e._v("total number of users with particular suite enabled -- "),s("code",[e._v("total_users_count_active")])]),e._v(" "),s("li",[e._v("total number of websites with particular suite enabled -- "),s("code",[e._v("total_sites_count_active")])]),e._v(" "),s("li",[e._v("number of websites with particular suite enabled per each user in the report -- "),s("code",[e._v("*_sites_count")]),e._v(" in the "),s("code",[e._v("users")]),e._v(" list")]),e._v(" "),s("li",[e._v("suites visibility status per each user in the report -- "),s("code",[e._v("suites")]),e._v(" in the "),s("code",[e._v("users")]),e._v(" list\n"),s("ul",[s("li",[e._v("possible values for visibility status are: "),s("code",[e._v("visible")]),e._v(", "),s("code",[e._v("allowed")]),e._v(", "),s("code",[e._v("disabled")])])])])]),e._v(" "),s("p",[e._v("The example output for a single user is given below:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('{\n "last_scan_time": 1681198804,\n "result": "success",\n "timestamp": 1681203383.3503218,\n "total_sites_count_active": {\n "accelerate_wp": 1,\n "accelerate_wp_premium": 0\n },\n "total_users_count": 1,\n "total_users_count_active": {\n "accelerate_wp": 1,\n "accelerate_wp_premium": 0\n },\n "total_wordpress_count": 2,\n "users": [\n {\n "accelerate_wp_active_sites_count": 1,\n "accelerate_wp_premium_sites_count": 0,\n "suites": {\n "accelerate_wp": {\n "source": "manual",\n "status": "allowed"\n },\n "accelerate_wp_premium": {\n "source": "default",\n "status": "visible"\n }\n },\n "username": "user16",\n "wp_sites_count": 2\n }\n ]\n}\n')])])]),s("h4",{attrs:{id:"acceleratewp-features-statistics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#acceleratewp-features-statistics","aria-hidden":"true"}},[e._v("#")]),e._v(" AccelerateWP features statistics")]),e._v(" "),s("p",[e._v("Get overall AccelerateWP features usage statistics for a server with:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin get-stat\n")])])]),s("p",[e._v("This CLI command returns the following information:")]),e._v(" "),s("ul",[s("li",[e._v("number of "),s("code",[e._v("allowed_users")]),e._v(" in "),s("code",[e._v("total")]),e._v(" and per feature")]),e._v(" "),s("li",[e._v("number of sites with enabled features in "),s("code",[e._v("total")]),e._v(" and per feature -- "),s("code",[e._v("enabled_sites")])]),e._v(" "),s("li",[e._v("number of users with visible features in "),s("code",[e._v("total")]),e._v(" and per feature -- "),s("code",[e._v("visible_users")])]),e._v(" "),s("li",[e._v("features which are currently allowed -- "),s("code",[e._v("features_allowed_by_default")])]),e._v(" "),s("li",[e._v("features which are currently visible -- "),s("code",[e._v("features_visible_by_default")])])]),e._v(" "),s("p",[e._v("The example output is given below:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('{\n "allowed_users": {\n "object_cache": 0,\n "site_optimization": 1,\n "total": 1\n },\n "enabled_sites": {\n "object_cache": 0,\n "site_optimization": 1,\n "total": 1\n },\n "features_allowed_by_default": [\n "site_optimization"\n ],\n "features_visible_by_default": [\n "object_cache",\n "site_optimization"\n ],\n "is_accelerate_wp_flag_enabled": false,\n "is_accelerate_wp_icon_enabled": true,\n "result": "success",\n "timestamp": 1681208259.19426,\n "visible_users": {\n "object_cache": 22,\n "site_optimization": 22,\n "total": 23\n }\n}\n')])])]),s("h4",{attrs:{id:"acceleratewp-features-detailed-statistics"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#acceleratewp-features-detailed-statistics","aria-hidden":"true"}},[e._v("#")]),e._v(" AccelerateWP features detailed statistics")]),e._v(" "),s("p",[e._v("AccelerateWP features detailed statistics is available in user's environment only.")]),e._v(" "),s("p",[e._v("Use the following CLI command "),s("strong",[s("em",[e._v("on behalf of a user")])]),e._v(":")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-user get\n")])])]),s("p",[e._v("The command reports:")]),e._v(" "),s("ul",[s("li",[e._v("features allowed for a user -- "),s("code",[e._v("allowed_features")])]),e._v(" "),s("li",[e._v("all user's websites "),s("code",[e._v("docroots")]),e._v(" with features information per each "),s("code",[e._v("wps")]),e._v(", which includes:\n"),s("ul",[s("li",[e._v("status of each feature -- if the feature is "),s("code",[e._v("enabled")]),e._v(", if the feature is "),s("code",[e._v("visible")])]),e._v(" "),s("li",[e._v("issues detected (if any) for each feature")])])]),e._v(" "),s("li",[e._v("subscription status (for premium features) -- "),s("code",[e._v("subscription")])]),e._v(" "),s("li",[e._v("features visible for a user -- "),s("code",[e._v("visible_features")])])]),e._v(" "),s("p",[e._v("The example output is given below:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v('{\n "allowed_features": {\n "accelerate_wp": [],\n "accelerate_wp_premium": []\n },\n "docroots": [\n {\n "domains": [\n "user0.com"\n ],\n "php_handler": "fastcgi",\n "php_version": "plesk-php73-fastcgi",\n "wps": [\n {\n "features": {\n "accelerate_wp": {\n "enabled": false,\n "issues": [\n {\n "context": {\n "plugins": "WP Rocket"\n },\n "description": "Found conflicting plugins: %(plugins)s.",\n "fix_tip": "Deactivate and uninstall the conflicting plugin using the WordPress administration interface.",\n "header": "Conflicting plugins are enabled",\n "type": "incompatibility"\n }\n ],\n "visible": true\n },\n "object_cache": {\n "enabled": false,\n "issues": [\n {\n "context": {\n "blog_url": "https://blog.cloudlinux.com/",\n "supported_handlers": "php-fpm, lsapi"\n },\n "description": "Website uses unsupported PHP handler. Currently supported handler(s): %(supported_handlers)s.",\n "fix_tip": "Please, set or ask your system administrator to set one of the supported PHP handlers for the domain: %(supported_handlers)s. Or keep watching our blog: %(blog_url)s for supported handlers list updates.",\n "header": "Unsupported PHP handler",\n "type": "incompatibility"\n }\n ],\n "visible": true\n }\n },\n "path": "wordpress",\n "version": "6.2"\n }\n ]\n },\n {\n "domains": [\n "sub.user0.com"\n ],\n "php_handler": "fastcgi",\n "php_version": "plesk-php73-fastcgi",\n "wps": []\n }\n ],\n "max_cache_memory": "64mb",\n "result": "success",\n "subscription": {\n "object_cache": "no"\n },\n "timestamp": 1681200081.765476,\n "upgrade_url": null,\n "used_memory": null,\n "visible_features": {\n "accelerate_wp": [\n "accelerate_wp"\n ],\n "accelerate_wp_premium": [\n "object_cache"\n ]\n }\n}\n')])])]),s("h3",{attrs:{id:"whmcs-billing"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#whmcs-billing","aria-hidden":"true"}},[e._v("#")]),e._v(" WHMCS billing")]),e._v(" "),s("p",[e._v("CloudLinux developed it's own WHMCS plugin\nwhich provides you AccelerateWP billing integration out of the box.\nCheck out "),s("a",{attrs:{href:"https://docs.cln.cloudlinux.com/whmcs_awp_plugin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("the documentation"),s("OutboundLink")],1),e._v(" to find how to install and use the plugin.")]),e._v(" "),s("h3",{attrs:{id:"other-billing-integration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-billing-integration","aria-hidden":"true"}},[e._v("#")]),e._v(" Other billing integration")]),e._v(" "),s("p",[e._v("As AccelerateWP Premium is the feature that works on subscription basis,\nwe made it possible for hosters to integrate their existing billing systems with our plugin and sell the\nfeature for their users.")]),e._v(" "),s("p",[e._v("When AccelerateWP Premium is enabled in admin interface, users get proposal to upgrade their subscription.")]),e._v(" "),s("p",[s("img",{attrs:{src:a(358),alt:""}})]),e._v(" "),s("p",[e._v("When user upgrades the subscription to the plan with AccelerateWP support,\nbilling must execute the following command on the server:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --allowed --source=BILLING_OVERRIDE --users=\n")])])]),s("p",[e._v("This command makes two things:")]),e._v(" "),s("ul",[s("li",[e._v("allow user to install plugin, bypassing the upgrade window;")]),e._v(" "),s("li",[e._v("reports premium as being used to CLN, starting the billing cycle for hoster.")])]),e._v(" "),s("p",[e._v("When user terminates or downgrades plan, the following command must be executed by the billing system:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --default --source=BILLING_OVERRIDE --users=\n")])])]),s("h3",{attrs:{id:"setup-upgrade-url-for-acceleratewp-premium"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup-upgrade-url-for-acceleratewp-premium","aria-hidden":"true"}},[e._v("#")]),e._v(" Setup upgrade URL for AccelerateWP Premium")]),e._v(" "),s("p",[e._v("The upgrade window can be customized with link to the plan upgrade page, which can be set using CLI command:")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-options --upgrade-url https://plan.upgrade/splash\n")])])]),s("p",[s("img",{attrs:{src:a(359),alt:""}})]),e._v(" "),s("p",[e._v("AccelerateWP automatically appends GET parameters when the link is displayed.")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("https://plan.upgrade/splash/?m=acceleratewp&action=provisioning&username=democom&domain=demo.com&server_ip=10.51.0.10\n")])])]),s("table",[s("thead",[s("tr",[s("th",[e._v("Parameter")]),e._v(" "),s("th",[e._v("Value")]),e._v(" "),s("th",[e._v("Description")])])]),e._v(" "),s("tbody",[s("tr",[s("td",[e._v("m")]),e._v(" "),s("td",[e._v("acceleratewp")]),e._v(" "),s("td",[e._v("Constant.")])]),e._v(" "),s("tr",[s("td",[e._v("action")]),e._v(" "),s("td",[e._v("provisioning")]),e._v(" "),s("td",[e._v("Constant.")])]),e._v(" "),s("tr",[s("td",[e._v("username")]),e._v(" "),s("td",[e._v("democom")]),e._v(" "),s("td",[e._v("Customer's account name.")])]),e._v(" "),s("tr",[s("td",[e._v("domain")]),e._v(" "),s("td",[e._v("demo.com")]),e._v(" "),s("td",[e._v("Customer's account primary domain.")])]),e._v(" "),s("tr",[s("td",[e._v("server_ip")]),e._v(" "),s("td",[e._v("10.51.0.10")]),e._v(" "),s("td",[e._v("Primary IP of the server where AccelerateWP is installed")])])])]),e._v(" "),s("p",[e._v("Parameters can be used to determine the billing account of the user in order to display proper page.\nWHMCS plugin already has automatic redirect to upgrade page, there is only needed to set upgrade-url\nto the root of your WHMCS instance.")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[e._v("cloudlinux-awp-admin set-options --upgrade-url https://whmcs.mydomain.zone/\n")])])]),s("p",[e._v("Upgrade URL is opened in modal browser window and will be automatically closed\nwhen AccelerateWP receives callback about successful upgrade.")]),e._v(" "),s("p",[e._v("Callback is already implemented in WHMCS plugin, but if you are using some other billing,\nyou should add the following code on the page which appears when user successfully upgrades subscription.")]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[e._v(" + + + + + + + + + + + + + + + + + + + +

CloudLinux OS Admin

Description

CloudLinux OS Admin is designed for shared hosting providers who want to flawlessly migrate their +big shared hosting customer to individual VPS with same CloudLinux features as on Shared hosting. +At the same time you will be able to separate such a user's websites if necessary and isolate them +with CageFS for efficient and extra security.

Also it may be suitable for a little server with less than 5 customers on it, but be careful, +there is no migration to Shared edition available.

Most of the features of CloudLinux OS Shared are available in this edition, with a small differences:

  • lve limits are set to unlimited by default (can be changed in CloudLinux Manager at any time)
  • MySQL Governor is not available in this edition
  • the license itself does not allow more than 5 users to be hosted on server.

Note

The CloudLinux OS Admin plan does not include the NodeJS, Python and Ruby selectors as well as the MySQL Governor.

Installation

CloudLinux OS Admin installation process is the same as for CloudLinux Shared, +please forward to installation guide for the detailed instructions.

Note

The CloudLinux OS Admin can be installed and compatible only with AlmaLinux OS 8

Components

CloudLinux OS Admin is very close to the regular CloudLinux Shared edition, which means that +99% of components described in this documentations are available for CloudLinux OS Admin.

The exclusions are:

  • MySQL Governor is not available
  • NodeJS, Python and Ruby selectors aren't available, however, PHP Selector is available
  • X-Ray is available like with CloudLinux Shared Pro
  • Accelerate WP is available like with CloudLinux Shared Pro

The rest of the components are similar with CloudLinux OS Shared.

FAQ

Q: Is it possible to convert my existing CloudLinux OS Shared server into CloudLinux OS Admin?
+A: No, only fresh installation is possible.

Q: Is Centralized Monitoring supported on CloudLinux OS Admin?
+A: No, Centralized Monitoring only works with CloudLinux OS Shared Pro license.

+ + + diff --git a/cloudlinux-os-plus/index.html b/cloudlinux-os-plus/index.html new file mode 100644 index 000000000..93003b93c --- /dev/null +++ b/cloudlinux-os-plus/index.html @@ -0,0 +1,424 @@ + + + + + + CloudLinux OS Shared Pro | Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CloudLinux OS Shared Pro

X-Ray

Description

Warning!

X-Ray is available out of the box for cPanel, Plesk, and DirectAdmin. For other control panels you should implement integration as described here

X-Ray is a tool developed for website performance monitoring and performance issues detection.

X-Ray can gather and visualize information about top N slowest system functions, external requests, software modules and database queries of the client’s website.

Known limitations

X-Ray is not compatible with Opcahce JIT optimization. +Once X-Ray tracing task is running for the site the Opcache JIT optimization will be disabled until tracing task completed.

Installation

  1. Make sure you have CloudLinux OS Shared Pro subscription (only non-reseller accounts apply)

  2. Make sure you have installed LVE Manager version 6.2 or later. You can install or update it with the following commands:

    • installation
    # yum install lvemanager
    +
    • update
    # yum update lvemanager
    +
  3. X-Ray will be activated on all your servers during 4 hours. You will see the X-Ray tab in the LVE Manager UI.

  4. For instant activation, run the following command:

    # rhn_check
    +

    If the rhn_check command is not found, run the following command:

    # yum install rhn-check rhn-setup
    +
  5. Then install the alt-php-xray package

    • Via user interface

      • Go to the X-Ray tab.
      • Click Install to start installation.

    • Via SSH by running the following command:

    # yum install lvemanager alt-php-xray
    +
  6. After installation, use the Start tracing button to create your first tracing task for a slow site.

How to manage X-Ray

X-Ray provides several options for monitoring domain requests speed: Manual Tracing task, X-Ray Autotracing and Continuous tracing.

  • Manual Tracing task is a task that you can create for a specific URL to collect server requests. The task will end either after a specified number of requests to the URL or after a specified time (maximum after two days). It is not possible here to automatically email a report but it is possible to export the report in PDF and send to a user.

  • Autotracing task is a task that will be created automatically at the end of each day for slow URLs that were found during that day by the PHP Slow Site Analyzer (SSA). +Need to be enabled separately, see How to enable X-Ray Autotracing.

  • Continuous tracing is a task that initiates daily hourly tracing requests for a specified domain and email a monitoring report. Continuous task can't stop automatically, you need to stop it manually. In fact, continuous task allows to automatically create a tracing task for each new day, with the ability to get a report for the past day.

Tracing tasks tab

The Tracing tasks tab contains a list of all tracing tasks created both manually and automatically via continuous tasks.

The Created column shows how a task was created – automatically (by continuous task) or manually.

Continuous tracing tab

Warning

To use Continuous task, update your LVE Manager and alt-PHP-X-Ray packages to versions lvemanager-6.2.9-1 and alt-php-xray-0.2-1 by running the following command:

yum update lvemanager alt-php-xray
+

The Continuous tracing tab contains a list of continuous tasks for which tracing tasks will be created automatically for a new day for a specific domain.

Managing tracing task

Creating a new tracing task

  1. Go to the X-Ray tab
  2. Click the Start tracing button to create a new task
  3. In the opened popup specify a website URL to trace
  4. Click the Run button
  5. Tracing will run in the default mode. In the default mode X-Ray traces the first 20 requests for a specified URL

  • URL should be a valid URL of the domain which exists on the current hosting server. The URL field supports wildcard matching. To learn more about wildcard matching, click How to use special characters.

  • Advanced settings allow you to set an IP address and tracing options: by time or by number of queries.

Advanced settings

  • Client’s IP: it is an IPv4 address of a machine to trace. For example, if you have a production website that processes requests from different IP addresses and you do not want to add these requests to the tracing task. So, you can set a specific IP address and X-Ray will analyze requests only from this specific IP address. +Record for
  • Time period: how much time X-Ray collect the requests (2 days max)
  • Requests: the amount of requests that X-Ray will collect

After creating, the task appears in the list of tracing tasks.

Viewing tracing tasks list

Tasks created Manually are simply tracing tasks.

Tracing status

A tracing task can have the following statuses:

  • Running – tracing is in progress
  • Stopped – tracing was stopped by administrator
  • On hold – the same URL already exists in the lists. Task processing will not start automatically. Administrator should start it manually.
  • Completed – period of time is finished or number of requests is reached.

Collected requests for tracing task

Warning!

Collected requests are available in the UI for two weeks.

Click to open a list of collected requests.

Tracing tasks

The slowest request is highlighted.

  • Total displays how many requests were collected according to tasks requirements.
  • Pending displays how many of collected requests are not visible in the table yet.
  • Throttled displays the number of requests during the execution of which the LVE limits were exceeded.
  • Slow displays the number of requests lasting more than one second.

There are filters for the request types and the indicator of a filter used now.

If slow requests were not detected during the tracing task, the following is displayed. Here, you can also view all requests.

X-Ray collects the following data for each request:

  • Top issues – the slowest items of a request
  • Software modules/plugins by execution time (only for WordPress plugins)
  • Database queries by execution time
  • External requests by execution time
  • Other system functions by execution time

Software modules/plugins

The Software modules/plugins section displays the following data:

  • Software type – a type a module/plugin. For now, X-Ray can analyze only WordPress software
  • Software module – a name of the WordPress plugin
  • Duration – plugin execution time
  • Duration (%) – plugin execution time as a percentage of the total duration of the request

Database queries

The Database queries section displays the following data:

  • Query – the executed SQL-query
  • File – the file and the line of the executed query and backtrace
  • Software module – a WordPress plugin name from which the request was completed. If the request does not belong to any of the WordPress plugin, the name of the function that executed the given request is displayed
  • Calls – the number of identical SQL queries
  • Duration – execution time as a percentage of the total duration of a request and the function processing time (in brackets)

External requests

The External requests section displays the following data:

  • URL – the URL of the executed request
  • File – the file and the line of the executed request and backtrace
  • Duration – execution time as a percentage of the total duration of a request and the function processing time (in brackets)

System functions

The System functions section displays the following data:

  • Function – the executed function
  • File – the file and the line of the executed request
  • Duration – execution time as a percentage of the total duration of a request and the function processing time (in brackets)

Stopping tracing task

Click to stop the tracing task.

The tracing task status will be changed to Stopped. Data will not be collected anymore but you can see already collected information or continue tracing later by clicking .

Deleting tracing task

Click to delete the tracing task.

Warning!

When you have deleted a tracing task, all collected data will be unavailable.

Managing continuous tasks

Creating a new continuous task

  1. Click the Create continuous tracing button

  1. Specify URL in the Domain field and email in the Email for reports field and click the Create button.

  1. You can see a new task in the Continuous tracing tab in the X-Ray UI.

  1. If you stop a continuous tracing task, a new task for the next 24 hours will not be created. The task for the current day will be finished at midnight and the report will be emailed.

  2. If you delete a continuous tracing task, the task for the current day will be finished at midnight and the report will be emailed.

Viewing continuous tasks list

You can find a list of continuous tracing tasks in the Continuous tracing tab.

You can find automatically created tasks in the Tracing tasks tab marked as Automatically in the Created column.

The statuses for automatically created tasks are the same as for tracing task.

To view detailed info about an automatically created task, click . You will get requests grouped by hour.

Click to a group to open a list of the requests.

The following data is collected for each request:

  • Software modules/plugins by execution time (only for WordPress plugins)
  • Database queries by execution time
  • External requests by execution time
  • Other system functions by execution time

Stopping automatic tracing task

Stopping automatic tracing task (a part of continuous tracing task) affects only the automatic tracing task for the current day. A new task for the next day will be created at the end of the day.

To stop the continuous tracing task completely, see Creating a new continuous task, paragraph 4.

Deleting automatic tracing task

Deleting automatic tracing task (a part of continuous tracing task) affects only the automatic tracing task for the current day. A new task for the next day will be created at the end of the day.

To delete the continuous tracing task completely, see Creating a new continuous task, paragraph 5.

Continuous task daily report

  1. Users get daily reports on their emails. An example of a report is shown below:

  2. Click the link in the email to show the detailed report:

  3. You can view requests grouped by hour:

  4. You can also view the detailed information about request:

X-Ray Autotracing

X-Ray Autotracing automatically creates tracing tasks for slow URLs that were found during a day by the PHP Slow Site Analyzer (SSA).

Warning

To use X-Ray Autotracing, update your alt-php-ssa and alt-php-xray packages to versions alt-php-ssa-0.2-1 and alt-php-xray-0.4-1 or higher by running the following command:

# yum update alt-php-ssa alt-php-xray --enablerepo=cloudlinux-updates-testing
+

How to enable X-Ray Autotracing

To enable X-Ray Autotracing, run the following commands via SSH:

# /usr/sbin/cloudlinux-ssa-manager enable-ssa
+# /usr/sbin/cloudlinux-autotracing enable --all
+

Check CLI documentation for a description of the /usr/sbin/cloudlinux-autotracing CLI utility.

Requirements

  • CloudLinux OS Shared Pro or CloudLinux OS Solo or CloudLinux OS Admin
  • alt-php-ssa > 0.2-1 version
  • alt-php-xray > 0.4-1 version
  • Enabled PHP SSA on the server

Autotracing Interface

A new tab for Autotracing tasks was added to the X-Ray UI:

Autotracing FAQ

Q: Why are the slow URLs in the Slow Site Analyzer report different from those on which the autotracing tasks were created?

A: Because the autotracing decision module uses rules and thresholds different from Slow Site Analyzer, which are configured by the CloudLinux team.

Q: How often autotracing tasks will be generated?

A: Once a day at the same time as a Slow Site Analyzer report.

X-Ray Smart Advice

Smart advice is a new feature of X-Ray that is designed to find and propose solutions to fix performance issues and speed up the performance of a sites.

Note

Smart Advice will work only for CloudLinux OS Shared Pro servers with cPanel Control Panel for now.

At the moment, Smart Advise is focused only on WordPress sites.

Warning

To use X-Ray Smart Advice, update your alt-php-ssa and alt-php-xray packages to versions alt-php-ssa-0.2-3 and alt-php-xray-0.5-1 or higher by running the following command:

# yum update alt-php-ssa alt-php-xray lve-utils lvemanager --enablerepo=cloudlinux-updates-testing
+

How to enable X-Ray Smart Advice

Attention!

If you'd like to try Smart Advice and AccelerateWP you should participate in the Beta tester program. To become a beta tester, please send your request at our Beta program page with the signup form here. Once you submit the request, we will send you a confirmation email with program details and terms of use.

Requirements

  • CloudLinux OS Shared Pro or CloudLinux OS Solo
  • alt-php-xray > 0.5-1 version
  • lve-utils > 6.3.2-1 version
  • lvemanager > 7.6.1-1 version
  • cloudlinux-site-optimization-module > 0.1-1 version

We Recommend:

How X-Ray Smart Advice works

The main process of looking for advice is X-Ray tracing tasks. The best way for doing this is to enable X-Ray Autotracing. +This will allow you to most effectively find Smart Advice for sites that have performance issues without your manual participation. +You can find information on how to enable X-Ray Autotracing here. +On the other hand, you can create tracing tasks manually or use continuous X-Ray but we suggest you use X-Ray Autotracing for this purpose.

Note

Advice will not be generated by old tracing tasks.

While the tracing task is running, X-Ray will look for places where advice can be applied. New advice will be displayed on the Smart Advice tab.

After the X-Ray finds advice you will see new advice in the Review status on the Smart Advice tab. +Then you may use the Details button to see which URLs were found by X-Ray that will be speed up by that advice and use Quick Action to enable advice for a site.

Example of details:

After you apply the advice by using Quick Action, the status will change to the Applied.

If a long time has passed since the last time the advice was updated for a site, it will be moved to the Outdated status.

Note

New X-Ray task may update Outdated advice if X-Ray finds performance issues that may be fixed by that advice. Then the status of advice becomes Review.

If the process of applying advice fails you will see an error log with a detailed error, you may try to fix it manually and try again or contact our support team for help.

Example when an error appears during advice applying:

Smart Advice FAQ

Q: Why I can't see new advice on the Smart Advice tab?

A: For the generating of advice, it is necessary to run X-Ray tracing tasks, the best way to do it without manual interaction is to use X-Ray Autoracing. You can find more information on how to enable X-Ray Autotracing here.

Useful Smart Advice CLI commands

Warning!

This is an experimental feature. The backwards compatibility is not guaranteed.

To obtain the full list of advice generated for your server use the following CLI command:

cl-smart-advice list
+

For each advice in the list the CLI command returns the following information:

  • metadata, which includes information about username, domain and website for which the advice is issued
  • advice information: +
    • its identifier id
    • its type
    • its status -- review or applied
    • if advice is Premium is_premium
    • other internal informational fields

The example output is given below:

{
+  "data": [
+    {
+      "created_at": "2023-04-11T07:33:48.191870+00:00",
+      "updated_at": "2023-04-11T07:33:48.191870+00:00",
+      "metadata": {
+        "username": "user16",
+        "domain": "user16.com",
+        "website": "/wordpress"
+      },
+      "advice": {
+        "id": 23484,
+        "type": "OBJECT_CACHE",
+        "status": "review",
+        "description": "Turn on Object Caching",
+        "is_premium": true,
+        "module_name": "object_cache",
+        "subscription": {
+          "status": "no",
+          "upgrade_url": null
+        },
+        "total_stages": 0,
+        "completed_stages": 0,
+        "detailed_description": "To improve site performance, enable the Object Caching We recommend applying the advice if you see it frequen
+tly for the most valuable URLs of your site."
+      }
+    },
+    {
+      "created_at": "2023-04-11T07:33:48.297784+00:00",
+      "updated_at": "2023-04-11T08:51:42.362117+00:00",
+      "metadata": {
+        "username": "user16",
+        "domain": "user16.com",
+        "website": "/wordpress"
+      },
+      "advice": {
+        "id": 23485,
+        "type": "SITE_OPTIMIZATION",
+        "status": "applied",
+        "description": "Turn on AccelerateWP feature",
+        "is_premium": false,
+        "module_name": "accelerate_wp",
+        "total_stages": 0,
+        "completed_stages": 0,
+        "detailed_description": "To improve site performance, enable the AccelerateWP optimization feature. We recommend applying the advice if you see it frequently for the most valuable URLs of your site."
+      }
+    }
+  ],
+  "result": "success",
+  "timestamp": 1681203110
+}
+

End-user X-Ray plugin

Warning

To use the end-user X-Ray plugin, update your LVE Manager and X-Ray packages to the lvemanager-6.3.9-1 (or later) and alt-php-xray-0.3-1 (or later) by running the following command:

# yum update lvemanager alt-php-xray
+

How to enable/disable the end-user X-Ray plugin

You can hide or show the end-user X-Ray plugin icon by ticking or unticking the proper checkbox in the LVE Manager.

Go to LVE Manager → Options Tab → User interface settings.

Note

The X-Ray plugin icon in the end-user interface is hidden when the checkbox is ticked.

How to manage the end-user X-Ray plugin

The web interface of the end-user X-Ray plugin is almost the same as the X-Ray administrator interface.

But there are some differences and they are described further.

  • End-users can create tasks only for their domains from the drop-down list: +
  • To specify URL or wildcard, end-users should use the input field next to the domain: +

You can read about all other basic interface elements and managing tracing tasks in the Managing tracing task section.

Note

Tracing tasks created by an end-user will also be displayed in the administrator interface and administrators can manage the end-user's tasks the same way as they manage their own. At the same time, tasks created by the administrator or other end-users will not be displayed in the UI of the current user.

End-user X-Ray plugin limitations

  • The end-user X-Ray plugin does not support creating continuous tasks.

  • The end-user has a limit of tracing tasks running at a time. Before starting the next task, the end-user should wait for the completion of the previous ones or forcefully stop the running ones. Otherwise, the user will get the next error:

    Note

    The current limit is one tracing task per user.

  • The administrator and the end-user can’t run the tracing task for the same Domain/URL at the same time. Once, the administrator started a specific tracing task, the end-user will not be able to duplicate it. And the same is true for the administrators – they will just see the running task for the specific domain and see the notification that they're trying to create a tracing task with a duplicated URL.

  • If continuous tracing is enabled for the domain, the end-user will not be able to create a new task for this domain because the same rule works - it will be a duplicate of the existing tracing tasks. The next warning will appear:

    To solve this, the existing running tasks for the same Domain/URL should be stopped or completed. You can find more details about this in the FAQ.

  • If a user's tracing task was created for a domain which is using the FPM handler there's an additional limitation. To avoid frequent reloads of the particular FPM service, Start tracing , Stop tracing or Continue tracing action would be blocked in case if the latest reload of a corresponding FPM service was done less than 1 minute ago.
    +If a user gets such an error message - it means that 1 reload in 1 minute for a particular FPM service has been already done. Just try performing the same operation once again in a while.

X-Ray automated throttling detection

Note

CPU throttling detection is available since alt-php-xray-0.3-2 and lvemanager-xray-0.5-2.

IO/IOPS throttling detection is available since alt-php-xray-0.3-7 and lvemanager-xray-0.7-1.

  • kmod-lve-2.0-23 (and later) for CloudLinux OS Shared 8 or CloudLinux OS Shared 7 hybrid
  • kernel-1.5-58 (and later) for CloudLinux OS Shared 7 or CloudLinux OS Shared 6 hybrid

are also required to utilize the feature of IO/IOPS throttling detection.

Warning

X-Ray automated throttling detection feature is not supported for CloudLinux OS Shared 6

The X-Ray automated throttling detection system checks if the account exceeds LVE limits by CPU or by IO/IOPS during the HTTP request execution. Requests with exceeded LVE limits are indicated in both X-Ray Administrator and X-Ray User plugins.

If CPU limiting was detected for a particular request, it is indicated in the X-Ray UI that the system itself has slowed down the request processing due to CPU throttling and this is apparently not a performance issue in the PHP code.

If limiting by IO and IOPS in total was detected for a particular request, it is indicated in the X-Ray UI in the same manner, except for the cause of slowing down the request -- IO throttling.

The case of both limiting for the request is also possible.

Requests with exceeded LVE limits are also marked in the request detailed view.

Requests with exceeded LVE limits are marked in the PDF report as well.

X-Ray client

X-Ray client is a PHP extension named xray.so. It analyzes the processing time of the entire request and its parts and then sends the data to the X-Ray agent.

List of supported PHP versions

The list of currently supported PHP versions:

ALT PHP: EA PHP: Plesk PHP DirectAdmin PHP Other panels PHP
  • alt-php54
  • alt-php55
  • alt-php56
  • alt-php70
  • alt-php71
  • alt-php72
  • alt-php73
  • alt-php74
  • alt-php80
  • alt-php81
  • ea-php54
  • ea-php55
  • ea-php56
  • ea-php70
  • ea-php71
  • ea-php72
  • ea-php73
  • ea-php74
  • php54
  • php55
  • php56
  • php70
  • php71
  • php72
  • php73
  • php74
  • php54
  • php55
  • php56
  • php70
  • php71
  • php72
  • php73
  • php74
  • 54
  • 55
  • 56
  • 70
  • 71
  • 72
  • 73
  • 74

Warning!

php-zts and custom PHPs, rolled in selector, are not supported

Functions that X-Ray client can hook

Database queries

  • Functions from the MySQL extension: +
    • mysql_query
    • mysql_db_query
    • mysql_unbuffered_query
  • Functions from the MySQLi extension: +
    • mysqli_query
    • mysqli::query
    • mysqli_multi_query
    • mysqli::multi_query
    • mysqli_real_query
    • mysqli::real_query
  • Functions from the PDO extension: +
    • PDO::exec
    • PDO::query
    • PDOStatement::execute

External requests

System PHP functions

It may be any PHP system function which can be related to a PHP engine or other PHP extension, for example fopen() or json_encode(). A list of these functions can be found here.

Configuration Options

xray.enabled

Syntax: xray.enabled=On/Off

Default: On

Changeable: PHP_INI_SYSTEM

Description: Enable or disable X-Ray extension from php.ini


xray.database_queries

Syntax: xray.database_queries=[number]

Default: 20

Changeable: PHP_INI_SYSTEM

Description: The number of the slowest SQL queries which will be sent to the X-Ray agent. The min value is 0 and the max value is 100. If the variable value is more, the default value will be used.


xray.external_requests

Syntax: xray.external_requests=[number]

Default: 20

Changeable: PHP_INI_SYSTEM

Description: The number of the slowest external requests (the curl_exec function) which will be sent to the X-Ray agent. The min value is 0 and the max value is 100. If the variable value is more, the default value will be used.


xray.system_functions

Syntax: xray.system_functions=[number]

Default: 20

Changeable: PHP_INI_SYSTEM

Description: The number of the slowest system functions which will be sent to the X-Ray agent. +The min value is 0 and the max value is 100. If the variable value is more, the default value will be used.


xray.backtrace_depth

Syntax: xray.backtrace_depth=[number]

Default: 10

Changeable: PHP_INI_SYSTEM

Description: The backtrace depth to the main() function which will be sent to the X-Ray agent. The min value is 0 and the max value is 20. If the variable value is more, the default value will be used.


xray.processor

Syntax: xray.processor=[processor_name]

Default: xray

Changeable: PHP_INI_SYSTEM

Description: Tells the X-Ray client which processor to use. The new processors may be added in the future. The default processor is xray which means to send data to the X-Ray agent.


xray.tasks

Syntax: xray.tasks=host:uri:ip:id

Default: no value

Changeable: PHP_INI_SYSTEM

Description: The current tracing tasks for the given PHP request. This directive is added automatically by the X-Ray manager when creating a task. It is not allowed to edit manually, as X-Ray may stop working.


xray.to_file

Syntax: xray.to_file=On/Off

Default: Off

Changeable: PHP_INI_SYSTEM

Description: Only for debug purposes. Writes to a file data which is sent to the processor.


xray.debug

Syntax: xray.debug=On/Off

Default: Off

Changeable: PHP_INI_SYSTEM

Description: Only for debug purposes. Enables debug output during request processing. In the On mode can slow down the domain.


xray.debug_file

Syntax: xray.debug_file=[path_to_file]

Default: /tmp/xray-debug.log

Changeable: PHP_INI_SYSTEM

Description: Only for debug purposes. Specifies a file for logging debug information.

X-Ray agent

This is a service that receives data from the X-Ray client and sends it to the remote storage.

Managing X-Ray service

The X-Ray agent is managed by the service utility.

  • To start the X-Ray agent, run the following command:

    # service xray-agent start
    +
  • To stop the X-Ray agent, run the following command:

    # service xray-agent stop
    +
  • To restart the X-Ray agent, run the following command:

    # service xray-agent restart
    +

FAQ

Does X-Ray affect website performance?

X-Ray affects website performance. Our tests show 5-10 % overhead from a website loading time with X-Ray tracing enabled. +X-Ray allows you to find website performance issues and should not be enabled permanently. If your website is very slow, you can enable X-Ray to find the cause and then disable it.

What should I do if I see the warning "Task is duplicated by URL"?

This warning means that you already have a task to trace this URL in the list of your tracing tasks. If you see this warning, a new task can be created only with the On hold status and you will be able to run it only when the previous task with the same URL will be completed.

Note that the URL field supports wildcard matching and you can have a case when X-Ray is tracing the URL=domain.com/* and you are trying to create a new task with URL=domain.com/xray.php. In this case, you will see that warning because the * URLs array includes xray.php.

I started a tracing task and made requests to URL but did not see any results in the UI. What should I do?

  1. X-Ray may not send data if a site uses a caching plugin, as the caching plugin is outputting HTML, thus there are no PHP scripts to examine. We encountered such issues with sites that use LSCache and WP Super Cache plugins. Check that your site does not use caching plugins. If so, disable it while tracing a site to get information from X-Ray. Moreover, it can also be because of caching on server side, for example NGINX Cache. Or when using CDN because requests are processed from another host. In such cases, during tracing, caching must also be disabled.

  2. If you set a client’s IP when creating the tracing task, check that your requests come to the server with this IP via phpinfo (since there may be NAT between your local machine and the server).

  3. Check that xray extension is enabled for the domain. To do so, go to the phpinfo() page and make a request. In the phpinfo output try to find the following section:

If you cannot see that section, try to restart PHP processes for that user (the simplest way is to restart Apache) and check that you can see the xray extension.

  1. If you can see the xray extension in the phpinfo, check that X-Ray agent service is running with the service xray-agent status command. If it is not running, start it with the service xray-agent start command.

  2. If, after checking the previous items, the issue persists, contact our support team.

What to do if X-Ray is not found in the phpinfo() page?

If you managed to create a tracing task, this means that the xray.ini file was created in a system. Therefore, there may be two reasons why it did not appear in the phpinfo page of the domain.

  1. PHP process wasn't reloaded after adding the xray.ini. To solve this, you should restart the Apache or fpm service for the domain on which the tracing was started. At the moment, this is done automatically by the X-Ray manager after creating the task.

  2. Your domain uses a PHP version different from the one which was detected by the X-Ray manager. To solve this, check the scan dir for additional ini files for your domain.

    Then check the ini_location that was passed to the X-Ray manager by running the following command:

    # cat /usr/share/alt-php-xray/manager.log | grep ini_location
    +

    Find your tracing task in the output and check that the xray.ini exists in this directory, also check that the ini path is the same in the phpinfo page output and in the ini_location directive for your tracing task. If they are the same, you should reload your PHP. If they are different that means that the X-Ray manager could not correctly determine the PHP version your domain uses. In this case, contact our support team at https://cloudlinux.zendesk.com/hc/requests/new.

I use LiteSpeed, X-Ray is enabled and it is shown in the phpinfo() page but does not collect data when sending requests to a site. What to do?

Check for the CacheLookup on option in the htaccess file for your domain. +If the option is there, LiteSpeed processes requests bypassing the PHP X-Ray extension. +In this case, to get tracing information, you should remove the CacheLookup on option.

What is the proper format for the URL?

All of the examples below are correct:

  • http://domain.com
  • http://domain.com/
  • https://domain.com
  • https://domain.com/

You can use any of them with a prefix www. and it is also correct.

What packages are required for X-Ray?

Required packages:

  • lvemanager >= 6.2.10-1
  • alt-php-xray >= 0.2-1

Centralized Monitoring

Description

Centralized Monitoring is a tool that allows hosting administrators to monitor load for all their servers and users.

Centralized Monitoring allows you to:

  • View system metrics for all clients’ end servers
  • View the LVE statistics per user for all clients’ end servers

Installation

Note

Make sure that cm.cloudlinux.com is available on your end server.

  1. Make sure you have a CloudLinux OS Shared Pro subscription.
  2. Make sure you have installed the lve-utils package version 4.2.21-2 or later. You can install or update it with the following commands: +
    • installation
    yum install lve-utils
    +
    • update
    yum update lve-utils
    +
  3. Log in to the https://cm.cloudlinux.com/ using CLN credentials (if you are already logged in via CLN, authorization via CM is not necessary, it uses SSO).
  4. Activate statistics collection on all your servers via the Centralized Monitoring UI (https://cm.cloudlinux.com) or via the CLN UI https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring. +
  5. Within 5 hours from the activation, statistics collection and sending to the central server will be set up automatically: all required packages and components will be installed. For new, just registered servers, statistics collection and sending will be set up automatically within 5 hours.
  6. Make sure you have activated statistics collection (see paragraph 4) otherwise you will not be able to set up your servers. For instant set up of a registered server after statistics collection was enabled, run the following commands for all servers:
    # rhn_check	
    +# /usr/share/cloudlinux/cl_plus/manage_clplus enable
    +
    Note: If the rhn_check command is not found, run the following command:
    # yum install/update rhn-check rhn-setup
    +
  7. After 5 hours (or after the manual setup), check that statistics for all registered servers is collected via https://cm.cloudlinux.com/#/servers. And check that user statistics on the servers is collected via https://cm.cloudlinux.com/#/users.

    Note

    User statistics will be available only for users that were loaded starting from connecting the server to the Centralized Monitoring.

Centralized Monitoring: mode without session expired

Users can monitor server’s or user’s load for a long time using the mode without session expired.

To turn on the mode without session expired, follow the next steps:

  1. Log in to the cln.cloudlinux.com via your account

  2. Open the cm.cloudlinux.com in a new browser tab/window (please, use the same browser as in step 1)

  3. Use the toggle to turn on/off 10 min auto logout

Your session in the cln.cloudlinux.com will expire in 10 min. But your session in the cm.cloudlinux.com will not expire while your browser tab remains open.

Centralized Monitoring user interface

You can access Centralized Monitoring in your CLN account. +Click C-Monitoring in the left menu.

Servers

This page contains the list of all clients’ end servers. The server appears in the list after finishing Installation. By default, there is a descending sort by CPU usage.

The following values are available for each server:

  • Load Avg 15m – average system load for the last 15 min
  • CPU Usage – CPU usage for the last 15 min (the number of cores can be found in the hint)
  • Memory Usage – free available memory, the second value is the total memory for the last 15 min
  • IO read/write – disk read bytes/disk written bytes for the last 15 min

Note

The values are calculated using a 15 min time period but the metric state is updated automatically every minute by default or you can choose from one of the predefined periods.

  • Idle state – there were no statistics for the server for the last minute.
  • N/A state – there were no statistics for the server for the last 30 days. This can happen if a new server was added but statistics sending was not configured.

There is no pagination on the All servers page and all columns can be sorted by absolute value. +Use the search tool to operate with the data.

Servers details

To get the detailed statistics for the server via charts, click a desired server line in the table. +All charts are auto-refreshed and there is an ability to select the period for metrics data to be updated for the chart.

Note

We store the metrics data for one month only.

Charts for server metrics

Disk space usage

Open file descriptor/Context switches

System load 1m , 5m, 15m

CPU usage (total, system, user, iowait, steal)

Network traffic usage

Disk space usage

Memory usage (total, used, available)

Time spent doing I/Os

Disk IOps Completed

Disk read/write data

Disk read/write time

Apache connections (number)/Number of requests per minute/Max connections

Note

In the current version, we collect these metrics for the cPanel end servers only. We are planning to add other panels support soon.

Note

In the current version, we collect these metrics only for Apache (NOT for LiteSpeed, Nginx, etc.). The charts will be empty for LiteSpeed, Nginx, etc..

MySQL queries

MySQL queries collector gets number of queries executed on the server per minute. It takes data from the MySQL server variable "Questions". You may manually check variable value by executing query SHOW GLOBAL STATUS LIKE 'Questions';. For more information about MySQL server variables - please, see MySQL documentation.

The most loaded server users for the last minute

We calculate the user’s load by LVE statistics that we collect on the end server. +The idle state for the user means that the LVE statistics were not collected for the last minute for some reason.

In each cell there are current usage/limit values for the basic LVE limits:

  • CPU Usage
  • Entry Processes
  • Physical Memory Usage
  • IOPS
  • IO Usage
  • Number of Processes
  • MySQL CPU
  • MySQL IO

In the hint, there is a number of faults for each limit. The values in the columns are underlined (it is red if load-to-limit ratio >=90% and it is yellow if load-to-limit ratio >= 50%). For the current implementation, the only sort by the load-to-limit ratio is available. +By default, there is a descending sort by the CPU usage column.

When sorting by a column, the lines with the load-to-limit ratio >=90% for this column will have the red background color, and lines with the load-to-limit ratio >=50% for this column will have the yellow background color.

Note

The users with unlimited resources (∞) will be at the bottom of the table.

Users

This page contains all users for the all server of the client and their LVE statistics for the last minute. You can select the number of users on this page and search by user’s data.

The description of this page is the same as The most loaded server users for the last minute of the top 5 loaded users.

User’s metrics data can be sorted by the load-to-limit ratio and by the absolute value.

The absolute value is used to analyse the load produced by unlimited users.

The value of the load-to-limit ratio is convenient to use in the analysis of how many resources the users consume and whether they need to change the limits.

The values like this means that the resource is unlimited and 500.2 MB is the current usage of it.

Metrics data of Idle users is not used in the sorting, so such users always will be at the end of the list. The sorting can be done for only one metric.

Charts for Users metrics

Note

We store the metrics data for one month only.

On the user details page, the admin can find the charts for all LVE limits.

Alert Manager

Alert Manager allows you to create a server or user alert for selected metrics and email the triggered events.

Alert Manager page

The Alert Manager page contains a table with the following:

  • Alert name - a unique alert name
  • Tracking metric - a name of a server/user metric which will trigger the alert notification
  • # of servers - number of servers on which the metric will be tracked +
    • click to view a list of servers host names
  • # of users - number of users for which the metric will be tracked +
    • click to view a list of users names
  • Value - a condition for the alert rule which will be applied to the tracking metrics
  • Email - email to send the triggered events notifications
  • Type - a type of the alert rule
  • # of triggered events - the number of events from the time, when alert rule was created +
    • the event is still firing
  • Time of the last trigger - the time of last triggered event, it is the time in your browser time zone
  • Actions - click to edit and to delete the alert rule

Color Codes

  • Red color means that the event with the condition "more than" is still firing.
  • Green color means that the event with the condition "less than" is still firing.

Creating an alert

To create a new alert, click the Create alert button.

Next, fill out the opened popup.

  • Name of alert - a unique alert name
  • Alert type - an admin can create a user or a server alert. What is the difference between them?
  • Select user/server - admin will see such dropdown depending on a case of alert creating
  • Notify me - the condition of the alert trigger
  • Duration - how much time the condition should be actual to trigger the notification
  • Notify me on email - the email to send notifications

Editing an alert

An admin can edit any field in the Alert except the Alert type.

Difference between the server alert and the user alert

The server alert is used to track the state of the whole server, it does not track user state on the server. +The server alert tracks the next list of metrics:

  1. Context switches
  2. System load (1m)
  3. System load (5m)
  4. System load (15m)
  5. CPU Basic (total)
  6. CPU Basic (system)
  7. CPU Basic (user)
  8. CPU Basic (iowait)
  9. CPU Basic (steal)
  10. Network Traffic Basic (eht0_receive)
  11. Network Traffic Basic (eht0_transmit)
  12. Network Traffic Basic (ehtN_receive)
  13. Network Traffic Basic (ehtN_transmit)
  14. Disk Space Used Basic (mountpoint: <0>)
  15. Disk Space Used Basic (mountpoint: <1>)
  16. Disk Space Used Basic (mountpoint: <N>)
  17. Memory Basic (available)
  18. Memory Basic (used)
  19. Time spent Doing I/Os
  20. Disk IOps Writes Completed
  21. Disk IOps Reads Completed
  22. Disk Read Data
  23. Disk Write Data
  24. Disk Read Time
  25. Disk Write Time
  26. Apache connections
  27. Number of requests per minute
  28. MySQL queries
  29. Hardware Temperature (chip<0>)
  30. Hardware Temperature (sensor<0>)
  31. Hardware Temperature (chip<N>)
  32. Hardware Temperature (sensor<N>)
  33. Open File Description

During creating a server alert an admin should select the type of metrics as the first step. The list of servers will be collected according to the availability of these metrics on the server.

For example, for now, we do not collect Apache metrics for non-cPanel servers, so you will get only cPanel servers as a list of servers for these metrics.

We're planning to implement support for other panels/web servers in the next releases.

Small limitation

We collect the server list according to having their statistics in our database (this behavior will be changed in the next releases).

For example, if server state is N/A or idle more than 24 hours, it will not be visible in the list for the alert.

The user alert tracks the next list of LVE metrics:

  1. CPU Usage (current usage)
  2. CPU Usage (faults)
  3. Entry Processes (current usage)
  4. Entry Processes (faults)
  5. Physical Memory Usage (current usage)
  6. Physical Memory Usage (faults)
  7. IOPS (current usage)
  8. IOPS (faults)
  9. IO Usage (current usage)
  10. IO Usage (faults)
  11. Number of Processes (current usage)
  12. Number of Processes (faults)
  13. MySQL CPU (current usage)
  14. MySQL CPU (faults)
  15. MySQL IO (current usage)

Small limitation

We collect the server list according to having their statistics in our database (this behavior will be changed in the next releases).

For example, if the user state is N/A or idle more than 24 hours, it will not be visible in the list for the alert.

Cases of alert creating

  • Creating a server alert for the selected metrics for one server
  • Creating a server alert for the selected metrics for all servers (the default value)

In this two cases, you will not see the dropdown for selecting users because the metrics will track the server state.

  • Creating a user alert for one user, so admin can select a server and a user.
  • Creating a user alert for all users on several servers/all servers (in this case admin can't select users - all users will be selected automatically)

What is the Firing state of the alert?

This is the state of an alert that has been active for longer than the configured threshold duration.

Alert notifications

  • Alert name - the link to the alert page
  • Firing target - the link to the server details page

FAQ

How can I disable collecting and sending statistics on a client’s server?

Run this command:

/usr/share/cloudlinux/cl_plus/manage_clplus disable
+

Where can I view all my servers load?

You can find all your servers load in your CM personal account here: https://cm.cloudlinux.com/#/servers or in your CLN personal account here: https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring.

Where can I view all my users load?

You can find all your users load in your CM personal account here: https://cm.cloudlinux.com/#/users or in your CLN personal account here: https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring

Where can I view a server load details for a period?

Click the desired server in the server list in the UI.

Where can I view a user load details for the period?

Click the desired user in the user list in the UI.

How long are statistics stored in the central database?

30 days.

How can I change the charts period on the details page?

Choose the desired period in the upper right corner or select it directly on the chart.

I don’t understand how to read the user load chart.

The user load chart contains three lines:

  • limit
  • current load
  • count of faults

Limit and current load are drawing regarding the left vertical axis, the count of faults is drawing regarding the right vertical axis. You can focus on a particular line by clicking a required legend.

Troubleshooting

I can't see a server statistics

  1. Check that your server is registered by key or by IP license of the CloudLinux+ account, i.e., it should be seen in the list of servers in your CLN account here: https://cln.cloudlinux.com/console/auth/login
  2. Check that the following required packages are installed on the end server:
  • cl-end-server-tools >= 1.0.7-1
  • cl-node-exporter >= 1.1.0-2
  • rhn-client-tools
    • CloudLinux OS Shared 6 >= 1.1.15-3.el6.cloudlinux.26
    • CloudLinux OS Shared 7 >= 2.0.2-31.el7.clouldinux
    • CloudLinux OS Shared 8 >= 2.8.16-14.module_el8.1.0+6074+9dc6073e.cloudlinux.2
  • lve-stats >= 3.0.7-2
  • lve-utils >= 4.2.21-2
  • alt-python27-cllib >= 2.1.13-1
  • lvemanager >= 6.2.10-1
  1. Check that service collecting and sending statistics is running:
service cl_plus_sender status
+
  1. Check that log of the cl_plus_sender service doesn't contain errors:
/var/log/clplus_sender.log
+

Where can I view the events log on the client's server?

You can view the events log on the client's server here:

/var/log/clplus_sender.log
+

Can I get monitoring metrics from LiteSpeed, Nginx or other (Not Apache) web server?

Starting from end-server-tools-1.0.7, it supports collecting and sending statistics from the Apache and LiteSpeed web servers.

LiteSpeed is supported on cPanel and DirectAdmin control panels.

Each minute the statistics collection daemon checks which web server is started. If LiteSpeed is started, the daemon will collect data from it, otherwise, it checks if Apache is started.

When the daemon detects that the server is changed, it writes the following line into the statistics collection daemon log /var/log/clplus_sender.log:

2020-10-09 17:25:31,462: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Using Apache
+

or

2020-10-09 18:13:03,897: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Using Litespeed
+

If the daemon can't detect either Apache or LiteSpeed, it writes to the log the following:

2020-10-09 17:33:38,399: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Apache or Litespeed stopped or absent, collector will not work
+

The statistics collection daemon reacts to the server changing automatically, no need to restart it.

Warning

Please note that the daemon checks the server type once in a minute, so the data sent on a minute of switching can be unreliable.

Logging data sent to pushgateway to the statistics collection daemon log

Starting from cl-end-server-tools v.1.0.6-1, the statistics collection daemon allows to log data sent to pushgateway to its log /var/log/clplus_sender.log.

To start logging, run the following command:

touch /var/lve/cmt_debug_logging
+

To stop logging, run the following command:

rm -f /var/lve/cmt_debug_logging
+

You don't need to restart the daemon after starting/stopping logging. The presence of a control file is evaluated "on the fly".

Warning

Use this logging with caution because when it is enabled, the size of the daemon log /var/log/clplus_sender.log will increase each minute minimum on 3-4 KB. The actual increase size depends on the number of active users' processes on a server.

Known issues

  • MySQL Governor statistics in some cases is collected incorrectly
  • Sorting by MySQL Governor statistics ignores idle users
  • Sorting from the search result set does not work
  • Sorting by ratio for unlimited users works incorrectly

AccelerateWP

Get started

AccelerateWP carries a suite of optimization features that can be enabled and automatically configured for the end-user's site.

There are AccelerateWP, AccelerateWP Premium and AccelerateWP CDN features suites.

AccelerateWP suite is always enabled when AccelerateWP is turned on. Choose whether you want to offer AccelerateWP Premium +or CDN (Content Delivery Network) for your users (by opting in) and click "Turn on" to start exploring AccelerateWP.

Once the AccelerateWP suite is enabled by administrator, +end-users will see an AccelerateWP tab in their control panel interface and be able to activate the optimization feature.

When AccelerateWP CDN suite enabled by administrator, end-users will get 1 GB of CDN traffic and be able to activate +feature to use until limit is reached. Once 1GB limit is reached - end-user will be suggested to extend CDN limit by +purchasing CDN plan using WHMCS or 3'd party billing

When AccelerateWP Premium suite enabled by administrator, +end-users will see the Object Caching, Image Optimization and Critical CSS features in their interface, +but cannot activate the feature unless they purchase the feature using WHMCS or 3'd party billing.

AccelerateWP suite

This is a basic suite which includes AccelerateWP base feature: +a WordPress optimization plugin that provides full page caching, GZIP compression and some other useful optimizations.

AccelerateWP suite limitations

  • the website must be served with Apache web server;
  • the website must use PHP version 7.2 or higher.
  • the WordPress version must be 5.6 and higher.
  • the other WordPress Caching plugins must not be installed.
  • the WordPress should not run in Multisite mode.

AccelerateWP Premium suite

This is a premium suite which includes Object Caching feature.

The Object Caching mechanism stores database query results in additional storage for quick access. +This mechanism is really helpful in case if website needs to process multiple pages per second as +requests come in and may be helpful in case when full page caching cannot be used, e.g. on personalized pages.

Image Optimization feature

Critical CSS feature

Premium suite limitations

  • the website must be served with Apache web server;
  • the website must use one of the following PHP handlers: +
  • the website must use ea-PHP version 7.4 or 8.0.
  • the WordPress version must be 3.7 and higher.
  • the other WordPress Caching plugins must not be installed.
  • the Snuffleupagus must be turned off.
  • the WordPress should not run in Multisite mode.

AccelerateWP Premium CDN suite

This suite includes CDN feature

CDN (Content Delivery Network) is the feature which speeds up resource loading for WordPress site customers. +CDN suite limitations are the same as for AccelerateWP feature.

Limitations

There are the following requirements to use AccelerateWP:

  • the server must have CloudLinux Shared PRO license;
  • the server must be powered with cPanel or Plesk.

Administrator interface

Overview

In the CloudLinux Manager → AccelerateWP tab an administrator has the opportunity to provide end-users with a suite of features, which on its turn could be activated by end-users.

Once the feature suite is enabled by administrator, end-users will see an AccelerateWP tab in their control panel interface and be able to activate the optimization feature.

Suites usage statistics

When AccelerateWP is enabled, the AccelerateWP usage statistics is shown.

It includes:

  • Active Users block with total number of users and number of users who has activated the optimization feature/total users
  • Wordpress sites on server block with total number of WordPress sites and WordPress sites optimized by the feature
  • statistics table

Each row in the statistics table represents a particular user.

The first column #of Wordpress sites shows total number of user's WordPress sites.

The second column AccelerateWP shows number of user's WordPress sites, optimized by the feature.

To enable premium features, click on the "Activate premium features" link and select the options you want. To integrate functions with billing, you must specify the base URL for the purchase of the function by end users.

In case if both AccelerateWP and AccelerateWP Premium feature suites are enabled, +the statistics is extended with AccelerateWP Premium metrics.

Please notice the AccelerateWP Premium rows in the Active Users and the Wordpress sites on server +blocks, and also the AccelerateWP Premium column in statistics table.

Note

Newly created users will be accounted for 10 min after adding. +If you want to get updated statistics immediately, use the "Rescan users websites" button.

Filters

You may use the following filters to browse AccelerateWP statistics slices.

  • Users with WordPress sites only filter will show statistics for users which already have WordPress sites; users without WordPress installations will be hidden
  • Users with AccelerateWP only filter will show statistics for users who utilizes the AccelerateWP optimization feature; users who did not activated AccelerateWP feature will be hidden
  • Users with AccelerateWP Premium only filter will show statistics for users who utilizes AccelerateWP Premium (Object Caching) feature; users who did not activated AccelerateWP Premium feature will be hidden
  • Users with CDN Free only filter will show statistics for users who utilizes AccelerateWP CDN feature
  • Users with CDN Pro only filter will show statistics for users who utilize AccelerateWP CDN Pro feature

Activate free AccelerateWP for all WordPress sites on the server

Use the cloudlinux-awp-admin enable-feature CLI command to +ensure the best performance for every end-user. CLI command +scans a server for all WordPress sites and activates the AccelerateWP +feature suite. It can take up to 2 minutes for a single site. CLI command skips activation for WordPress sites with +page caching or feature incompatibilities.

Note

Please make sure your AccelerateWP version is >= 1.2-2 before proceed.

Scan the server in background mode and activate AccelerateWP +on those WordPress sites where it is possible:

cloudlinux-awp-admin enable-feature --all
+

The output will state the number of users for the scan and the +progress state of the process.

Check activation status:

cloudlinux-awp-admin enable-feature --status
+

The output will be either:

  • Activation is still in progress,
  • Activation is done. The message will state how many users +were initially for the scan, a number of WordPress sites with +successfully activated suite, and the total number of WordPress sites +scanned.

Enable AccelerateWP CDN Pro

To enable CDN Pro for all users:

cloudlinux-awp-admin set-suite --suites accelerate_wp_cdn_pro --users all --allowed-for-all
+

To enable CDN Pro for a particular user:

cloudlinux-awp-admin set-suite --suites accelerate_wp_cdn_pro --allowed --users=<username>
+

Disable AccelerateWP for a particular user

Use CLI commands to disable undesired optimization suites for a single user.

To disable AccelerateWP suite:

cloudlinux-awp-admin set-suite --suites=accelerate_wp --disallowed --users=<username>
+

To disable AccelerateWP Premium suite:

cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --disallowed --users=<username>
+

To disable AccelerateWP CDN suite:

cloudlinux-awp-admin set-suite --suite=accelerate_wp_cdn --disallowed --users=<username>
+

To disable AccelerateWP CDN Pro suite:

cloudlinux-awp-admin set-suite --suite=accelerate_wp_cdn_pro --disallowed --users=<username>
+

To disable all suites:

cloudlinux-awp-admin set-suite --suites=accelerate_wp,accelerate_wp_premium,accelerate_wp_cdn,accelerate_wp_cdn_pro --disallowed --users=<username>
+

Useful AccelerateWP CLI commands

Use CLI commands to check AccelerateWP features status.

If you are also interested in Smart Advice CLI command, they could be found here.

Warning!

This is an experimental feature. The backwards compatibility is not guaranteed.

AccelerateWP suites statistics

Get suites statistics for all users:

cloudlinux-awp-admin get-report --all
+

or for a particular user:

cloudlinux-awp-admin get-report --users=<username>
+

This CLI command returns the following information:

  • total number of users in the report -- total_users_count
  • total number of websites in the report -- total_wordpress_count
  • total number of users with particular suite enabled -- total_users_count_active
  • total number of websites with particular suite enabled -- total_sites_count_active
  • number of websites with particular suite enabled per each user in the report -- *_sites_count in the users list
  • suites visibility status per each user in the report -- suites in the users list +
    • possible values for visibility status are: visible, allowed, disabled

The example output for a single user is given below:

{
+    "last_scan_time": 1681198804,
+    "result": "success",
+    "timestamp": 1681203383.3503218,
+    "total_sites_count_active": {
+        "accelerate_wp": 1,
+        "accelerate_wp_premium": 0
+    },
+    "total_users_count": 1,
+    "total_users_count_active": {
+        "accelerate_wp": 1,
+        "accelerate_wp_premium": 0
+    },
+    "total_wordpress_count": 2,
+    "users": [
+        {
+            "accelerate_wp_active_sites_count": 1,
+            "accelerate_wp_premium_sites_count": 0,
+            "suites": {
+                "accelerate_wp": {
+                    "source": "manual",
+                    "status": "allowed"
+                },
+                "accelerate_wp_premium": {
+                    "source": "default",
+                    "status": "visible"
+                }
+            },
+            "username": "user16",
+            "wp_sites_count": 2
+        }
+    ]
+}
+

AccelerateWP features statistics

Get overall AccelerateWP features usage statistics for a server with:

cloudlinux-awp-admin get-stat
+

This CLI command returns the following information:

  • number of allowed_users in total and per feature
  • number of sites with enabled features in total and per feature -- enabled_sites
  • number of users with visible features in total and per feature -- visible_users
  • features which are currently allowed -- features_allowed_by_default
  • features which are currently visible -- features_visible_by_default

The example output is given below:

{
+    "allowed_users": {
+        "object_cache": 0,
+        "site_optimization": 1,
+        "total": 1
+    },
+    "enabled_sites": {
+        "object_cache": 0,
+        "site_optimization": 1,
+        "total": 1
+    },
+    "features_allowed_by_default": [
+        "site_optimization"
+    ],
+    "features_visible_by_default": [
+        "object_cache",
+        "site_optimization"
+    ],
+    "is_accelerate_wp_flag_enabled": false,
+    "is_accelerate_wp_icon_enabled": true,
+    "result": "success",
+    "timestamp": 1681208259.19426,
+    "visible_users": {
+        "object_cache": 22,
+        "site_optimization": 22,
+        "total": 23
+    }
+}
+

AccelerateWP features detailed statistics

AccelerateWP features detailed statistics is available in user's environment only.

Use the following CLI command on behalf of a user:

cloudlinux-awp-user get
+

The command reports:

  • features allowed for a user -- allowed_features
  • all user's websites docroots with features information per each wps, which includes: +
    • status of each feature -- if the feature is enabled, if the feature is visible
    • issues detected (if any) for each feature
  • subscription status (for premium features) -- subscription
  • features visible for a user -- visible_features

The example output is given below:

{
+    "allowed_features": {
+        "accelerate_wp": [],
+        "accelerate_wp_premium": []
+    },
+    "docroots": [
+        {
+            "domains": [
+                "user0.com"
+            ],
+            "php_handler": "fastcgi",
+            "php_version": "plesk-php73-fastcgi",
+            "wps": [
+                {
+                    "features": {
+                        "accelerate_wp": {
+                            "enabled": false,
+                            "issues": [
+                                {
+                                    "context": {
+                                        "plugins": "WP Rocket"
+                                    },
+                                    "description": "Found conflicting plugins: %(plugins)s.",
+                                    "fix_tip": "Deactivate and uninstall the conflicting plugin using the WordPress administration interface.",
+                                    "header": "Conflicting plugins are enabled",
+                                    "type": "incompatibility"
+                                }
+                            ],
+                            "visible": true
+                        },
+                        "object_cache": {
+                            "enabled": false,
+                            "issues": [
+                                {
+                                    "context": {
+                                        "blog_url": "https://blog.cloudlinux.com/",
+                                        "supported_handlers": "php-fpm, lsapi"
+                                    },
+                                    "description": "Website uses unsupported PHP handler. Currently supported handler(s): %(supported_handlers)s.",
+                                    "fix_tip": "Please, set or ask your system administrator to set one of the supported PHP handlers for the domain: %(supported_handlers)s. Or keep watching our blog: %(blog_url)s for supported handlers list updates.",
+                                    "header": "Unsupported PHP handler",
+                                    "type": "incompatibility"
+                                }
+                            ],
+                            "visible": true
+                        }
+                    },
+                    "path": "wordpress",
+                    "version": "6.2"
+                }
+            ]
+        },
+        {
+            "domains": [
+                "sub.user0.com"
+            ],
+            "php_handler": "fastcgi",
+            "php_version": "plesk-php73-fastcgi",
+            "wps": []
+        }
+    ],
+    "max_cache_memory": "64mb",
+    "result": "success",
+    "subscription": {
+        "object_cache": "no"
+    },
+    "timestamp": 1681200081.765476,
+    "upgrade_url": null,
+    "used_memory": null,
+    "visible_features": {
+        "accelerate_wp": [
+            "accelerate_wp"
+        ],
+        "accelerate_wp_premium": [
+            "object_cache"
+        ]
+    }
+}
+

WHMCS billing

CloudLinux developed it's own WHMCS plugin +which provides you AccelerateWP billing integration out of the box. +Check out the documentation to find how to install and use the plugin.

Other billing integration

As AccelerateWP Premium is the feature that works on subscription basis, +we made it possible for hosters to integrate their existing billing systems with our plugin and sell the +feature for their users.

When AccelerateWP Premium is enabled in admin interface, users get proposal to upgrade their subscription.

When user upgrades the subscription to the plan with AccelerateWP support, +billing must execute the following command on the server:

cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --allowed --source=BILLING_OVERRIDE --users=<username>
+

This command makes two things:

  • allow user to install plugin, bypassing the upgrade window;
  • reports premium as being used to CLN, starting the billing cycle for hoster.

When user terminates or downgrades plan, the following command must be executed by the billing system:

cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --default --source=BILLING_OVERRIDE --users=<username>
+

Setup upgrade URL for AccelerateWP Premium

The upgrade window can be customized with link to the plan upgrade page, which can be set using CLI command:

cloudlinux-awp-admin set-options --upgrade-url https://plan.upgrade/splash
+

AccelerateWP automatically appends GET parameters when the link is displayed.

https://plan.upgrade/splash/?m=acceleratewp&action=provisioning&username=democom&domain=demo.com&server_ip=10.51.0.10
+
Parameter Value Description
m acceleratewp Constant.
action provisioning Constant.
username democom Customer's account name.
domain demo.com Customer's account primary domain.
server_ip 10.51.0.10 Primary IP of the server where AccelerateWP is installed

Parameters can be used to determine the billing account of the user in order to display proper page. +WHMCS plugin already has automatic redirect to upgrade page, there is only needed to set upgrade-url +to the root of your WHMCS instance.

cloudlinux-awp-admin set-options --upgrade-url https://whmcs.mydomain.zone/
+

Upgrade URL is opened in modal browser window and will be automatically closed +when AccelerateWP receives callback about successful upgrade.

Callback is already implemented in WHMCS plugin, but if you are using some other billing, +you should add the following code on the page which appears when user successfully upgrades subscription.

<script>
+if(window.opener && !window.opener.closed) {
+    window.opener.postMessage('PAYMENT_SUCCESS', '*');
+}
+</script>
+

In order to remove the link, just set upgrade url to the empty one.

cloudlinux-awp-admin set-options --upgrade-url ''
+

Disable AccelerateWP Premium

If you would like to stop using AccelerateWP Premium, +click on the manage link and remove Premium Features checkbox. +AccelerateWP will be still available for your users.

Disable AccelerateWP

If you would like to stop using AccelerateWP completely, toggle the AccelerateWP back. +Both AccelerateWP and AccelerateWP Premium will be turned off.

This operation will:

  • disable AccelerateWP tab in users' control panel interface
  • disable all AccelerateWP optimization suites
  • deactivate all optimization features for all users

This operation will NOT:

  • cancel the subscription made by user in WHMCS or other billing. User's subscription stays +alive and user will still be charged in billing system unless hoster manually makes a refund

Logs

The main AccelerateWP log is located at

  • /var/log/clwpos/main.log

In case if AccelerateWP Premium is active, the auxiliary monitoring daemon clwpos_monitoring is also activated. Its log is located at

  • /var/log/clwpos/daemon.log

FAQ

With which panel can I use AccelerateWP?

Currently AccelerateWP is compatible with cPanel and Plesk only.

If you are interested in supporting DirectAdmin control panel, please record your demand on our feature portal respectively:

Is it possible to use AccelerateWP on a non-control panel server?

No, AccelerateWP is compatible with cPanel and Plesk only.

Do you plan to enable support of Nginx server?

This is a part of our very long term plans, thus not expected in the nearest future.

How will it help my customers?

AccelerateWP is a complex solution to help your customers increase their WordPress site performance. AccelerateWP brings number of optimization features, like object caching, css and js preprocessing and website preloading.

How could I monitor Redis instances while using AccelerateWP Premium suite?

Redis process is started for a user after activating AccelerateWP Premium Object Caching feature for at least one Wordpress site. +It is killed after AccelerateWP Premium Object Caching has been deactivated for all user's websites.

Look through the processes list to check Redis status for a particular user:

 $ ps aux | grep redis
+ awpuser  2662517  0.0  0.5 101096  8512 ?        Sl   15:33   0:00 /opt/alt/redis/bin/redis-server unixsocket:/home/awpuser/.clwpos/redis.sock
+

In case if AccelerateWP Premium is active, the auxiliary monitoring daemon clwpos_monitoring is also activated. It checks Redis instances each 5 minutes, starts new instances, restart failed ones and kills the “garbage” instances if needed. +Check daemon status using service clwpos_monitoring status and its main log: /var/log/clwpos/daemon.log.

My users are complaining that their feature are not installed automatically after subscription upgrade

This can be caused by several reasons. Either your customer's website was detected to have malfunctions +or there was an issue with environment when feature was installed +(e.g. bad internet connectivity with wordpress market).

First, try to enable feature manually using AccelerateWP interface. +Most likely you will find human-readable error message there.

Next, you can try to dive into /var/log/clwpos/daemon.log and find the reason why the enable command failed. +Here is an example of successful feature installation for reference:

2023-02-14 11:01:14,696: (clwpos.daemon_base) [INFO] Running cloudlinux-awp-user enable --feature object_cache --domain wpujj.com --wp-path
+2023-02-14 11:01:15,081: (clwpos.daemon_base) [INFO] Command succeded with output:
+`CompletedProcess(args=['/bin/cagefs_enter.proxied', 'cloudlinux-awp-user', 'enable', '--feature', 'object_cache', '--domain', 'wpujj.com', '--wp-path', ''], returncode=0, stdout='{\n    "context": {\n        "domain": "wpujj.com",\n        "feature": "object_cache"\n    },\n    "result": "success",\n    "timestamp": 1676372475.044419,\n \n}\n', stderr='')`
+2023-02-14 11:01:15,086: (clwpos.daemon_base) [INFO] background process finished: pid=415368
+

Also, some useful notes may be present in user's log located at /home/<username>/.clwpos/main.log.

If the issue persists, or you cannot resolve it yourself, +contact CloudLinux support and attach /var/log/clwpos/daemon.log and /home/<username>/.clwpos/main.log +for further investigation.

Troubleshooting

End-users of AccelerateWP Premium feature encounter Redis extension is not installed for selected php version

In order to make use of AccelerateWP Premium Object Caching feature, the loaded Redis extension is required for the end-user's website. +End-users will not be able to activate the Object Caching feature until Redis extension configuration is incomplete.

Corresponding incompatibility warning will be displayed in control panel's User interface:

The Redis extensions are configured for all installed and supported PHP versions automatically:

  • right after the AccelerateWP Premium suite is enabled
  • by cron once a day

or you can trigger the utility manually:

/usr/sbin/enable_redis_for_panel_php
+

All errors will be displayed in standard output and logged into /var/log/clwpos/main.log.

Ensuring the EA-PHP Redis extension is configured correctly

  1. Check Redis extension package is installed by running the following command

    rpm -q ea-phpXY-php-redis
    +

    Install the corresponding extension if it is not present:

    yum install ea-phpXY-php-redis
    +

    Consider the example for checking out and installing Redis extension for ea-php74:

    rpm -q ea-php74-php-redis
    +yum install ea-php74-php-redis
    +
  2. Check Redis ini file is present by running the following command:

    ls /opt/cpanel/ea-phpXY/root/etc/php.d/ | grep 50-redis
    +

    Consider the example for checking out Redis extension for ea-php74:

    ls /opt/cpanel/ea-php74/root/etc/php.d/ | grep 50-redis
    +

    Try reinstalling the package if ini file is missing.

  3. Make sure Redis module is loaded under specific user by running the following command:

    su -c "php -m | grep redis" <username>
    +

Ensuring the ALT-PHP Redis extension is configured correctly

  1. Check if redis.so is present for a particular alt-php version:

    ls /opt/alt/phpXY/usr/lib64/php/modules | grep redis.so
    +

    Consider the example for checking alt-php74 redis.so:

    ls /opt/alt/php74/usr/lib64/php/modules | grep redis.so
    +redis.so
    +
  2. If the Redis module is missing:

    a. Install the alt-phpXY-pecl-ext package manually +b. Run the Redis configuration script /usr/share/cloudlinux/wpos/enable_redis_for_alt_php.py

    All errors will be displayed in standard output and logged into /var/log/clwpos/main.log.

  3. If the Redis module is present for a particular php version, but the incompatibility issue persists, re-check the following:

    a. Make sure the Redis module is loaded under user:

    su -c "php -m | grep redis" <username>
    +

    b. Check the required extensions are enabled in php.ini:

    cat /opt/alt/phpXY/etc/php.ini | grep redis.so
    +cat /opt/alt/phpXY/etc/php.ini | grep json.so
    +cat /opt/alt/phpXY/etc/php.ini | grep igbinary.so
    +

    c. Enable missing extensions manually.

End-users may encounter PHP-related errors while activating the AccelerateWP features.

The general examples of possible reasons are:

  • broken PHP binaries
  • missing PHP files
  • etc.

To check that this issue is caused by PHP itself, call any PHP command, for example:

/opt/cpanel/ea-php80/root/usr/bin/php -i
+

And make sure that installed ea-php80 packages are not broken using +rpm -V <package_name>.

Reinstall broken packages if found.

Consider the example issue (presented at the picture above) with broken mbstring.so for ea-php80:

# /opt/cpanel/ea-php80/root/usr/bin/php -i
+Segmentation fault (core dumped)
+# rpm -V ea-php80
+# rpm -V ea-php80-php-mbstring
+S.5....T.    /opt/cpanel/ea-php80/root/usr/lib64/php/modules/mbstring.so
+......G..  a /usr/lib/.build-id/9c/38ed78a6d401ff6dce059ccea51c95870d98c5
+# yum reinstall ea-php80-php-mbstring
+
+ + + diff --git a/docs/.vuepress/public/cloudlinux-xmlrpc-api.pdf b/cloudlinux-xmlrpc-api.pdf similarity index 100% rename from docs/.vuepress/public/cloudlinux-xmlrpc-api.pdf rename to cloudlinux-xmlrpc-api.pdf diff --git a/cloudlinux_installation/index.html b/cloudlinux_installation/index.html new file mode 100644 index 000000000..b2ff1f723 --- /dev/null +++ b/cloudlinux_installation/index.html @@ -0,0 +1,232 @@ + + + + + + Installation | Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Installation

Hardware compatibility

CloudLinux OS supports all the hardware supported by RHEL/CentOS/AlmaLinux, with few exceptions. Exceptions are usually hardware that require binary drivers, and that doesn't have any open source alternatives.

Note

CloudLinux OS does not support ARM-based CPUs (e.g. Graviton).

Warning

In cases where your server hardware is incompatible with any version of RHEL/CentOS/AlmaLinux and CloudLinux OS or our components - we will not be able to provide assistance in adding such hardware support or solving possible issues related to such installation.

Note

Replacing the server hardware affects specifications and support for such hardware from CloudLinux OS end. +It is most likely that the CloudLinux OS will stop working if you replace any hardware component on the server.

Example: the same HDD/SSD/NVMe model will have a new UUID and CloudLinux OS is mapped to old UUID which break the boot procedure.

In this case, we are not responsible for the CloudLinux OS operation and cannot assist you in restoring the server or adapting CloudLinux OS installation to the new hardware.

There are some incompatible devices with CL6:

Device Binary Driver Source
B110i Smart Array RAID controller hpahcisr https://h10032.www1.hp.com/ctg/Manual/c01754456
B120i/B320i Smart Array SATA RAID Controller hpvsa https://www8.hp.com/h20195/v2/GetPDF.aspx/c04168333.pdf
SanDisk DAS Cache https://www.dell.com/en-us/work/learn/server-technology-components-caching

With RHEL8 (CloudLinux OS 8/CloudLinux OS 7 Hybrid), some devices are no longer supported. +You can check the entire list here: Hardware enablement considerations in adopting RHEL 8

Getting license

You will need a valid activation key - trial or paid - to be able to use your CloudLinux OS Solo server.

Getting trial license

The trial activation key can be used to convert your server to CloudLinux OS.

Note

The trial license subscription will work for 30 days.

If you have any issues getting activation key or if you have any questions regarding using your +trial subscription – contact sales@cloudlinux.com and we will help.

To get the activation key:

  1. Register with CloudLinux Network: https://cln.cloudlinux.com/console/register/customer (skip it if you already registered)
  2. You will receive an email with activation link
  3. Login at https://cln.cloudlinux.com/console/auth/login
  4. Choose the appropriate CloudLinux edition that fits your needs.
  5. Click on Get Trial Activation Key

You will get a key that looks like: 12314-d34463a182fede4f4d7e140f1841bcf2

Converting existing servers

Sometimes it is required to convert already existing servers with CentOS or AlmaLinux and make them CloudLinux OS.

It is easy to convert your existing installation by cldeploy script. The process takes a few minutes and replaces just a handful of RPMs.

WARNING

Unlike Fresh installation, converting immediately requires CloudLinux OS license. +Please refer to the guide to get an activation key.

Requirements

Currently supported OS for conversion:

  • CentOS 7
  • AlmaLinux OS 8, AlmaLinux OS 9
  • RockyLinux (installation only, no uninstall option)

Unsupported OS for conversion:

  • CentOS 8
  • CentOS Stream

Supported control panels:

Other control panels:

Control panels not mentioned in the list of supported panels have native integration or integration by the developer of such a panel. +We cannot guarantee the stability or correct operation of CloudLinux components on such panels.

Warning:

Some CloudLinux components may not be supported by the control panel itself or the control panel can have its own analog of such a component. +You can verify this information when reviewing the system requirements for installing a particular CloudLinux component.

Note: CentOS 8 is EOL

CentOS 8 reached End Of Life (EOL) on December 31st, 2021. +If you would like to convert from CentOS 8 to CloudLinux OS 8, do the following:

Downloading and running conversion script

Key-based activation

If you want to use your activation key for activation, run the following commands:

yum install wget -y
+wget https://repo.cloudlinux.com/cloudlinux/sources/cln/cldeploy
+bash cldeploy -k ACTIVATION_KEY
+

Where ACTIVATION_KEY is the one that you got on previous step. +Your CloudLinux OS edition will be detected automatically based on the ACTIVATION_KEY

IP-based activation

If your reseller provides you with an IP-based license, run the following commands:

To convert server into the CloudLinux OS Shared edition:

$ sh cldeploy -i
+

To convert server into the CloudLinux OS Admin edition:

$ sh cldeploy -i --to-admin-edition
+

Next steps

After successful conversion, reboot your system by running the following command:

reboot
+

Once you reboot - your server should be running with CloudLinux OS LVE kernel.

You may check the booted kernel with the following command:

$ uname -r
+

Note

If after rebooting you do not see the CloudLinux kernel (the kernel has the abbreviation LVE in its name) +then please consider check our knowledge base or +contact support.

Note

SELinux is not supported on CloudLinux OS 6 and 7. SELinux is supported on CloudLinux OS 8+, +but might not work or be compatible with control panels and various components.

Note

At the end of conversion from CentOS 7.x to CloudLinux OS Shared 7, +the cldeploy script converts CloudLinux OS Shared 7 to CloudLinux OS Shared 7 Hybrid.

Automatic hybridization will be performed for the AMD processors with the following CPU families:

  • Zen / Zen+ / Zen 2 / Zen 3
  • Hygon Dhyana

Automatic hybridization may be skipped by passing extra option '--no-force-hybridize'. +See also advanced options for cldeploy.

Minor version step-down

If you are attempting to convert an AlmaLinux machine of a minor OS version higher than the most recent CloudLinux minor version, you won't be able to perform a standard conversion, since the required packages will be missing.

E.g. if the AlmaLinux OS 8.8 has already become publicly accessible, but the latest CloudLinux OS release is still 8.7, a standard conversion will not be possible.

This situation typically occurs after a new AlmaLinux release and persists for several weeks.

If you cannot wait until the corresponding CloudLinux release, you have an option of performing a step-down conversion, in which cldeploy will install the previous CloudLinux OS minor version on your system.

For instance, AlmaLinux 8.8 can be converted to CloudLinux 8.7 in such a scenario.

Note

At the moment, the step-down conversion is only supported on systems with no panel, cPanel or Plesk.

Note

When performing a step-down conversion, cldeploy will add MySQL and MariaDB RPM packages to the Yum exclude list, in order to avoid downgrading them to CloudLinux-modified versions.

Not doing so would risk rendering the databases non-functional, since MySQL explicitly does not support minor-version downgrades of its packages.

If you want to update these packages on a step-down converted system, make sure to exclude/disable the CloudLinux package repositories while doing so.

In addition, on CloudLinux 9 the kernel packages are downgraded and excluded from updates in order to maintain parity with the CloudLinux kernel modules.

cldeploy will automatically detect the latest available CloudLinux version and, depending on the result, will either proceed normally or perform the step-down conversion.

If a normal conversion is not possible, it will request confirmation (yes/no) from the user. To implicitly respond "yes" to this and other questions, running script non-interacively, pass the -y option to the cldeploy script.

Updating systems from a step-down conversion

Once the previously missing minor CloudLinux release becomes available, you will likely want to upgrade to it from a step-down conversion.

To do so, you need to do the following:

  • Remove the automatically created excludes for MySQL and MariaDB packages from /etc/yum.conf
    • Specifically, remove mysql* mariadb*, and kernel* if present, from excludes in your yum.conf.
    • Any other excluded packages except the above are unrelated to cldeploy and should remain in the configuration.
  • Install the newest available cloudlinux-release package over the previous one. +
    • This will replace the AlmaLinux and CloudLinux package repository configuration files that were modified by cldeploy step-down conversion.
    • Make sure the new files replace the old ones - check for presence of .rpmnew files.
  • Update the system normally.

Troubleshooting

If you receive any troubles during the conversion process, +please feel free to search our knowledge base +or contact our support and attach the conversion log (/var/log/cldeploy.log).

How to enable secure boot for CloudLinux 9

Overview

CloudLinux 9 uses non-modified AlmaLinux 9 kernel.
+To make secure boot work with CloudLinux's kernel module you need to enroll CloudLinux secure boot key to your server.
+This procedure shows how to do it

Requirements

  • UEFI support
  • mokutil package installed
  • Access to server's BIOS options menu and boot screen

Procedure

  1. Download CloudLinux key +
    1. wget https://repo.cloudlinux.com/cloudlinux/SECURE-BOOT-KEY-cloudlinux-kmod.der
  2. Import the key +
    1. mokutil --import SECURE-BOOT-KEY-cloudlinux-kmod.der
    2. When prompted, enter a password of your choice. This password will be used when enrolling the key into the MOK list.
  3. Reboot server +
    1. Upon rebooting, the "Shim UEFI key management" screen appears. Press any key withing 10 seconds to proceed.
  4. Enroll the key

Select Enroll MOK
Step 1

Select View key 0
Step 2

Make sure that CloudLinux's Secure Boot Key information is displayed
+Press the Esc key when you are finished
Step 3

Select Continue on the screen from Step 2 +It will ask "Enrol the key(s)?".
+Select Yes/OK
Step 4

Enter the password you used for importing the key (point 2.ii)
Step 5

Select Reboot (Older versions may say Continue boot)
Step 6

Now you can enable Secure Boot in BIOS options menu

Useful commands

  • mokutil --sb-state to check current Secure Boot state
  • mokutil --list-enrolled to show list of enrolled keys

If you wish to remove the CloudLinux key from the MOK list, follow the instructions below

Warning

Do not delete the key when secure boot is enabled - server will be unable to boot

  1. Disable Secure Boot
  2. mokutil --delete SECURE-BOOT-KEY-cloudlinux-kmod.der
  3. mokutil --list-delete (to check the key to be deleted)
  4. Reboot the system and go through the MOK management process to complete the deletion from the MOK list.

Technical details: cldeploy

By its design, CloudLinux OS Shared is very close to the upstream operating system - RHEL. +This makes the conversion process relatively straightforward, requiring just one reboot.

Installation process

Here's what the cldeploy script does when you run it:

  • Backups the original repository settings into /etc/cl-convert-saved.
  • Backups RHEL system ID into /etc/cl-convert-saved (RHEL systems only).
  • Installs CloudLinux repository settings & imports CloudLinux RPM key.
  • Replaces redhat/centos-release/almalinux-release, redhat-release-notes, redhat-logos with CloudLinux versions.
  • Removes cpuspeed RPM (as it conflicts with CloudLinux limits).
  • Reinstall CloudLinux version of rhnlib/rhnplugin.
  • Checks for binary kernel modules, finds replacement if needed.
  • Detects OVH servers and fixes mkinitrd and possible boot issues.
  • Detects Linode servers and fixes grub issues.
  • Checks if LES is installed.
  • Checks that /etc/fstab has correct /dev/root
  • Checks for EFI and performs the necessary configuration.
  • Installs CloudLinux kernel, lve-utils, liblve, lve-stats RPMs.
  • Installs CloudLinux Manager for the supported control panels.
  • Installs mod_hostinglimits Apache module *: +
    • RPM install for supported control panels;
    • On Plesk, replaces psa-mod_fcgid* with mod_fcgid;
    • Perform CustomBuild tool execution for DirectAdmin.

Uninstallation process

Here's what the cldeploy script does, if one runs it to uninstall CloudLinux:

  • Restores CentOS/AlmaLinux repositories, and almalinux-release/centos-release/release-notes/logos.
  • Removes lve, mod_hostinglimits, lve-stats, lvemanager packages.
  • mod_hostinglimits RPM is removed.

Note

cldeploy doesn't remove the kernel to prevent condition when server has no kernels and wouldn't boot. Instead, script provide the instructions on how you could remove it manually later, when it is safe to do so.

On cPanel servers, rebuild of Apache with EasyApache will complete the conversion back, but doesn't have to be performed immediately. * +On DirectAdmin servers, rebuild of Apache with custombuild will complete the conversion back, but doesn't have to be performed immediately.

More information is also available here: Uninstall CloudLinux.

Installing new servers

All CloudLinux OS editions may be installed using one ISO and source.

Downloading ISO

You can download the latest CloudLinux OS ISO and use it to install CloudLinux OS on your server:

There are multiple ISO types available:

  • CloudLinux-*-boot.iso - this ISO is made specifically for network installation and does not contain any packages inside.
  • CloudLinux-*-dvd1.iso - this one contains all packages from network installation repository, +so you can set up any possible configuration without network access.
  • CloudLinux-*-minimal.iso - this one contains only minimal set of packages to set up light server without GUI and Development tools.

Installing using the Graphical User Interface

The graphical installation interface is the preferred method of manually installing CloudLinux OS. +It allows you to have full control over all available settings, including disk partitioning and storage configuration.

The graphical mode is used by default when you boot the system from the local media. Mount and boot the image, then follow the steps.

Language selection

The first screen displayed is the language selection page.

Welcome page screenshot

First, find your preferred language in the left column and than select locale in the right one. +Selected language will be used during installation and also as a default language of the installed system.

After you select your language and locale, click Continue to confirm your selection +and proceed to the Installation Summary.

Installation summary

The Installation summary screen is the main dashboard of your installation parameters. +Most of the options which can be configured during the installation can be accessed from here.

Welcome page screenshot

The summary screen displays links to other configuration screens, those links can be in +several different states, which are graphically indicated:

  • Grayed out link means that the installer is currently updating this sections. +Please wait a little before accessing this section.

  • A warning symbol next to an icon means that a screen requires your attention before you start the installation.

  • Links without warning symbol mean that screen does not require your attention. +You can still change your settings in these screens, but it is not required to start installation.

Choosing the installation source

The first thing that you should define is where the system will be installed from. +There are basically two options:

  • ISO file
  • On the network

On the network source

Use this option to download packages to be installed from a network location. +This is the preferred way as you automatically receive all critical bug fixes that may affect installation.

Note

Most likely your network is not configured by default, +so you can see the URL configuration field greyed out, like on the screenshot below. Please refer to the Network Configuration screen first to set up a network connection.

Unavailable network source

The correct installation URL for CloudLinux OS is

https://repo.cloudlinux.com/cloudlinux/8/BaseOS/x86_64/kickstart/
+

Type in installation URL in the corresponding field, configure proxy if needed and press the Done button.

ISO file source

This option is primary used as an alternative when you don't have internet connection on a target server. +It is only available if you downloaded Minimal or DVD ISO which contains some bundled packages in.

Tick the ISO file checkbox and press the Done button.

Next steps

After clicking Done, you will be redirected to the Installation Summary screen +where Installation source and Software Selection links +will be greyed and the Downloading package metadata message wll be shown.

Please hold on while that message disappears and proceed to the Software Selection section.

Software Selection

The Software Selection screen allows you to choose a Base Environment and Add-ons. +These options control which software packages will be installed on your system during the installation process.

This screen is only available if Installation Source is properly configured and only after the installer +has downloaded package metadata from the source.

It is not possible to select specific packages during a manual installation, you can only select pre-defined environments and add-ons.

You should choose the CloudLinux edition that matches your license on this stage: +

The available options are:

  • to install CloudLinux OS Shared or Shared Pro, choose the CloudLinux OS Shared/Pro (minimal) environment on the left of the screen.
  • to install CloudLinux OS Admin, choose the CloudLinux OS Admin (minimal) environment on the left of the screen.
  • to install CloudLinux OS Solo, choose the CloudLinux OS Solo (minimal) environment on the left of the screen.

Then, on the right side of the screen, select one or more add-ons which you want to install by ticking the +check boxes next to each add-on.

Final preparations

Installation is almost done, all you need to do is to configure your installation target +using the Installation Destination menu and create your Root Password.

Doing that, the Begin installation button becomes blue, so click it.

After this point, the installation process actually starts and changes are being made to your selected disks. +It is not possible to go back to the Installation Summary and change any settings configured there; +if you need to do so, you must wait for the installation process to finish, reboot your system, log in and change your settings +on the installed system.

The bottom of the screen shows a progress bar and a message informing you of the current progress of the installation. +When the installation finishes, you can press the Finish installation button +to reboot your computer and log in to your newly installed system.

Warning

Before you finish the installation and reboot, either remove the media +which you used to start the installation, or make sure that your system tries to boot +from the hard drive before trying removable media. Otherwise, your computer will start the installer again instead of the installed system.

Next steps

Reboot your system, login and check EULA which is located in the /usr/share/cloudlinux-release/EULA.

Next, activate your installation in order to get updates.

License activation

To register your CloudLinux OS server with CloudLinux Network using activation key, run the following command:

$ yum install rhn-setup
+$ /usr/sbin/rhnreg_ks --activationkey=<activation key>
+

Where <activation key> is like 1231-2b48feedf5b5a0e0609ae028d9275c93

If you have IP based license, use the clnreg_ks command instead:

$ yum install rhn-setup
+$ /usr/sbin/clnreg_ks --force
+

Cloud provider images (CloudLinux OS Shared only)

CloudLinux Azure Images

We build and release CloudLinux 7.9 and CloudLinux 8.6 for Azure and upload to the Mircosoft Azure Community Galleries.

Images are built in both types Azure supports: gen1 (BIOS based) and gen2 (UEFI based). CloudLinux Images could be found in the following regions: West Europe, Germany West Central, Southeast Asia, East US, West US 2. A publisher of CloudLinux Images in Azure is cloudlinux. Community gallery name is cloudlinux-cbc76afd-63bc-4f6e-b801-65bd2f1ab0a0.

How to use CloudLinux Image in Azure:

  • When creating Virtual Machine, while choosing what OS should be used, click See al images. +
  • Switch from Marketplace to Community images. +
  • Search by typing cloudlinux or filter by Publisher which is also cloudlinux or Azure Compute Gallery which is cloudlinux-cbc76afd-63bc-4f6e-b801-65bd2f1ab0a0. +
  • Choose a suitable image. Check that the Publisher of the selected images is cloudlinux and Public Gallery Name is cloudlinux-cbc76afd-63bc-4f6e-b801-65bd2f1ab0a0.

Xen images

Note

We do not provide Xen images of CloudLinux OS Shared anymore, use ISO images instead

Provider-specific guidelines (CloudLinux OS Shared only)

AWS

CloudLinux OS Shared image list can be found here

If you are going to use CloudLinux OS Shared with cPanel image, you may find useful the following article

H-Sphere

Note

For H-Sphere 3.5+ +Please note, that CageFS and PHP Selector are not supported for H-Sphere

Requirements

  1. CloudLinux OS Shared with liblve 0.8 or later.
  2. Apache 2.2.x or 1.3.
  3. mod_suexec should be enabled.

To achieve optimal performance, we recommend to convert from mod_fastcgi to mod_fcgid.

There is no need to install mod_hostinglimits – it comes built in with H-Sphere. Once you load kernel from CloudLinux OS Shared with liblve 0.8 or later – it will get enabled.

You can check if LVE is enabled by running: +

$ ps aux | grep httpd | grep DLIBLVE
+

If you see no output, it means that Apache didn't pick up LVE. Try checking file /hsphere/shared/scripts/apache-get-env.sh

The following lines should be there: +

if [ -e /usr/lib64/liblve.so.0 -o -e /usr/lib/liblve.so.0 ]; then
+APENV_DSSL="$APENV_DSSL -DLIBLVE"
+fi
+

If those strings are absent, you should add it, after:

else
+APENV_DSSL='-DSSL'
+fi
+###
+

and before:

# this is used by apacheGetEnv.pm perl module
+if [ "$1" = 'show' ] ; then
+set | egrep "^APENV_"
+fi
+

strings.

Restart Apache afterward.

Converting from mod_fastcgi to mod_fcgid

To achieve the best results in productivity and stability we recommend converting from mod_fastcgi to mod_fcgid.

Note

H-Sphere 3.6.3+

  1. Download our fcgi.conf file:
$ wget -O /hsphere/local/config/httpd2/fcgi.conf https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/fcgi.conf
+
  1. Edit ~httpd2/conf/extra/httpd-hostinglimits.conf to the following state:
######
+LoadModule hostinglimits_module /hsphere/shared/apache2/modules/mod_hostinglimits.so
+
+<IfModule mod_hostinglimits.c>
+SkipErrors Off
+AllowedHandlers cgi-script %php% fcgid-script application/x-miva-compiled
+DenyHandlers hs-php5-script hs-php53-script hs-php54-script
+Include /hsphere/local/config/httpd2/fcgi.conf
+ 
+</IfModule>
+#######
+
  1. Go to P.Servers > web server [Config] and be sure to have enabled: +
    • apache_version=2
    • apache_mpm=prefork
    • apache_fastcgi
    • apache_fcgid
    • PHP version/mode: php_fastcgi*

Note

*No changes needed to httpd.conf.tmpl.custom or usermodule.phpmode as this version provides its own mod_fcgid.

Older versions of H-Sphere

  1. Compile mod_fcgid module:
$ yum install gcc liblve-devel zlib-devel openssl-devel 
+$ wget https://apache.osuosl.org//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz
+$ tar zxvf mod_fcgid-2.3.9.tar.gz
+$ cd mod_fcgid-2.3.9/
+$ APXS=/hsphere/shared/apache2/bin/apxs ./configure.apxs 
+$ make
+$ mv modules/fcgid/.libs/mod_fcgid.so /hsphere/shared/apache2/modules
+
  1. Download and apply patch https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/usemodule.phpmode.patch to /hsphere/local/config/scripts/usemodule.phpmode:
$ wget https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/usemodule.phpmode.patch 
+$ patch /hsphere/local/config/scripts/usemodule.phpmode usemodule.phpmode.patch
+
  1. If /hsphere/local/config/httpd2/httpd.conf.tmpl.custom does not exists – create it:
$ cp -rp /hsphere/local/config/httpd2/httpd.conf.tmpl /hsphere/local/config/httpd2/httpd.conf.tmpl.custom
+

Download and apply patch https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/httpd.conf.tmpl.patch to the /hsphere/local/config/httpd2/httpd.conf.tmpl.custom:

$ wget https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/httpd.conf.tmpl.patch 
+$ patch --fuzz=3 /hsphere/local/config/httpd2/httpd.conf.tmpl.cusom  httpd.conf.tmpl.patch
+
  1. Download pre-defined config file https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/fcgi.conf to /hsphere/local/config/httpd2:
$ wget -O /hsphere/local/config/httpd2/fcgi.conf https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/fcgi.conf
+
  1. Download our wrapper file https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/php-wrapper into /hsphere/shared/php5/bin/ and make it executable:
$ wget -O /hsphere/shared/php5/bin/php-wrapper https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/php-wrapper
+$ chmod 755 /hsphere/shared/php5/bin/php-wrapper
+
  1. Change permissions for /hsphere/local/home to 755:
$ chmod 755 /hsphere/local/home
+
  1. Edit ~httpd2/conf/extra/httpd-hostinglimits.conf and add DenyHandlers, so section will look like:
<IfModule mod_hostinglimits.c>
+SkipErrors Off
+AllowedHandlers cgi-script %php% fcgid-script application/x-miva-compiled
+DenyHandlers hs-php5-script hs-php53-script hs-php54-script 
+</IfModule>
+
  1. Configure physical server from H-Sphere admin > E.Manager > P.Servers > server_name [parameters] icon, settings should be:
apache_version = 2
+apacha_fastcgi = yes
+apache_status = yes
+

  1. Set PHP configuration to:
php_libphp5 enabled but not default
+php_fastcgi5 enabled and is default
+

Other options could be configured according to personal needs.

When done - click SUBMIT to apply changes.

Note

After updating H-Sphere software on web server with CloudLinux OS Shared you need to re-apply step 2 (patch usemodule.phpmode) and restart apache with /hsphere/shared/scripts/apache-restart script.

DigitalOcean

How to make CloudLinux OS Shared work on DigitalOcean:

DigitalOcean doesn't support custom kernels. The droplet (VM) always runs DigitalOcean's kernel. CloudLinux OS Shared requires its own kernel. To enable CloudLinux OS Shared work on DigitalOcean droplets, we provide ability to boot into CloudLinux OS Shared kernel using kexec functionality.

How does this work:

  • cldeploy script checks for presence of /etc/digitalocean. If the file detected, we assume that this is DigitalOcean droplet;
  • kexec-tools are installed;
  • kexec script will be created in /etc/rc.d/init.d/ and set to run right after rc.sysinit.

When executed, script /etc/rc.d/init.d/kexec detects the latest installed CloudLinux OS Shared kernel, and loads that kernel.

If the system cannot boot into CloudLinux OS Shared kernel (due to any reason), subsequent reboot will skip kexec, allow droplet to boot into DigitalOceans' kernel.

To disable booting into Cloudlinux OS Shared kernel, run:

chkconfig --del kexec
+

To re-enable booting into CloudLinux OS Shared kernel, run: +

chkconfig --add kexec
+

Adding CloudLinux OS Shared image to DigitalOcean

Custom images are Linux distributions that have been modified to fit the specific needs of DigitalOcean users. You can find some basics of importing a custom CloudLinux OS Shared image below.

Importing custom images to DigitalOcean is free, as you are only charged for the storage of your image. To save money, you can easily import your image, start a Droplet from your image, and delete the image, so you don’t incur any storage costs.

Below, we will describe how to add a qcow2 (QEMU/KVM) CloudLinux OS Shared image as a custom image. You can find more information on image options at https://www.digitalocean.com/docs/images/custom-images/overview/

  1. To choose the right image, navigate to https://download.cloudlinux.com/cloudlinux/images/#kvm-tab. Several different images are available for download (with and without a control panel).

  1. Copy the link for the image you are going to use and log into cloud.digitalocean.com.

Click Images on the left of the screen and then choose Custom Images. Click the Import via URL button and paste the CloudLinux OS Shared image link.

There are several options here, but the most important is Choose a datacenter region, i.e. which datacenter region your Droplets should be created in for this image.

Click the Upload Image button and wait until the image is successfully uploaded.

  1. Add your public key to access your droplets using key-based authentication: navigate to the Security sidebar menu and click the Add SSH Key button.

You can find more information about creating/adding SSH keys in this article.

  1. You will then be able to start a CloudLinux OS Shared Droplet using the image.

    Note

    Your Droplet will be created in the same datacenter that your custom image resides in.

  1. Now, use your preferred SSH client software to connect to your Droplet. You can find more information on SSH client setup here.

Linode

CloudLinux OS Shared on Linode KVM

To install CloudLinux OS Shared 7 on Linode KVM server you should perform the following steps:

  1. Deploy CL to your Linode following the steps from this section

  2. Install grub on your system:

yum install grub2
+
  1. Add to /etc/default/grub the following parameters:
GRUB_TIMEOUT=10
+GRUB_CMDLINE_LINUX="console=ttyS0,19200n8"
+GRUB_DISABLE_LINUX_UUID=true
+GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"
+
  1. Update grub config:
grub2-mkconfig -o /boot/grub/grub.cfg
+
  1. Edit your Linode profile, change the boot settings to GRUB 2 .

  2. Reboot your Linode.

After reboot you will have fully operational CloudLinux OS Shared 7 system and can proceed with other configuration you need.

CloudLinux OS Shared on Linode Xen

To install CloudLinux OS Shared 7 on Linode Xen please perform the following steps:

  1. Deploy CL to your Linode following the steps from this section.

  2. Create the file /boot/grub/menu.lst with the following content:

timeout 5
+title CloudLinux 7.1, $KVERSION
+root (hd0)
+kernel /boot/vmlinuz-$KVERSION root=/dev/xvda1 ro quiet
+initrd /boot/initramfs-$KVERSION.img
+

where $KVERSION is the version of the installed CloudLinux OS Shared 7 kernel.

Note

You will need to update /boot/grub/menu.lst manually after every kernel update.

  1. Switch boot settings to pv-grub-x86_64 and switch off Auto-configure networking in Linode settings.

  2. Reboot your Linode.

In case if you will migrate to KVM later you will need only switch the boot settings to GRUB 2.

Virtuozzo and OpenVZ

Virtuozzo 7 and OpenVZ 7

To use CloudLinux Shared Pro in Virtuozzo container, please update the next packages to the specified versions (or higher):

  • alt-php-ssa-0.3-4
  • alt-php-xray-0.5-8
  • cloudlinux-linksafe-1-5.2
  • accelerate-wp-1.0-11
  • lvemanager-7.7.5-2
  • alt-python27-cllib-3.2.32-1
  • pam_lve-0.4-3
  • lve-wrappers-0.7.7-1
  • lve-utils-6.4.3-1
  • cagefs-7.5.1-1
  • liblve-2.1-11
  • tuned-profiles-cloudlinux-0.2-3

Available functionality

Requirements

  • Virtuozzo 7 as server system
  • Virtuozzo container with CloudLinux Shared Pro 8
  • cloudlinux-updates-testing repo is enabled (+ yum clean all)

How to install

  1. Prepare Virtuozzo container with ostemplate almalinux-8-x86_64
  2. Enter to the container
  3. Install cPanel:
cd /home && curl -o latest -L https://securedownloads.cpanel.net/latest && sh latest
+
  1. Download and start cldeploy:
wget https://repo.cloudlinux.com/cloudlinux/sources/cln/cldeploy
+chmod 775  cldeploy
+./cldeploy -k SHARED_PRO_CLN_KEY_HERE --testing-repo
+
  1. You don't need to restart the container after the cldeploy script finished execution.

CloudLinux Wizard

Wizard is a tool to set up CloudLinux OS components.

In the current version only the lsapi module can be installed.

Dashboard

CloudLinux OS Shared dashboard provides a quick overview of statistics and all administrative information for server administrators.

In the current version only statistics about the lsapi module is available.

Lsapi

To install Lsapi via CloudLinux Wizard, please turn off mod_ruid2 in EasyApache 4 -> Apache Modules.

Note

For EasyApache select Currently Installed Packages.

Note

Currently mod_suexec is not available in containers and will be released in future versions. Just ignore this message, click "ok" and continue installing lsapi via the Wizard.

You can find the complete lsapi documentation here.

AccelerateWP

If you'd like to try Smart Advice and AccelerateWP you should participate in the Beta tester program. To become a beta tester, please send your request at our Beta program page with the signup form here. Once you submit the request, we will send you a confirmation email with program details, terms of use, and installation instructions.

All additional information can be found here.

CageFS

You can fing CageFS documentation here.

Attention!

Kernel config variables are not available for the Virtuozzo container!

PHP Selector

How to install

  1. To install via SSH, update your packages in the container:
    yum update alt-python27-cllib pam_lve lve-wrappers lve-utils liblve tuned-profiles-cloudlinux lvemanager
    +
  2. The following commands can be executed via SSH or via CloudLinux Wizard +Via SSH:
    yum install cagefs
    +yum groupinstall alt-php
    +cagefsctl –init
    +
    Via CloudLinux Wizard (cPanel only):
  3. Make sure compatible handlers are installed: +Via SSH:
    yum install ea-apache24-mod_suexec
    +yum install ea-apache24-mod_suphp
    +
    Or
    Install lsapi
    It's also possible to install via CloudLinux Wizard:
    +The mod_suexec and mod_suphp can be installed via cPanel EasyApache4 installation tool.

  4. Make sure users are enabled in the CageFS: +

Useful links:

Python Selector

Python Ыelector for Virtuozzo is available starting from the following packages version:

  • lve-2.1-14
  • alt-python27-cllib-3.2.47-1
  • lvemanager-7.8.8-1
  • cagefs-7.5.5-1

Please update or install the packages mentioned above using the following command:

yum update lve alt-python27-cllib lvemanager cagefs --enablerepo=cloudlinux-updates-testing
+

The installation of Python Selector is available via CloudLinux Wizard. Aslo, the information about manual installation can be found here.

Information about working with Python Selector via GUI can be found here.

Node.js Selector

Node.js Selector for Virtuozzo is available starting from the following packages version:

  • lve-2.1-14
  • alt-python27-cllib-3.2.47-1
  • lvemanager-7.8.8-1
  • cagefs-7.5.5-1

Please update or install the packages mentioned above using the following command:

yum update lve alt-python27-cllib lvemanager cagefs --enablerepo=cloudlinux-updates-testing
+

Installation for cPanel

To use Node.js Selector, install Node.js packages by running the following command:

yum groupinstall alt-nodejs
+

CloudLinux OS Shared 7 supports both ea-ruby24-mod_passenger and ea-ruby27-mod_passenger.

Note

The ea-apache24-mod-alt-passenger is deprecated in favor of ea-ruby24-mod_passenger and ea-ruby27-mod_passenger.

General information

General information can be found here.

Requirements

Information about Requirements can be found here.

Limitations

Information about limitations can be found here.

If during Node.js Selector usage on cPanel servers you get "ENOMEM npm ERR! errno-12" error, try to increase Memory limit in cPanel WHM → Server Configuration → Tweak Settings → System → Max cPanel process memory, then restart cPanel service with the following command to apply changes:

systemctl restart cpanel.service
+

Node.js deployment

Information about Node.js deployment can be found here.

Remote usage of Node.js interpreters

Information about Remote usage of Node.js interpreters can be found here.

Node.js Selector UI

Information about working with Node.js Selector via UI can be found here.

FAQ

Q: My CloudLinux Manager-> options menu is empty.

A: You don't have AccelerateWP enabled and PHP X-Ray enabled, so there is nothing to configure. Install and enable any of those features to see settings. This minor UI issue will be fixed in future updates.

Q: Dashboard says both: that data is updated and that I need to refresh it and both panels never disappear.

A: Just click the refresh button and reload the page, data will be loaded soon.

Q: Website monitoring does not appear enabled after clicking the toggle.

A: Just reload the page, the feature will be displayed as active.

Q: Website monitoring proposes me to enable autotracing while I disable it.

A: Issue is known and will be fixed soon.

Known restrictions and issues

  1. We do not recommend using disk quota inside of containers - PHP Selector may be not functional for a user when disk quota is exceeded for the user.

  2. The following systemd directives may break CageFS inside containers:

    • PrivateDevices
    • PrivateMounts
    • PrivateTmp
    • ProtectSystem
    • ReadOnlyDirectories
    • ReadWriteDirectories
    • InaccessibleDirectories
    • ProtectHome

Virtuozzo 6 and OpenVZ 6

Installation

Note

Make sure all containers are stopped prior to doing this operation. Or reboot the server after the installation.

Note

Please make sure you have vzkernel-headers and vzkernel-devel packages installed.

yum install vzkernel-headers vzkernel-devel
+
+$ wget -P /etc/yum.repos.d/ https://repo.cloudlinux.com/vzlve/vzlve.repo
+$ yum install lve-kernel-module
+

This will setup LVE module for VZ kernel, as well as DKMS to update that module each time VZ kernel is updated.

After this is done, you can add LVE support for any container on a node, at any time.

To make CloudLinux OS Shared work inside VZ container, VZ node has to be enabled. This should be done for any container where LVE support needs to be added:

$ vzctl set CT_ID --devnodes lve:rw --save
+

To disable LVE support for Container:

$ vzctl set CT_ID --devnodes lve:none --save
+

Inside the container, follow standard CloudLinux installation procedures.

CloudLinux OS Shared license is required for each VZ container.

Note

Some servers require increasing fs.ve-mount-nr on host node, otherwise CageFS will throw errors.

To increase fs.ve-mount-nr, on a host node:

  1. add fs.ve-mount-nr = 15000 to /etc/sysctl.conf;

  2. apply it with the sysctl -p command.

In very rare cases the value should be increased higher, up to 50000.

Available functionality

  • CageFS
  • PHP Selector
  • max entry processes
  • mod_lsapi
  • MySQL Governor

LILO boot loader

CloudLinux OS can be deployed on servers that don't have grub installed, by installing хороgrub first.

To do that:

  1. Make sure grub and kernel packages are not excluded. Edit file /etc/yum.conf and check exclude= line for presence of kernel* grub*.

  2. Backup lilo config file:

mv /etc/lilo.conf /etc/lilo.conf.bak
+
  1. Convert to CloudLinux OS Shared using deploy2cl utility.

  2. Check grub.conf – it should be configured automatically:

# cat /boot/grub/grub.conf
+default=0
+timeout=5
+title CloudLinux Server (2.6.18-294.8.1.el5.lve0.7.33)
+     kernel /boot/vmlinuz-2.6.18-294.8.1.el5.lve0.7.33 root=/dev/sda1  ro
+     root (hd0,0)
+     initrd /boot/initrd-2.6.18-294.8.1.el5.lve0.7.33.img
+     title linux centos5_64
+     kernel /boot/bzImage-2.6.33.5-xxxx-grs-ipv4-64 root=/dev/sda1  ro
+     root (hd0,0)
+
  1. Install grub to master boot record:
/sbin/grub-install /dev/sda
+
  1. Reboot and check that you are running CloudLinux OS Shared. uname -r should show something like: 2.6.18-294.8.1.el5.lve0.7.33.

Uninstalling

You can always uninstall CloudLinux OS. In this case, the system will be converted back to AlmaLinux or CentOS* (Depends on what system the conversion was done from).

WARNING

CentOS Linux 8 reached End Of Life (EOL) on December 31st, 2021. You can still uninstall CloudLinux and return to CentOS 8, but we don't guarantee stable operation of the system and its repositories after this action.

The following actions will be taken:

  1. LVE related packages will be removed.
  2. CloudLinux OS Shared repositories & yum plugin will be removed.
  3. AlmaLinux or CentOS* repositories will be set up.

In the end, the script will provide instructions on how to finish the conversion back to AlmaLinux or CentOS*. That will require removal of CloudLinux OS Shared kernel (manual step), and installation of AlmaLinux or CentOS* kernel (if needed).

WARNING

Do not forget to free up a CloudLinux OS Shared license by removing the server from the Servers section of your CLN account. After that, if you don't intend to use the license anymore, you can remove it to avoid being billed for it.

To uninstall CloudLinux OS, run:

$ wget -O cldeploy https://repo.cloudlinux.com/cloudlinux/sources/cln/cldeploy
+$ sh cldeploy -c
+

Now you have converted back to AlmaLinux or CentOS* and it is the time to install kernel.

To delete CloudLinux OS kernel, run (change the kernel package name to the one you've been using):

rpm -e --nodeps $(rpm -qa | grep kernel | grep lve)
+

To install new AlmaLlinux or CentOS* kernel once you deleted CloudLinux OS Shared kernel, run the following command:

yum install kernel
+

If yum says that the latest kernel is already installed, it is OK.

Please check your bootloader configuration before rebooting the system.

To remove unused kmods and lve libs, run:

yum remove lve kmod*lve*
+

Kernel package and related LVE packages should be deleted and the required kernel will be installed.

Before the reboot, the following command should be executed for restoring Apache and httpd.conf without mod_hostinglimits.

For EasyApache 3:

/scripts/easyapache --build
+

For EasyApache 4:

/usr/local/bin/ea_install_profile --install /etc/cpanel/ea4/profiles/cpanel/default.json
+

Note

Some of the packages from CloudLinux OS repo will still be present. They are the same as AlmaLinux or CentOS* packages, and don't have to be removed. They will be updated in the future from AlmaLinux or CentOS* repositories, as new versions come out.

+ + + diff --git a/cloudlinux_os_components/index.html b/cloudlinux_os_components/index.html new file mode 100644 index 000000000..3e795c595 --- /dev/null +++ b/cloudlinux_os_components/index.html @@ -0,0 +1,1872 @@ + + + + + + CloudLinux OS components | Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + +

CloudLinux OS components

General information and requirements

LVE-Stats 2

General information and requirements

Why is it needed?

  • Old LVE-statistics store averages as integer numbers, as % of CPU usage. If user used 100% of CPU for 1 second within an hour, it is only 1-2% for a minute, and 0 for 5 minutes. Data in old LVE-statistics is aggregated to 1-hour intervals. So, such peak load will noExat be recorded and we need to store data with much higher precision.
  • 100% CPU usage in old lve statistics means “all cores”. On 32 core servers usage is not visible for most users (as they are limited to 1 core).
  • Old LVE-statistics does not provide a way to determine a cause of LVE faults, i.e. what processes are running when user hits LVE limits.Example
  • Notifications in old LVE-statistics are not accurate because they are based on average values for CPU, IO, IOPS.
  • Old LVE-statistics functionality is hard to extend.

Major improvements and features

  • increased precision of statistics;
  • CPU usage is calculated  in terms of % of a single core (100% usage means one core);
  • lvestats-server emulates and tracks faults for CPU, IO, IOPS;
  • lvestats-server saves “snapshots” of user’s processes and queries for each “incident” - added new lve-read-snapshot utility;
  • improved notifications about hitting LVE limits (more informative and without false positives);
  • implemented ability to add custom plugins;
  • MySQL and PostGreSQL support;
  • more pretty, scalable, interactive charts;
  • snapshots include HTTP-requests.

Note

mod_proctitle has to be enabled for HTTP request collection to be available

What features will be implemented in the future?

  • Notifications for control panels other than CPanel.
  • Burstable Limits/server health: We are monitoring server health ( LA , memory , idle CPU ) and automatically decreasing/increasing limits based on server health.
  • Reseller Limits: plugin would analyze usage per group of users (reseller’s usage), and do actions.
  • Suspend/notify plugin: would detect that user is being throttled for 10 minutes, and suspend him (just because), or notify, or increase limits.

Installation and update

To install, please execute:

yum install lve-stats
+

To update:

yum update lve-stats
+

Settings of old lve-stats (ver. 0.x) are imported automatically on the first install/update of a new lve-stats package.

SQLite database file is located in /var/lve/lvestats2.db, data from old lve-stats (ver. 0.x) are being migrated automatically in the background. Migrating process can last 2-8 hours (during this time lags are possible when admin is trying to check statistics, at the same time users will not be affected). Migrating the latest 30 days, SQLite DB stable migration is provided.

Currently, the new lve-stats supports all databases available in CloudLinux OS Shared.

Note

You can also use LVE-stats 2 CLI

Downgrade

If you have any problems after update, downgrade lve-stats2 to the previous stable version by running:

yum downgrade lve-stats
+

and contact CloudLinux OS Shared support at https://cloudlinux.zendesk.com/hc/requests/new

Note

You may need to rename *.rpmsave files to original ones in order to restore settings for old lve-stats (/etc/sysconfig/lvestats, /etc/sysconfig/cloudlinux-notify).

Note

You can also use LVE-stats 2 CLI

Configuration

The main configuration file /etc/sysconfig/lvestats2 contains the following options:

  • db_type - selects appropriate database type to use;

  • connect-string - connection string for PostGreSQL and MySQL database, has the following form:

    connect_string = USER:PASSWORD@HOST[:PORT]/DATABASE
    +

    Default port is used for specific database, if port is not specified (typical port is 3306 for MySQL and 5432 for PostGreSQL). Connection string is not used for sqlite database.

  • server_id - sets the name of the server (at most 10 characters). This option is to use with centralized database ( PostGreSQL or MySQL). For use with sqlite database, value of this option should be "localhost" (without quotes).

  • plugins – path to directory containing custom plugins for lve-stats (default path /usr/share/lve-stats/plugins).

  • db_timeout - period of time to write data to database (in seconds); default value is 60 seconds.

  • timeout - timeout for custom plugins (seconds). If plugin execution does not finish within this period, plugin is terminated. Default value is 5 seconds.

  • interval - duration of one cycle of lvestats-server (seconds). This should be less than total duration of execution of all plugins. Default value is 5 seconds. Increasing this parameter makes precision of statistics worse.

  • keep_history_days - period of time (in days) to keep history in database. Old data is removed from database automatically. Default value is 60 days.

  • mode – sets compatibility output mode (compatibility with older lveinfo version

    • Value v1 enables compatibility with old version of lveinfo.
    • Value v2 enables extended output mode, but can break LVE plugins for control panels (statistics in LVE Manager, Resource Usage, etc). Support of v2 mode will be added to LVE plugins in the recent future. When mode parameter is absent, later version of lveinfo is implied.
  • disable_snapshots - disable snapshots and incidents. +Possible values:

    • true
    • false
  • hide_lve_more_than_maxuid - disable displaying of lve ids more than max uid in resource usage. +Possible values:

    • true
    • false
  • use_big_uids - the option is available from lvestats version 3.0.14-1. It allows using the user uids more than 109 and up to 231-2 (2 147 483 646). Top border is the biggest value which kmodlve can use as LVE ID. You should recreate lvestats database by command lve-create-db --recreate if you change the option's value from false to true. +Possible values:

    • true
    • false

Configuration files for plugins are located in /etc/sysconfig/lvestats.config directory.

/etc/sysconfig/lvestats.config/SnapshotSaver.cfg contains the following options:

  • period_between_incidents - the minimal interval of time between incidents (in seconds). If minimal interval of time between LVE faults is greater than value specified, than new "incident" will begin and new snapshots will be saved. Default value is 300 seconds.
  • snapshots_per_minute - the maximum number of snapshots saved per minute for specific LVE id (default is 2).
  • max_snapshots_per_incident - the maximum number of snapshots saved for one "incident". Default is 10.
  • litespeed - enable or disable data import from LiteSpeed, default is auto (autodetect); On|on|1 - force use litespeed; Off|off|0 - force use apache

/etc/sysconfig/lvestats.config/StatsNotifier.cfg contains the following options:

  • NOTIFY_ADMIN – enables notification for admin (Y/N, default N);
  • NOTIFY_RESELLER – enables notification for reseller (Y/N, default N);
  • NOTIFY_CUSTOMER - enables notification for customers (Y/N, default N);
  • NOTIFY_INCLUDE_RESELLER_CUSTOMERY=notify all users, N=notify only hoster's users (whos reseller is root), default = N;
  • NOTIFY_CPU – notify about CPU faults when customer hits 100% of his CPU limit (Y/N, default N);
  • NOTIFY_IO - notify about IO faults when customer hits 100% of his IO limit (Y/N, default N);
  • NOTIFY_IOPS - notify about IOPS faults when customer hits 100% of his IOPS limit (Y/N, default N);
  • NOTIFY_MEMORY - notify about memory faults (Y/N, default N);
  • NOTIFY_EP – notify about entry processes faults (Y/N, default N);
  • NOTIFY_NPROC – notify about number of processes faults (Y/N, default N);
  • NOTIFY_MIN_FAULTS_ADMIN – minimum number of faults to notify admin (default 1);
  • NOTIFY_MIN_FAULTS_USER – minimum number of faults to notify customer (default 1);
  • NOTIFY_INTERVAL_ADMIN – period of time to notify admin (default 12h);
  • NOTIFY_INTERVAL_USER – period of time to notify customer (default 12h);
  • NOTIFY_FROM_EMAIL - sender email address. For example: NOTIFY_FROM_EMAIL=main_admin@host.com;
  • NOTIFY_FROM_SUBJECT - email message subject. For example: NOTIFY_FROM_SUBJECT=Message from notifier
  • REPORT_ADMIN_EMAIL - custom email for admin reporting. For example: REPORT_ADMIN_EMAIL=report_email@host.com
  • NOTIFY_CHARSET_EMAIL – charset type for email. Available for lve-stats-2.9.4-1 and later. Default is us-ascii. For example: NOTIFY_CHARSET_EMAIL=utf-8. If your email templates include non-Latin letters, it is recommended to use the UTF-8 encoding.

These values can also be set using cloudlinux-config CLI utility

Templates of notifications are located here:

  • /usr/share/lve/emails/en_US/admin_notify.txt
  • /usr/share/lve/emails/en_US/reseller_notify.txt
  • /usr/share/lve/emails/en_US/user_notify.txt
  • /usr/share/lve/emails/en_US/admin_notify.html
  • /usr/share/lve/emails/en_US/reseller_notify.html

Note

Notifications about LVE faults are implemented for CPanel, Plesk, and DirectAdmin.

After changing any options above, please restart lvestats service:

service lvestats restart
+

/etc/logrotate.d/lvestats - configuration file for /var/log/lve-stats.log rotation

Note

You can also use LVE-stats 2 CLI

LVE-stats2 and DB servers compatible work setup

LVE-stats2 and MySQL DB server compatible work setup

Note

Run all the commands below under root.

1. MySQL server setup

If MySQL Server is not installed, then install it according to control panel documentation.

For non-panel system:

  • CloudLinux OS Shared 6

    yum install mysql mysql-server
    +service mysqld start
    +chkconfig mysqld on
    +
  • CloudLinux OS Shared 7

    yum install mariadb mariadb-server
    +systemctl start mariadb.service
    +systemctl enable mariadb.service
    +

2. Database setup

  • Run MySQL administrative utility: mysql.

  • In utility run the commands:

    • creating server DB. Also, check Note below.
    CREATE DATABASE db_lvestats2;
    +
    • creating a user for LVE Stats 2 server to work under. Also, check Note below.
    CREATE USER 'lvestats2'@'localhost' IDENTIFIED BY 'lvestats2_passwd';
    +
    • granting all the privileges for all DB tables to the user. Use the username and DB name from the points above.
    GRANT ALL PRIVILEGES ON db_lvestats2.* TO 'lvestats2'@'localhost';
    +
    • refreshing privileges information.
    FLUSH PRIVILEGES;
    +
    • Exit administrative utility (Ctrl+d).

Note

DB name, username and their passwords above are given for an example - you can use any of your choices. Using old DB from LVE Stats version 1 is also acceptable as LVE Stats2 uses different tables and the old information will not be corrupted.

3. LVE-stats2 setup

  • Stop LVE Stats 2 server by running the command:
service lvestats stop
+
  • In server configuration file /etc/sysconfig/lvestats2, edit the following options: +
    • db_type = mysql
    • connect_string = lvestats2:lvestats2_passwd@localhost/db_lvestats2

Note

connect_string option value is used in format: user:pass@host/database. +Username, password and DB name must be the same as in point 2 of Database Setup above.

  • After making changes in configuration files run:
/usr/sbin/lve-create-db 
+

For DB primary initialization (creating tables, indexes, etc). There is no need to create anything in the DB manually.

  • When done, restart server by running:
service lvestats restart
+

4. Additional security settings

If you need to provide access to LVE Stats information utilities (lveinfo, lvechart, lve-read-snapshot) for different users, then we recommend creating one more DB user with read-only privilege to guarantee information security. It can be done by running the following commands in administrative utility:

  • creating a user (check Note above)
CREATE USER 'lvestats2_read'@'localhost' IDENTIFIED BY 'lvestats2_read_passwd';
+
  • granting read-only privilege to the user
GRANT SELECT ON db_lvestats2.* TO 'lvestats2_read'@'localhost';
+
  • refreshing privileges information
FLUSH PRIVILEGES;
+

If LVE Stats2 server is set correctly (see information below), the information utilities will work under this user.

If you need to provide access to information utilities to other users, then in order to guarantee information security you should do the following:

  • Assign permission 600 to the main configuration file (/etc/sysconfig/lvestats2), so that it could be read only by LVE Stats 2 server and by utilities that run under root.
  • Copy /etc/sysconfig/lvestats2 to /etc/sysconfig/lvestats2.readonly, assign permission 644 to the new file, so that it could be read by any user but could only be changed by root.
  • In /etc/sysconfig/lvestats2.readonly file, in the line connect_string, specify DB user with read-only permission, created above.

These steps allow hiding main DB user username/password from other system users.

If there is no need in such access differentiation, then /etc/sysconfig/lvestats2 file access permission should be 644, so that it could be read by all users and could be changed only by root.

5. Using special characters in database password

Since scheme ://user:password@host[:port]/database_name URI is used in connect_string config option, then usage of special characters in user DB password is not allowed.

To use special symbols in the password, it must be converted to escape-sequence. You can convert a password to escape-sequence in a console as follows:

echo -n '[You_P@$$]:' | perl -MURI::Escape -ne 'print uri_escape($_)."\n"'
+%5BYou_P%40%24%24%5D%3A
+

Or replace the symbols manually:

!    #    $    &    '    (    )    *    +    ,    /    :    ;    =    ?    @   [    ]
+%21  %23  %24  %26  %27  %28  %29  %2A  %2B  %2C  %2F  %3A  %3B  %3D  %3F  %40  %5B %5D
+

After that сonnect_string will look as follows:

сonnect_string=lvestats2:%5BYou_P%40%24%24%5D%3A@localhost/db_lvestats2
+

LVE-stats2 and PostgreSQL DB server compatible work setup

Note

Run all the commands below under root.

1. PostgreSQL server installation and setup

  • PostgreSQL installation and initialization

    For control panels use proper documentation for installation on the links: сPanel, Plesk.

    For non-panel CloudLinux OS Shared, run the following commands:

    • CloudLinux OS Shared 6
    yum install postgresql-server postgresql
    +service postgresql initdb
    +service postgresql start
    +chkconfig postgresql on
    +
    • CloudLinux OS Shared 7
    yum install postgresql-server postgresql
    +postgresql-setup initdb
    +systemctl start postgresql
    +systemctl enable postgresql
    +
  • Setup

    • In /var/lib/pgsql/data/pg_hba.conf config file change user authentication mode. Add the following lines (place before all other authentication parameters):

      # IPv4 local connections for lve-stats-2.x
      +host dblvestat all 127.0.0.1/32 password
      +# IPv6 local connections for lve-stats-2.x
      +host dblvestat all ::1/128 password
      +

      These lines enable user authentication by the password for IP4/IP6 connections. You can set other modes if needed.

    • Apply config changes by running:

      service postgresql restart
      +

2. DB for LVE-stats-2.x - creating and setup

  • Run standard PostgreSQL psql administrative utility:
sudo -u postgres psql postgres 
+

OR for сPanel

psql -w -U postgres
+
  • In utility run:

    • creating server DB. Also, check Note below.

      CREATE DATABASE dblvestat;
      +
    • creating a user for LVE Stats 2 server to work under. Also, check Note below.

      CREATE USER lvestat WITH password 'passw';
      +
    • granting lvestat user all privileges for work with dblvestat DB.

      GRANT ALL privileges ON DATABASE dblvestat TO lvestat;
      +
    • exit psql utility:

      \q
      +

      OR alternatively:

      Ctrl+d
      +

Note

DB name, username and their passwords above are given for an example - you can use any of your choices. Using old DB from LVE Stats version 1 is also acceptable as LVE Stats 2 uses different tables and the old information will not be corrupted

3. LVE-stats-2.x setup

  • Stop lve-stats2 server by running:
service lvestats stop
+
  • In server config file /etc/sysconfig/lvestats2 edit options for connecting to DB:
db_type = postgresql
+connect_string=lvestat:passw@localhost/dblvestat
+If DB is going to be used as centralized for multiple hosts then collect_usernames parameter must be changed:
+collect_usernames=true
+

Note

connect_string option value is of the format: user:pass@host/database. Username, password and DB name must be the same as in Database Setup section above.

  • After making changes in configuration files, for DB primary initialization (creating tables, indexes, etc), run:
/usr/sbin/lve-create-db 
+
  • There is no need to create anything in the DB manually. When done, restart server by running:
service lvestats restart
+

4. Additional security settings

If you need to provide access to LVE Stats information utilities (lveinfo, lve-read-snapshot ) for other users (or if CageFS is disabled), then in order to guarantee DB security the following steps are required:

  • Create a DB user with read-only permission:
CREATE USER lvestat_read WITH password 'passw';
+GRANT CONNECT ON DATABASE dblvestat to lvestat_read;
+\connect dblvestat;
+GRANT SELECT ON lve_stats2_history, lve_stats2_history_gov, lve_stats2_history_x60, lve_stats2_incident, lve_stats2_servers, lve_stats2_snapshot, lve_stats2_user TO lvestat_read;
+
  • Assign root ownership and permission 600 to the main configuration file (/etc/sysconfig/lvestats2), so that it could be read only by LVE Stats 2 server and by utilities that run under root.

  • Copy /etc/sysconfig/lvestats2 to /etc/sysconfig/lvestats2.readonly, assign permission 644 to the new file, so that it could be read by any user but could be changed only by root.

  • In /etc/sysconfig/lvestats2.readonly file, in the line connect_string, specify DB user with read-only permission, created above.

    These steps allow hiding main DB user username/password from other system users.

    If there is no need in such access differentiation, then /etc/sysconfig/lvestats2 file access permission should be 644, so that it could be read by all users and could be changed only by root.

  • When done, restart server by running:

service lvestats restart
+

5. Using special characters in database password

Since scheme ://user:password@host[:port]/database_name URI is used in connect_string config option, then usage of special characters in user DB password is not allowed.

To use special symbols in the password, it must be converted to escape-sequence. You can convert a password to escape-sequence in a console as follows:

echo -n '[You_P@$$]:' | perl -MURI::Escape -ne 'print uri_escape($_)."\n"'
+%5BYou_P%40%24%24%5D%3A
+

OR replace the symbols manually:

!    #    $    &    '    (    )    *    +    ,    /    :    ;    =    ?    @    [    ]
+%21  %23  %24  %26  %27  %28  %29  %2A  %2B  %2C  %2F  %3A  %3B  %3D  %3F  %40  %5B  %5D
+

After that сonnect_string will look as follows:

сonnect_string=lvestats2:%5BYou_P%40%24%24%5D%3A@localhost/db_lvestats2
+

Customize LVE-stats2 notifications

Jinja2 is used as a template engine for the notifications.

The templates for notifications are located in /usr/share/lve/emails/LOCALE, where LOCALE is the directory with localization name (language codes are formed according to ISO 639-1 and ISO 639-2).

By default the templates for English are set: /usr/share/lve/emails/en_US..

/usr/share/lve/emails/en_US contains the following templates:

  • admin_notify.html admin_notify.txt for administrator;
  • reseller_notify.html reseller_notify.txt for reseller;
  • user_notify.txt for user.

Starting from lve-stats-4.1.2, it allows server administrators to use their own lvestats notifier email notification templates.

To use the custom templates, place them and the locales.json file to the /etc/cl.emails.d/LOCALE directory. File names are the same as in general /etc/cl.emails.d/LOCALE file.

If the /etc/cl.emails.d/LOCALE doesn't exist or doesn't contain the templates, you can use the /usr/share/lve/emails/LOCALE directory, as it was in previous versions of lve-stats.

Please do not edit the templates in the the /usr/share/lve/emails and place the new updated templates in the /etc/cl.emails.d directory.

The notification is formed as Multipart content type RFC1341(MIME).

The plain text is taken from the .txt files, html version - from the .html template.

In case when only one template is present (.txt or .html) the notification is sent as a Non-multipart content type notification.

It is better to use Multipart content type notifications because when a mail client can not display an html-format message, then it will be displayed as plain text version.

To localize notifications, copy standard templates into directory with the proper locale name and translate the template. Also you can customize the main template making proper changes into it.

The list of variables that can be used in the template:

Variable Example Description
TONAME Customer Notification receiver user name. Taken from profile in the control panel, by default - Customer for user, Administrator for administrator, Reseller for reseller.
TOMAIL support@cloudlinux.com Notification receiver email address.
DOMAIN wordpress.test247.cloudlinux.com Main domain. Available only for user.
LOCALE en_US Locale in which the notification is sent. Available only for user.
RESELLER root User reseller. Available only for user.
PERIOD 12 hours Verification and notification sending period.
LOGIN wordpress User login in the system.
ID 500 User ID in the system.
lPMem lEP PMemF lVMem anyF IOf VMemF lCPU aIOPS aEP aPMem IOPSf lIO lIOPS aIO EPf aCPU aVMem NprocF aNproc lNproc CPUf See description in lveinfo --help output. Available only for users
STATS_HTML html table with the list of users that exceeded limits. Available for administrator and reseller.
STATS ASCII - table with the list of users that exceeded limits. Available only for admins and resellers.

Sender’s email address by default is administrator email address from control panel settings (root@{hostn_name} if there is no email in the control panel).

It can be changed with NOTIFY_FROM_EMAIL option in the config /etc/sysconfig/lvestats.config/StatsNotifier.cfg

For example:

NOTIFY_FROM_EMAIL=support@hostername.com

To apply changes restart lve-stats service:

service lvestats restart
+

for CloudLinux OS Shared 7

systemctl restart lvestats.service
+

Default subject is Hosting account resources exceeded.  It can be changed for each template (and for localized templates as well). To change subject, in the very beginning of the file (no blank lines allowed in the beginning of the template) add the field Subject:, leave two blank lines after it and add template body.

Customized subjects can be taken only from the templates with the resolution *.txt (admin_notify.txt, reseller_notify.txt, user_notify.txt). Changes apply without lvestats restart.

For backward compatibility the subject can be also changed with the key NOTIFY_FROM_SUBJECT in the config /etc/sysconfig/lvestats.config/StatsNotifier.cfg.

Customized subjects have the higher priority than the key NOTIFY_FROM_SUBJECT.

Example for the file user_notify.txt

Subject: Customized subject example
+Dear {{TONAME}},
+ 
+Your {{DOMAIN}} web hosting account exceeded one or more of its resources within the last {{PERIOD}}.
+{% if epf %}Exceeded the maximum of {{lep}} concurrent website connections. Your website was not available {{epf}} times because of this problem.
+{% endif %}{% if pmemf %}Exceeded the physical memory limit of {{lpmem}}KB. Your website was not available {{pmemf}} times because of this problem.
+{% endif %}{% if vmemf %}Exceeded the virtual memory limit of {{lvmem}}KB. Your website was not available {{vmemf}} times because of this problem.
+{% endif %}{% if nprocf %}Exceeded the number of processes limit of {{lnproc}}. Your website was not available {{nprocf}} times because of this problem.
+{% endif %}{% if cpuf %}You reached limit of {{lcpu}} of total server CPU usage {{cpuf}} times. Your website was forced to load slower to reduce its CPU usage.
+{% endif %}{% if iof %}You reached limit of {{lio}}KB/s disk io rate {{iof}} times. The disk io speed for your account was slowed as a result of this problem.
+{% endif %}{% if iopsf %}You reached limit of {{liops}} I/O operations {{iopsf}} times. The disk io speed for your account was slowed as a result of this problem.
+{% endif %}
+ 
+To view full details about your web hosting account's resource usage, including the time of each incident listed above, please click the link below and log into your cpanel hosting control panel, then click the "Resource Usage" link under the "Logs and Statistics" section.
+http://{{DOMAIN}}:2083
+ 
+If your account is regularly exceeding it's available resources, please consider upgrading to a higher level hosting plan that includes more resources. If you have any questions or need help with anything, just reply to this email and let us know.
+ 
+Sincerely,
+ 
+Your Friendly Web Hosting Support Team
+

Note

The email template should be in the UTF-8 encoding. The other encodings are not supported.

Starting from lve-stats v. 3.0.15-1, it allows to localize the words that before were imported directly from the lve-stats program code and couldn't be changed.

The email template looks like follows:

Dear {{TONAME}},
+Following accounts experienced issues in the past {{PERIOD}}{% if HOSTNAME is defined %} on host {{HOSTNAME}}{% endif %}
+
+{{STATS}}
+
+Sincerely,
+Your Friendly Web Hosting Support Team
+

Before, the {TONAME} was replaced with “Administrator”/”Reseller”/”Customer” according to the type of the addressee. The {PERIOD} was replaced with the duration of the period during which the limits faults were detected. The period duration includes the words "days"/"hour"/"minutes"/"seconds".

In the new version, in order for the lve-stats notifier to include these words in the letter in the language corresponding to the addressee locale, you should create a file for the required locale /usr/share/lve/emails/<encoding_name>/locale_defines.json with the following content:

{
+ "NOTIFY_FROM_SUBJECT": "Your server has lve-stats faults",
+ "PERIOD": {
+   "days": "days", "hours": "hour(s)", "minutes": "minutes", "seconds": "seconds"
+ },
+ "TONAME": {
+   "admin": "Administrator", "reseller": "Reseller", "customer": "Customer"
+ }
+}
+

The file format should be JSON, and the file encoding should be UTF-8. If this file is found and successfully read, the words from it will be used in emails. +In case of any file reading/parsing error, a corresponding message will be written in the lve-stats log, and the contents of the file will be completely ignored. +If a key in the JSON file content is missing, then lve-stats notifier uses the word contained in the body of the program (just like in previous lve-stats versions). +Also, this file allows you to override/localize the subject of the email.

It should be noted that this override of the subject line is the highest priority. I.e., if you want to use the subject from the configuration file /etc/sysconfig/lvestats.config/StatsNotifier.cfg, then do not specify the NOTIFY_FROM_SUBJECT key in the locale_defines.json.

Plugins

LVE-stats2 comes with a set of generic plugins:

Plugin Name Order Default Period (seconds) Description
LVECollector 1000 Y 5 Collects usage/limits data from /proc/lve/list
CPUInfoCollector 2000 Y 5 collents info about CPU - /proc/cpuinfo
LVEUsernamesCollector 3000 Y 3600 collects usernames & user ids to match uid <-> lve id later on
LVEUsageAnalyzer 4000 Y 5 analyzes usage of LVE
LveUsageAggregator 5000 Y 60 aggregates data by time periods
DBGovSaver 6000 Y 5 Saves data about database governor
FileSaver 7000 Y 5 Saves LVE data into /var/lve/info
CloudLinuxTopFileSaver 8000 Y 60 saves data used by cloudlinux-top to /var/lve/cloudlinux-top.json
DBSaver 9000 Y 60 save LVE data to database
DbUsernamesSaver 10000 Y 3600 saves users name to database
DBSaverX60 11000 Y 3600 saves aggregated hourly data into database
SnapshotSaver 12000 Y 30 collects & saves snapshots data
StatsNotifier 13000 Y varied notify user/admin based on usage
HistoryCleaner 14000 Y 3600 removes old usage
ResMEMCollector 1500 N 30 collects physical memory usage from processes RES field instead of /proc/lve/list
LVEDestroyer - N 5 destroys LVEs that weren't active for X iterations. Number of iterations is passed from config using iterations variable. iterations=0 means plugin disabled

To enable non-default plugin, copy or link it to /usr/share/lve-stats/plugins directory.

For example to enable ResMEMCollector plugin, do:

ln -s /usr/share/lve-stats/plugins.other/res_mem_collector.py /usr/share/lve-stats/plugins/
+service lvestats restart
+

Creating a plugin for LVE-stats2

Introduction

LVE Stats 2 complex has scalable architecture, which allows to connect custom plugins.

LVE Stats server searches for plugins in the directory which is specified with plugins parameter of server’s /etc/sysconfig/lvestats2 configuration file. Default directory is /usr/share/lve-stats/plugins.

Each plugin must be of a Python class, must be written in Python language and its file must have .py extension. Files with all other extensions will be ignored. For normal server work access permission 400 is enough; owner – root .

Plugin classes can be of the same name, but better not, because classes' names can affect the set of parameters in set_config method. You can find detailed plugins' configuring information below, in appropriate chapter.

Plugin class must contain execute() method, which is invoked by the server every 5 seconds (by default, can be changed by interval parameter of configuration file). +Also set_config method (configuration settings) can be available. You can find more info in Plugins Configuration chapter.

Additionally the following attributes can be set (plugin class instance variable):

  • order (integer) - defines plugin's position in the server's plugin list, (more info in Servers Plugin Arrangement ).
  • timeout (integer or float ) – the longest allowable duration of one launch of the plugin (execute method). Default value of timeout parameter is 5 seconds.
  • period (integer) – sets the interval between two launches of execute plugin method in seconds. If not defined, then plugin runs every 5 seconds ( interval parameter in configuration file).

When execute() method of the plugin is invoked, the server creates an attribute now in it, where launch time is recorded. This value is equal to what a standard Python function time.time() returns. All the plugins launched one after another receive the same  value of now attribute from the server. now is overwritten before execute() method is invoked.

The previous value of now attribute is not saved by the server. If plugin needs it, it has to save it by itself.

Plugin class can be inherited from LveStatsPlugin class, which is the part of the server itself. This is not obligatory, but inheritance can help to avoid different errors in servers work, particularly if a plugin doesn't contain required execute method.

LveStatsPlugin class is defined in the file: /opt/alt/python27/lib/python2.7/site-packages/lvestats/core/plugin.py .

Server plugin arrangement

When the server starts, it performs the search of plugins in the directory specified in /etc/sysconfig/lvestats2 configuration file. This directory is scanned only when the server starts, therefore if any plugin was added into the directory, the server has to be restarted with the following command: +

service lvestats restart.
+

After successful restart, the plugins are graded and executed ascending by order attribute. If any plugin order attribute is not set, it is considered as a Python language constant sys.maxint (which is usually 9223372036854775807). This in fact means that such plugins will be executed in the last. +If any plugins has similar order meanings, their execution order is unpredictable.

The server invokes execute method of all plugins one after another.

When the server invokes execute() method of any plugin, it transmits a data dictionary ( lve_data argument) into plugin. The dictionary is common for all the plugins. Any plugin can read, write and change any data in this dictionary. LVE Stats 2 server doesn't control this area. That is why one must be careful while developing new plugins, in order not to change or corrupt other plugins' data which can break their functionality.

If an exception occurs in execute() method, its text and python stack trace is recorded into server log /var/log/lve-stats and all the changes made to lve_data dictionary before the exception happened are lost.

The keys of the lve_data dictionary are recommended to look like PluginName_Key , in order the plugins do not corrupt other data accidentally.

Server contains some standard plugins which define and use the following keys in the common dictionary lve_data: LVE_VERSION, stats, old_stats, procs and lve_usage . User plugins can use data from these keys, but it is recommended not to change them if there is no special need, because it can break the next plugins in the execution queue.

Key Content
LVE_VERSION LVE version. The same as console command lvectl lve-version produces.
stats Dictionary, that contains lve id’s as keys and LVEStat class objects as values. Every LVEStat object contains values of usages and limits taken from /proc/lve/list file for every LVE Id . Dictionary keys – integer lve id , including 0 for “ default ” LVE. This dictionary is updated on each iteration of lvestats-server (every 5 seconds by default). LVEStat – is a standard server class, it can be imported with the command from lvestats.core.lvestat import LVEStat. The class is described in the file /opt/alt/python27/lib/python2.7/site-packages/lvestats/core/lvestat.py . Here you can find the whole list of data fields and their functions.
old_stats stats content from the previous iteration. Before the first iteration – empty dictionary.
totalHz When LVE_VERSION is 4, real CPU frequency in Hz multiplied by number of cores. When LVE_VERSION > 4, CPU speed is in conventional units and equals to 1000000000 * cores (1 GHz per core).
procs Quantity of CPU cores.
lve_usages Contains accumulated LVE statistics for each 5-seconds interval in current minute. Cleared each minute.
lve_usage Contains aggregated LVE Statistics for “previous” minute to store to database. Overwritten each minute.

Each plugin’s instance lifetime is from the moment it was loaded till the server stops working. But if execute() method working time exceeds timeout, the plugin will be terminated and restarted in the next iteration. All changes to the lve_data dictionary will be lost.

During servers graceful shutdown (restart, server shutdown, commands service lvestats stop, service lvestats restart ), each plugin receives SIGTERM signal. +This is useful to correctly unload the plugin (terminate all subsidiary processes, save data to files etc.). If a plugin doesn't need to “finalize” its execution before termination, then there's no need to implement this signal handler. Below you can see an example of such handler.

Note

If a plugin implements handler for SIGTERM, then this handler must end with sys.exit(0) command. Otherwise plugin process will not be terminated correctly and will become orphaned.

Plugin configuration

LVE Stats 2 Server allows to configure each plugin separately.

On initialization stage the server invokes set_config() method of the plugin and locates there a dictionary which contains:

  • all parameters from file /etc/sysconfig/lvestats2 (global).
  • plugin's individual configuration file parameters (if one exists). Configuration files must be located in /etc/sysconfig/lvestats.config directory, have .cfg extension and be the same format as /etc/sysconfig/lvestats2 . Files in this directory are matched with the plugins by name. For instance, if plugin class is Plugin1_class , then server will try to find and download /etc/sysconfig/lvestats.config/Plugin1_class.cfg. Names are case sensitive. If any plugin doesn't have an individual configuration file, then it's not an error. In this case plugin will just receive parameters from /etc/sysconfig/lvestats2 .

Note

An individual configuration file of every plugin is loaded after server configuration file. That is why if it contains any parameters with names similar to ones of server config, then plugin will use parameters from its individual config rather than server config parameters.

If a plugin doesn't require any configuration to be done, then set_config method can be skipped.

In addition, plugins can use their own configuration methods.

Types of plugins

According to server architecture, plugins can be of the following types:

  • collectors
  • analyzers
  • persistors
  • notifiers

Collectors are designed to collect information; analyzers – to analyze it and form some other data on its basis; persistors – to save information from the common dictionary into files, databases, etc.; notifiers - to notify system users about any events.

This division is rather arbitrary. There is an opportunity to execute all the actions on collection, analysis and saving the information in one and only plugin. But at the same time the division into functionally independent parts allows to build flexible and easily configurable system for collecting and processing the data.

Also it is possible to implement the systems of lazy-write, planning of collecting/processing tasks and notifying users about different events.

Examples of plugins

Here is a practical example of a user plugin.

Specification:

  1. To trace specified file size changes. The name of file being traced must be specified in configuration file, which allows to change it without modifying the plugin itself. If file size has been changed, it has to be written as a message into our log. The name of log must be specified in configuration file as well.

  2. File size must be checked with default interval (5 seconds), and log notification must be held once a minute (to avoid resource expend for possibly regular write).

  3. System administrator must receive emails with file size at the moment the email was sent. These notifications must be sent even if the file size hasn’t been changed. Notification emails must be read periodicity from configuration file as well as sender/receiver emails .

As file size check, fixing the result and notification sending must be held with different periods, then it’s impossible to realize all the tasks by means of one plugin. +The fact that one minute (60 seconds) is multiple to 5 seconds doesn’t matter in this case, because default period can be changed in server’s configuration file, but the condition of fixing the result once a minute is a part of the specification, which can not be violated. In addition, notification email period is known in advance, as it is specified by user in configuration file.

That is why we realize 4 plugins: collector, analyzer, persistor and notifier.

Collector

Collector's aim is to determine the size of a proper file.

# FSize_watcher_collector.py
+# Example plugin for monitoring file size.
+# Part 1. Collector
+
+import os
+from lvestats.core.plugin import LveStatsPlugin 
+
+# Key name
+COLLECTOR_KEY = 'FSizeWatcher_fsize'
+COLLECTOR_KEY_FILENAME = 'FSizeWatcher_fname'  
+
+class FSize_watcher_collector (LveStatsPlugin):
+	# this plugin should be first in chain
+	order = 0
+	# File to monitoring
+	file_to_monitoring = None 
+	
+	def __init__(self):
+		pass 
+		
+	# Sets configuration to plugin
+	def set_config(self, config):
+		self.file_to_monitoring = config.get('file_to_monitoring', None)
+		pass
+	# Work method
+	def execute(self, lve_data):
+		try:
+			# if monitoring file absent, do nothing
+			if self.file_to_monitoring is None or not os.path.exists(self.file_to_monitoring):
+		return 
+		
+			# Get file size
+			stat_info = os.stat(self.file_to_monitoring)
+			fsize = stat_info.st_size 
+			
+			# Place file name and file size to server data dictionary
+			lve_data[COLLECTOR_KEY_FILENAME] = self.file_to_monitoring
+			lve_data[COLLECTOR_KEY] = fsize
+		except (OSError, IOError):
+			# file absent or any other error - remove size from dictionary
+			del lve_data[COLLECTOR_KEY]
+

Plugin algorithm is extremely simple – file size is read and written into data dictionary. Files name is read from set_config method configuration. If the name is not specified, then None is written into appropriate variable. All the errors are completely ignored (e.g. if specified file doesn't exist or there's no way to read any of it's information).

order attribute is specified as 0 to make this plugin go the first among three. Data collector must always be the first in plugins logical chain, because it provides all the necessary information for the analyzer which goes the next. Specific values of order can be of any kind, but what is important is that when the server starts, all the plugins line up in proper sequence: collector – analyzer – persistor .

In order to make plugin work, we have to create configuration file /etc/sysconfig/lvestats.config/FSize_watcher_collector.cfg with the following content:

# Config file for FSize_watcher_collector plugin
+# Please define monitoring file here
+# file_to_monitoring = /usr/local/cpanel/logs/error_log
+file_to_monitoring = /usr/local/cpanel/logs/access_log
+

Note that file name FSize_watcher_collector without .cfg extension matches plugin class name.

file_to_monitoring option is read by plugin in set_config method and contains file’s full name for monitoring.

Files for monitoring, suggested in the actual example - /usr/local/cpanel/logs/error_log and /usr/local/cpanel/logs/access_log - are real, these are cPanel control panel logs.

The first file is errors log; the second is appeal log, is refreshed during common work with panel (e.g. if user email address is changed).

Errors log tracking is more important, but appeal log monitoring allows to illustrate plugins work more in details, because it is refreshed more often.

Note that plugin can monitor one file only.

Analyzer

Analyzer decides if the file's size has changed and gives a command to persistor to refresh log.

# FSize_watcher_analyzer.py
+# Example plugin for monitoring file size.
+# Part 2. Analyzer 
+
+from lvestats.core.plugin import LveStatsPlugin 
+
+# Key name from collector plugin
+COLLECTOR_KEY = 'FSizeWatcher_fsize' 
+
+# Key name 1 for saver plugin
+SAVER_KEY = 'FSizeWatcher_fsize_to_store'
+# Key name 2 for saver plugin
+SAVER_DATA_PRESENCE = 'FSizeWatcher_fsize_present'  
+
+class FSize_watcher_analyzer (LveStatsPlugin):
+	# this plugin should be second in chain
+	order = 1
+	# Last file size
+	file_last_size = 0
+	# Plugin run period in secondsperiod = 60 
+	
+	def __init__(self):
+		pass 
+		
+	# work method
+	def execute(self, lve_data):
+		# Default setting for saver
+		lve_data[SAVER_DATA_PRESENCE] = 0
+		# Check presence data
+		if COLLECTOR_KEY not in lve_data:
+		return 
+		
+		# Get file size from server data dictionary
+		fsize = lve_data[COLLECTOR_KEY] 
+		
+		# Check, if file size changed, store it for saver plugin
+		if fsize == self.file_last_size:
+			return 
+			
+		# Put new size for saver plugin
+		lve_data[SAVER_KEY] = fsize
+		self.file_last_size = fsize
+		lve_data[SAVER_DATA_PRESENCE] = 1
+

This plugin is extremely simple as well. It starts after collector (order=1) , searches for file size in the dictionary and compares it with the previous index. If it has changed, then it writes a sign of presence of a new size into the dictionary. If no changes seen, then sign resets. The previous file size is stored in the plugin itself in file_last_size variable. Note that they are stored during the whole server lve-stats lifetime.

If file size is not found in data dictionary, then plugin just ends.

All the errors are completely ignored.

Analyzer is unconfigurable, that is why it doesn’t require any configuration file and it doesn’t contain set_config method.

Plugin starts every 60 seconds (1 minute), because we need data fixation to be performed one time in a minute.

Persistor

Persistor saves information from the common dictionary into files, databases, etc.

# FSize_watcher_saver.py
+# Example plugin for monitoring file size and last modification date-time.
+# Part 3. Data saver 
+
+import signal
+import sys
+import time
+from lvestats.core.plugin import LveStatsPlugin 
+
+# Key name 1 for saver plugin
+SAVER_KEY = 'FSizeWatcher_fsize_to_store'
+# Key name 2 for saver plugin
+SAVER_DATA_PRESENCE = 'FSizeWatcher_fsize_present'
+# Monitoring file name
+COLLECTOR_KEY_FILENAME = 'FSizeWatcher_fname'  
+
+class FSize_watcher_saver (LveStatsPlugin):
+	# this plugin should be third in chain
+	order = 2
+	# Plugin run period in seconds
+	period = 60
+	# Log filename
+	log_file_name = None
+	# First run flag
+	is_first_run = True 
+	
+	def __init__(self):
+		signal.signal(signal.SIGTERM, self.sigterm_handler) 
+		
+	# Sets configuration to plugin
+	def set_config(self, config):
+		# Get log filename
+		self.log_file_name = config.get('log_filename', None) 
+		
+	# work method
+	def execute(self, lve_data):
+		# do nothing, if log file not defined
+		if not self.log_file_name:
+			return
+		try:
+			# Check presence data
+			if SAVER_DATA_PRESENCE not in lve_data or lve_data[SAVER_DATA_PRESENCE] == 0:
+				# No data
+				return
+			# Get file size from server data dictionary
+			fsize = lve_data[SAVER_KEY]
+			
+			# Store data to log
+			f = open(self.log_file_name, 'a')
+			if self.is_first_run:
+				f.write('%s - FSize_watcher started. Monitoring file: %s, saving data period=%d sec\n' % (time.asctime(time.localtime()), lve_data[COLLECTOR_KEY_FILENAME], self.period))
+				self.is_first_run = False
+			f.write('%s - FSize_watcher: file size is %d bytes\n' % (time.asctime(time.localtime()), fsize))
+			f.close()
+		except:
+			# Ignore all errors
+			pass 
+			
+	# Terminate handler
+	def sigterm_handler(self, signum, frame):
+		if self.log_file_name:
+			try:
+				# Store data to log file
+				f = open(self.log_file_name, 'a')
+				f.write('%s - File watcher saver plugin: TERMINATE\n' % time.asctime(time.localtime()))
+				f.close()
+				pass
+			except:
+				# Ignore all errors
+				pass
+		# Terminate process
+		sys.exit(0)
+

Configuration file /etc/sysconfig/lvestats.config/FSize_watcher_saver.cfg: +

# Config file for FSize_watcher_saver.py plugin
+# Please define log filename here
+log_filename = /var/log/FSize_watcher.log
+

This plugin starts after analyzer (order=2) , checks new file size presence flag, and if positive – writes it into log. If the flag is cleared (which means the size hasn't changed), then plugin simply ends.

Starts once in a minute (period=60).

Also this plugin shows the work of signal handler.

Plugin constructor registers handler-function of a proper signal: signal.signal(signal.SIGTERM, self.sigterm_handler) . This means, that when the server finishes its work, then sigterm_handler method of plugin class will be invoked. In the actual example the function just writes a notification into log, tracing the fact of it's invocation.

Pay attention on sys.exit(0) command in the end of the handler. Find the information on it in Server Plugin Arrangement section.

In addition see into examples of file log /var/log/FSize_watcher.log formed by the plugins above: +

Tue Feb  3 13:06:24 2015 - FSize_watcher started. Monitoring file: /usr/local/cpanel/logs/access_log, saving data period=60 sec
+Tue Feb  3 13:06:24 2015 - FSize_watcher: file size is 122972890 bytes
+Tue Feb  3 13:07:25 2015 - FSize_watcher: file size is 122975507 bytes
+Tue Feb  3 13:08:25 2015 - FSize_watcher: file size is 122978124 bytes
+Tue Feb  3 13:09:25 2015 - FSize_watcher: file size is 122978997 bytes
+Tue Feb  3 13:10:25 2015 - FSize_watcher: file size is 122981033 bytes
+Tue Feb  3 13:11:25 2015 - FSize_watcher: file size is 122982052 bytes
+Tue Feb  3 13:13:25 2015 - FSize_watcher: file size is 122983798 bytes
+Tue Feb  3 13:20:15 2015 - File watcher saver plugin: TERMINATE
+

and +

Thu Feb  5 13:07:27 2015 - FSize_watcher started. Monitoring file: /usr/local/cpanel/logs/error_log, saving data period=60 sec
+Thu Feb  5 13:07:27 2015 - FSize_watcher: file size is 14771849 bytes
+Thu Feb  5 14:03:32 2015 - FSize_watcher: file size is 14771995 bytes
+Thu Feb  5 15:01:36 2015 - FSize_watcher: file size is 14772434 bytes
+Thu Feb  5 17:15:47 2015 - FSize_watcher: file size is 14772873 bytes
+Thu Feb  5 18:47:54 2015 - FSize_watcher: file size is 14775213 bytes
+Thu Feb  5 19:11:56 2015 - FSize_watcher: file size is 14775652 bytes
+Thu Feb  5 21:09:05 2015 - FSize_watcher: file size is 14776091 bytes
+Thu Feb  5 23:06:14 2015 - FSize_watcher: file size is 14776530 bytes
+Fri Feb  6 00:47:23 2015 - FSize_watcher: file size is 14778870 bytes
+Fri Feb  6 01:02:24 2015 - FSize_watcher: file size is 14779309 bytes
+Fri Feb  6 02:00:28 2015 - FSize_watcher: file size is 14779434 bytes
+Fri Feb  6 03:16:34 2015 - FSize_watcher: file size is 14779873 bytes
+Fri Feb  6 05:04:42 2015 - FSize_watcher: file size is 14779998 bytes
+Fri Feb  6 05:12:43 2015 - FSize_watcher: file size is 14780437 bytes
+Fri Feb  6 05:56:50 2015 - FSize_watcher: file size is 14780551 bytes
+Fri Feb  6 06:01:50 2015 - FSize_watcher: file size is 14780975 bytes
+Fri Feb  6 06:03:51 2015 - FSize_watcher: file size is 14782183 bytes
+Fri Feb  6 06:04:51 2015 - FSize_watcher: file size is 14782575 bytes
+Fri Feb  6 06:18:52 2015 - FSize_watcher: file size is 14782647 bytes
+Fri Feb  6 06:21:52 2015 - FSize_watcher: file size is 14782898 bytes
+Fri Feb  6 06:48:54 2015 - FSize_watcher: file size is 14785238 bytes
+Fri Feb  6 07:09:56 2015 - FSize_watcher: file size is 14785677 bytes
+Tue Feb  6 08:03:15 2015 - File watcher saver plugin: TERMINATE
+

You can see that log record is being held once a minute (what we actually need), new file size is written.

Also we can notice that handler SIG_TERM was executed, signaling that plugin received the notification about server shut-down.

Notifier

Notifier informs system users about any events. +

# FSize_watcher_saver.py
+# Example plugin for monitoring file size and last modification date-time.
+# Part 4. Notifier 
+
+import time
+import smtplib 
+
+from lvestats.lib.commons import dateutil
+from lvestats.core.plugin import LveStatsPlugin  
+
+
+# Key name
+COLLECTOR_KEY_FSIZE = 'FSizeWatcher_fsize'
+COLLECTOR_KEY_FILENAME = 'FSizeWatcher_fname' 
+
+# email message pattern
+EMAIL_MESSAGE_PATTERN = """Hello, administrator!
+Size of the file '%s' is %d bytes.
+"""  
+
+
+class FSize_watcher_notifier (LveStatsPlugin):
+	# Default period
+	DEFAULT_PERIOD_STR = '12h'
+	# this plugin should be third in chainorder = 3
+	# Timeout
+	timeout = 20
+	# Notifier Log filename
+	log_file_name = '/var/log/FSize_watcher_notifier.log'
+	# Email from address
+	email_from = None
+	# Email to address
+	email_to = None
+	# Email subject
+	email_subject = None
+	# Sets configuration to plugin
+	def set_config(self, config):
+		# Email settings
+		self.email_from = config.get('notify_from_email', None)
+		self.email_to = config.get('notify_to_email', None)
+		self.email_subject = config.get('notify_from_subject', 'Message from FSize_watcher_notifier plugin')
+		# Notify period
+		s_period = config.get('notify_period', None)
+		if s_period:
+			self.period = dateutil.parse_period2(s_period)
+		else:
+			self.period = dateutil.parse_period2(FSize_watcher_notifier.DEFAULT_PERIOD_STR)
+		f = open(self.log_file_name, 'a')
+		f.write('%s - FSize_watcher_notifier plugin: configure\n' % time.asctime(time.localtime()))
+		f.write('       - Period: %s\n' % self.period)
+		f.write('       - From: %s\n' % self.email_from)
+		f.write('       - To: %s\n' % self.email_to)
+		f.write('       - Subject: \'%s\'\n' % self.email_subject)
+		f.close() 
+		
+	# work method
+	def execute(self, lve_data):
+		if COLLECTOR_KEY_FSIZE not in lve_data or COLLECTOR_KEY_FILENAME not in lve_data:
+			return
+		if not self.email_from or not self.email_to:
+			f = open(self.log_file_name, 'a')
+			f.write('%s - FSize_watcher_notifier plugin error: email_from or email_to not set\n')
+			f.close()
+			return
+		try:
+			from email.mime.text import MIMEText
+			# Send email
+			msg = MIMEText(EMAIL_MESSAGE_PATTERN % (lve_data[COLLECTOR_KEY_FILENAME], lve_data[COLLECTOR_KEY_FSIZE]))
+		msg['Subject'] = self.email_subject
+		msg['From'] = self.email_from
+		msg['To'] = self.email_to 
+		
+		s = smtplib.SMTP('localhost')
+		s.sendmail(self.email_from, [self.email_to], msg.as_string())
+			s.quit() 
+			
+		f = open(self.log_file_name, 'a')
+			f.write('%s - FSize_watcher_notifier plugin: email message was successfully sent\n' % time.asctime(time.localtime()))
+			f.close()
+			except Exception as e:
+			f = open(self.log_file_name, 'a')
+			f.write('%s - FSize_watcher_notifier plugin error:\n%s\n' % (time.asctime(time.localtime()), str(e)))
+			f.close()
+

Configuration file /etc/sysconfig/lvestats.config/FSize_watcher_notifier.cfg :

# Config file for FSize_watcher_notifier.py plugin
+# Please define email options here 
+
+NOTIFY_FROM_EMAIL=user@hostname
+NOTIFY_FROM_SUBJECT=Message from FSize_watcher_notifier
+NOTIFY_TO_EMAIL=admin@hostname
+NOTIFY_PERIOD=12h
+

Plugin’s index number equals 3 ( order=3 ), that is why notifier starts after the rest. But since it uses only data formed by collector , then its order may equal any number bigger that collectors order (>0).

Notifier reads the necessary parameters from the configuration (email address, topic, period) and writes them into its own log as reference.

Plugin’s execute method checks the availability of all the necessary data (email parameters, collectors data) and sends the message. All the notifications are written into the notifier's own log.

If any data is missing, the message is not sent.

Log example: +

Thu Feb  5 11:51:34 2015 - FSize_watcher_notifier plugin: configure
+       - Period: 60.0
+       - From: user@hostname
+       - To: admin@hostname
+       - Subject: 'Message from FSize_watcher_notifier'
+Thu Feb  5 11:51:35 2015 - FSize_watcher_notifier plugin: email message was successfully sent
+Thu Feb  5 11:52:35 2015 - FSize_watcher_notifier plugin: email message was successfully sent
+Thu Feb  5 11:53:35 2015 - FSize_watcher_notifier plugin: email message was successfully sent
+Thu Feb  5 11:54:35 2015 - FSize_watcher_notifier plugin: email message was successfully sent
+Thu Feb  5 11:57:00 2015 - FSize_watcher_notifier plugin: configure
+       - Period: 43200.0
+       - From: user@hostname
+       - To: admin@hostname
+       - Subject: 'Message from FSize_watcher_notifier'
+Thu Feb  5 11:57:00 2015 - FSize_watcher_notifier plugin: email message was successfully sent
+

File info and format for /var/lve/info file

This file is used by control panels to display to user their 'current' usage. The file is updated every 5 seconds by lve-stats.

When writing to this file we make sure that: average CPU/IOPS/MEM is never greater then LIMIT for that resource.

Example:

0,0,20,0,2500,0,262144,0,0,262144,0,0,100,0,0,0,0,1024,1024,0,0,0,0 +600,1,20,2492,2500,70,262144,0,0,262144,33,0,100,1,0,0,0,1024,1024,0,5,0,0 +200,0,20,0,2500,0,262144,0,0,262144,0,0,100,0,0,0,0,1024,1024,0,0,0,0 +500,0,20,0,2500,0,262144,0,0,262144,0,0,100,0,0,0,0,1024,1024,0,0,0,0

First line of the file is ' default limits '.

Fields: +

# 0 - id
+# 1 - mep (average entry processes)
+# 2 - lep  (limit ...)
+# 3 - cpu_usage (average speed)
+# 4 - lcpu (limit spped)
+# 5 - mem_usage (average virtual memory)
+# 6 - lmem (limit ...)
+# 7 - mem_fault (number of virtual memory faults)
+# 8 - mep_fault (number of entry processes faults)
+LVE_VERSION >=6
+# 9 - lmemphy (limit physical memory)
+# 10 - memphy (average ...)
+# 11 - memphy_fault (faults ...)
+# 12 - lnproc (limit number of processes)
+# 13 - nproc (average ...)
+# 14 - nproc_fault (faults ...)
+# 15 - lcpuw (CPU weight -- deprecated not used)
+# 16 - io_usage (average IO usage)
+# 17 - io_limit (limit ...)
+LVE_VERSION >=8
+#18 - liops  (limit IOPS)
+#19 - iops (average IOPS)
+

Note

You can also use LVE-stats 2 CLI

Troubleshooting

lvestats service and utilities write fatal errors to system log.

There is /var/log/lve-stats.log file with additional information (warnings, tracebacks for errors).

To see which letters were sent via lves-tats notifier in the logs, do the following:

  1. In the /etc/sysconfig/lvestats2, specify logging_level=debug;
  2. Execute the service lvestats restart command.

CageFS

General information and requirements

CageFS is a virtualized file system and a set of tools to contain each user in its own 'cage'. Each customer will have its own fully functional CageFS, with all the system files, tools, etc.

The benefits of CageFS are:

  • Only safe binaries are available to user
  • User will not see any other users, and would have no way to detect presence of other users & their user names on the server
  • User will not be able to see server configuration files, such as Apache config files.
  • User's will have limited view of /proc file system, and will not be able to see other users' processes

At the same time, user's environment will be fully functional, and user should not feel in any way restricted. No adjustments to user's scripts are needed. CageFS will cage any scripts execution done via:

  • Apache (suexec, suPHP, mod_fcgid, mod_fastcgi)
  • LiteSpeed Web Server
  • Cron Jobs
  • SSH
  • Any other PAM enabled service

Note

mod_php is not supported, MPM ITK requires a custom patch

Note

CageFS is not supported for H-Sphere.

See also Compatibility Matrix.

Minimum Requirements:

  • kernel: CL6 with lve1.2.17.1 or later, CL7.
  • 7GB of disk space.

Depending on your setup, and number of users, you might also need:

  • Up to 8MB per customer in /var directory (to store custom /etc directory)
  • 5GB to 20GB in /usr/share directory (to store safe skeleton of a filesystem)

Warning

If at any time you decide to uninstall CageFS, please make sure you follow uninstall instructions

CageFS quirks

Due to the nature of CageFS, some options will not work as before or will require some changes:

  • lastlog will not work (/var/log/lastlog).
  • PHP will load php.ini from /usr/selector/php.ini. That file is actually a link to the real php.ini file from your system. So the same php.ini will be loaded in the end.
  • You have to run cagefsctl --update any time you have modified php.ini, or you want to get new/updated software inside CageFS.
  • CageFS installation changes jailshell to regular bash on cPanel - read why.

Installation and update

To install CageFS: +

$ yum install cagefs
+$ /usr/sbin/cagefsctl --init
+

That last command will create skeleton directory that might be around 7GB in size. If you don't have enough disk space in /usr/share, use following commands to have cagefs-skeleton being placed in a different location: +

$ mkdir /home/cagefs-skeleton
+$ ln -s /home/cagefs-skeleton /usr/share/cagefs-skeleton
+

The commands above should be executed before the cagefsctl --init.

Also, it is needed approximately 4Kb of disk space per one user for the /var/cagefs directory. You should place the /var/cagefs directory on partition, which is large enough and has disk quota enabled.

For example, to create the /var/cagefs directory on the /home partition, execute the following commands before the cagefsctl --init:

mkdir /home/cagefs
+ln -s /home/cagefs /var/cagefs
+

IMPORTANT

Please make sure to turn on disk quota for a partition where the /var/cagefs directory is located, or move the /var/cagefs to a partition where disk quota is enabled. This is needed to prevent users from abusing disk quota inside CageFS.

If the /var/cagefs directory is already created, you can move it. How to move the /var/cagefs directory: +https://docs.cloudlinux.com/cloudlinux_os_components/#moving-var-cagefs-directory

IMPORTANT

If you are placing skeleton in /home directory on cPanel servers, you must configure the following option in cPanel WHM: WHM -> Server Configuration -> Basic cPanel/WHM Setup -> Basic Config -> Additional home directories
+Change the value to blank (not default Home ). Without changing this option, cPanel will create new accounts in incorrect places.

CageFS will automatically detect and configure all necessary files for:

  • cPanel
  • Plesk
  • DirectAdmin
  • ISPmanager
  • Interworx
  • MySQL
  • PostgreSQL
  • LiteSpeed

Web interface to manage CageFS is available for cPanel, Plesk 10+, DirectAdmin, ISPmanager & Interworx. Command line tool would need to be used for other control panels.

Once you initialized the template you can start enabling users. By default CageFS is disabled for all users.

Starting from cagefs-6.1-27 fs.proc_can_see_other_uid will be migrated (one time) from /etc/sysctl.conf into /etc/sysctl.d/90-cloudlinux.conf . If this variable is not set in either file, it will default to 0.

It is strongly advised against setting this variable in 90-cloudlinux.conf. Define it in /etc/sysctl.conf or in some other config file with an index number greater than 90-cloudlinux.conf, e.g. /etc/sysctl.d/95-custom.conf.

You can find more information on fs.proc_can_see_other_uid automatic migration in Kernel Config Variables.

Note

You can also use CageFS CLI

Uninstalling

To uninstall CageFS, start by disabling and removing all directories:

$ /usr/sbin/cagefsctl --remove-all
+

That command will: disable CageFS for all customers, unmount CageFS for all users, removes /usr/share/cagefs-skeleton & /var/cagefs directories. It will not remove /etc/cagefs directory.

Remove CageFS RPM:

$ yum remove cagefs
+

Managing users

CageFS provides for two modes of operations:

  1. Enabled for all, except those that are disabled.
  2. Disabled for all, except those that are enabled.

Mode #1 is convenient for production operation, where you want all new users to automatically be added to CageFS. +Mode #2 is convenient while you test CageFS, as it allows you to enable it on one by one for your customers.

To start using CageFS you have to select one of the mode of operations: +

$ /usr/sbin/cagefsctl --enable-all
+
+or +
$ /usr/sbin/cagefsctl --disable-all
+
+or +
$ /usr/sbin/cagefsctl --toggle-mode
+
+That will switch the operation mode, preserving current disabled/enabled users. +

To enable individual user do: +

$ /usr/sbin/cagefsctl --enable [username]
+
+To disable individual user: +
$ /usr/sbin/cagefsctl --disable [username]
+
+To list all enabled users: +
$ /usr/sbin/cagefsctl --list-enabled
+
+To list all disabled users: +
$ /usr/sbin/cagefsctl --list-disabled
+
+To see current mode of operation: +
$ /usr/sbin/cagefsctl --display-user-mode
+

Note

You can also use CageFS CLI

Configuration

File system templates

Note

Please do not modify any existing files in the /etc/cagefs/conf.d directory because they may be overwritten while updating CageFS package. You should create a new file with a unique name instead.

CageFS creates a filesystem template in /usr/share/cagefs-skeleton directory. CageFS template will be mounted for each customer. The template is created by running: +

# /usr/sbin/cagefsctl --init
+

To update the template, you should run: +

$ /usr/sbin/cagefsctl --update
+

The behavior of the commands (and the files copied into /usr/share/cagefs-skeleton directory) depends on the configuration files in /etc/cagefs/conf.d
+You can add additional files, users, groups and devices into CageFS template by adding .cfg file, and running: +

$ /usr/sbin/cagefsctl --update
+

To delete files from CageFS template, remove corresponding .cfg file, and run: +

$ /usr/sbin/cagefsctl --update
+

Here is an example openssh-clients.cfg file: +

[openssh-clients]
+
+comment=OpenSSH Clients
+
+paths=/etc/ssh/ssh_config, /bin/hostname, /usr/bin/scp, /usr/bin/sftp, /usr/bin/slogin, /usr/bin/ssh, /usr/bin/ssh-add, /usr/bin/ssh-agent, /usr/bin/ssh-copy-id, /usr/bin/.ssh.hmac, /usr/bin/ssh-keyscan, /usr/libexec/openssh/sftp-server, /etc/environment, /etc/security/pam_env.conf
+
+devices=/dev/ptmx
+

Example mail.cfg file: +

[mail]
+
+comment=Mail tools
+
+paths=/bin/mail, /etc/aliases.db, /etc/mail, /etc/mailcap, /etc/mail.rc, /etc/mime.types, /etc/pam.d/smtp.sendmail, /etc/rc.d/init.d/sendmail, /etc/smrsh, /etc/sysconfig/sendmail, /usr/bin/hoststat, /usr/bin/Mail, /usr/bin/mailq.sendmail, /usr/bin/makemap, /usr/bin/newaliases.sendmail, /usr/bin/purgestat, /usr/bin/rmail.sendmail, /usr/lib64/sasl2/Sendmail.conf, /usr/lib/mail.help, /usr/lib/mail.tildehelp, /usr/lib/sendmail.sendmail, /usr/sbin/mailstats, /usr/sbin/makemap, /usr/sbin/praliases, /usr/sbin/sendmail.sendmail, /usr/sbin/smrsh, /var/log/mail, /var/spool/clientmqueue, /var/spool/mqueue
+
+users=smmsp
+
+groups=smmsp
+

There is an easy way to add/delete files from particular RPMs into CageFS. That can be done by using --addrpm and --delrpm options in cagefsctl . Like: +

$ cagefsctl --addrpm ffmpeg
+$ cagefsctl --update
+

Note

ffmpeg RPM should be installed on the system already.

Excluding files

To exclude files and directories from CageFS, edit file:
/etc/cagefs/custom.black.list
+And add files or directories in there, one per line.

Execute the following command to apply changes: +

cagefsctl --force-update
+

Please do not edit /etc/cagefs/black.list file because it is replaced during the update of CageFS package.

Excluding users

To exclude users from CageFS, create a file (any name would work) inside /etc/cagefs/exclude folder, and list users that you would like to exclude from CageFS in that file (each user in separate line).

Then execute the following command to apply changes: +

cagefsctl --user-status USER
+

And check that the command shows Disabled.

Mount points

Note

Please do not mount the entire /var directory into CageFS (i.e. do not add the /var to the cagefs.mp). This will break CageFS.

CageFS creates individual namespace for each user, making it impossible for users to see each other's files and creating high level of isolation. The way namespace is organized:

  1. /usr/share/cagefs-skeleton with safe files is created
  2. Any directory from the server that needs to be shared across all users is mounted into /usr/share/cagefs-skeleton +(a list of such directories is defined in /etc/cagefs/cagefs.mp)
  3. /var/cagefs/[prefix]/username directory for each user. Prefix is defined as last two digits of user id. User id is taken from /etc/passwd file.
  4. Separate /etc directory is created and populated for each user inside /var/cagefs/[prefix]/username
  5. /tmp directory is mounted for each user separately into ~username/.cagefs/tmp directory
  6. Additional custom directories can be mounted for each user by defining them in /etc/cagefs/cagefs.mp
  7. You can define custom directories per user using virt.mp files [CageFS 5.1 and higher]

To define individual custom directories in /etc/cagefs/cagefs.mp following format is used:

@/full/path/to/directory,permission notation

This is useful when you need to give each user its own copy of a particular system directory, like:

@/var/run/screen,777

Such entry would create separate /var/run/screen for each user, with permissions set to 777

To modify mount points, edit /etc/cagefs/cagefs.mp. Here is an example of cagefs.mp: +

/var/lib/mysql
+/var/lib/dav
+/var/www/cgi-bin
+/var/spool
+/dev/pts
+/usr/local/apache/domlogs
+/proc
+/opt
+@/var/spool/cron,700
+@/var/run/screen,777
+

If you want to change mount points, make sure you re-initialize mount points for all customers: +

$ cagefsctl --remount-all
+
+This command will kill all current processes and reset mount points. +

Per user virtual mount points

[CageFS 5.1 and higher]

  • Please, see Split by username feature, as it might be simpler to implement in some cases.

Starting with CageFS 5.1 you can specify additional directories to be mounted inside user's CageFS. This can be specified for each user. +To specify virtual mount points for a user, create a file:

/var/cagefs/[prefix]/[user]/virt.mp

Inside that file, you can specify mount points in the following format: +

virtdir1,mask
+@subdir1,mask
+@subdir2,mask
+virdir2,mask
+@subdir3,mask
+@subdir4,mask
+>virtdir3,mask
+@subdir5,mask
+@subdir6,mask
+# comments
+
  • mask is always optional, if missing 0755 is used
  • Create virtual directory subdir/virtdir , mount it to: +
    • skeleton jaildir/virtdir
    • inside virtual directory, create directories subdir1, subdir2
    • mount virtdir1/subdir1 to subdir/virtdir/subdir1
    • if virtdir is started with >, create directory subdir/virtdir , but don't mount it into jaildir . This is needed for cases when virtdir is inside home base dir.
  • if file /var/cagefs/[prefix]/[user]/virt.mp is missing -- no virt directories are loaded for that user.

Note that CageFS will automatically create those files for Plesk 10 & higher.

For example if we have Plesk 11.5 with two users cltest1, and cltest2: +

cltest1 uid 10000 has domains: cltest1.com, cltest1-addon.com and sub1.cltest1.com
+cltest2 uid 10001 has domains: cltest2.com, cltest2-addon.com
+

In such case we would have file /var/cagefs/00/cltest1/virt.mp : +

>/var/www/vhosts/system,0755
+@cltest1-addon.com,0755
+@cltest1.com,0755
+@sub1.cltest1.com,0755
+

and file: /var/cagefs/01/cltest2/virt.mp:

>/var/www/vhosts/system
+@cltest2-addon.com
+@cltest2.com
+

Split by username

[CageFS 5.3.1+]

Sometimes you might need to make sure that directory containing all users would show up as containing just that user inside CageFS. For example, if you have directory structure like: +

/home/httpd/fcgi-bin/user1
+/home/httpd/fcgi-bin/user2
+

Then we can add the following line to /etc/cagefs/cagefs.mp file: +

%/home/httpd/fcgi-bin
+

and execute: +

cagefsctl --remount-all
+

After that each subdirectory of /home/httpd/fcgi-bin will be mounted for appropriate user in CageFS: /home/httpd/fcgi-bin/user1 will be mounted for user1 and /home/httpd/fcgi-bin/user2 will be mounted for user2 .

Splitted by user’s UID mounts

Note

Requires CageFS v.7.4.2-1 and later

In addition to splitted by username mounts, there is an ability to “split” mounts by user’s UID. This feature is useful for systems with non-unique UIDs, i.e. when multiple users have the same UID.

Using splitted by UID mounts is more preferable over splitted by username mounts, because you can mount the same directory for all users with the same UID. Also, splitted by UID mounts work fine with renaming of the users (when username changes but UID remains the same).

For example if you have a directory structure like the following:

/data/uids/1000/data.db
+/data/uids/1001/data.db
+

Then you can add the following line to the /etc/cagefs/cagefs.mp file:

*/data/uids
+and execute
+cagefsctl --remount-all
+

After that each subdirectory of the /data/uids will be mounted for the appropriate user in CageFS. The /data/uids/1000 directory will be mounted for the user with UID 1000 and the /data/uids/1001 directory will be mounted for the user with UID 1001.

Mounting users home directory inside CageFS

CageFS 6.1-1 (and later) has improved mounting user’s home directory that is applied for users with home directories like /home/user or /homeN/user (where N = 0,1,..9).

In such case, earlier versions of CageFS always mount user’s home directory to /home/user and create symlink /homeN -> /home when needed, so user’s home directory can be accessed both via /home/user and /homeN/user . This quirk leads to some rare incompatibilities between CageFS and other software (for example OpenCart), because real path of user’s home directory in CageFS and in real file system can differ.

New CageFS mounts user’s home directory in a way that its real path in CageFS is always the same as in real file system. Additionally, CageFS searches for symlinks like +/homeX -> /homeY and /homeX/user -> /homeY/user in real system and creates such symlinks in user’s CageFS when found.

This new mounting mode is enabled by default. You can switch to old mounting mode by executing the following commands: +

# touch /etc/cagefs/disable.home.dirs.search
+# cagefsctl --force-update
+# cagefsctl --remount-all
+

Note

New mounting mode will be disabled automatically when "mounting base home directory" mode is enabled (mount_basedir=1 setting in /etc/cagefs/cagefs.base.home.dirs file).

How to hide directory inside mount point CageFS 6.4.7-1 +

Note

For files outside a mount point, use blacklisting, see: Excluding files

To hide directories inside a mount point, create a file in the /etc/cagefs/empty.dirs directory (you can use any name) with a list of directories to be hidden (these directories will look like empty for users in CageFS).

Note

Please do not edit the supplied config file (/etc/cagefs/empty.dirs/emptied_dirs.default).

Example

Let’s take a /var/www directory which contains the following folders: icons and html. +To hide the /var/www directory content from users inside CageFS, we will do the following:

  • Create the custom.empty file with a single record: /var/www
  • Place the custom.empty file to the /etc/cagefs/empty.dirs directory
  • Run the cagefsctl --remount-all command

Now, all users inside CageFS will see the /var/www directory as an empty directory even if there is /var/www/html in the /etc/cagefs/cagefs.mp.

Base home directory

If you have a custom setup where home directories are in a special format, like: /home/$USERNAME/data , you can specify it using regular expressions. This is needed by CageFS to create safe home space for end user, where no other users are visible.

We will create empty: /var/cagefs/[prefix]/$USERNAME/home , and then mount /home/$USERNAME in that directory

To do that, create a file: /etc/cagefs/cagefs.base.home.dirs

With content like: +

^/home/
+^/var/www/users/
+

If there is no such file, the home directory without last component will be considered as a base dir, like with +/home/$USERNAME we would create /var/cagefs/[prefix]/$USERNAME/home , and then mount +/home/$USERNAME in there

With /home/$USERNAME/data as a home dir, we would assume that /home/$USERNAME is the base directory, and we would create /var/cagefs/[prefix]/$USERNAME/home/$USERNAME/data and then we would mount /home/$USERNAME/data -- which would cause each user to see empty base directories for other users, exposing user names.

Sharing home directory structure among users

When you want to share directory structure among multiple users, you can add following line at the top of the /etc/cagefs/cagefs.base.home.dirs file. This is useful on the systems that support sites with multiple users, with different home directories inside the main 'site' directory. +

mount_basedir=1
+

For example:

user1 has home directory /var/www/vhosts/sitename.com/web_users/user1 user2 has home directory /var/www/vhosts/sitename.com/web_users/user2 +site admin has home directory /var/www/vhosts/sitename.com

So, content of /etc/cagefs/cagefs.base.home.dirs should be the following:

mount_basedir=1
+^/var/www/vhosts/[^/]+
+

Directory structure in /var/www/vhosts/sitename.com will be mounted in CageFS for appropriate users.
+Each user will have access to whole directory structure in /var/www/vhosts/sitename.com (according to their permissions).

Note

You should execute cagefsctl --remount-all in order to apply changes to CageFS (i.e. remount home directories).

PostgreSQL support

CloudLinux OS Shared 7:

CageFS works with any PostgreSQL version installed from CloudLinux OS Shared or CentOS repositories. PostgreSQL packages for CloudLinux OS Shared 7 come from the upstream (CentOS) unmodified. PostgreSQL’s socket is located in /var/run/postgresql directory. This directory is mounted to CageFS by default (in cagefs-5.5-6.34 or later).

When PostgreSQL has been installed after CageFS install, please add line: +

/var/run/postgresql
+

/etc/cagefs/cagefs.mp file and then execute: +

cagefsctl --remount-all 
+

The steps above are enough to configure CageFS to work with PostgreSQL.

CloudLinux OS Shared 6:

CageFS provides separate /tmp directory for each end user. Yet, PostgreSQL keeps its Unix domain socket inside server's main /tmp directory. In addition to that, the location is hard coded inside PostgreSQL libraries.

To resolve the issue, CloudLinux OS Shared provides a version of PostgreSQL with modified start up script that can store PostgreSQL's socket in /var/run/postgres. The script automatically creates link from /tmp to that socket to prevent PostgreSQL dependent applications from breaking.

In addition to that, CageFS knows how to correctly link this socket inside end user's /tmp directory.

To enable PostgreSQL support in CageFS:

  1. Make sure you have updated to latest version of PostgreSQL.

  2. Edit file /etc/sysconfig/postgres, and uncomment SOCK_DIR line.

  3. Update CageFS configuration by running:

cagefsctl  --reconfigure-cagefs
+
  1. Restart PostgreSQL by running:
$ service postgresql restart 
+

If you are using cPanel, you would also need to modify file: /etc/cron.daily/tmpwatch

And update line: +

flags=-umc 
+

to: +

flags=-umcl
+

to prevent symlink from being removed.

PAM configuration

CageFS depends on pam_lve module for PAM enabled services. When installed, the module is automatically installed for following services:

  • sshd
  • crond
  • su

The following line is added to corresponding file in /etc/pam.d/: +

session    required     pam_lve.so      100     1
+

Where 100 stands for minimum UID to put into CageFS & LVE , and 1 stands for CageFS enabled.

Filtering options for commands executed by proxyexec

You can disallow a user in CageFS to execute specific commands with some specific dangerous options via proxyexec.

To do so, you should create <command>.json file in the /etc/cagefs/filters directory and specify the names of options you want to disable.

For example, to disable some options of sendmail command, /etc/cagefs/filters/sendmail.json is created with the following content:

{
+  "default": {
+    "deny": [
+      "-be",
+      "-bem"
+    ],
+    "restrict_path": [
+      "-C",
+      "-D"
+    ]
+  },
+  "/usr/sbin/sendmail": {
+    "deny": [
+      "-be",
+      "-bem"
+    ],
+    "restrict_path": [
+      "-C",
+      "-D"
+    ]
+  },
+  "/var/qmail/bin/sendmail": {
+    "deny": [
+      "-be",
+      "-bem"
+    ],
+    "restrict_path": [
+      "-C",
+      "-D"
+    ]
+  },
+  "/usr/sbin/sendmail.sendmail": {
+    "deny": [
+      "-be",
+      "-bem"
+    ],
+    "restrict_path": [
+      "-C",
+      "-D"
+    ]
+  },
+  "/usr/local/cpanel/bin/sendmail": {
+    "deny": [
+      "-be",
+      "-bem"
+    ],
+    "restrict_path": [
+      "-C",
+      "-D"
+    ]
+  }
+}
+

You can specify options for different paths separately (for example, /usr/sbin/sendmail or /var/qmail/bin/sendmail).

If the path to the program being executed does not match any path specified in the config file, then default parameters are used.

  • deny list should contain options that should be disallowed for use by users (the black list of options, all other options will be allowed).
  • You can specify the white list of options in the allow list (all other options will be denied).
  • You cannot specify both white and black list (allow and deny).

It is possible to verify that a path specified as a parameter for an option does not refer outside of the user’s home directory. This check is performed for options specified in the restrict_path list. All issues are reported in /var/log/secure log file.

NOTE: By default, option filters only compare the starting parts of arguments with entries specified by lists. +For instance, if option "-f" is forbidden, "-f /etc/list" will be forbidden, but "-vf /etc/list" will not.

Starting from cagefs v. #7.4.12-1, specifying a "strict_options": true switch inside a filter file entry enables an extended parsing mechanism where each short option from a cluster is parsed separately.

It is recommended to enable this option, unless it causes issues with the restricted command's functionality.

{
+  "default": {
+    "deny": [
+      "-be",
+      "-bem"
+    ],
+    "restrict_path": [
+      "-C",
+      "-D"
+    ],
+    "strict_options": true
+  }
+}
+

Executing by proxy

Some software has to run outside CageFS to be able to complete its job. It includes such programs as passwd, sendmail, etc. CageFS provides proxyexec technology to accomplish this goal: you can define any program to run outside CageFS by specifying it in any file located in the /etc/cagefs/ which ends with .proxy.commands. In the examples below we use custom.proxy.commands, but you can use any other name, e.g. mysuperfile.proxy.commands.

Warning

Do not edit the existing /etc/cagefs/proxy.commands file as it will be overwritten with the next CageFS update.

The syntax of the /etc/cagefs/[*.]proxy.commands file is as follows:

ALIAS[:wrapper_name]=[username:]path_to_executable
+
Parameter Description
ALIAS Any name unique within all /etc/cagefs/\[*.\]proxy.commands files. Used as an identifier.
wrapper_name Optional field. The name of the wrapper file which is used as a replacement for an executable file (set by path_to_executable) inside CageFS.

Possible values:
- a name of a wrapper you place into the /usr/share/cagefs/safeprograms directory;
- noproceed - a reserved word which means that the wrapper is not needed, e.g. when it is already installed by other ALIAS. Often used for the commands with several ALIAS as in the example below.
- omit this field - default wrapper cagefs.proxy.program will be used.

Used in cases when you'd like to give access only to the part of binary functions but it is not possible to do that using options filtering.
Note: wrapper works inside CageFS with user rights and executes “real” scripts using proxy daemon.
path_to_executable A path to an executable file that will run via proxyexec.
username Optional field. A name of a user on whose behalf path_to_executable will run in the real system. If username is not specified, then path_to_executable will run on behalf of the same user who is inside CageFS.

Once the program is defined, run this command to populate the skeleton:

$ cagefsctl --force-update
+

Users with duplicate UIDs

Sometimes hosters may have users with non-unique UIDs. Thus, proxyexec may traverse users' directories to find a specific one. That behavior turns into inappropriate if the user's directory is not cached locally (for example LDAP is used).

To turn this feature off, run:

touch /etc/cagefs/proxy.disable.duid
+

Or to activate it back, run:

rm /etc/cagefs/proxy.disable.duid
+

Examples

Let's have a script that must do some stuff outside CageFS and return a result to a user. Let's name it superbinary and place it into the /my/scripts/ directory.

In the examples below, we will use a small script that:

  • checks if it works inside or outside of CageFS
  • prints a number of users in the /etc/passwd file

We use the /etc/passwd file because it is truncated inside the cage by default and we can easily see the difference between CageFS and the “real” system by just counting lines in it.

$ cat /opt/scripts/superbinary
+#!/usr/bin/env bash
+if [[ -e /var/cagefs ]]; then
+  echo "I am running without CageFS"
+else
+  echo "I am running in CageFS"
+fi;
+echo "I am running as: `whoami`"
+echo "Number or records in /etc/passwd: `cat /etc/passwd | wc -l`"
+

First, let’s check that CageFS works: create a user and disable the cage:

useradd test
+cagefsctl --disable test
+

Then, run the following command as root and you will see the following output:

[root ~]# su - test -c "/my/scripts/superbinary"
+I am running without CageFS
+I am running as: test
+Number or records in /etc/passwd: 49
+

Now, enable CageFS for the test user and run the command again:

[root ~]# cagefsctl --enable test
+[root ~]# su - test -c "/my/scripts/superbinary"
+-bash: /my/scripts/superbinary: No such file or directory
+

As you can see the access to the file is restricted by CageFS.

Example 1. Make users in CageFS be able to execute a script which must work outside CageFS

Add the following line into the /etc/cagefs/custom.proxy.commands:

MYSUPERBINARY=/my/scripts/superbinary
+

Then run the cagefsctl --force-update, which will place a special wrapper instead of your script inside CageFS. And run your script again:

[root ~]# su - test -c "/my/scripts/superbinary"
+I am running without CageFS
+I am running as: test
+Number or records in /etc/passwd: 49
+

To compare, let’s count a number of users in the /etc/passwd directly:

[root ~]# su - test -c "cat /etc/passwd | wc -l"
+25
+

Result: the script escapes from CageFS and has access to all files which a user with disabled CageFS has.

Example 2. Permissions escalation

Let's imagine that you need to give the users the ability to run a script which gets information about their domains from the apache.conf. To do that, you need root permissions. You can achieve that with proxyexec.

First, run the following:

echo "MYSUPERBINARY=root:/my/scripts/superbinary" > /etc/cagefs/custom.proxy.commands
+

And then, run the example script again:

[root ~]# su - test -c "/my/scripts/superbinary"
+I am running without cagefs
+I am running as: root
+Number or records in /etc/passwd: 49
+

As you can see, the script now works with root permissions, as set in the custom.proxy.commands file. In order to get information about a user who runs the script, use the following environment variables:

PROXYEXEC_UID
+PROXYEXEC_GID
+

Example:

[root ~]# id test
+uid=1226(test) gid=1227(test) groups=1227(test)
+[root ~]# su - test -c "/my/scripts/superbinary"                                                
+I am running without CageFS                                                                          
+I am running as: root
+Number or records in /etc/passwd: 49
+PROXYEXEC_UID=1226
+PROXYEXEC_GID=1227
+

Result: users can run the script that gains the root permissions and work outside CageFS. Of course, you can set any other user instead of root in the custom.proxy.commands.

Example 3. Custom proxyexec wrapper

Let’s modify the test binary in a next way:


+[root ~]# cat /my/scripts/superbinary
+#!/usr/bin/env bash
+FILE="$1"
+if [[ -e /var/cagefs ]]; then
+  echo "I am running without CageFS"
+else
+  echo "I am running in CageFS"
+fi;
+echo "I am running as: `whoami`"
+echo "Number or records in ${FILE}: `cat ${FILE} | wc -l`"
+echo "PROXYEXEC_UID=${PROXYEXEC_UID}"
+echo "PROXYEXEC_GID=${PROXYEXEC_GID}"
+

Now users can pass any path to the file as an argument. In order to restrict possible parameters (file paths) that users can pass, you can use the custom proxyexec wrapper.

First, duplicate the default wrapper and give it a name, e.g. cagefs.proxy.mysuperbinary.

[root ~]# cp /usr/share/cagefs/safeprograms/cagefs.proxy.program /usr/share/cagefs/safeprograms/cagefs.proxy.mysuperbinary
+

The default wrapper already contains a check that does not allow to run it by the root user:

#!/bin/bash
+##CageFS proxyexec wrapper - ver 15
+    
+if [[ $EUID -eq 0 ]]; then
+    echo 'Cannot be run as root'
+    exit 1
+fi
+...
+

Add the new check below:

if [[ $1 == "/etc/passwd" ]]; then                                                    
+    echo "it is not allowed for user to view this file!"                  
+    exit 1      
+fi
+

Now, set a custom binary name in the custom.proxy.commands:

[root ~]# cat /etc/cagefs/custom.proxy.commands
+MYSUPERBINARY:cagefs.proxy.mysuperbinary=root:/my/scripts/superbinary
+

Run skeleton update and check that everything works as expected:

[root ~]# cagefsctl --force-update
+[root ~]# su - test -c "/my/scripts/superbinary /etc/passwd"
+it is not allowed for user to view this file!
+[root ~]# su - test -c "/my/scripts/superbinary /etc/group"
+I am running without CageFS
+I am running as: root
+Number or records in /etc/group: 76
+PROXYEXEC_UID=1226
+PROXYEXEC_GID=1227
+

Notes and warnings

  1. Make sure that a directory with your script is not listed in the /etc/cagefs/cagefs.mp (is not mounted inside the cage). Otherwise, the proxyexec will not work because CageFS will not be able to replace your script with a special wrapper inside the cage.
  2. Use this feature with caution because it gives users the ability to execute specified commands outside CageFS. SUID commands are extremely dangerous because they are executed not as a user, but as an owner of the file (typically root). You should give users the ability to execute safe commands only. These commands should not have known vulnerabilities. You should check that users cannot use these commands to get sensitive information on a server. You can disable specific dangerous options of programs executed via proxyexec using filtering options.
  3. In cPanel, all the scripts located in the /usr/local/cpanel/cgi-sys/, that user might need to execute, should be added to the custom *.proxy.commands file.

Custom /etc files per customer

[4.0-5 and later]

To create a custom file in /etc directory for end user, create a directory:
/etc/cagefs/custom.etc/[username]

Put all custom files, and sub-directories into that direcotry.

For example, if you want to create custom /etc/hosts file for USER1 , create a directory:
/etc/cagefs/custom.etc/USER1

Inside that directory, create a hosts file, with the content for that user.

After that execute: +

$ cagefsctl --update-etc USER1
+

If you are making changes for multiple users, you can run:

$ cagefsctl --update-etc
+

To remove a custom file, remove it from /etc/cagefs/custom.etc/[USER] directory, and re-run: +

$ cagefsctl --update-etc
+

Moving cagefs-skeleton directory

Sometimes you might need to move cagefs-skeleton from /usr/share to another partition.

There are two ways:

  1. If /usr/share/cagefs-skeleton is not created yet ( cagefsctl --init wasn't executed), then execute:
$ mkdir /home/cagefs-skeleton 
+$ ln -s /home/cagefs-skeleton /usr/share/cagefs-skeleton 
+$ cagefsctl --init
+
  1. If /usr/share/cagefs-skeleton already exists, see this article

Moving /var/cagefs directory

To move /var/cagefs to another location:

$ cagefsctl --disable-cagefs
+$ cagefsctl --unmount-all
+

Verify that /var/cagefs.bak directory does not exist (if it exists - change name "cagefs.bak" to something else)

$ cp -rp /var/cagefs /new/path/cagefs
+$ mv /var/cagefs /var/cagefs.bak
+$ ln -s /new/path/cagefs /var/cagefs
+$ cagefsctl --enable-cagefs
+$ cagefsctl --remount-all
+

Verify that the following command gives empty output: +

$ cat /proc/mounts | grep cagefs.bak
+

Then you can safely remove /var/cagefs.bak: +

$ rm -rf /var/cagefs.bak
+

TMP directories

CageFS makes sure that each user has his own /tmp directory, and that directory is the part of end-user's quota.

The actual location of the directory is $USER_HOME/.cagefs/tmp

Once a day, using cron job, CageFS will clean up user's /tmp directory from all the files that haven't been accessed during 30 days.

This can be changed by running: +

$ cagefsctl --set-tmpwatch='/usr/sbin/tmpwatch -umclq 720'
+

Where 720 is the number of hours that the file had to be inaccessible to be removed.

By default this is done at 03:37 AM, but you can also force the clean up outdated files that match 'chosen period' of all user's /tmp directories without waiting for a job to be launched by cronjob . Just run:

$ cagefsctl --tmpwatch
+

The following paths will be cleaned as well:

  • /var/cache/php-eaccelerator (actual location $USER_HOME/.cagefs/var/cache/php-eaccelerator)
  • /opt/alt/phpNN/var/lib/php/session (actual location $USER_HOME/.cagefs/opt/alt/phpNN/var/lib/php/session), where NN corresponds to Alt-PHP version.

You can configure tmpwatch to clean custom directories inside CageFS.

Create /etc/cagefs/cagefs.ini configuration file and specify tmpwatch_dirs directive as follows:

tmpwatch_dirs=/dir1,/dir2

After that directories /dir1 and /dir2 inside CageFS  will be cleaned automatically.

Note that actual location of those directories in real file system is $USER_HOME/.cagefs/dir1 and $USER_HOME/.cagefs/dir2.

Cleanup PHP sessions in cPanel

For cPanel servers, CageFS version 6.0-42 or higher performs cleaning of PHP sessions based on session.gc_maxlifetime and session.save_path directives specified in proper php.ini files.

session.gc_maxlifetime directive default value is 1440 seconds. Those session files will be deleted, that were created or had metadata (ctime) changes more time ago than it is specified in session.gc_maxlifetime.

For Alt-PHP versions session.save_path value is normally /tmp.

Note

For new installations of Alt-PHP packages, session.save_path will be changed from /tmp to /opt/alt/phpNN/var/lib/php/session, where NN corresponds to Alt-PHP version.

This applies to the following Alt-PHP versions (or later):

  • alt-php44-4.4.9-71;
  • alt-php51-5.1.6-81;
  • alt-php52-5.2.17-107;
  • alt-php53-5.3.29-59;
  • alt-php54-5.4.45-42;
  • alt-php55-5.5.38-24;
  • alt-php56-5.6.31-7;
  • alt-php70-7.0.23-5;
  • alt-php71-7.1.9-5;
  • alt-php72-7.2.0-0.rc.2.2.

When using EasyApache 3, session.save_path value is normally /var/cpanel/php/sessions/ea3 or /tmp . Settings for EasyApache 3 are usualy taken from the file /usr/local/lib/php.ini .

When using EasyApache 4, session.save_path value is normally /var/cpanel/php/sessions/ea-phpXX , where XX corresponds to PHP version.

Cleaning is started by cron /etc/cron.d/cpanel_php_sessions_cron , which starts the script /usr/share/cagefs/clean_user_php_sessions twice within one hour.

Note

Script clean_user_php_sessions deletes only files which names match mask sess_[a-z0-9]*. If php was configured to use non-standart session file prefix in some custom save_handler, these session files wouldn't be managed by clean_user_php_sessions.

The settings for ea-php are located in /opt/cpanel/ea-phpXX/root/etc/php.d/local.ini or in /opt/cpanel/ea-phpXX/root/etc/php.ini , where XX corresponds to the PHP version.

The settings for alt-php are located in /opt/alt/phpXX/etc/php.ini files, where XX corresponds to PHP version.

The cleaning script cleans php sessions for all PHP versions ( ea-php and alt-php ) regardless of whether a version is used or selected via MultiPHP Manager or PHP Selector . When different session.gc_maxlifetime values are specified for the same session.save_path (for different php versions), the cleaning script will use the least value for cleaning session.save_path . So, it is recommended to specify different session.save_path for each PHP version.

Users can define custom value of session.gc_maxlifetime via PHP Selector in order to configure PHP's garbage collector, but that will not affect the script for cleaning PHP sessions. The script cleans PHP sessions based on global values of session.gc_maxlifetime and session.save_path directives taken from files mentioned above. Settings in custom users’ php.ini files are ignored.

Cleanup PHP session files in Plesk

For Plesk servers, CageFS version 6.0-52 or higher is provided with a special cron job for removing obsolete PHP session files. Cleanup script runs once an hour (similar to how it is done in Plesk).

Each time the script runs, it performs the cleanup of the paths:

  1. set by session.save_path directive in /opt/alt/phpXX/etc/php.ini files. If session.save_path is missing, then /tmp is used. Session files lifetime is set by session.gc_maxlifetime directive. If it is not found, then 1440 seconds value is used (24 minutes, as in Plesk). Lifetime set in the file is only taken into consideration if it is longer than 1440 seconds, otherwise 1440 seconds is used. All the installed Alt-PHP versions are processed.

  2. /var/lib/php/session . Files lifetime is only defined by Plesk script /usr/lib64/plesk-9.0/maxlifetime . If the script is missing or returns errors, then this directory is not processed.

The following features are applied during the cleanup:

  • all the users with UID higher than specified in /etc/login.defs are processed. Each user is processed independently from one another.
  • only directories inside CageFS are being cleaned. The paths of the same name in the physical  file system are not processed.
  • in all the detected directories, all the files with the names that correspond to sess_ search mask are removed, the rest of the files are ignored.
  • the files older than specified lifetime are removed.
  • all non-fatal errors (lack of rights, missing directory) are ignored and do not affect the further work of the script.

Disable PHP sessions cleanup on cPanel and Plesk

Here is a possible workaround for PHP session expiration problem (session lives longer than it is possible in a control panel). To use your own custom PHP sessions cleanup scripts - you can turn off built-in sessions cleanup implementation in the following way: +add clean_user_php_sessions=false line to /etc/sysconfig/cloudlinux .

Syslog

By default, /dev/log should be available inside end user's CageFS . This is needed so that user's cronjobs and other things that user dev/log would get recorded in the system log files.

This is controlled using file /etc/rsyslog.d/schroot.conf with the following content: +

$AddUnixListenSocket /usr/share/cagefs-skeleton/dev/log
+

To remove presence of dev/log inside CageFS, remove that file, and restart rsyslog service.

Excluding mount points

How to exclude mounts from namespaces for all LVEs

By default, all mounts from the real file system is inherited by namespaces of all LVEs . So, destroying all LVEs may be required in order to unmount some mount in real file system completely. Otherwise, mount point remains busy after unmounting it in the real file system because this mount exists in namespaces of LVEs .

lvectl start command saves all mounts from real file system as “default namespace” for later use in all LVEs . lve_namespaces service executes lvectl start command during startup.

In lve-utils-2.0-26 (and later) there is an ability to exclude specific mounts from namespaces for all LVEs . +In order to do so, please create a file /etc/container/exclude_mounts.conf with list of mounts to exclude (one mount per line) as regular expressions, and then execute lvectl start : +

# cat /etc/container/exclude_mounts.conf    
+^/dir1/
+^/dir2$
+# lvectl start
+

After that, all new created LVEs will be without /dir2 mount and without mounts that start with /dir1/ (like /dir1/x , /dir1/x/y , etc). To apply changes to existing LVEs you should recreate LVEs : +

# lvectl destroy all   
+# lvectl apply all
+

Note

You should recreate all LVEs only once after creating /etc/container/exclude_mounts.conf file. After that the configuration changes will be applied to all new LVEs automatically.

Shared memory (/dev/shm) isolation in CageFS

Note

Requires cagefs-6.2.1-1 or later

The /dev/shm in a real file system directory is “world-writable”. This directory from the real file system is mounted to CageFS by default, so /dev/shm directory is common for all users by default. However, it is possible to improve security and isolate /dev/shm (shared memory) for each user in CageFS.

To enable /dev/shm isolation, do the following steps:

  1. Delete /dev/shm line from the /etc/cagefs/cagefs.mp file
sed -i -e '/^\/dev\/shm/d' /etc/cagefs/cagefs.mp
+
  1. Create a configuration file with mount options for shared memory
echo 'mode=0777' > /etc/cagefs/dev.shm.options
+
  1. Remount CageFS to apply changes
cagefsctl --remount-all
+

You can also specify additional mount options.

For example, you can specify the size of shared memory in megabytes:

echo 'mode=0777,size=1m' > /etc/cagefs/dev.shm.options
+cagefsctl --remount-all
+

Or you can specify the size of user’s physical memory limit (PMEM) in percentage:

echo 'mode=0777,size=50%' > /etc/cagefs/dev.shm.options
+cagefsctl --remount-all
+

To disable /dev/shm isolation, do the following steps:

  1. Delete configuration file
rm -f /etc/cagefs/dev.shm.options
+
  1. Validate /etc/cagefs/cagefs.mp file
cagefsctl --check-mp
+
  1. Add /dev/shm line to /etc/cagefs/cagefs.mp file
echo '/dev/shm' >> /etc/cagefs/cagefs.mp
+
  1. Remount CageFS to apply changes
cagefsctl --remount-all
+

Note

you should specify mode=0777. It is required for the proper operation of shared memory inside CageFS. This is not a security issue because the /dev/shm directory is isolated for each user and visible inside a user’s CageFS only.

Note

/dev/shm is mounted with nosuid,nodev,noexec mount options always (both in “isolated /dev/shm” mode and not). You cannot change this behavior.

Note

“isolated /dev/shm” mode will become the default in the future CageFS releases.

Note

when the size of the /dev/shm is specified in percentage of user’s physical memory limit (PMEM), you should remount CageFS after changing PMEM limit in order to change the size of shared memory allocated for the /dev/shm in user’s CageFS. To do so, execute cagefsctl --remount-all

Preventing process from entering CageFS on error

Starting from CageFS v.7.2.0-1, you can prevent a process from work if it can't enter to CageFS. The option is disabled by default.

To enable it, run the following commands:

touch /etc/cagefs/fail.on.error
+cagefsctl --remount-all (cagefsctl --remount <user>)
+

To disable it, run the following commands:

rm -f /etc/cagefs/fail.on.error
+cagefsctl --remount-all (cagefsctl --remount <user>)
+

The message “Act like CageFS is disabled” in the /var/log/messages will be displayed regardless the file /etc/cagefs/fail.on.error is available or not.

Integration with control panels

CageFS comes with a plugin for various control panels.

The plugin allows to:

  • Initialize CageFS;

  • Select mode of operation;

  • See and modify the list of enabled/disabled users;

  • Update CageFS skeleton.

cPanel

CageFS plugin for cPanel is located in Plugins section of WHM.

It allows to initialize CageFS, select users CageFS will be enabled for, as well as update CageFS skeleton.

To enable CageFS for a proper user (users), in CageFS User Manager choose a user from the list on the right ( Disabled users) and click Toggle . The user will move to the list on the left ( Enabled users).

To disable a user (users), choose a user from the list on the left ( Enabled users) and click Disable CageFS . The user will move to the list on the right ( Disabled users).

To update CageFS skeleton, click Update CageFS Skeleton .

Plesk

CageFS comes with a plugin for Plesk 10.x. It allows initializing and updating CageFS template, as well as managing users and mode of operation for CageFS.

In modules section choose CageFS:

To enable CageFS for a proper user (users), in CageFS User Manager choose a user from the list on the right ( Disabled users) and click Toggle . The user will move to the list on the left ( Enabled users).

To disable a user (users), choose a user from the list on the left ( Enabled users) and click Disable CageFS . The user will move to the list on the right ( Disabled users).

To update CageFS skeleton, click Update CageFS Skeleton .

ISPManager

CageFS comes with plugin for ISP Manager to enable/disable CageFS on per user base. In edit user section chose Permission tab. Mark CageFS User Mode checkbox and click OK to apply.

Or you can manage global CageFS settings via CageFS menu +

See also CageFS CLI tools.

MySQL Governor

General information and requirements

Note

MySQL Governor 0.8-32+

Warning

The "All" mode will be deprecated starting from September 1, 2021. You can read more here.

MySQL Governor is software to monitor and restrict MySQL usage in shared hosting environment. The monitoring is done via resource usage statistics per each MySQL thread.

MySQL Governor has two active modes of operations:

  • off - In this mode MySQL Governor will not throttle customer's queries, instead it will let you monitor the MySQL usage.
  • abusers - In this mode, once user goes over the limits specified in the MySQL Governor, all customer's queries will execute inside that user's LVE.

More details of the governor operation modes are described in the Modes of operation section

MySQL Governor allows to restrict customers who use too much resources. It supports following limits:

CPU % CPU speed relative to one core. 150% would mean one and a half cores
READ bytes bytes read. Cached reads are not counted, only those that were actually read from disk will be counted
WRITE bytes bytes written. Cached writes are not counted, only once data is written to disk, it is counted

You can set different limits for different periods: current, short, med, long. By default those periods are defined as 1 second, 5 seconds, 1 minute and 5 minutes. They can be re-defined using configuration file. The idea is to use larger acceptable values for shorter periods. Like you could allow a customer to use two cores (200%) for one second, but only 1 core (on average) for 1 minute, and only 70% within 5 minutes. That would make sure that customer can burst for short periods of time.

Customers will also be limited to a finite number of concurrent connections, this number is 30 by default and can be changed. This is done so they wouldn't use up all the MySQL connections to the server. MySQL Governor can also kill off slow SELECT queries.

MySQL Governor limits interaction with LVE limits

How is interaction between MySQL Governor and LVE organized?

The main purpose of MySQL Governor is to monitor how many common resources are used by each user for working with MySQL/MariaDB and to manage usage restrictions for such resources by LVE containers.

Before any SQL request, MySQL Governor determines which user sent the request and if this user exceed limits, the MySQL Governor pushes the request to appropriate LVE container.

This is how common server resources can be managed.

Why the СPU/IO charts are different for database and LVE usage?

SQL requests are not limited inside LVE, so there are not any calculations for IO usage there. It can be clearly viewed via the lve-stats charts:

Blue chart (database):

This is the user’s real IO Database usage which was calculated by MySQL Governor.

Green chart (LVE):

This is the user’s IO Database usage which was calculated by lve-stats.

Also for different types of database load (for example in case, there is a huge amount of shot requests), CPU usage charts for LVE and database can be different.

Take a look on this chart:

Blue (database) CPU usage:

It is calculated by MYSQL Governor and the value is identical with top/htop values.

Green (LVE) CPU usage:

It is calculated by lve-stats. The values are less on the LVE CPU usage chart because user requests are placed in the LVE only for part of the time.

For what purpose are the IO limits of MySQL Governor used?

MySQL Governor uses its limits as triggers to place user’s requests to the LVE. If user’s requests exceed MySQL Governor limits they are placed to the LVE, which already limits resource usage. After some timeout (which can be configured in the MySQL Governor config file requests will not be placed to the LVE. The next placing of the SQL requests to the LVE will occur after the next limits are exceeded.

How exactly does IO limiting work for MySQL/MariaDB requests?

There is no direct IO limitation for database treads. But in case of exceeding governor IO user limits, their requests will be placed into the LVE and CPU LVE limitation will be applied to the requests. And it’s clear that any IO load causes CPU load. So by CPU limits IO usage will be limited indirectly.

Take a look at the next chart. The I/O load is synchronous with the CPU load.

Installation and update

Installation

IMPORTANT

Please note that MariaDB 10.4 release isn’t supported by cPanel, thus you can’t install this version with MySQL Governor + cPanel. More details are available here: https://features.cpanel.net/topic/maria-10-4-support.

IMPORTANT

Please make full database backup (including system tables) before you upgrade MySQL or switch to MariaDB. This action will prevent data loss in case if something goes wrong.

MySQL Governor is compatible only with MySQL 5.x, 8.0; MariaDB & Percona Server 5.6.

To install MySQL Governor on your server install governor-mysql package at first:

$ yum remove db-governor db-governor-mysql  # you can ignore errors if you don't have those packages installed
+$ yum install governor-mysql
+

Then configure MySQL Governor properly.

The installation is currently supported only on cPanel, Plesk, DirectAdmin, ISPmanager, InterWorx , as well as on servers without control panel.

If you are installing CloudLinux OS Shared on a server running MySQL already, set your current MySQL version before calling installation script:

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=mysqlXX
+$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install
+

Please make sure to specify your current MySQL version instead of XX as follows:

  • 55 — MySQL v5.5
  • 56 — MySQL v5.6
  • 57 — MySQL v5.7
  • 80 — MySQL v8.0 (requires MySQL Governor 1.2-37+)

If you are installing CloudLinux OS Shared on a server running MariaDB already, do instead:

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=mariadbXX
+$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install
+

Please make sure to specify your current MariaDB version instead of XX as follows:

  • 55 — MariaDB v5.5
  • 100 — MariaDB v10.0
  • 101 — MariaDB v10.1
  • 102 — MariaDB v10.2
  • 103 — MariaDB v10.3 [requires MySQL Governor 1.2-36+; for cPanel - MySQL Governor 1.2-41+]
  • 104 – MariaDB v10.4 [requires MySQL Governor 1.2-53+]
  • 105 - MariaDB v10.5 [requires MySQL Governor 1.2-62+]
  • 106 - MariaDB v10.6 [requires MySQL Governor 1.2-76+]

Note

MariaDB version 10.4 is not available for CloudLinux OS Shared 6.

Installation for Percona Server 5.6 [requires MySQL Governor 1.1-22+ or 1.2-21+]:

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=percona56
+$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install
+

Please note that MySQL/MariaDB/Percona will be updated from CloudLinux OS Shared repositories.

If you are installing MySQL Governor on a server without MySQL at all, you have an opportunity to choose desired MySQL version to be installed with MySQL Governor installation script. Use --mysql-version flag before calling the installation script:

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=MYSQL_VERSION
+$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install
+

MYSQL_VERSION could be chosen from the list of versions currently supported by MySQL Governor :

mysql51 MySQL v5.1
mysql55 MySQL v5.5
mysql56 MySQL v5.6
mysql57 MySQL v5.7
mysql80 MySQL v8.0 (requires MySQL Governor 1.2-37+)
mariadb55 MariaDB v5.5
mariadb100 MariaDB v10.0
mariadb101 MariaDB v10.1
mariadb102 MariaDB v 10.2
mariadb103 MariaDB v 10.3 [requires MySQL Governor 1.2-36+; for cPanel - MySQL Governor 1.2-41+]
mariadb104 MariaDB v 10.4 [requires MySQL Governor 1.2-53+]
mariadb105 MariaDB v 10.5 [requires MySQL Governor 1.2-62+]
mariadb106 MariaDB v 10.6 [requires MySQL Governor 1.2-76+]
percona56 Percona Server v 5.6

Generally, stable and beta channels contain different version of MySQL packages - beta contains newer version than stable or the same one. If you would like to install beta packages, use --install-beta flag instead of --install when calling installation script:

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install-beta
+

Starting with MySQL Governor version 1.2 when installing MySQL/MariaDB MySQL Governor asks for a confirmation of a database version to be installed. To avoid such behavior for the automatic installations, please use --yes flag.

For example:

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install --yes
+

Please note that restore of previous packages in case of failed installation would also be confirmed with --yes flag.

IMPORTANT

Use --yes flag on your own risk, because it confirms installation in any case - even in case if there are troubles during installation (for example, network problems causing incomplete download of packages), everything would be confirmed.

Note

See also MySQL Governor CLI

Upgrading database server

Important

Upgrade from MySQL 8 to MariaDB 10.x isn't supported due to compatibility issues between these database server versions and will break your database server completely. You can find more information about the compatibility issues here

Warning

Please note that DB Governor is capable of upgrading your database to a newer version, including sequential upgrades, but we make no guarantee that such upgrades do not affect the operation of the database, its components, control panel operation and other functions of database. Always create a backup copy of your data.

In order to change MySQL version you should run the following commands:

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=MYSQL_VERSION
+$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install
+

where MYSQL_VERSION is the target database server version that should be replaced with the value from the table above.

IMPORTANT

Make sure you have full database backup (including system tables) before you switch. This action will prevent data loss in case if something goes wrong.

Uninstalling

To remove MySQL Governor:

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --delete
+

The script will install original MySQL server, and remove MySQL Governor.

Configuration and operation

Configuration

Warning

The "All" mode will be deprecated starting from September 1, 2021. You can read more here.

MySQL Governor configuration is located in /etc/container/mysql-governor.xml

It is best to modify it using dbctl tool.

Once configuration file is updated, please, restart the MySQL Governor using:

$ service db_governor restart
+
+Example configuration: +
<governor> 
+
+<!--  'off' - do not throttle anything, monitoring only -->
+<!--  'abusers' - when user reaches the limit, put user's queries into LVE for that user -->
+<!--  'all' - user's queries always run inside LVE for that user -->
+<!--  'single' - single LVE=3 for all abusers. -->
+<!-- 'on' - deprecated (old restriction type) -->
+<!-- To change resource usage of restricted user in LVE mode use command /usr/sbin/lvectl set 3 --cpu=<new value> --ncpu=<new value> --io=<new value> --save-all-parameters -->
+<lve use="on|single|off|abusers|all"/> 
+
+<!-- connection information -->
+<!-- If host, login and password are not present, this information is taken from /etc/my.cnf and ~root/.my.cnf -->
+<!-- Use symbol specified in prefix to figure out hosting accounts (mysql username will be split using prefix_separator, and first part will be used as account name). If prefix is not set, or empty -- don’t use prefixes/accounts --> 
+
+<!-- db governor will try to split MySQL user names using prefix separator (if present)and statistics will be aggregated for the prefix (account name) -->
+<connector host="..." login="..." password=".." prefix_separator="_"/> 
+
+<!-- Intervals define historical intervals for burstable limits. In seconds -->
+<intervals short="5" mid="60" long="300"/> 
+
+<!-- log all errors/debug info into this log -->
+<log file=”/var/log/dbgovernor-error.log” mode=”DEBUG|ERROR”/> 
+
+<!-- s -- seconds, m -- minutes, h -- hours, d -- days -->
+<!-- on restart, restrict will disappear -->
+<!-- log file will contain information about all restrictions that were take -->
+<!-- timeout - penalty period when user not restricted, but if he hit his limit during this period he will be restricted with higher level of restrict (for more long time) -->
+<!- level1, level2, level3, level4 - period of restriction user for different level of restriction. During this period all user's requests will be placed into LVE container -->
+
+<!-- if user hits any of the limits during period of time specified in timeout, higher level of restrict will be used to restrict user. If user was already on level4, level4 will be applied again -->
+<!-- attribute format set an restrict log format:
+SHORT -  restrict info only
+MEDIUM - restrict info, _all_tracked_values_
+LONG - restrict info, _all_tracked_values_, load average and vmstat info
+VERYLONG - restrict info, _all_tracked_values_, load average and vmstat info, slow query info -->
+<!-- script -- path to script to be triggered when account is restricted -->
+<!-- user_max_connections - The number of simultaneous connections of blocked user (in LVE mode) --> 
+
+<!-- restriction levels/format are deprecated -->
+<restrict level1="60s" level2="15m" level3="1h" level4="1d" timeout="1h"
+log="/var/log/dbgovernor-restrict.log" format="SHORT|MEDIUM|LONG|VERYLONG"
+script="/path/to/script"
+user_max_connections="30"/> 
+
+<!-- period (deprecated) - period based restriction that has multiple levels (see above) -->
+<!-- limit (by default) - when user hits limits, the account will be marked as restricted and if user does not hit  limit again during "unlimit=1m" account will be unrestricted. This mode doesn't have any additional levels/penalties. -->
+<restrict_mode use="period|limit" unlimit="1m"/>
+
+<!-- killing slow SELECT queries (no other queries will be killed) -->
+<!-- if "log" attribute was set all killed queries will be saved in log file -->
+<!-- slow parameter in the <limit name="slow" current="30"/> will no be applied without enabling slow_queries --> 
+<slow_queries run="on|off" log="/var/log/dbgovernor-kill.log"/> 
+<!-- Enable or disable saving of statistics for lve-stats - On - enabled, Off-disabled -->
+<statistic mode="on|off"></statistic>
+<!-- Enable logging user queries on restrict, can be On or Off -->
+<!-- Files are saved in /var/lve/dbgovernor-store and being kept here during 10 days -->
+<logqueries use="on|off"></logqueries>
+<default>
+<!-- -1 not use limit(by default, current - required) -->
+<limit name="cpu" current="150" short="100" mid="90" long="65"/>
+<limit name="read" current="100000000" short="90000000" mid="80000000" long="70000000"/>
+<limit name="write" current="100000000" short="90000000" mid="80000000" long="70000000"/>
+<!-- Time to kill slow SELECT queries for account, can be different for accounts in seconds(but unit can be specified) -->
+<!-- enabled only when slow_queries run="on" -->
+<!-- s -- seconds, m -- minutes, h -- hours, d -- days -->
+<!-- Requests are checked at 15 second intervals, so a request will be canceled after a timeout + 15 seconds maximum -->
+<limit name="slow" current="30"/>
+</default>
+<!-- name will matched account name, as extracted via prefix extraction --> 
+
+<!-- mysql_name will match exact MySQL user name. If both name and mysql_name are present, system will produce error -->
+<!-- mode restrict -- default mode, enforcing restrictions -->
+<!-- mode norestrict -- track usage, but don’t restrict user --> 
+<!-- mode ignore -- don’t track and don’t restrict user -->
+<user name=”xxx” mysql_name=”xxx” mode=”restrict|norestrict|ignore”>
+<limit...>
+</user> 
+
+<!-- debug mode for particular user. The information logged to restrict log. -->
+<debug_user name="xxx"/> 
+
+</governor>
+

These values can also be set using cloudlinux-config CLI utility

Modes of operation

Warning

The "All" mode will be deprecated starting from September 1, 2021. You can read more here.

Note

MySQL Governor 1.0+

Active modes

  • abusers - Use LVE for a user to restrict queries (default mode): In that mode, once user goes over the limits specified in the MySQL Governor , all customer's queries will execute inside that user's LVE. We believe this mode will help with the condition when the site is still fast, but MySQL is slow (restricted) for that user. If someone abuses MySQL, it will cause queries to share LVE with PHP processes, and PHP processes will also be throttled, causing fewer new queries being sent to MySQL. Requires dbuser-map file.
  • off - Monitor Only: In that mode MySQL Governor will not throttle customer's queries, instead it will let you monitor the MySQL usage to see the abusers at any given moment in time (and historically). This mode is good when you are just starting and want to see what is going on.

Deprecated modes

  • all - Always run queries inside user's LVE (will be deprecated on September 1, 2021): This way there is no need for separate limits for MySQL. Depending on overhead we see in the future, we might decide to use it as a primary way of operating MySQL Governor . The benefit of this approach is that limits are applied to both PHP & MySQL at the same time, all the time, preventing any spikes whatsoever. Requires dbuser-map file.
  • single - Single restricted's LVE for all restricted customers (deprecated): In that mode once customer reaches the limits specified in the MySQL Governor , all customer's queries will be running inside LVE with id 3. This means that when you have 5 customers restricted at the same time, all queries for all those 5 customers will be sharing the same LVE. The larger the number of restricted customers - the less resources per restricted customer will be available.
  • on - Synonym for single mode

Note

After the all mode will be deprecated on September 1, 2021:

  • the users, having it, will continue to work with this mode;
  • all new installation will not have the all mode;
  • moving to the all mode will be forbidden.

If the dbuser-map file is absent on the server, the abusers mode emulates the single.

With the single and abusers mode, once user is restricted, the queries for that user will be limited as long as user is using more than limits specified. After a minute that user is using less, we will unrestricted that user.

You can specify modes of operation using dbctl or by changing configuration file.

MySQL Governor limits

MySQL Governor limit setting recommendations

Note

Please note that these recommendations on setting limits for MySQL Governor are general. The exact values of the limits for the effective work of MySQL and the site as a whole depend on many factors.

Here they are:

  • the load of the virtual server with incoming requests
  • the database size
  • SQL queries efficiency
  • absolute values of the LVE limits

MySQL Governor allows setting the burstable limits for accounts. To provide that possibility, four levels of limits are defined: current, short, middle, and long. Correctly set limits can give users more CPU without having a bottleneck on MySQL.

General principles of choosing the limits:

  • current and short can be more than the LVE limit and should not be less
  • setting the current and short limits more than the LVE limit prevents bottlenecks in SQL request processing
  • middle limit can be more or less that the LVE limit
  • long on the contrary, should not be more than the LVE limit
  • setting the middle and long limits less than the LVE limit prevents abuse of other processes in the account (Apache, PHP) by MySQL

Example of choosing MySQL Governor limits

  • With the default LVE SPEED limit is 100, the possible values of the MySQL Governor CPU limits can be 250/150/110/90. I.e., we admit the short-term exceeding of the limits for processing SQL requests.
  • If you face spike CPU consumption with these limits, it is recommended to reduce the excess of the current and short limits over the LVE limit. For example, to the values 150/110/100/90.
  • If the average level of CPU consumption is too high, then it is recommended to reduce the middle and long limits, too. For example, to the values 150/100/80/50.
  • Then MySQL processes will fall into LVE and be limited by LVE limits more often.
  • The same clues are applicable to the IO limits – the current and short IO limits for MySQL Governor can exceed IO LVE limits, but the middle and long cannot.

Starting and stopping

To start: +

$ service db_governor start
+

To stop: +

$ service db_governor stop
+

Mapping a user to a database

[ MySQL Governor 1.x]

Traditionally MySQL Governor used prefixes to map user to database. With the latest version, we automatically generate user -> database user mapping for cPanel , Plesk and DirectAdmin control panels.

The mapping file is recreated daily by cron.

Mapping recreation is also triggered by the following events on cPanel servers:

  • creation of user
  • modification of user
  • removal of user

You can also rebuild the mapping file manually on cPanel, Plesk and DirectAdmin control panels by running the following command:

/usr/share/lve/dbgovernor/mysqlgovernor.py --dbupdate
+

The mapping file is located in: /etc/container/dbuser-map

The format of the file: +

[dbuser_name1] [account_name1] [UID1]
+...
+[dbuser_nameN] [account_nameN] [UIDN]
+
+For example: +
pupkinas_u2 pupkinas 502
+pupkinas_u1 pupkinas 502
+pupkinas_u3 pupkinas 502
+pupkin2a_uuu1 pupkin2a 505
+pupkin10_p10 pupkin10 513
+pupkin5a_u1 pupkin5a 508
+pupkin3a_qq1 pupkin3a 506
+pupkin3a_test22 pupkin3a 506
+pupkin3a_12 pupkin3a 506
+

This would specify that db users: pupkinas_u2, pupkinas_u1, pupkinas_u3 belong to user pupkinas with uid (lve id) 502 +db user pupkin2a_uuu1 belongs to user pupkin2a with uid 505, etc...

db_governor service checks this file for modifications every 5 minutes.

If you need to force reload the mapping file, run: +

service db_governor restart
+

Log files

Error_log

MySQL Governor error log is used to track any problems that MySQL Governor might have

Restrict_log

Restrict log is located in /var/log/dbgovernor-restrict.log

Restrictions: +

_timestamp_ _username_ LIMIT_ENFORCED _limit_setting_ __current_value_                         _restrict_level__ SERVER_LOAD TRACKED_VALUES_DUMP
+ ... 
+
  • TRACKED_VALUES_DUMP=busy_time:xx,cpu_time:xx,...
  • SERVER_LOAD = load averages followed by output of vmstat
  • TRACKED_VALUES_DUMP is available with MEDIUM & LONG format
  • SERVER_LOAD is available with LONG format

Kill_log

MySQL Governor kill log is optional log located in the /var/log/dbgovernor-kill.log. Kill log is used to track all killed queries

Change MySQL version

If you would like to change to a different MySQL version, or switch to MariaDB you have to start by backing up existing databases.

Note

For experienced users only. Changing MySQL version is a quite complicated procedure, it causes system table structural changes which can lead to unexpected results. Think twice before proceeding.

IMPORTANT

Please make full database backup (including system tables) before you will do upgrade of MySQL or switch to MariaDB. This action will prevent data losing in case if something goes wrong.

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=MYSQL_VERSION
+$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install
+
  • If you are using cPanel or DirectAdmin - recompile Apache .

To install beta version of MySQL: +

$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install-beta
+

MYSQL_VERSION can be one of the following:

auto default version of MySQL for given OS release (or cPanel settings)
mysql51 MySQL v5.1
mysql55 MySQL v5.5
mysql56 MySQL v5.6
mysql57 MySQL v5.7
mysql80 MySQL v8.0 (requires MySQL Governor 1.2-37+)
mariadb55 MariaDB v5.5
mariadb100 MariaDB v10.0
mariadb101 MariaDB v10.1
mariadb102 MariaDB v 10.2
mariadb103 MariaDB v 10.3 [requires MySQL Governor 1.2-36+; for cPanel - MySQL Governor 1.2-41+ ]
mariadb104 MariaDB v 10.4 [requires MySQL Governor 1.2-53+]
percona56 Percona v 5.6
  • We don't recommend to downgrade from MySQL v5.6, MariaDB 10.x

Note

cPanel does not officially support MariaDB 10.4, that is why we don’t recommend to use it on cPanel servers. Use on your own risk for Plesk servers, because downgrade can corrupt your databases.

Note

MariaDB version 10.4 is not available for CloudLinux OS Shared 6 yet.

Note

See also MySQL Governor CLI

PrivateDevices mode support

MySQL Governor v. 1.2-66 and later on Cloudlinux OS Shared 7 and 8 supports the PrivateDevices mode for the mysqld service.

To switch on the PrivateDevices mode, follow these steps.

On Cloudlinux OS Shared 7

  • Make sure that the systemd version is at least 219-78.2.cloudlinux.1
  • Add the following instruction into the Service section of the mysqld service file:
    PrivateDevices=true
    +
  • Invoke systemctl daemon-reload
  • Restart mysqld service

On Cloudlinux OS Shared 8

  • Add the following instructions into the Service section of the mysqld service file:
    PrivateDevices=true
    +DeviceAllow=/dev/lve
    +BindPaths=/dev/lve 
    +
  • Invoke systemctl daemon-reload
  • Restart mysqld service

Backing up MySQL

On cPanel server disable MySQL service monitoring before doing the job: +

$ whmapi1 configureservice service=mysql enabled=1 monitored=0
+

Execute as root : +

$ mkdir -p ~/mysqlbkp
+$ service mysql restart --skip-networking --skip-grant-tables
+$ mysql_upgrade
+$ mysqldump --all-databases --routines --triggers > ~/mysqlbkp/dbcopy.sql
+$ service mysql stop
+$ cp -r /var/lib/mysql/mysql ~/mysqlbkp/
+$ service mysql start
+

On cPanel server enable monitoring back: +

$ whmapi1 configureservice service=mysql enabled=1 monitored=1
+

Note

This operation may take some time.

See also MySQL Governor CLI tools.

MySQL Governor improvements for CPU calculation

In MySQL Governor version 1.2-81, we provide improvements in the algorithm of calculation user CPU usage. New behavior helps to increase precision of resource distribution between server users. By default the new type of CPU usage calculation is tuned on.

Server administrator can turn on/off the new type of CPU usage calculation by using the following command:

dbctl --lve-improved-accuracy off
+

What is the impact of improvements?

The calculation of CPU usage has become more accurate, so the dbtop utility provides more correct information to the MySQL Governor and it places user’s requests to the LVE in a proper moment. And as a result, such improvements reduce the possibility of absorbing whole server resources by one user.

One mpre possible outcome of calculation improvements is that some server users will become in need of MySQL Governor limits reconfiguration.

How to view the impact of improvements?

Let’s check the CPU usage charts from CloudLinux statistics (lve-stats).

The new type of  CPU usage calculation is turned off.

In this case, CPU usage by database could be less than LVE average CPU usage (blue chart is lower than green chart):

The new type of  CPU usage calculation is turned on.

In this case, CPU usage by database become more similar to LVE average CPU usage (blue chart and green chart on the sceen):

FAQ

How is interaction between MySQL Governor and LVE organized?

The main purpose of MySQL Governor is to monitor how many common resources are used by each user for working with MySQL/MariaDB and to manage usage restrictions for such resources by LVE containers.

Before any SQL request, MySQL Governor determines which user sent the request and if this user exceed limits, the MySQL Governor pushes the request to appropriate LVE container.

This is how common server resources can be managed.

Why the СPU/IO charts are different for database and LVE usage?

SQL requests are not limited inside LVE, so there are not any calculations for IO usage there. It can be clearly viewed via the lve-stats charts:

Blue chart (database):

This is the user’s real IO Database usage which was calculated by MySQL Governor.

Green chart (LVE):

This is the user’s IO Database usage which was calculated by lve-stats.

Also for different types of database load (for example in case, there is a huge amount of shot requests), CPU usage charts for LVE and database can be different.

Take a look on this chart:

Blue (database) CPU usage:

It is calculated by MYSQL Governor and the value is identical with top/htop values.

Green (LVE) CPU usage:

It is calculated by lve-stats. The values are less on the LVE CPU usage chart because user requests are placed in the LVE only for part of the time.

For what purpose are the IO limits of MySQL Governor used?

MySQL Governor uses its limits as triggers to place user’s requests to the LVE. If user’s requests exceed MySQL Governor limits they are placed to the LVE, which already limits resource usage. After some timeout (which can be configured in the MySQL Governor config file requests will not be placed to the LVE. The next placing of the SQL requests to the LVE will occur after the next limits are exceeded.

How exactly does IO limiting work for MySQL/MariaDB requests?

There is no direct IO limitation for database treads. But in case of exceeding governor IO user limits, their requests will be placed into the LVE and CPU LVE limitation will be applied to the requests. And it’s clear that any IO load causes CPU load. So by CPU limits IO usage will be limited indirectly.

Take a look at the next chart. The I/O load is synchronous with the CPU load.

Troubleshooting

MariaDB 5.5 and MariaDB 10.0: How to set LimitNOFILE correctly for systemd.

MariaDB 5.5 and MariaDB 10.0 have only file for managing the service, but the file has LSB functions, so it is supported by systemd .

For adding extra limits, do the following:

  1. Run:
mkdir /etc/systemd/system/mariadb.service.d/
+
  1. Run:
touch /etc/systemd/system/mariadb.service.d/limits.conf
+
  1. Add the following content to the the file /etc/systemd/system/mariadb.service.d/limits.conf :
[Service] 
+LimitNOFILE=99999
+

MySQL Governor lost connection to MySQL - “Can't connect to mysql” messages in /var/log/dbgovernor-error.log (Plesk and DirectAdmin)

This may be caused by changing root/administrator credentials without updating MySQL Governor configuration file.

When you change root or administrator credentials in Plesk or DirectAdmin, you also need to update MySQL Governor configuration file. This could be done with the following command (available since governor-mysql 1.2-38):

/usr/share/lve/dbgovernor/mysqlgovernor.py --update-config-auth
+

The command updates credentials in MySQL Governor configuration file and restarts db_governor service afterwards.

After applying the command MySQL Governor successfully connects to MySQL.

Known limitations

I/O LVE limits don't work for user’s SQL queries

In the MySQL Governor default mode, once users go over the limits, all their SQL queries will execute inside that user's LVE.

This technique was provided with the early 1.1.5 version of MySQL Governor.

It turned out that memory limitation for MySQLrequests causes the OOM (Out Of Memory) issues and as a result database corruptions. So, it was decided not to apply LVE memory limits for SQL queries supplied by MySQL Governor. But the internal implementation of LVE is such that I/O and memory limits work together. That’s why the I/O LVE limits do not apply for user’s SQL queries now.

Nevertheless, SQL queries inside LVE are restricted by CPU limit which indirectly limits I/O usage, too.

PHP Selector

General information and requirements

The main requirements:

  • CageFS is installed
  • Alt-PHP packages are installed
  • Mod_suexec is installed. You can find installation instruction here
  • CageFS is initialized without errors
  • CageFS is enabled for a domain user-owner
  • An appropriate PHP handler is selected for PHP version which is system version. PHP Selector is compatible with the following technologies: suPHP, mod_fcgid, CGI (suexec), LiteSpeed. See also Compatibility Matrix.
  • PHP version in the CloudLinux OS Shared PHP selector does not equal to the Native PHP version

Note

PHP Selector is not supported for H-Sphere.

Note

PHP Selector requires native PHP to be installed, otherwise you will get an error message with a proposal to install PHP package. +Here are some instructions for different control panels:

  1. for cPanel
  2. for Plesk
  3. for DirectAdmin

After installing native PHP, please run the cloudlinux-selector setup --interpreter=php --json command in order to reconfigure CageFS and LVE Manager.

Installation and update

The installation of PHP Selector presumes that you already have CageFS & LVE Manager installed.

Use compatibility matrix to check if your Web Server/PHP mode is supporting PHP Selector. If not, you need a change to one of the supported models.

Installation of different versions of PHP & modules: +

$ yum groupinstall alt-php
+

Update CageFS & LVE Manager with support for PHP Alternatives:

$ yum update cagefs lvemanager
+

cPanel/WHM: Make sure 'Select PHP version' is enabled in Feature Manager .

IMPORTANT

Please, do not use settings like SuPHP_ConfigPath, PHPRC, PHP_INI_SCAN_DIR. Do not redefine path to php.ini and ini-files for PHP modules. Doing that can break PHP Selector functionality.

For example, alternative php5.2 versions should load /opt/alt/php52/etc/php.ini file and scan /opt/alt/php52/etc/php.d directory for modules: +

Configuration File (php.ini) Path         /opt/alt/php52/etc
+Loaded Configuration File                 /opt/alt/php52/etc/php.ini
+Scan this dir for additional .ini files   /opt/alt/php52/etc/php.d
+additional .ini files parsed              /opt/alt/php52/etc/php.d/alt_php.ini
+

Those are default locations for alt-php.

If you need custom PHP settings per user, please change them via "Edit PHP settings" feature of PHP Selector .

If a list of default modules is absent on the server in the /etc/cl.selector/defaults.cfg file for some alt-PHP version and there is nd_mysqli extension in this version, then on installation/update of the LVE Manager the mysqli extension will be disabled and nd_mysqli extension will be enabled automatically.

  • If nd_mysqli module is absent or a list of enabled modules is available, then they won't be changed automatically.
  • If alt-PHP is not installed on LVE Manager installation/update, then they won’t be changed automatically.

To change the modules status (enabled/disabled) manually, run the following command in a console: +

# /usr/sbin/cloudlinux-selector make-defaults-config --json --interpreter=php
+

Update

To update PHP Selector, run the following command: +

yum groupupdate alt-php
+

This command allows to install newly released versions in PHP Selector.

Note

See also PHP Selector CLI

Installation instructions for cPanel users

  1. Install CageFS as root via SSH:
yum install cagefs
+
  1. Install alt-php packages as root:
yum groupinstall alt-php
+
  1. Install mod_suexec package as root. See installation instructions here.
  2. Verify that CageFS is initialized successfully.
  • via SSH by running the following command:
cagefsctl --check-cagefs-initialized
+
  • via cPanel admin interface

Go to cPanel → Admin interface → LVE Manager → Dashboard → click Refresh

If there is a problem you can see Not initialized

  1. Initilize CageF (if it is not initialized)
  • Via SSH
cagefsctl --init
+
  • Via cPanel admin interface

    Go to cPanel → Admin interface → LVE manager → Options → CageFS INIT

If CageFS was initialized after refreshing Dashboard you will see that CageFS is enabled:

  1. Enable CageFS to a user

Go to cPanel → Admin interface → LVE manager → Users

  • For one user by individual slider (for LVE 1001 in the picture above)
  • For a group of user by the CageFS button (for LVE 1002 and 1003 in the picture above)
  1. Check that system PHP version is not alt-php (it should be ea-php)

Go to cPanel → Admin interface → MultiPHP Manager → PHP versions

  1. Check that an appropriate PHP handler is selected for PHP version which is system version

Go to cPanel Admin interface → MultiPHP Manager → PHP Handlers

  1. Check version for domain in MultiPHP Selector. It should be equal to the system default version

Go to cPanel Admin interface → MultiPhp Manager → PHP versions → scroll to Set PHP Version per Domain

  1. Version for domain in User’s interface in PHP Selector should not be equal to the Native version.

LiteSpeed support

Note

LiteSpeed detects CloudLinux OS Shared and applies all settings out-of-the-box.

Note

If your LiteSpeed is installed to a non-standard, custom location path, create a symlink: ln -s /path/to/custom/lsws /usr/local/lsws then run cagefsctl --setup-cl-selector.

If the settings were not applied, you can use the following steps to set up LiteSpeed to use PHP Selector.

  1. Follow PHP Selector installation guide.
  2. Make sure the following settings are set in the LSWS Web Admin console:
  • Configuration ➞ Server ➞ General ➞ CloudLinux OS Shared: CageFS or CageFS without suEXEC
  • Configuration ➞ Server ➞ General ➞ PHP suEXEC: Yes

How to set up LiteSpeed version 5.3+ to use PHP Selector

For Plesk

For other control panels

Additionally, we recommend setting up the following parameters:

  • Configuration ➞ Server ➞ PHP:
  • Click Edit in the PHP Handler Defaults section
  • Set Yes in the Run On Startup
  • Make sure to set Max Idle Time (for example to 140)

How to set up LiteSpeed version lower than 5.3 to use PHP Selector

Go to the External App tab, External Application ➞ Add.

  • The Command line should be /var/www/cgi-bin/cgi_wrapper/cloudlinux_wrapper on Plesk.
  • For other control panels, the Command line should be /usr/local/bin/lsphp.
  • The Run On Start Up line must contain Yes or No.

For Plesk

For other control panels

Settings in text format:

Name lsphp_selector
Address uds://tmp/lshttpd/lsphp_selector.sock
Notes Not Set
Max Connections 35
Environment PHP_LSAPI_MAX_REQUESTS=5000
PHP_LSAPI_CHILDREN=35
Initial Request Timeout (secs) 60
Retry Timeout (secs) 0
Persistent Connection Yes
Connection Keepalive Timeout Not Set
Response Buffering No
Auto Start Through CGI Daemon (Async)
Command * For Plesk /var/www/cgi-bin/cgi_wrapper/cloudlinux_wrapper
* For other control panels /usr/local/bin/lsphp
Back Log 100
Instances 1
suEXEC User Not Set
suEXEC Group Not Set
umask Not Set
Run On Start Up Yes
Max Idle Time 70
Priority 0
Memory Soft Limit (bytes) 2047M
Memory Hard Limit (bytes) 2047M
Process Soft Limit 400
Process Hard Limit 500

Go to the Script Handler tab. For required suffixes, change the Handler Name to lsphp_selector.

Note

In order to use PHP Selector and custom php.ini, lsphp5 needs to be in SuEXEC non-daemon mode.

Note

Some PHP configurations require more memory for SuExec to work properly. If you are getting error 500 after switching suEXEC to non-daemon mode, try to increase Memory Soft Limit and Memory Hard Limit for external App to at least 650/800M.

ISPmanager support

As of July 2013, PHP Selector support for ISPmanager is limited to command line utilities. You should still be able to use it.

As always, PHP Selector requires CGI, FCGI or suPHP to work.

You will need to do following modifications:

Create new file /usr/local/bin/php-cgi-etc:

#!/bin/bash
+/usr/bin/php-cgi -c /etc/php.ini "$@"
+
+Make that file executable: +
$ chmod +x /usr/local/bin/php-cgi-etc
+
+Edit file /usr/local/ispmgr/etc/ispmgr.conf

Add a line: +

path phpcgibinary /usr/local/bin/php-cgi-etc
+

Make sure there is no other lines with path phpcgibinary defined in the file.

Restart ISPmanager : +

$ killall ispmgr
+

After that FCGID wrappers (/var/www/[USER]/data/php-bin/php) for new users will be like this:

#!/usr/local/bin/php-cgi-etc

You might need to edit/modify wrappers for existing users if you want them to be able to use PHP Selector. You can leave them as is for users that don't need such functionality.

Uninstalling

It is not possible to remove PHP Selector from the system completely as it is an essential part of LVE Manager and CageFS packages. However, you can make PHP Selector unavailable for cPanel and Plesk users.

To do so, go to LVE Manager → PHP Selector and check Disabled as PHP Selector status. Doing so allows you to disable web-interface of the PHP Selector in the user interface but does not reset custom settings (choosing a version of PHP and modules).

To disable PHP Selector and make it has no effect on a PHP version on the sites, run the following command:

  • this command resets PHP versions to Native:
cagefsctl --cl-selector-reset-versions
+
  • this command resets PHP modules to Default:
cagefsctl --cl-selector-reset-modules
+

DANGER

These commands can affect PHP version of your clients’ web sites. Use them with caution as improper usage might cause your clients’ web sites down.

Note

It is possible to manually uninstall the integral parts of PHP Selector - alt-php packages. However, since CloudLinux OS components heavily rely on them, we do not recommend doing so. Proceed with caution and keep an eye on yum dependencies if you decide to uninstall the packages.

Disabling PHP extension globally

If you want to disable PHP extension globally, you don't need to remove file /opt/alt/phpXX/etc/php.d.all/$EXTENSION.ini . You should just comment out "extension=" directives in it.

The extension will be visible in PHP Selector interface, but selecting it in users's interface will take no effect - extension will be disabled in fact.

Reinstalling of alt-php packages will not reset settings (will not enable extension again).

Configuration and using

Setting default version and modules

Administrator can set default interpreter version and extensions for all users. All file operations are actually done by CageFS. CageFS takes settings from /etc/cl.selector/defaults.cfg. Currently the /etc/cl.selector/defaults.cfg is created and handled by CloudLinux OS Shared PHP Selector scripts. It has the following format: +

[global]
+selector=enabled
+
+[versions]
+php=5.4
+
+[php5.4]
+modules=json,phar
+
+[php5.3]
+modules=json,zip,fileinfo
+

Individual PHP.ini files

For each customer, inside CageFS, file alt_php.ini is located in /etc/cl.php.d/alt-phpXX (XX - version of PHP, like 52 or 53). The file contains PHP extension settings and extension directives selected by customer. This file exists for each customer, for each PHP version.

Note, that this is 'local' to CageFS, and different users will have different files. The file is not visible in /etc/cl.php.d outside CageFS. If you would like to view that file, use: +

# cagefsctl -e USERNAME 
+

to enter into CageFS for that user. Then type: exit ; to exit from CageFS

This file has to be updated using cagefsctl --rebuild-alt-php-ini after updating alt-php RPMs

Admin can change individual settings for PHP extensions by changing that extension's ini file, like editing /opt/alt/php54/etc/php.d.all/eaccelerator.ini and then running: +

cagefsctl --rebuild-alt-php-ini
+
+to propagate the change. +

How to add additional php.ini file for a user inside CageFS

If you want to create additional php.ini file for a user inside CageFS in order to change some specific PHP options for that user, you can execute the following:

# su -s /bin/bash - USER
+# cd /etc/cl.php.d/alt-php72/
+# echo "upload_tmp_dir=/tmp" >> custom.ini
+

The commands above create custom.ini file that will be used for alt-php72. By default this approach is valid only for alt-php version selected via PHP Selector. When /etc/cl.selector/symlinks.rules file contains php.d.location = selector line, then the approach is valid for all alt-php versions regardless whether it is selected in PHP Selector or not.

You can find more details here.

But the recommended way is to modify PHP options via PHP Selector web or CLI interfaces, as described here.

Substitute global php.ini for individual customer

Sometimes you might want to have a single customer with a different php.ini, than the rest of your customers.

To do that, you will use custom.etc directory functionality

  1. Move default php.ini into /etc directory and create a symlink to it:
$ mv /usr/local/lib/php.ini /etc/php.ini
+$ ln -fs /etc/php.ini /usr/local/lib/php.ini
+
  1. Change path to php.ini in /etc/cl.selector/native.conf file to:
php.ini=/etc/php.ini
+
  1. For each user that needs custom file, create directory /etc/cagefs/custom.etc/USER_NAME/php.ini .

For example if you want to create custom for USER1 and USER2 you would create files:
/etc/cagefs/custom.etc/USER1/php.ini
/etc/cagefs/custom.etc/USER2/php.ini

Create such files for each user that should have custom file.

  1. Execute:
$ cagefsctl --force-update 
+

Notes

  1. Make sure that php.ini load path is set to /etc/php.ini

  2. Users will be able to override settings of those php.ini files (global or custom) via PHP Selector. If you want to prevent that, you should disable PHP Selector feature.

  3. Even if PHP Selector is disabled, user can override PHP settings by using ini_set() php function in PHP script, or by php -c command line option.

  4. If you modify anything in /etc/cagefs/custom.etc directory, you should execute:

$ cagefsctl --update-etc
+

in order to apply changes to CageFS for all users.

OR

$ cagefsctl --update-etc user1 user2
+

to apply changes to CageFS for specific users.

How to substitute global php.ini for individual customer on cPanel server with EasyApache4

Note

It is enough to put php.ini in the directory where PHP script is located in order to run the PHP script with a custom php.ini when using SuPHP. Also, you can use cPanel MultiPHP Manager to create user’s custom php.ini file, and this approach should work for CGI, FCGI, and LSAPI. Recommended ways to manage php.ini settings per user are to use cPanel MultiPHP or CloudLinux OS Shared PHP Selector interfaces.

  1. For each user that needs custom file, create directory /etc/cagefs/custom.etc/USER_NAME/php.ini.

    For example, if you want to create a custom file for USER1 and USER2 you would create files:

    /etc/cagefs/custom.etc/USER1/php.ini
    +/etc/cagefs/custom.etc/USER2/php.ini
    +

    Create such files for each user that should have a custom file.

  2. Execute the following command:

    $ cagefsctl --force-update
    +
  3. Configure php.ini load path for user’s domains.

  • When using suphp handler, you should use SuPHP_ConfigPath directive in virtual host configuration for these domains, or use this directive in .htaccess files: suPHP_ConfigPath/etc.

  • When using mod_lsapi, you should use lsapi_phprc directive in virtual host configuration: lsapi_phprc/etc/. +You can find the detailed description of mod_lsapi directives here.

  • When using FCGI or CGI, you should implement custom PHP wrapper and redefine the path to php.ini via -c command line option, like below: +

    #!/bin/bash
    +[ -f /etc/php.ini ] && exec /usr/bin/php -c /etc/php.ini
    +exec /usr/bin/php
    +

Notes:

  1. You should restart Apache web server after modifying virtual host configuration for the domains.

  2. Custom php.ini may break switching PHP version via CloudLinux OS Shared PHP Selector or cPanel MultiPHP Manager for the appropriate users or domains.

  3. When using cPanel ea-php for the domains, additional php.ini files may not be loaded, so you should load all needed PHP extensions in custom /etc/php.ini file: +

  4. When using CloudLinux OS Shared alt-php, additional php.ini files will be loaded: +

  5. If you have modified anything in /etc/cagefs/custom.etc directory, you should execute one of the following:

    • to apply changes to CageFS for all users, run:
    $ cagefsctl --update-etc
    +
    • to apply changes to CageFS for specific users, run:
    $ cagefsctl --update-etc user1 user2
    +

Managing interpreter version

Managing interpreter versions is done by means of manipulating a set of symbolic links that point to different versions of interpreter binaries. For example, if default PHP binary is /usr/local/bin/php :

  • First we move the default binary inside CageFS to /usr/share/cagefs-skeleton/usr/selector , and make /usr/local/bin/php a symlink pointing to /etc/cl.selector/php . This operation is done as part of CageFS deployment.
  • Next suppose we have additional PHP version, say 7.2.5. The information about all additional interpreter binaries and paths for them is kept in /etc/cl.selector/selector.conf . This config file is updated by RPM package manager each time alternative PHP package is added, removed or updated
  • /usr/bin/selectorctl --list --interpreter=php will get us list of all available PHP interpreter versions out of /etc/cl.selector/selector.conf file . +Next we want to know which PHP version is active for a given user (to supply a selected option in options list). We type:
  • /usr/bin/selectorctl --user USERNAME --interpreter=php --user-current will retrieve PHP version set for a particular user. The script gets the path from /var/cagefs/LAST_TWO_DIGITS_OF_UID/USERNAME/etc/cl.selector/php symlink, compares it with contents of /etc/cl.selector/selector.conf file and if path is valid, prints out the current interpreter version.
  • /usr/bin/selectorctl --user USERNAME --interpreter=php --set-user-current=7.2 sets the current PHP version for particular user by creating symlink in /var/cagefs/LAST_TWO_DIGITS_OF_UID/USERNAME/etc/cl.selector directory. All old symlinks are removed, and new symlinks are set.

Including PHP Selector only with some packages (cPanel)

cPanel has a ' Feature Manager ' in WHM that allows you to disable PHP Selector for some of the packages that you offer.

In reality it only disables the icon in cPanel interface. Yet, in most cases it should be enough in shared hosting settings.

You can find more info on ' Feature Manager ' here: http://docs.cpanel.net/twiki/bin/view/11_30/WHMDocs/FeatureManager

Once PHP Selector is enabled, you can find it in the Feature Manager . Disabling it in Feature Manager , will remove the icon for users that are using that particular 'Feature List'

PHP extensions

Configuring Alt-PHP modules loading

CloudLinux OS Shared PHP Selector and Alt-PHP can be used in conjunction with Plesk PHP Selector and cPanel MultiPHP . To be compatible, CloudLinux OS Shared PHP Selector works as follows: modules that are selected in CloudLinux OS Shared PHP Selector are loaded for Alt-PHP version selected in CloudLinux OS Shared PHP Selector only. For the rest Alt-PHP versions default module set is loaded ( /opt/alt/phpXX/etc/php.d/default.ini ) . Described above is default behavior.

Note

If system default PHP version selected in cPanel MultiPHP Manager is not ea-php, then default module set is loaded for all Alt-PHP versions by default (/opt/alt/phpXX/etc/php.d/default.ini).

When "php.d.location = selector" option is in effect, modules selected via PHP Selector will be loaded for all alt-php versions.

This behavior is implemented in CageFS-6.1-10 and later.

In LVE Manager 1.0-9.40+ this behavior can be modified so that modules selected in CloudLinux OS Shared PHP Selector would be loaded for all Alt-PHP versions (with CageFS enabled), which can be quite useful if you use  ‘ per directory ’ or ‘ per domain ’ Alt-PHP configuration and want to select modules using CloudLinux OS Shared PHP Selector .

To modify it, create a file /etc/cl.selector/symlinks.rules (read-only for regular users) with the following content: php.d.location = selector

And run the command to apply changes: +

/usr/bin/selectorctl --apply-symlinks-rules
+
+To revert to the default behavior: +
  • Delete /etc/cl.selector/symlinks.rules file.
  • Alternatively remove php.d.location option from the file.
  • Alternatively set default value for php.d.location option.

And run the command to apply changes: +

/usr/bin/selectorctl --apply-symlinks-rules
+

FFmpeg

Note

The PHP-FFmpeg project has not been renewed for the last few years and is not compatible with the RHEL 8 based systems. Since code for alt-PHP-FFmpeg is outdated and FFmpeg has a lot of third-party dependencies, this module is not available for CloudLinux OS Shared 8.

Due to possible patent issues CloudLinux OS Shared does not provide FFmpeg libraries ( https://ffmpeg.org/legal.html ). We highly recommend researching if you can legally install FFmpeg extension on your server. This might differ based on where you and your servers are located. More information can be found on the link: https://ffmpeg.org/legal.html

For your convenience we provide FFMPEG PHP binding. For them to work, you need to install FFmpeg package from the “Nux Dextop” repository following the instructions.

Once FFmpeg is installed you can install PHP bindings, by running: +

yum install alt-php*ffmpeg 
+

Enable PHP-FFmpeg extension via PHP Selector : +

selectorctl --enable-extensions=ffmpeg --user USERNAME --version X.Y
+

Native PHP configuration

PHP Selector requires access to the native PHP version for proper work. It is specified in the file /etc/cl.selector/native.conf of the following content (example): +

php=/usr/bin/php-cgi
+php-cli=/usr/bin/php
+php.ini=/etc/php.ini
+lsphp=/usr/local/bin/lsphp
+php-fpm=/usr/local/sbin/php-fpm
+

Then execute the following command to apply changes. +

cagefsctl --setup-cl-selector
+

The file is created when installing CageFS on the servers with cPanel, Plesk, DA, Interworx and ISP Manager , if it is missing. On all other servers the file is not being created at all.

That is why, if the file is not created automatically, then it must be created manually and correct paths must be written to its directives.

Access permission 644 must be set: +

chmod 0644 /etc/cl.selector/native.conf
+

How to configure alt-php72-zts to use with PHP Selector

Requirements

To use alt-php72-zts with PHP Selector you need the following:

  • cagefs-6.1.8-1 or later
  • alt-php72-zts-7.2.21-4 or later

Using zts PHP

  1. Install alt-php72-zts with the following command:
yum install alt-php72-zts
+
  1. Make sure that /etc/cl.selector/selector.conf file contains correct paths to the PHP zts binaries.

You should remove the old lines:

php 7.2 7.2.20 /opt/alt/php72/usr/bin/php-cgi
+php-cli 7.2 7.2.20 /opt/alt/php72/usr/bin/php
+

And replace them with the lines with the new paths:

php 7.2 7.2.20 /opt/alt/php72/usr/bin/zts-php-cgi
+php-cli 7.2 7.2.20 /opt/alt/php72/usr/bin/zts-php
+
  1. Make sure that /opt/alt/php72/etc/php.d.all path refers to the directory containing ini files for zts PHP extensions:
cd /opt/alt/php72/etc
+ln -fsn php.d.all.zts php.d.all
+
  1. Execute the following command:
cagefsctl --setup-cl-selector
+

Using non-zts PHP

  1. Make sure that /etc/cl.selector/selector.conf file contains correct paths to the non-zts PHP binaries.

You should remove the old lines:

php 7.2 7.2.20 /opt/alt/php72/usr/bin/zts-php-cgi
+php-cli 7.2 7.2.20 /opt/alt/php72/usr/bin/zts-php
+

And replace them with the lines with the new paths:

php 7.2 7.2.20 /opt/alt/php72/usr/bin/php-cgi
+php-cli 7.2 7.2.20 /opt/alt/php72/usr/bin/php
+
  1. Make sure that /opt/alt/php72/etc/php.d.all path refers to the directory containing ini files for non-zts PHP extensions:
cd /opt/alt/php72/etc
+ln -fsn php.d.all.def php.d.all
+
  1. Execute the following command:
cagefsctl --setup-cl-selector
+

Using

Once PHP Selector is installed, you will see the Selector tab in the LVE Manager.

Customers can use PHP Selector client plugin to change their PHP Selctor related settings.

Custom PHP.ini options

PHP Selector allows customer to edit php.ini settings. Admin has a full control over which settings can be modified.

To allow settings to be modifiable, it has to be whitelisted in /etc/cl.selector/php.conf.

Here are some of the examples of allowed directives: +

Directive = safe_mode
+Type      = bool
+Remark    = <5.4.0
+Comment   = Enables PHP safe mode. This mode puts a number of restrictions on scripts (say, access to file system) mainly for security reasons.
+
Directive = safe_mode_include_dir
+Type      = value
+Remark    = <5.4.0
+Comment   = If PHP is in the safe mode and a script tries to access some files, files from this directory will bypass security (UID/GID) checks. The directory must also be in include_path. For example: /dir/inc
+
Directive php.ini setting
Type bool, value (any text), list
Range list of values for list Type
Comment explanation of the setting to display in UI

Default values, that are shown in PHP Selector web interface, are taken from '/opt/alt/phpXX/usr/bin/php -i' runtime values, if +directive is not there, it will use the output of phpinfo() function. So, if you wish to change default value of any option for +"alternative" php version, please modify /opt/alt/phpXX/etc/php.ini files (where XX = 55, 54, 53, etc according to php version).

Admin can modify the settings using selectorctl command.

Users can use web interface to modify php.ini settings:

End user files and directories

The following files and directories are created inside CageFS for each customer:

/etc/cl.selector - PHP binaries symbolic links.

/usr/selector/php - Native PHP binaries.

/etc/cl.php.d/alt-php* - Links to enabled modules.

/home/user/.cl.selector/alt_phpXX.cfg - Config file for custom PHP options.

like:

/etc/cl.php.d/alt-php54/fileinfo.ini - /opt/alt/php54/etc/php.d.all/fileinfo.ini

Compiling your own extensions

Sometimes you might want to compile your own PHP extension for your users to use. In most cases, it is better to contact our support by sending us a support ticket . We will try to provide such extension for you via regular updates within 5-7 days.

If you have decided that you want to build it on your own, you would need to build it for each and every supported version of PHP that you have installed. The module installation process is a bit different from standard - you would need to use the version of phpize and php-config binaries that come with particular Alt-PHP version.

The full process for PHP 5.X and 7.X looks as follows:

  1. Download and unpack extension, cd into it's directory.

  2. Execute our version of phpize if necessary:

/opt/alt/phpXX/usr/bin/phpize
+
  1. Execute configure with our binary:
./configure --with-php-config=/opt/alt/phpXX/usr/bin/php-config
+
  1. Make the .so file:
make
+
  1. Copy it to the modules directory (on 32-bit server, use usr/lib/php/modules ).
cp -rp modules/*.so /opt/alt/phpXX/usr/lib64/php/modules/
+
  1. Add ini file for module to /opt/alt/phpXX/etc/php.d.all .

  2. Register new Alt-PHP version with:

$ cagefsctl --setup-cl-selector
+

Roll your own PHP

To add your own PHP version in PHP Selector :

  • Create directory in (like: /opt/alt/php51), and mimic directory structure inside to be similar to the one of PHP versions bundled by CloudLinux OS Shared.
  • Put all the ini files for all the modules into /opt/alt/php51/etc/php.d.all
  • Create a symbolic link /opt/alt/php51/etc/php.d -> /etc/cl.php.d/alt-php51

Place all such files into /opt/alt/php51/usr/lib/php/modules

Add an absolute path to PHP binaries into /etc/cl.selector/selector.conf using the following format:

php     5.1 5.1.2 /opt/alt/php51/usr/bin/php-cgi 
+php-cli 5.1 5.1.2 /opt/alt/php51/usr/bin/php 
+php-fpm 5.1 5.1.2 /opt/alt/php51/usr/sbin/php-fpm
+   ^     ^    ^                ^----- absolute path
+   |     |    |---------------------- real version
+   |     | -------------------------- version to display
+   |--------------------------------- binary to 'substitute'
+

Execute: +

cagefsctl --setup-cl-selector
+

The new PHP version must be available now for selection in PHP Selector.

Detect user's PHP version

Note

LVE Manager 0.5-63 or higher

PHP Selector provides an easy way to figure out which versions are available and selected for end user from the command line. You can get this information by running:

$ selectorctl --interpreter=php --user-summary --user=USERNAME
+
The output:
+5.2 e - -
+5.3 e - s
+5.4 e - -
+5.5 e - -
+native e d -
+

The first column defines the PHP version. Native means native PHP version, like the one installed by cPanel with EasyApache.

The second column will contain either e or -. If e is present, it means that given version is enabled, and can be selected by the end user.

The third column can have values d or -. If d is present, that version is considered a 'default' version. Only one PHP version will have d indicator.

The fourth column can have values s or -. If s is present, that is the selected version, currently being used by the end user. Only one PHP version will have s indicator.

In case a user is not inside CageFS, and as such doesn't use PHP Selector , you will see the following error message:

ERROR:User USERNAME not in CageFS
+

PHP Selector without CageFS

[LVE Manager 2.0-11.1 or higher]

PHP Selector can now be used with CageFS turned off (in case when there is only one user account on the server).

To install run: +

yum groupinstall alt-phpyum install cagefs lvemanager
+

(no need to initialize or turn on CageFS)

selectorctl --setup-without-cagefs USER
+

( USER - the name of a user who is using selector. If not specified, the first available cPanel account username will be used).

When executing --setup-without-cagefs, the following actions are performed:

  • Creating symlinks to the user modules and options for each Alt-PHP version:
    /opt/alt/php55/link/conf/alt_php.ini -> /home/USER/.cl.selector/alt_php55.ini

  • In user home directory creating:
    .cl.selector/

“Backup” settings files (selected version, modules, options):
.cl.selector/defaults.cfg
.cl.selector/alt_php44.cfg

Symlinks to the selected version:
.cl.selector/lsphp -> /opt/alt/php44/usr/bin/lsphp
.cl.selector/php.ini -> /opt/alt/php44/etc/php.ini
.cl.selector/php-cli -> /opt/alt/php44/usr/bin/php
.cl.selector/php -> /opt/alt/php44/usr/bin/php-cgi

Additional symlinks for environment variable $PATH (search path) in the file ~/.bashrc :
.cl.selector/selector.path/
.cl.selector/selector.path/php-cgi -> ../php
.cl.selector/selector.path/php -> ../php-cli

Generated ini files with selected modules and options for each version: +.cl.selector/alt_php44.ini
.cl.selector/alt_php51.ini
.cl.selector/alt_php52.ini
.cl.selector/alt_php53.ini
.cl.selector/alt_php54.ini
.cl.selector/alt_php55.ini
.cl.selector/alt_php56.ini
.cl.selector/alt_php70.ini
.cl.selector/alt_php71.ini

Symlinks above are being created according to the settings in ~/.cl.selector/defaults.cfg and ~/.cl.selector/alt_php44.cfg files (44 - corresponding PHP version), which are storing PHP Selector settings for the user. These files are usually taken from user home directory backup or when migrating account from another server. Thus, when migrating account from server to server, PHP Selector settings are saved.

If no PHP Selector settings backup files are found when running selectorctl --setup-without-cagefs, then default settings from /etc/cl.selector/defaults.cfg global file are applied (as in selector normal mode). If the file is absent, then native PHP version will be selected for the user.

  • The following line: PATH=$HOME/.cl.selector/selector.path:$HOME/.cl.selector:$PATH

is being added to the user file ~/.bashrc

Apache PHP handlers settings are not changed.

  • Also selectorctl --setup-without-cagefs command does the following:

    • Turns off link traversal protection (linksafe);
    • Turns off cagefs service.

To get back to the selector normal mode (“with CageFS”) run: +

selectorctl --revert-to-cagefs
+

(CageFS should be initialized by using cagefsctl --init command before running the command above)

This command removes symlinks:
/opt/alt/php55/link/conf/alt_php.ini -> /home/USER/.cl.selector/alt_php55.ini +turns on link traversal protection (linksafe) and cagefs service.

Note

See also PHP Selector CLI

Configuring "global” php.ini options for all Alt-PHP versions

Note

CageFS 6.0-33 or higher, LVE Manager 2.0-11.2 or higher

There is /etc/cl.selector/global_php.ini file, where you can specify values of PHP options that should be applied for all Alt-PHP versions that are installed on a server. These settings will also be automatically applied to the new Alt-PHP versions that will be installed later.

Example:
# cat /etc/cl.selector/global_php.ini
[Global PHP Settings]
date.timezone = Europe/Warsaw
error_log = error_log
memory_limit = 192M
+Sections are ignored. Only name of an option and a value have meaning.

When an option is absent in /etc/cl.selector/global_php.ini file, than it is not changed (applied) to php.ini for Alt-PHP versions.

date.timezone and error_log options are handled differently than the others. When these options are not in /etc/cl.selector/global_php.ini file, than values for the options will be taken from "native" php.ini file. And when the option is in php.ini for some Alt-PHP version already (and its value is not empty), than value from /etc/cl.selector/global_php.ini will be NOT applied.

Note

CageFS version 6.1.5-1 or later

The behavior above is changed for cPanel servers with EasyApache 4. The /usr/local/lib/php.ini file is removed for new installations of cPanel v80 and later.

  • When /usr/local/lib/php.ini file exists, error_log and date.timezone options will be taken from that php.ini file.
  • When /usr/local/lib/php.ini file does not exist, error_log and date.timezone options will be taken from the php.ini file for system default PHP version selected in MultiPHP Manager.

This functionality works when the system default PHP version is ea-php only. When the system default PHP version is alt-php, error_log and date.timezone directives will be NOT taken from that php.ini file.

To confirm changes (not affecting "date.timezone" and "error_log" options) please run:

/usr/sbin/cagefsctl --setup-cl-selector
+

To confirm changes (including date.timezone and error_log options) please run:

/usr/bin/selectorctl --apply-global-php-ini
+
+or +
/usr/sbin/cagefsctl --apply-global-php-ini
+
+(two commands above work the same way). +

If you don't want to change error_log, but want to change date.timezone, you can execute:

selectorctl --apply-global-php-ini date.timezone
+

Similarly, command selectorctl --apply-global-php-ini error_log applies error_log and all other options specified in /etc/cl.selector/global_php.ini file, except date.timezone .

So, you can specify 0, 1 or 2 parameters from the list: error_log, date.timezone .

Using --apply-global-php-ini without arguments applies all global PHP options including two above.

Example:

selectorctl --apply-global-php-ini error_log
+selectorctl --apply-global-php-ini date.timezone
+selectorctl --apply-global-php-ini date.timezone error_log
+

The latter command has the same effect as /usr/bin/selectorctl --apply-global-php-ini.

Note

See also PHP Selector CLI

Integration with control panels

This is the list of commands that we use to integrate PHP Selector with control panels.

PHP summary:

Command: +

/usr/bin/selectorctl --summary
+
+Result: +
4.4 e -
+5.1 e -
+5.2 e -
+5.3 e -
+5.4 e -
+5.5 e -
+5.6 e -
+7.0 e -
+7.1 e -
+native e d
+
+When native PHP version needs to be displayed: +

Command: +

/usr/bin/selectorctl --summary --show-native-version
+

Result: +

4.4 e -
+5.1 e -
+5.2 e -
+5.3 e -
+5.4 e -
+5.5 e -
+5.6 e -
+7.0 e -
+7.1 e -
+native(5.6) e d
+

The first column: PHP version
+The second column: enabled or not ( e - enabled)
+The third column: if selected as default ( d - default)

Set default version:

/usr/bin/selectorctl --set-current=_VERSION_
+

Disable version:

/usr/bin/selectorctl --disable-alternative=_VERSION_
+

Enable version:

/usr/bin/selectorctl --enable-alternative=_VERSION_
+

List extensions for a version:

/usr/bin/selectorctl --list-extensions --version=5.6
+

Result: +

- apc
+- bcmath
+- big_int
+- bitset
+- bloomy
+~ bz2
+- bz2_filter
+~ calendar
+- coin_acceptor
+- crack
+~ ctype
++ curl
+

+: enabled
+~: included in php binary (cannot be disabled) or enabled in php global config file /opt/alt/phpXX/etc/php.ini
+-: disabled

Select default extensions (enable comma-separated list of extensions globally for a version):

/usr/bin/selectorctl --version=5.6 --enable-extensions=pdo,json,mysql
+

Deselect default extensions (disable comma-separated list of extensions globally for a version):

/usr/bin/selectorctl --version=5.6 --disable-extensions=pdo,json,mysql
+

Replace extensions with comma-separated list of extensions for a version globally:

/usr/bin/selectorctl --version=5.6 --replace-extensions=pdo,json,mysql
+

Select PHP version for a user:

/usr/bin/selectorctl --set-user-current=_VERSION_ --user=_USER_
+

List enabled extensions for a user:

/usr/bin/selectorctl --list-user-extensions --user=_USER_ --version=_VERSION_
+

Enable comma-separated list of extensions for a user:

/usr/bin/selectorctl --enable-user-extensions=pdo,json,mysql --user=_USER_ --version=_VERSION_
+

Reset user’s extensions to defaults:

/usr/bin/selectorctl --reset-user-extensions --user=_USER_ --version=_VERSION_
+

Replace user extensions with comma-separated list of extensions:

/usr/bin/selectorctl --replace-user-extensions=EXT_LIST --user=_USER_ --version=_VERSION_
+

EXT_LIST a is comma separated list of PHP extensions (for example: pdo,json,mysql )

List available options for php.ini editing:

/usr/bin/selectorctl --print-options --user=_USER_ --version=_VERSION_ [--json]
+

List available options for php.ini editing (print safe strings):

/usr/bin/selectorctl --print-options-safe --user=_USER_ --version=_VERSION_ [--json]
+

Set php.ini options for end user:

/usr/bin/selectorctl --user=_USER_ --version=_VERSION_ --replace-options=_OPTIONS_ --base64 [--json]
+

Here is an example of how you can generate OPTIONS in base64 format:

OPTIONS=`echo disable_functions:exec,syslog|base64 -w 0`,`echo display_errors:off|base64 -w 0`,`echo post_max_size:128M|base64 -w 0`
+echo $OPTIONS
+

See also PHP Selector CLI tools.

Bundled PHP extensions

Large number of PHP extensions are bundled with each version of PHP.

PHP 4.4 extensions

bcmath
bz2
calendar
ctype
curl
dba
dbase
dbx
domxml
exif
fileinfo
ftp
gd
gettext
gmp
iconv
imap
interbase
ioncube_loader
json
ldap
mbstring
mcrypt
mhash
mysql
mysql
ncurses
odbc
openssl
overload
pcntl
pcre
pgsql
posix
pspell
readline
recode
session
shmop
snmp
sockets
sourceguardian
standard
sybase_ct
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlrpc
zlib

PHP 5.1 extensions

Reflection
SPL
SimpleXML
bcmath
big_int
bitset
bz2
bz2_filter
calendar
coin_acceptor
crack
ctype
curl
date
dba
dbase
dom
doublemetaphone
exif
ftp
gd
geoip
gettext
gmagick
gmp
gnupg
haru
hash
huffman
iconv
idn
igbinary
imagick
imap
inclued
inotify
interbase

oncube_loader
ldap
libxml
lzf
mbstring
mcrypt
memcache
msgpack
mysql
mysqli
ncurses
odbc
openssl
pcntl
pcre
pdo
pdo_oci*
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pgsql
posix
pspell
quickhash
radius
readline
redis
session
shmop
snmp
sourceguardian
soap
sockets
ssh2
standard
stats
stem
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
translit
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
zlib

* CloudLinux 6/7

PHP 5.2 extensions

Reflection
SPL
SimpleXML
apc
apm
ares
bcmath
bcompiler
big_int
bitset
bloomy
bz2
bz2_filter
calendar
coin_acceptor
crack
ctype
curl
date
dba
dbase
dbx
dom
doublemetaphone
eaccelerator
enchant
exif
ffmpeg**
fileinfo
filter
ftp
gd
gender
geoip
geos
gettext
gmagick
gmp
gnupg
haru
hash
hidef
htscanner
http
huffman
iconv
idn
igbinary
imagick
imap
inclued
inotify
interbase
intl
ioncube_loader
json
ldap
libxml
lzf
mailparse
mbstring
mcrypt
memcache
memcached
mhash
mongo
msgpack
mssql
mysql
mysqli
ncurses
oauth
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird

pdo_mysql
pdo_oci**
pdo_odbc
pdo_pgsql
pdo_sqlite
pgsql
phar
posix
pspell
quickhash
radius
rar
readline
recode
redis
rsync
session
shmop
snmp
soap
sockets
sourceguardian
spl_types
sqlite
ssh2
standard
stats
stem
stomp
suhosin
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
translit
uploadprogress
uuid
wddx
xcache
xcache_3
xdebug
xhprof
xml
xmlreader
xmlrpc
xmlwriter
xrange
xsl
xcache*
yaf
yaz
zend_optimizer
zip
zlib

* CloudLinux 6

** CloudLinux 6/7

PHP 5.3 extensions

amqp
apc
apcu
apm
ares
bcmath
bcompiler
big_int
bitset
bloomy
brotli
bz2
bz2_filter
calendar
clamav**
coin_acceptor
core
crack
ctype
curl
date
dba
dbase
dbx
dom
doublemetaphone
eaccelerator
eio
enchant
ereg
exif
ffmpeg*
fileinfo
filter
ftp
functional
gd
gender
geoip
geos
gettext
gmagick
gmp
gnupg
haru
hash
hidef
htscanner
http
huffman
iconv
idn
igbinary
imagick
imap
inclued
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libevent
libxml
lzf
mailparse
mbstring
mcrypt
memcache
memcached
mhash
mongo
msgpack
mssql
mysql
mysqli
mysqlnd
ncurses
nd_mysql
nd_mysqli
nd_pdo_mysql
oauth
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_oci*
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pgsql
phalcon*
phar
posix
propro
pspell
quickhash
radius
raphf
rar
readline
recode
redis
reflection
rsync
session
shmop
simplexml
snmp
soap
sockets
sourceguardian
solr
spl
spl_types
sqlite
sqlite3
ssh2
standard
stats
stem
stomp
suhosin
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
tideways
timezonedb
tokenizer
trader
translit
uploadprogress
uri_template
uuid
wddx
weakref
xcache*
xcache_3
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xrange
xsl
xhprof
yaf
yaml
yaz
zend_guard_loader
zip
zlib
zmq

* CloudLinux 6/7

** CloudLinux 7

PHP 5.4 extensions

aapm**
amqp
apc
apcu
apm
ares
bcmath
big_int
bitset
brotli
bz2
bz2_filter
calendar
core
ctype
curl
clos_ssa
date
dba
dbase
dbx
dom
doublemetaphone
eaccelerator
eio
enchant
ereg
exif
ffmpeg*
fileinfo
filter
ftp
functional
gd
gender
geoip
geos
gettext
gmagick
gmp
gnupg
haru
hash
hidef
htscanner
http
iconv
igbinary
imagick
imap
inclued
inotify
interbase
intl
ioncube_loader
json
ldap
libevent
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt
memcache
memcached
mhash
mongo
mongodb
msgpack
mssql
mysql
mysqli
mysqlnd
ncurses
nd_mysql
nd_mysqli
nd_pdo_mysql
oauth
oci8*
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_oci*
pgsql
phalcon*
phar
posix
propro
pspell
quickhash
radius
raphf
rar
readline
recode
redis
reflection
rsync
session
shmop
simplexml
snmp
soap
sockets
solr
sourceguardian
spl
spl_types
sqlite3
ssh2
standard
stats
stem
stomp
suhosin
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
tideways
timezonedb
tokenizer
trader
translit
uploadprogress
uri_template
uuid
wddx
weakref
xcache*
xcache_3
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xrange
xray***
xsl
xhprof
jsmin
yaf
yaml
yaz
zend_guard_loader
zip
zlib
zmq

* CloudLinux 6/7

** CloudLinux 7

*** CloudLinux 7/8

PHP 5.5 extensions

aapm**
amqp
apcu
apm
ares
bcmath
big_int
bitset
brotli
bz2
bz2_filter
calendar
clamav**
core
ctype
curl
clos_ssa
date
dba
dbase
dbx
dom
doublemetaphone
diseval
eio
enchant
ereg
exif
ffmpeg*
fileinfo
filter
ftp
gd
gender
geoip
geos
gettext
gmagick
gmp
gnupg
gRPC
haru
hash
hidef
htscanner
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libevent
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt
memcache
memcached
mhash
mongo
mongodb
msgpack
mssql
mysql
mysqli
mysqlnd
ncurses
nd_mysql
nd_mysqli
nd_pdo_mysql
oauth
oci8*
odbc
opcache*
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_oci*
pgsql
phalcon*
phalcon3
phar
posix
postal*
propro
pspell
quickhash
radius
raphf
rar
readline
recode
redis
reflection
rsync
session
shmop
simplexml
snmp
soap
sockets
sourceguardian
solr
spl
spl_types
sqlite3
ssh2
standard
stats
stem
stomp
suhosin
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
tideways
timezonedb
tokenizer
trader
translit
uploadprogress
uri_template
uuid
wddx
weakref
xcache_3
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xrange
xray
xsl
xhprof
yaf
yaml
yaz
zend_guard_loader
zip
zlib
zmq

* CloudLinux 6/7

** CloudLinux 7

PHP 5.6 extensions

aapm**
amqp
apcu
apm
ares
bcmath
big_int
bitset
brotli
bz2
bz2_filter
calendar
core
ctype
curl
clos_ssa**
date
dba
dbase
dbx
dom
doublemetaphone
diseval
eio
enchant
ereg
exif
ffmpeg*
fileinfo
filter
ftp
gd
gender
geoip
gettext
geos
gmagick
gmp
gnupg
gRPC
haru
hash
htscanner
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libevent
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt
memcache
memcached
mhash
mongo
mongodb
msgpack
mssql
mysql
mysqli
mysqlnd
ncurses
nd_mysql
nd_mysqli
nd_pdo_mysql
oauth
oci8
odbc
opcache*
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_oci*
pgsql
phalcon*
phalcon3
phar
posix
postal**
propro
pspell
quickhash
radius
raphf
rar
readline
recode
redis
reflection
rsync
session
shmop
simplexml
snmp
soap
sockets
sourceguardian
spl
spl_types
sqlite3
ssh2
standard
stats
stem
stomp
solr
suhosin
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
translit
tideways
uploadprogress
uri_template
uuid
wddx
xcache_3
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xrange
xray
xsl
xhprof
yaml
yaz
zend_guard_loader
zip
zlib
zmq

* CloudLinux 6/7

** CloudLinux 7

PHP 7.0 extensions

aapm**
amqp
apcu
bcmath
bitset
brotli
bz2
clos_ssa**
calendar
core
ctype
curl
date
dba
dbase
dom
diseval
eio
enchant
exif
fileinfo
filter
ftp
ffmpeg*
gd
gearman
gender
geos
geoip
gettext
gmagick
gmp
gnupg
gRPC
hash
htscanner
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt
memcached
memcache
mongodb
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
newrelic
oauth
oci8*
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
psr
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_sqlsrv
pdo_oci
pgsql
phalcon3
phar
posix
postal**
propro
pspell
phalcon4
raphf
rar
readline
rrd
redis
reflection
recode
session
shmop
simplexml
snmp
snuffleupagus
soap
sockets
sourceguardian
sodium
solr
spl
sqlite3
sqlsrv
ssh2
standard
stats
suhosin7
sysvmsg
swoole
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
tideways_xhprof
uploadprogress
uuid
vips*
vld**
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xray
xsl
yaml
yaz
yaf
zip
zlib
zmq

* CloudLinux 6/7

** CloudLinux 7

Note

To use newrelic extension you should set your own New Relic License Key in your own /opt/alt/php7*/etc/php.ini file. +Please find more info about New Relic License Key in the New Relic documentation.

PHP 7.1 extensions

aapm**
amqp
snuffleupagus
vld
apcu
bcmath
brotli
bz2
clos_ssa**
calendar
core
ctype
curl
date
dba
dbase
dom
diseval
eio
enchant
exif
fileinfo
filter
ftp
ffmpeg*
gd
gearman
gender
geoip
gettext
geos
gmagick
gmp
gnupg
gRPC
hash
htscanner
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt
memcached
memcache
mongodb
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
newrelic
oauth
oci8
odbc
opcache
openssl
pcntl
pcre
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql psr

pdo_sqlite
pdo_sqlsrv
pgsql
phalcon3
phar
pdf
pdo_oci
phalcon4
posix
propro
pspell
psr**
raphf
rar
readline
redis
reflection
rrd
recode
solr
session
shmop
simplexml
snmp
soap
sockets
sourceguardian
spl
sodium
sqlite3
sqlsrv
ssh2
standard
stats
suhosin7
sysvmsg
swoole
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
tideways_xhprof
uploadprogress
uuid
vips*
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
xray
yaz
yaml
yaf
zip
zlib
zmq

* CloudLinux 6/7

** CloudLinux 7

Note

To use newrelic extension you should set your own New Relic License Key in your own /opt/alt/php7*/etc/php.ini file. +Please find more info about New Relic License Key in the New Relic documentation.

PHP 7.2 extensions

aapm**
jsmin
psr
rrd
yaz
amqp
snuffleupagus
vld
apcu
bcmath
brotli
bz2
calendar
clos_ssa**
core
ctype
curl
date
dba
dom
dbase
diseval
eio
enchant
exif
fileinfo
filter
ftp
ffmpeg*
gd
gender
geoip
gettext
gearman
geos
gmagick
gmp
gnupg
gRPC
hash
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
json
ldap
libxml
lzf
luasandbox*
mcrypt
memcache
mailparse
mbstring
memcached
mongodb
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
newrelic
oauth
oci8
odbc
opcache
openssl
pcntl
pcre
pdo
pdo_dblib
pdo_firebird
pdf
pdo_oci
phalcon4
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_sqlsrv
pgsql
phalcon3
phar
posix
propro
pspell
raphf
readline
redis
reflection
recode
sodium
sourceguardian
swoole
session
shmop
simplexml
snmp
soap
sockets
spl
sqlite3
sqlsrv
ssh2
standard
stats
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
tideways_xhprof
uploadprogress
uuid
vips*
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
xdebug
yaf
yaml
zip
zlib
zmq
xray

Note

To use newrelic extension you should set your own New Relic License Key in your own /opt/alt/php7*/etc/php.ini file. +You can find more info about New Relic License Key in the New Relic documentation.

* CloudLinux 6/7

** CloudLinux 7

PHP 7.3 extensions

ffmpeg*
aapm**
amqp
clos_ssa**
gearman
jsmin
mailparse
memcache
psr
rrd
solr
tideways_xhprof
zmq
snuffleupagus
vld
apcu
bz2
brotli
calendar
core
ctype
curl
date
exif
enchant
filter
ftp
gettext
gmp
gnupg
hash
iconv
interbase
luasandbox*
libxml
mysqlnd
opcache
openssl
pcntl
pcre
pdo_pgsql
phar
readline
reflection
session
shmop
simplexml
sourceguardian
spl
sqlite3
standard
snmp
stats
tokenizer
trader
xmlreader
bcmath
fileinfo
grpc
intl
lzf
nd_mysqli
pdf
pdo
posix
swoole
uploadprogress
xmlrpc
gd
http
ioncube_loader
mbstring
nd_pdo_mysql
pdo_dblib
pdo_sqlite
propro
soap
sysvmsg
uuid
xmlwriter
dbase
gender
igbinary
mcrypt
newrelic
pdo_firebird
pdo_sqlsrv
pspell
sockets
sysvsem
vips*
xsl
dba
geoip
imagick
json
memcached
oauth
pdo_mysql
pgsql
raphf
sodium
sysvshm
yaml
dom
geos
imap
ldap
mongodb
oci8
pdo_oci
phalcon3
recode
sqlsrv
tidy
wddx
yaz
eio
gmagick
inotify
leveldb
mysqli
odbc
pdo_odbc
phalcon4
redis
ssh2
timezonedb
xdebug
zip
xml
zlib
xray
yaf

* CloudLinux 6/7

** CloudLinux 7

Note

To use newrelic extension you should set your own New Relic License Key in your own /opt/alt/php7*/etc/php.ini file. +You can find more info about New Relic License Key in the New Relic documentation.

PHP 7.4 extensions

leveldb
sourceguardian
ffmpeg*
amqp
clos_ssa**
gearman
ioncube_ loader
jsmin
mailparse
mcrypt
memcache
psr
rrd
solr
ssh2
tideways_xhprof
yaz
zmq
apcu
bcmath
brotli
bz2
calendar
core
ctype
curl
date
dba
dbase
dom
eio
enchant
exif
fileinfo
filter
ftp
gd
gender
geoip
geos
gettext
gmagick
gmp
gnupg
grpc
hash
http
iconv
igbinary
imagick
imap
inotify
intl
json
ldap
libxml
luasandbox*
lzf
mbstring
memcached
mongodb
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
newrelic
snuffleupagus
oauth
oci8
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_oci
pdo_odbc
pdo_pgsql
vld
pdo_sqlite
pdo_sqlsrv
pgsql
phalcon4
phar
posix
propro
pspell
raphf
readline
redis
reflection
phalcon5
session
shmop
simplexml
snmp
soap
sockets
sodium
spl
sqlite3
sqlsrv
standard
stats
swoole
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
xray
uploadprogress
uuid
vips*
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
yaml
zip
zlib

* CloudLinux 6/7

** CloudLinux 7

PHP 8.0 extensions

brotli
amqp
clos_ssa***
core
date
filter
gearman
geoip
gmagick
gnupg***
grpc
apcu
bcmath
bz2
calendar
ctype
curl
dba
dbase
dom
enchant
exif
ffi**
fileinfo
hash
igbinary
inotify
jsmin
json
libxml
mcrypt
memcache ftp
gd
gettext
gmp
iconv
imagick
imap
intl
ldap
lzf
mailparse
mbstring
mongodb
newrelic
oauth
oci8
openssl
pcntl
pcre
pdo_oci
pdo_sqlsrv
readline
redis
reflection
rrd
session memcached
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
odbc
opcache
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
snuffleupagus
solr
SPL
sqlsrv
ssh2
standard
swoole
tideways_xhprof
trader pdo_pgsql
pdo_sqlite
pgsql
phar
posix
pspell
psr
raphf
shmop
simplexml
snmp
soap
sockets
uploadprogress
uuid
vips*
vld
xdebug
xmlrpc**
yaml
yaz
zip
zlib sodium
sqlite3
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
xml
xmlreader
xmlwriter
xsl
zmq
sourceguardian
phalcon5
xray

* CloudLinux 6/7

** CloudLinux 7/8

*** CloudLinux 7

PHP 8.1 extensions

amqp
apcu
bcmath
brotli
bz2
calendar
clos_ssa***
Core
ctype
curl
date
dba
dbase
dom
enchant
exif
ffi**
fileinfo
filter
ftp
gd
geoip
gearman
gettext
gmagick
gmp
gnupg**
grpc
hash
ioncube_loader
iconv
igbinary
imagick
imap
inotify
intl
jsmin
json
ldap
libxml
lzf
mailparse
mbstring
mcrypt
memcache
memcached
mongodb
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
newrelic
oauth
oci8
odbc
opcache
openssl
pcntl
pcre
pdo
pdo_dblib
pdo_mysql
pdo_oci
pdo_odbc
phalcon5
pdo_pgsql
pdo_firebird
pdo_sqlite
pdo_sqlsr
pgsql
phar
posix
process
pspell
psr
rrd
raphf
readline
redis
Reflection
session
shmop
SimpleXML v snmp
solr
sourceguardian
soap
sockets
sodium
SPL
sqlite3
sqlsrv
ssh2
standard
swoole
sysvmsg
sysvsem
sysvshm
tideways_xhprof
tidy
timezonedb
tokenizer
trader
uploadprogress
uuid
vips*
xdebug
xml
xmlreader
xmlrpc**
xmlwriter
xsl
yaf
yaml
zip
zlib
zmq
xray

* CloudLinux 6/7

** CloudLinux 7/8

*** CloudLinux 7

PHP 8.2 extensions

amqp**
apcu**
bcmath
brotli**
bz2
calendar
Core
ctype
curl
date
dba
dbase**
dom
enchant
exif
ffi
fileinfo
filter
ftp
gd
gearman**
geoip**
gettext
gmagick**
gmp
gnupg*
grpc**
hash
iconv
igbinary**
imagick**
imap
inotify**
intl
jsmin**
json
ldap
libxml
lzf**
mailparse**
mbstring
mcrypt**
memcache**
memcached**
mongodb**
mysqlnd
nd_mysqli
nd_pdo_mysql
oauth**
oci8**
odbc
opcache
openssl
pcntl
pcre**
pdo
pdo_dblib
pdo_firebird
pdo_mysql*
pdo_oci**
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_sqlsrv**
pgsql
phar
posix
pspell
psr**
random
raphf**
readline
redis**
Reflection
rrd**
session
shmop
SimpleXML
snmp
soap
sockets
sodium
solr**
SPL
sqlite3
sqlsrv**
ssh2**
standard
swoole**
sysvmsg
sysvsem
sysvshm
tideways_xhprof**
tidy
timezonedb**
tokenizer
trader**
uploadprogress**
uuid**
vips*
xdebug**
xml
xmlreader
xmlrpc**
xmlwriter
xsl
yaml**
zip
zlib
zmq**

* CloudLinux 7

** CloudLinux 7/8

Python Selector

General information

Python Selector is a CloudLinux OS Shared component that allows each user to easily deploy and manage Python applications. Users can manage applications at the control panel interface level or from the command line (CLI).

Requirements

  • cPanel or DirectAdmin control panel. Plesk isn't supported.
  • Apache or LiteSpeed webserver. Apache + Nginx (as a reverse proxy) combination is also supported.
  • Python Selector uses mod_passenger to host Python. For more details about mod_passenger, please read documentation. The needed version will be installed along with Python Selector.

Supported versions

  • Python Selector supports the following alt-python versions for all actual CloudLinux OS Shared versions:

    • alt-python 2.7
    • alt-python 3.3
    • alt-python 3.4
    • alt-python 3.5
    • alt-python 3.6
    • alt-python 3.7
    • alt-python 3.8
    • alt-python 3.9
    • alt-python 3.10

Installation

You can install Python Selector using the CloudLinux OS Shared Installation Wizard.

After installation, please make sure that you have set appropriate checkboxes in CloudLinux Manager Options tab to show Python App in the web-interface.

Manual installation

Here you can find the installation steps for supported control panels:

cPanel

To use Python Selector, it is required to install the following:

  • alternative Python packages by running the following command:
yum groupinstall alt-python
+
  • CloudLinux Manager, LVE Utils and Phusion Passenger to create isolated Python environments by running the following command:
yum install lvemanager lve-utils alt-python-virtualenv
+

Phusion Passenger could be installed by using either ea-ruby24-mod_passenger or ea-ruby27-mod_passenger. ea-ruby27-mod_passenger is not compatible with systems running CloudLinux OS Shared OS 6. CloudLinux OS Shared OS 7 supports both ea-ruby24-mod_passenger and ea-ruby27-mod_passenger. If your system runs CloudLinux OS Shared OS 8, you can only use ea-ruby27-mod_passenger.

Adding Python module requires executing permissions to gcc/make binaries. +Please enable compilers in Compiler Access section of WHM, then run:

cagefsctl --force-update
+

DirectAdmin

To use Python Selector, it is required to install the following:

  • alternative Python packages by running the following command:
yum groupinstall alt-python
+
  • CloudLinux Manager, LVE Utils and Phusion Passenger to create isolated Python environments by running the following command:
yum install lve-utils lvemanager alt-python-virtualenv alt-mod-passenger
+

Ruby Selector

General information and requirements

We have the ability to deploy Ruby applications via an application server. Ruby Selector uses mod_passenger to host Ruby applications.

Ruby Selector works only on cPanel/WHM servers.

You can find a list of supported alt-ruby versions using the following commands.

yum grouplist | grep alt-ruby
+

Installation and update

Note

The instructions below are suitable only for EasyApache 3 and EasyApache 4. You should follow this instruction if you use LiteSpeed.

To use Ruby Selector install alternative Ruby packages:

yum groupinstall alt-ruby 
+

Note

After installation, please make sure that you have unmarked appropriate checkboxes in VE Manager Options tab to show Ruby App in web-interface. Find the instructions on the link.

Note

Adding Ruby modules requires executing permissions to gcc/make binaries. Please enable compilers in Compiler Access section of WHM, then run: cagefsctl --force-update

Configuration and using

End user access

You can find an example of Ruby application setup here

Note

See also Ruby Selector CLI section.

Hide Ruby Selector icon

It is possible to hide or show Ruby Selector icon by marking or unmarking proper checkboxes in LVE Manager Options tab.

The same result can be accomplished in CLI by running:

cloudlinux-config set --json --data '{"options":{"uiSettings":{"hideRubyApp":false}}}'
+

Note

If you are using cPanel/WHM, you can also configure hide/show CloudLinux OS Shared Ruby Selectors in WHM | Feature Manager. +For that, you’d need to first uncheck Hide Ruby App in web-interface in the LVE Manager. This will make the menu appear for all accounts. After that, you are free to disable this app in WHM | Feature Manager for the required feature lists.

Deploying Redmine using Ruby Selector

Note

You can find Redmine version 2.6.0 and newer deployment guide here

EasyApache 4

Note

ea-apache24-mod-alt-passenger is deprecated in favor of ea-ruby24-mod_passenger and ea-ruby27-mod_passenger

Starting with cPanel/WHM version 66 provides ea-ruby24-mod_passenger (more information on the link), this allows creating Ruby applications with cPanel application manager.

CloudLinux OS Shared features its own Python and Ruby Selectors, which allow creating applications with one of mod_passenger Apache modules:

  • ea-ruby24-mod_passenger
  • ea-ruby27-mod_passenger

ea-ruby27-mod_passenger is not compatible with systems running CloudLinux OS Shared 6. CloudLinux OS Shared 7 supports both ea-ruby24-mod_passenger and ea-ruby27-mod_passenger. If your system runs CloudLinux OS 8, you can only use ea-ruby27-mod_passenger.

The ea-ruby2X-mod_passenger allows you to run applications via cPanel application manager and Ruby Selector.

To install, run: +

# yum install lvemanager alt-python-virtualenv
+# yum install ea-ruby24-mod_passenger
+

or:

# yum install lvemanager alt-python-virtualenv
+# yum install ea-ruby27-mod_passenger
+

See also Ruby Selector CLI tools.

Node.js Selector

General information and requirements

Node.js Selector is a CloudLinux OS Shared component that allows each user to easily create Node.js applications, choose Node.js version and other parameters for applications based on their needs.

Requirements

  • Node.js Selector supports Node.js versions 6.x, 8.x, 9.x, 10.x, 11.x, 12.x, 14.x, 16.x, 18.x, 19.x.
  • Node.js Selector requires LVE Manager 4.0 or later.
  • It supports cPanel and DirectAdmin servers as well as non-panel installations (Plesk is not supported as it already has Node.js support.) For more details, please go to Plesk & Node.js documentation here and here .
  • Node.js Selector uses mod_passenger to host Node.js. For more details about mod_passenger and Node.js, please read documentation here and here .
  • Node.js Selector supports both EasyApache 3 and EasyApache 4.

Limitations

Since Node.js Selector uses mod_passenger to host Node.js, then Node.js Selector has the same limitations as Phusion Passenger. Phusion Passenger cannot load ECMAScript modules and can only load Common js modules. +If you get an ERR_REQUIRE_ESM error when starting an application app.js.

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: app.js
+

In this case you can use the following cjs wrapper app_wrapper.cjs to load esm script app.js:

cat app_wrapper.cjs
+(() => import('app.js'))();
+

Installation and update

Note

Node.js Selector support is added to LiteSpeed Web Server starting from the 5.3RC1 release. See details here.

cPanel

To use Node.js Selector, install Node.js packages by running the following command: +

yum groupinstall alt-nodejs
+
+Also, please install LVE Manager, LVE Utils and Phusion Passenger by running the following command: +
yum install lvemanager lve-utils
+

Phusion Passenger could be installed by using either ea-ruby24-mod_passenger or ea-ruby27-mod_passenger. ea-ruby27-mod_passenger is not compatible with systems running CloudLinux OS Shared 6. CloudLinux OS Shared 7 supports both ea-ruby24-mod_passenger and ea-ruby27-mod_passenger. If your system runs CloudLinux OS Shared 8, you can only use ea-ruby27-mod_passenger.

Note

ea-apache24-mod-alt-passenger is deprecated in favor of ea-ruby24-mod_passenger and ea-ruby27-mod_passenger

For EasyApache 3: +

yum install lvemanager lve-utils alt-mod-passenger
+
+And we recommend to install CageFS for better security (not mandatory) by running the following command: +
yum install cagefs
+

Note

If during Node.js Selector usage on cPanel servers you get "ENOMEM npm ERR! errno-12" error, try to increase Memory limit in cPanel WHM → Server Configuration → Tweak Settings → System → Max cPanel process memory, then restart cPanel service with the following command to apply changes.

CloudLinux OS Shared 7: +

systemctl restart cpanel.service
+

CloudLinux OS Shared 6: +

service cpanel restart
+

DirectAdmin

To use Node.js Selector, please install Node.js packages by running the following command: +

yum groupinstall alt-nodejs6 alt-nodejs8 alt-nodejs9
+
+Also, please install LVE Manager, LVE Utils and Fusion Passenger by running the following command: +
yum install lvemanager lve-utils alt-mod-passenger
+
+And we recommend to install CageFS for better security (not mandatory) by running the following command: +
yum install cagefs
+

Node.js deployment

Remote usage of Node.js interpreters

  1. Create a Node.js project in IntelliJ IDEA/WebStorm . You can download this archive and use it as a basis.
  2. Install alt-nodejs packages on the server in use. See installation instructions.
  3. Create an application on the server. You can do it by three ways:
  • Via UI of the Node.js plugin.
  • Using the following command to create an application:
cloudlinux-selector create --interprete=nodejs --json --app-root=<USER_NAME> --app-uri=<APP_NAME> --app-mode=develompent --version=<VERSION> --domain=<DOMAIN>
+

Note

In the IntelliJ IDEA you can create and run any remote script (Preferences — Remote SSH External Tools — Add).

  • Choose a location of the application on the server and synchronize the files with the IntelliJ IDEA project.
  1. Set up Run/Debug Configurations in the project created.

  • Specify a path to the remote Node.js interpreter. To be able to specify the remote interpreter, you should install the Node.js Remote Interpreter plugin first. Please find more information here , using server access credentials for a user (Main menu → Run → Edit configurations...) .
  • Specify initial JavaScript file that will be run with the node command (it is the app.js file from the archive).
  • Specify Path Mappings between a local and a remote project (Preferences → Deployments → Add) . If you have created your application with the cloudlinux-selector utility or via plugin UI the Path Mappings should be as follows:
/home/<USER_NAME>/<APP_NAME>
+
  1. Synchronize the project directories on the local and the remote machine as per Path Mappings specified.
  2. Deploy the modules on the remote and the local machine with the npm install command (if there are dependent modules). In the UI you can click the Run NPM Install button.
  3. Run Node.js application with the configuration set at the 4th step (Main menu → Run → Run… → Select configuration) .

  1. If you are using the application from the archive attached, you can see the running application on port 3003 — http://DOMAIN:3003 .

Note

The port should be available to a server user.

The following information should be displayed on this page:

  • A version of the running Node.js interpreter;
  • Current environment variables;
  • The current time.

So that, you can be sure that deployed modules are used properly.

If you’d like to use a different version of Node.js to run an application, change a path to the interpreter in the configuration settings of the running.
+To apply all changes to the project, synchronize all changes with the server and restart the running application.

  1. To debug a script, set breakpoints in the code and run the configuration via Main Menu (Main menu → Run → Debug… → Select configuration) .

Useful links:

Note

It is not required to install Passenger while working in IDE if you are using this approach.

Remote usage of the cloudlinux-selector utility

  1. Create an application via UI or with the command as described in the Remote Usage of Node.js Interpreters approach, step 3 (a,b).
  2. Set up project mapping on the local machine with the created remote application /home/<USER_NAME>/<APP_NAME> (Preferences → Deployments → Add).
  3. Set up the remote commands of cloudlinux-selector (Preferences → Remote SSH External Tools → Add) for the following actions:
  • Restart application;

  • Install packages;

  • Run script;

  • Change Node.js version for the application. +You can see the running app at http://DOMAIN/APPLICATION_URL +To apply all changes, restart the application.

  • See also Node.js Selector CLI tools.

  • See also Node.js Selector UI.

Troubleshooting

Debugging errors

Since alt-mod-passenger-5.3.7-2, directives such as PassengerFriendlyErrorPages and PassengerAppEnv are available for use from htaccess file. This allows end users to see errors from their application during the development process. For example, if you add one of the following lines to the htaccess file on the application page, you will see the information (if there was an error) similar to one on the picture. +

PassengerAppEnv development
+
+or +
PassengerFriendlyErrorPages on
+

This is a much more convenient approach to developing an application and debugging errors. On the other hand, if these directives are turned off you will see:

In this case, there is no useful information for debugging errors and this is suitable for production mode. More information about PassengerFriendlyErrorPages and PassengerAppEnv.

Apache mod_lsapi PRO

General information and requirements

mod_lsapi PRO is an Apache HTTP Server module based on LiteSpeed Technologies API . It serves to execute PHP scripts on a web-server by analogy with other modules like mod_suphp, php-fpm, mod_php. However, mod_lsapi PRO usage offers excellent PHP performance, low memory footprint coupled with great security and support for opcode caching.

How does it work?

  1. Apache passes handling for PHP request to mod_lsapi PRO;
  2. mod_lsapi PRO use liblsapi to transfer request to lsphp parent process;
  3. lsphp is forking child process which executes the request and returns data to mod_lsapi PRO; +
    mod_lsapi PRO integrates with Apache, allows to handle concurrent requests and manages the lsphp processes
  • If there are no requests for lsapi_backend_pgrp_max_idle seconds, lsphp parent process will be  terminated;
  • If there are no lsphp child processes available when a new request comes, the new lsphp child process will be created;
  • lsphp childs process concurrent requests simultaneously;
  • The maximum number of simultaneously running lsphp child processes can be set by the lsapi_backend_children directive.

What is lsphp?

lsphp - PHP + LSAPI. What is PHP LSAPI? LiteSpeed Server Application Programming Interface (LSAPI) is designed specifically for seamless, optimized communication between LiteSpeed Web Server and third-party web applications. Now with mod_lsapi PRO this protocol is available for Apache 2.2/2.4.

Using mod_lsapi PRO, we have seen the higher performance than Apache with mod_php, easier installation than php-fpm and easier integration with any control panel. mod_lsapi PRO means faster and more stable dynamic web pages.

Requirements

Currently, the mod_lsapi is not compatible with:

  • Apache mod_ruid2 - should be disabled;
  • Apache mod_itk - should be disabled;
  • PHP-FPM - should be disabled because PHP-FPM is also a PHP Handler just as mod_lsapi.

Optional requirements

  • Configured LVE containers for end-users ( recommended - higher security level );
  • Installed and configured mod_hostinglimitsfor Apache ( recommended - higher security level );
  • Installed mod_suexec for Apache and configured SuExecUserGroup directive for each virtual host ( recommended - higher security level );
  • Enabled CageFS for end-users ( recommended - higher security level );
  • PHP Selector with alt-php - an easy way to select different PHP versions for each end-user provided by CloudLinux OS Shared;
  • ea-php - alternative to alt-php provided by cPanel (for cPanel only).

Installation

mod_lsapi PRO can be installed through YUM package manager, however, the installation process varies depending on the control panel.

Select the control panel you are using:

Note

See also mod_lsapi PRO.

Installing on cPanel servers with EasyApache 4

Install mod_lsapi PRO and related packages through YUM package manager as follows: +

$ yum install liblsapi liblsapi-devel
+$ yum install ea-apache24-mod_lsapi
+
+After installing mod_lsapi PRO packages run the next command to setup mod_lsapi to cPanel: +
$ /usr/bin/switch_mod_lsapi --setup
+
+Now, when the module is installed, restart Apache to ensure that the mod_lsapi PRO is enabled: +
$ service httpd restart
+
+Now the lsapi handler is available for managing through cPanel MultiPHP Manager. +

For more details about swith_mod_lsapi, please visit switch_mod_lsapi tool.

Installing on Plesk servers

Install mod_lsapi PRO and related packages through YUM package manager as follows: +

$ yum install liblsapi liblsapi-devel
+$ yum install mod_lsapi
+
+Once completed, run the command to setup mod_lsapi PRO and register LSPHP handlers to Plesk Panel: +
$ /usr/bin/switch_mod_lsapi --setup
+

Now, when the module is installed, restart Apache to ensure that mod_lsapi PRO is enabled: +

$ service httpd restart
+

Now LSPHPXY alt-php PHP handlers are available for managing through Plesk PHP Settings.

For more details about swith_mod_lsapi, please visit switch_mod_lsapi tool.

Installing on DirectAdmin servers

Installation process is done with custombuild script: +

$ yum install liblsapi liblsapi-devel
+$ cd /usr/local/directadmin/custombuild
+$ ./build update
+$ ./build set php1_mode lsphp
+$ ./build php n
+$ ./build apache
+
+Restart Apache afterwards: +
$ service httpd restart
+
+Now all domains under php1_mode are using lsphp handler and no further actions are required to enable mod_lsapi PRO on DirectAdmin. +

Installing on servers with no control panel

Install mod_lsapi PRO and related packages through YUM package manager as follows: +

$ yum install liblsapi liblsapi-devel
+$ yum install mod_lsapi
+
+Once completed, run a command to setup mod_lsapi PRO: +
$ /usr/bin/switch_mod_lsapi --setup
+
+Now, when the module is installed, restart Apache to ensure that mod_lsapi PRO is enabled: +
$ service httpd restart
+

If you are using an alternative Apache - httpd24 , then install mod_lsapi as follows:

$ yum install liblsapi liblsapi-devel
+$ yum install httpd24-mod_lsapi
+
+Once completed, run a command to setup mod_lsapi PRO: +
$ /usr/bin/switch_mod_lsapi --setup
+
+Now, when the module is installed, restart Apache to ensure that mod_lsapi PRO is enabled: +
$ service httpd24 restart
+

For more details about swith_mod_lsapi, please visit switch_mod_lsapi tool.

Uninstalling

Uninstall mod_lsapi PRO is performed depending on your control panel.

Select the control panel you are using:

Uninstall procedure for cPanel servers with EasyApache 4

To remove lsapi handler from cPanel MultiPHP Manager and uninstall mod_lsapi PRO, run a command: +

$ /usr/bin/switch_mod_lsapi --uninstall
+
+Then remove packages with YUM package manager: +
$ yum erase liblsapi liblsapi-devel ea-apache24-mod_lsapi
+
+Restart Apache afterwards: +
$ service httpd restart
+
+Now mod_lsapi PRO is fully uninstalled. +

Uninstall procedure for Plesk servers

To unregister LSPHP handlers and uninstall mod_lsapi PRO, run the command: +

$ /usr/bin/switch_mod_lsapi --uninstall
+
+Then remove packages with YUM package manager: +
$ yum erase liblsapi liblsapi-devel mod_lsapi
+
+Restart Apache afterwards: +
$ service httpd restart
+
+Now LSPHPXY alt-php PHP handlers and mod_lsapi PRO are fully uninstalled. +

Uninstall procedure for DirectAdmin servers

Uninstall is done with custombuild script: +

$ cd /usr/local/directadmin/custombuild
+$ ./build update
+$ ./build set php1_release [any other php mode]
+$ ./build php n
+$ ./build apache
+
+The following PHP modes are available for DirectAdmin: +
  • mod_php
  • fastcgi
  • php-fpm
  • suphp

Restart Apache afterwards: +

$ service httpd restart
+
+Now all domains under php1_mode are using the chosen handler and mod_lsapi PRO is fully uninstalled. +

Uninstall procedure for servers with no control panel

To uninstall mod_lsapi PRO, run the command: +

$ /usr/bin/switch_mod_lsapi --uninstall
+
+Then remove packages with YUM package manager: +
$ yum erase liblsapi liblsapi-devel mod_lsapi
+$ rm [path to mod_lsapi.conf]
+
+Restart Apache to restore the standard PHP handler: +
$ service httpd restart
+

If you are using an alternative Apache: - httpd24, then uninstall mod_lsapi PRO as follows:

$ /usr/bin/switch_mod_lsapi --uninstall
+
+Then remove packages with YUM package manager: +
$ yum erase liblsapi liblsapi-devel httpd24-mod_lsapi
+$ rm [path to mod_lsapi.conf]
+
+Restart Apache afterwards: +
$ service httpd24 restart
+
+Now mod_lsapi PRO is fully uninstalled. +

Configuration

In order to get mod_lsapi PRO work properly, you'll need to configure Apache. To do this, we use a separate lsapi.conf file.

First of all, for the mod_lsapi PRO work, you need to ensure that the module is loaded. In your lsapi.conf you need to make sure the LoadModule directive has not been commented out. A correctly configured directive may look like this: +

LoadModule lsapi_module modules/mod_lsapi.so
+

In order to enable the module to process requests, you need to add the lsapi_engine directive to your lsapi.conf file as follows: +

lsapi_engine On
+

The mod_lsapi PRO handler can be enabled using the AddType directive. The AddType directive tells Apache that a given filename extension should be handled by mod_lsapi PRO. Apache will assume that and will attempt to execute it when that particular resource is requested by a client. +

AddType application/x-httpd-lsphp .php
+

If no handler is explicitly set for a request, the specified content type will be used as the handler name, therefore, please disable php.conf or any other PHP handler for using mod_lsapi PRO. In this example application/x-httpd-lsphp is a default handler by which mod_lsapi PRO process requests with lsphp binary from /usr/local/bin/ directory.

The final lsapi.conf configuration might look like this: +

LoadModule lsapi_module modules/mod_lsapi.so
+
+
+<IfModule lsapi_module>      
+	lsapi_engine On      
+	AddType application/x-httpd-lsphp .php      
+	lsapi_backend_connect_timeout 100000
+	lsapi_backend_connect_tries 10
+	lsapi_backend_children 20
+	lsapi_backend_pgrp_max_idle 30
+	lsapi_backend_max_process_time 300
+	lsapi_debug Off
+</IfModule>
+

In order to mod_lsapi PRO work lsapi.conf should be loaded to Apache through Include directive.

For more detailed description of the module directives please visit Configuration reference.
+For installation guide mod_lsapi PRO please visit Installation.

Configuration references

mod_lsapi customization:

Tuning LSPHP backend:

Connection pool mode:

CRIU support:

PHP configuration management:

Security:

mod_lsapi customization

lsapi_engine

Syntax : lsapi_engine on/off
Default : lsapi_engine off
Context : httpd.conf, htaccess

Description :
+Switching mod_lsapi handler on or off.


lsapi_socket_path

Syntax : lsapi_socket_path [path] +Default : lsapi_socket_path /var/mod_lsapi
Context : httpd.conf

Description:
+Path to backend lsphp sockets. By default /var/mod_lsapi


lsapi_poll_timeout

Syntax : lsapi_poll_timeout [number]
Default : lsapi_poll_timeout 300
Context : httpd.conf, htaccess

Description :
+Time to wait for response from the lsphp daemon, in seconds. 0 stands for infinity. For preventing long running processes which can use EP (limit number of entry processes). Default value is 300. Should be more or equal to 0. In the case of wrong format, the default value will be used.


lsapi_per_user

Syntax : lsapi_per_user On/Off
Default : lsapi_per_user Off
Context : httpd.conf

Description :
+Invoke master lsPHP process not per VirtualHost but per account. +When On, invoke backend not per VirtualHost but per account. +Default value is Off. +It is possible, for example, to set it to On in global config file and to Off in config files of some particular Virtual Hosts. +Then these Virtual Hosts will have a dedicated backend process, while others will have backend processes shared on account basis.


lsapi_output_buffering

Syntax : lsapi_output_buffering On/Off
Default : lsapi_output_buffering On
Context : httpd.conf, virtualhost, htaccess

Description :
+Enable or disable output buffering on Apache level. Default value is On.


lsapi_disable_reject_mode

Syntax : lsapi_disable_reject_mode On/Off
Default : lsapi_disable_reject_mode Off
Context : httpd.conf, virtualhost

Description :
+If a new HTTP request is coming to LSPHP daemon when all LSPHP workers are still busy, it can process this situation in two different ways. In REJECT mode LSPHP daemon will reject such request immediately. Otherwise, in legacy mode, LSPHP daemon will put this request into infinite queue, until one or more LSPHP daemon becomes free. When HTTP request is rejected in REJECT mode, mod_lsapi will write into Apache error_log the following message: Connect to backend rejected, and the client will receive 507 HTTP response. +By default LSPHP daemon in CloudLinux OS Shared uses REJECT mode. It can be switched off with this option.


lsapi_terminate_backends_on_exit

Syntax : lsapi_terminate_backends_on_exit On/Off
Default : lsapi_terminate_backends_on_exit On
Context : httpd.conf

Description :
+httpd.conf, On - stop lsphp services on apache restart, Off - leave live started lsphp services on apache restart (for php+opcache). The lsphp will not restart, even if Apache gets restarted.


lsapi_avoid_zombies

Syntax : lsapi_avoid_zombies On/Off
Default : lsapi_avoid_zombies Off
Context : httpd.conf, virtualhost

Description :
+Enable or disable a mechanism to avoid creation of zombie processes by lsphp. Default value is Off.


lsapi_use_req_hostname

Syntax : lsapi_use_req_hostname On/Off
Default : lsapi_use_req_hostname Off
Context : httpd.conf, virtualhosts

Description :
+By default, we are using hostname from the server_rec structure (off), it means that mod_lsapi takes hostname from the VirtualHost section of the configuration file. Using hostname from the request_rec structure (On) means that mod_lsapi takes hostname from the HOST section of the request. It could be useful for those who use dynamically generated configs for virtual hosts for example with mod_lua.


lsapi_sentry

Syntax : lsapi_sentry On/Off
Default : lsapi_sentry On
Context : httpd.conf

Description :
+When this option is enabled, errors that occur in the operation of the mod_lsapi will be sent to the remote sentry server. You can see the error messages that were sent to the sentry server in the directory /var/log/mod_lsapi. If you do not want to send error notifications from your server, you can disable this directive in lsapi.conf.


lsapi_debug

Syntax : lsapi_debug On/Off
Default : lsapi_debug Off
Context : httpd.conf, virtualhost

Description :
+Extended debug logging.


Tuning LSPHP backend

lsapi_set_env

Syntax : lsapi_set_env VAR_NAME [VAR_VALUE]
Default : -
Context : httpd.conf

Description :
+Pass env variable to lsphp. By default lsphp environment have only TEMP, TMP and PATH variables set.
+Example: lsapi_set_env TMP "/var/lsphp-tmp"
+Note: PATH env var default "/usr/local/bin:/usr/bin:/bin" cannot be changed because of security reasons.
+To change it, use explicitly lsapi_set_env_path option.

Beta

When the lsapi_server_tweak option is switched On, this option can be used in the virtualhost context.


lsapi_set_env_path

Syntax : lsapi_set_env_path [path(s)]
Default : lsapi_set_env_path /usr/local/bin:/usr/bin:/bin
Context : httpd.conf

Description :
+Change PATH variable in the environment of lsPHP processes. Default path /usr/local/bin:/usr/bin:/bin will be used if not set.

Beta

When the lsapi_server_tweak option is switched On, this option can be used in the virtualhost context.


lsapi_backend_children

Syntax : lsapi_backend_children [number]
Default : lsapi_backend_children [EP]
Context : httpd.conf

Description :
+Sets maximum number of simultaneously running child backend processes. Optional, a default directive value is equal to 120. LSAPI_CHILDREN environment variable is set according to the following rules:

  • If NPROC and EP are unlimited, the directive value is used.
  • If NPROC is set to any limited value and the directive value is set to a number less than NPROC-1, the directive value is used.
  • If the value is bigger than NPROC-1 and EP is set to unlimited, NPROC-1 is used.
  • If the value is bigger than NPROC-1 and EP is set to any limited value, EP+1 is used.

For example, with the default lve settings NPROC=100 and EP=20, the effective LSAPI_CHILDREN will be EP+1, that is LSAPI_CHILDREN=21.


lsapi_backend_connect_tries

Syntax : lsapi_backend_connect_tries [number]
Default : lsapi_backend_connect_tries 20
Context : httpd.conf

Description :
+Number of retries to connects to lsPHP daemon.


lsapi_backend_connect_timeout

Syntax : lsapi_backend_connect_timeout [number]
Default : lsapi_backend_connect_timeout 500000
Context : httpd.conf

Description :
+Number of usec to wait while lsPHP starts (if not started on request).


lsapi_backend_max_process_time

Syntax : lsapi_backend_max_process_time [number]
Default : lsapi_backend_max_process_time 300
Context : httpd.conf, virtualhost

Description :
+Sets env variable LSAPI_MAX_PROCESS_TIME
+Optional. Default value is 300.
+Timeout to kill runaway processes.


lsapi_backend_pgrp_max_idle

Syntax : lsapi_backend_pgrp_max_idle [number]
Default : lsapi_backend_pgrp_max_idle 30
Context : httpd.conf

Description :
+Sets env variable LSAPI_PGRP_MAX_IDLE, in seconds.
+Controls how long a control process will wait for a new request before it exits. # 0 stands for infinite.
+Optional, default value is 30.
+Should be more or equal to 0.


lsapi_backend_use_own_log

Syntax : lsapi_backend_use_own_log On/Off
Default : lsapi_backend_use_own_log Off
Context : httpd.conf, virtualhost

Description :
+Redirecting log output of backend processes from Apache error_log to dedicated log file or files, depending on value of lsapi_backend_common_own_log option. If Off, use Apache error log file for backend output, or separate file otherwise.


lsapi_backend_common_own_log

Syntax : lsapi_backend_common_own_log On/Off
Default : lsapi_backend_common_own_log Off
Context : httpd.conf, virtualhost

Description :
+It will be used only when lsapi_backend_use_own_log set to On. On - backend processes of the all virtual hosts will share the common log file. Off - every virtual host will have its own backend log file.


lsapi_backend_coredump

Syntax : lsapi_backend_coredump On/Off
Default : lsapi_backend_coredump Off
Context : httpd.conf, htaccess

Description :
+env variable LSAPI_ALLOW_CORE_DUMP (On or Off). Pass LSAPI_ALLOW_CORE_DUMP to lsphp or not. If it will be passed - core dump on lsphp crash will be created.
+Off by default.
+By default LSAPI application will not leave a core dump file when crashed. If you want to have LSAPI PHP dump a core file, you should set this environment variable. If set, regardless the value has been set to, core files will be created under the directory that the PHP script in.


lsapi_backend_accept_notify

Syntax : lsapi_backend_accept_notify On/Off
Default : lsapi_backend_accept_notify On
Context : httpd.conf, virtualhost

Description :
+Switch LSAPI_ACCEPT_NOTIFY mode for lsphp. This option can be used both in Global and VirtualHost scopes.This mode is incompatible with PHP 4.4.


lsapi_backend_pgrp_max_reqs

Syntax : lsapi_backend_prgrp_max_reqs [number]
Default : lsapi_backend_max_reqs 0
Context : httpd.conf, virtualhost

Description :
+Controls how many requests a control process will process before it exits. Should be more or equal to 0. In the case of wrong format, a default value will be used. Optional, the default value is 0, which means an unlimited number of requests.


lsapi_backend_pgrp_max_crashes

Syntax : lsapi_backend_prgrp_max_crashes [number]
Default : lsapi_backend_max_crashes 0
Context : httpd.conf, virtualhost

Description :
+Controls how many crashes of its worker processes a control process will detect before it exits. Should be more or equal to 0. In the case of wrong format, a default value will be used. Optional, the default value is 0, which means an unlimited number of crashes.


lsapi_backend_loglevel_info

Syntax: lsapi_backend_loglevel_info [On/Off]

Default: lsapi_backend_loglevel_info Off

Context: httpd.conf, virtualhost

Description: Controls which log level will be used to write PHP warnings and notices into Apache’s error_log. Optional, the default value is Off. In that case LOG_WARNING log level will be used. Otherwise, with On value, LOG_INFO log level will be used.


lsapi_backend_oom_score_adj

Syntax: lsapi_backend_oom_score_adj [number]

Default: lsapi_backend_oom_score_adj 0

Context: httpd.conf, virtualhost

Description: This option can be used to apply oom_score_adj values for PHP processes created by mod_lsapi. Value is an integer in the -1000 to 1000 range. The lower the value, the lower the chance that the process will be killed. +When your server becomes low on free memory and an OOM killer is invoked then desirable that lsphp processes are sacrificed to free up memory. To do this, you need to set oom_score_adj to a large value. +For more information on setting value oom_score_adj, see the page https://man7.org/linux/man-pages/man5/proc.5.html


lsapi_server_tweak beta

Syntax: lsapi_server_tweak [On/Off]

Default: lsapi_server_tweak Off

Context: httpd.conf

Description: This option, when switched on, allows the use of lsapi_set_env and lsapi_set_env_path config options in the virtualhost context.


Connection pool mode

lsapi_with_connection_pool

Syntax : lsapi_with_connection_pool On/Off
Default : lsapi_with_connection_pool Off
Context : httpd.conf

Description :
+On/Off - disable enable connect pool, default is Off.


lsapi_backend_max_idle

Syntax : lsapi_backend_max_idle [number]
Default : lsapi_backend_max_idle 300
Context : httpd.conf

Description :
+It is relevant only with lsapi_with_connection_pool option switched on. Controls how long a worker process will wait for a new request before it exits. 0 stands for infinite. Should be more or equal to 0. In the case of wrong format default value will be used. Optional, default value is 300.


lsapi_backend_max_reqs

Syntax : lsapi_backend_max_reqs [number]
Default : lsapi_backend_max_reqs 10000
Context : httpd.conf

Description :
+It is relevant only with lsapi_with_connection_pool option switched on. Controls how many requests a worker process will process before it exits. Should be more than 0. In the case of wrong format default value will be used. Optional, default value is 10000.


CRIU support

lsapi_criu

Syntax : lsapi_criu On/Off
Default : lsapi_criu Off
Context : httpd.conf

Description :
+Enable/disable CRIU for lsphp freezing. Default: Off.


lsapi_criu_socket_path

Syntax : lsapi_criu_socket_path [path]
Default : lsapi_criu_socket_path /var/run/criu/criu_service.socket
Context : httpd.conf

Description :
+Set path to socket for communication with criu service. Default: /var/run/criu/criu_service.socket.


lsapi_criu_imgs_dir_path

Syntax : lsapi_criu_imgs_dir_path [path]
Default : lsapi_criu_imgs_dir_path /var/mod_lsapi/
Context : httpd.conf

Description :
+Path to folder where images of freezed PHP will be stored. Should be path. Default: /var/mod_lsapi/


lsapi_backend_initial_start

Syntax : lsapi_backend_initial_start [number]
Default : lsapi_backend_initial_start 0
Context : httpd.conf

Description :
+Number of requests to virtualhost, when lsphp will be freezed. Default: 0 - means disable freezing.


lsapi_criu_use_shm

Syntax : lsapi_criu_use_shm Off/Signals
Default : lsapi_criu_use_shm Off
Context : httpd.conf

Description :
+Method of requests counting. Off - use shared memory. Signals - use signals from child processes to parent. Default: Off


lsapi_backend_semtimedwait

Syntax : lsapi_backend_semtimedwait On/Off
Default : lsapi_backend_semtimedwait On
Context : httpd.conf

Description :
+Use semaphore for checking when lsphp process will be started. Speed of start lsphp increased with semaphore using. This method avoid cycles of waiting for lsphp start. Default: On.


lsapi_reset_criu_on_apache_restart

Syntax : lsapi_reset_criu_on_apache_restart On/Off
Default : lsapi_reset_criu_on_apache_restart Off
Context : httpd.conf, virtualhost

Description :
+This option allows cleaning all CRIU images on Apache restart.
+Setting lsapi_reset_criu_on_apache_restart to On means that on each Apache restart the CRIU images which are stored in directory specified by lsapi_criu_imgs_dir_path directive will be recreated on new request to domain(only after restart).
+If this option set to Off then CRIU images won’t be recreated on Apache restart.


lsapi_criu_debug

Syntax: lsapi_criu_debug On/Off
Default: lsapi_criu_debug Off
Context: httpd.conf, virtualhost

Description :
+Enable/disable CRIU related debug logging.


PHP configuration management

lsapi_process_phpini

Syntax : lsapi_process_phpini On/Off
Default : lsapi_process_phpini Off
Context : httpd.conf, virtualhost, directory

Description :
+Enable or disable phpini_* directive processing. Default value is Off.


lsapi_phpini

Syntax : lsapi_phpini [path]
Default : lsapi_phpini -
Context : httpd.conf, virtualhost, htaccess

Description :
+When lsapi_process_phpini option switched to Off, these values will be silently ignored. lsapi_phpini values with absolute filename of php.ini file can be inserted into .htaccess files in order to set custom php.ini which will override/complement settings from system default php.ini.


lsapi_phprc

Syntax : lsapi_phprc [No | Env | Auto | DocRoot]
Default : lsapi_phprc No
Context : httpd.conf, virtualhost

Description : +The value of PHPRC env variable.
+Special values are "No", "Env", "Auto" and "DocRoot".
+Default value is "No" - without PHPRC at all.
+"Auto" value stands for php.ini from DocumentRoot of the corresponding VirtualHost if it is present, or from user's home directory otherwise "DocRoot" value stands for php.ini from DocumentRoot of the corresponding VirtualHost.
+"Env" value for using PHPRC from the environment, to set it with SetEnv config option, for example
+lsapi_phprc No
+lsapi_phprc Auto
+lsapi_phprc DocRoot
+lsapi_phprc Env
+lsapi_phprc /etc/


lsapi_tmpdir

Syntax : lsapi_tmpdir [path]
Default : lsapi_tmpdir /tmp
Context : httpd.conf, virtualhost

Description :
+Set alternate request body temporary files directory.


lsapi_enable_user_ini

Syntax : lsapi_enable_user_ini On/Off
Default : lsapi_enable_user_ini Off
Context : httpd.conf, virtualhost

Description :
+Enable .user.ini files for backend. Same as suphp, php-fpm and fcgid mechanism of .user.ini. Default value is Off.


lsapi_user_ini_homedir

Syntax : lsapi_user_ini_homedir On/Off
Default : lsapi_user_ini_homedir Off
Context : httpd.conf, virtualhost

Description :
+If lsapi_enable_user_ini option is set to On, then enable/disable processing .user.ini file in home directory also. Default value is Off.


lsapi_keep_http200

Syntax : lsapi_keep_http200 On/Off
Default : lsapi_keep_http200 Off
Context : httpd.conf, .htaccess

Description :
+If set to On, always keep backend's response status as mod_php does. If set to Off, response status can be overridden by Apache as suphp does (in case of call via ErrorDocument directive).


lsapi_mod_php_behaviour

Syntax : lsapi_mod_php_behaviour On/Off
Default : lsapi_mod_php_behaviour On
Context : httpd.conf, virtualhost, directory

Description :
+On/Off - disable php_* directives, default On.


php_value, php_admin_value, php_flag, php_admin_flag

Syntax : [php_value|php_admin_value|php_flag|php_admin_flag]
Default :
Context : httpd.conf, virtualhost, htaccess

Description :
+mod_php emulation.


Security

lsapi_use_suexec

Syntax : lsapi_use_suexec On/Off
Default : lsapi_use_suexec On
Context : httpd.conf

Description :
+Use or not suexec to a target user.


lsapi_user_group

Syntax : lsapi_user_group [user_name] [group_name]
Default : -
Context : httpd.conf, virtualhost, directory

Description :
+Set user & group for requests.


lsapi_uid_gid

Syntax : lsapi_uid_gid [uid] [gid]
Default : -
Context : httpd.conf, virtualhost, directory

Description :
+Set user & group for request.


lsapi_use_default_uid

Syntax : lsapi_use_default_uid On/Off
Default : lsapi_use_default_uid On
Context : httpd.conf

Description :
+Use default Apache UID/GID if no uid/gid set. Values: On/Off. If Off, and no UID/GID set, error 503 will be returned.


lsapi_target_perm

Syntax : lsapi_target_perm On/Off
Default : lsapi_target_perm Off
Context : httpd.conf

Description :
+Check target PHP script permissions. If set to On, lsapi will check that script is owned by the same user, as user under which it is being executed. Return 503 error if they don't match. Default: Off.


lsapi_paranoid

Syntax : lsapi_paranoid On/Off
Default : lsapi_paranoid Off
Context : httpd.conf

Description :
+Check or not permissions of target php scripts. Optional, default value is Off.


lsapi_check_document_root

Syntax : lsapi_check_document_root On/Off
Default : lsapi_check_document_root On
Context : httpd.conf

Description :
+Check or not owner of DOCUMENT_ROOT. Optional, default value is On.


lsapi_disable_forced_pwd_var

Syntax : lsapi_disable_forced_pwd_var On/Off
Default : lsapi_disable_forced_pwd_var Off
Context : httpd.conf, virtualhost

Description :
+To disable addition of PWD variable. Default value is Off. If set to On, the PWD variable will not be added into a backend environment.


lsapi_max_resend_buffer

Syntax : lsapi_max_resend_buffer [number]tmp
Default : lsapi_max_resend_buffer 200
Context : httpd.conf, virtualhost

Description :
+Maximum buffer in KiB to resend for request that has a body (like POST request body).

See also Apache mod_lsapi PRO CLI tools.

Troubleshooting

Debugging mod_lsapi issues: error_log & sulsphp_log

mod_lsapi errors will be located in error_log and sulsphp_log. +Note that errors can appear in both logs at the same time, and you might need to refer to both of them to solve the issue.

See next table for more details:

error_log sulsphp_log Solution
Could not connect to lsphp backend: connect to lsphp failed: 111 Connection refused. Increase memory limit for LVE ID uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp Increase pmem or vmem limits for the user uid.
Error sending request: ReceiveLSHeader: nothing to read from backend socket No need to check this log. lsphp was killed. It can be due to apache restart or lfd. If you see this message too often - change lsapi_terminate_backends_on_exit to Off in lsapi.conf or add to /etc/csf/csf.pignore the following lines: exe:/usr/local/bin/lsphp pexe:/opt/alt/php.*/usr/bin/lsphp
Error sending request (lsphp is killed?): ReceiveLSHeader: nothing to read from backend socket, referer: http://XXXXXXX Child process with pid: XXXXX was killed by signal: 11, core dump: 0 No need to check this log. lsphp has crashed. Next slide will explain what to do (core dump creating). Also, check configuration options for apc and suhosin in php.ini. Once you have a core file generated at DocumentRoot contact https://cloudlinux.zendesk.com/ so we can investigate the cause.
Could not connect to lsphp backend: connect to lsphp failed: 111 Connection refused file is writable by others: (///usr/local/bin/lsphp) Incorrect lsphp file permissions. For fixing: chmod 755 /usr/local/bin/lsphp cagefsctl --force-update.
Could not determine uid/gid for request No need to check this log. UID/GID are not set in virtualhost. Set lsapi_use_default_uid On in lsapi.conf (it is On by default since 0.1-98 version, this solution is for older versions).
Own id for script file (/xxxx/xxx/xxxx) is xxx; should be xxxx No need to check this log. File is not owned by the user PHP executed by. To overwrite (insecure), set lsapi_target_perm Off in lsapi.conf.
Could not connect to lsphp backend: connect to lsphp failed: 111 Connection refused Entering jail error Check if СageFS enabled. Try running cagefsctl --remount-all.
Backend error on sending request(GET /XXXX HTTP/1.1); uri(/XXXX) content-length(0) (lsphp is killed?): ReceiveAckHdr: backend process reset connection: errno 104 (possibly memory limit for LVE ID XXXX too small) uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp Increase PMEM limits for the user UID.
Reached max children process limit: XX, extra: 0, current: XX, please increase LSAPI_CHILDREN.

Backend error on sending request(GET /XXXX HTTP/1.1); uri(/XXXX) content-length(0) (lsphp is killed?): ReceiveAckHdr: backend process reset connection: errno 104 (possibly memory limit for LVE ID XXXX too small)
uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp Increase value of lsapi_backend_children for UID in vhost.conf or globally in lsapi.conf.
fork() failed, please increase process limit: Cannot allocate memory

Backend error on sending request(GET /XXXX HTTP/1.1); uri(/XXXX) content-length(0) (lsphp is killed?): ReceiveAckHdr: backend process reset connection: errno 104 (possibly memory limit for LVE ID XXXX too small)
uid:(xxx); gid:(xxx); uid limit warning: EP should be < than NPROC, current EP: XX, NPROC: XX

uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp
Increase NPROC limits for the UID. It should be greater than EP and lsapi_backend_children.
Child process with pid: XXXXXX was killed by signal: 9, core dump: 0

Backend error on sending request(GET /XXXX HTTP/1.1); uri(/XXXX) content-length(0) (lsphp is killed?): ReceiveAckHdr: nothing to read from backend socket (LVE ID XXXX
uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp These errors occurs when the amount of PMEM limits is incommensurable with the number of EP. Increase PMEM limits or decrease EP number for the user UID.
totBytesRead (X) != bodyLen (X), referer: XXXX

Backend error on sending request(POST /XXXX HTTP/1.1); uri(/XXXX) content-length(X) (lsphp is killed?): ReceiveAckHdr: nothing to read from backend socket (LVE ID XXXX)

lsphp(XXXX): Child process with pid: XXXX was killed by signal: 15, core dump: 0
No need to check this log. Increase LimitRequestBody (Apache) or/and SecRequestBodyNoFilesLimit (mod_security) configuration limits
Connect to backend failed: connect to lsphp failed: 13 No need to check this log. Check that mod_ruid2 is disabled
Connect to backend rejected on sending request(POST /XXXXX HTTP/1.1); uri(/XXXXX) No need to check this log. Set lsapi_disable_reject_mode On in your lsapi.conf and reload Apache. This way LSPHP daemon will put requests that cannot be served by LSPHP daemon right away into infinite queue, until one or more LSPHP daemon becomes free. Visit Configuration Reference for more info.

Non-standard apache user

If apache runs under a username other than "apache" or "nobody" , you should rebuild sulsphp (where username is built in for security reasons) with corresponding username: +

$ yum install liblsapi liblsapi-devel   
+$ cd ~$ wget [https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz](https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz)  
+$ tar zxvf mod_lsapi.tar.gz  
+$ cd mod-lsapi-0.1-37  
+$ cmake -DHTTPD_USER=<new user name> .  
+$ make
+$ make install
+
+This will:
+- Install: /usr/lib/apache/mod_lsapi. so (or to another correct httpd modules path)
+- Install: /usr/sbin/sulsphp

lsphp started under user apache/nobody

Check if SuExecUserGroup specified for virtual hosts. This parameter is used by mod_lsapi for user identification.

Could not connect to lsphp backend: connect failed: 111 Connection refused

  • Switch in lsapi.conf or mod_lsapi.conf value to: lsapi_terminate_backends_on_exit Off

  • Check if empty: cat /etc/cron.d/kill_orphaned_php-cron | grep lsphp , then run:

yum install lve-utils
+
+Then restart cron service. +

Running PHP for users with UID < 99

If you need to run PHP using mod_lsapi using users with UID < 99, you would need to re-compile sulsphp:

$ yum install liblsapi liblsapi-devel
+$ cd ~
+$ wget [https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz](https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz)
+$ tar zxvf mod_lsapi.tar.gz
+$ cd mod-lsapi-0.1-XX
+$ cmake -DUID_MIN=80 -DGID_MIN=80 .
+$ make
+$ make install
+
+will be installed
+- Installing: /usr/lib/apache/mod_lsapi.so (or another httpd modules path)
+- Installing: /usr/sbin/sulsphp

Apache binary called not httpd (httpd.event, httpd.worker)

$ yum install liblsapi liblsapi-devel 
+$ cd ~
+$ wget https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz        
+$ tar zxvf mod_lsapi.tar.gz
+$ cd mod-lsapi-0.1-XX
+$ cmake -DPARENT_NAME="<apache binary name>".
+$ make
+$ make install
+
+Will be installed:
+- Installing: /usr/lib/apache/mod_lsapi.so (or another httpd modules path)
+- Installing: /usr/sbin/sulsphp

WHMCS Status page not accessible after installing CL and mod_lsapi (cPanel).

  • add user: useradd userstat
  • add to file (to the end of file before ) /usr/local/apache/conf/conf.d/lsapi.conf: <Directory /usr/local/apache/htdocs/> +lsapi_user_group userstat userstat +
  • service httpd restart

This is safe solution for easyapache rebuilding and cpanel-mod-lsapi updating.

PHP page with Suhosin return 503 error

Make php.ini for suhosin as recommended below: +

[suhosin]
+suhosin.simulation = Off
+suhosin.mail.protect = 1
+suhosin.cookie.disallow_nul = Off
+suhosin.cookie.max_array_depth = 1000
+suhosin.cookie.max_array_index_length = 500
+suhosin.cookie.max_name_length = 500
+suhosin.cookie.max_totalname_length = 500
+suhosin.cookie.max_value_length = 200000
+suhosin.cookie.max_vars = 16384
+suhosin.get.disallow_nul = Off
+suhosin.get.max_array_depth = 1000
+suhosin.get.max_array_index_length = 500
+suhosin.get.max_name_length = 500
+suhosin.get.max_totalname_length = 500
+suhosin.get.max_value_length = 1000000
+suhosin.get.max_vars = 16384
+suhosin.post.disallow_nul = Off
+suhosin.post.max_array_depth = 1000
+suhosin.post.max_array_index_length = 500
+suhosin.post.max_name_length = 500
+suhosin.post.max_totalname_length = 500
+suhosin.post.max_value_length = 1000000
+suhosin.post.max_vars = 16384
+suhosin.request.disallow_nul = Off
+suhosin.request.max_array_depth = 1000
+suhosin.request.max_array_index_length = 500
+suhosin.request.max_totalname_length = 500
+suhosin.request.max_value_length = 1000000
+suhosin.request.max_vars = 16384
+suhosin.request.max_varname_length = 524288
+suhosin.upload.max_uploads = 300
+suhosin.upload.disallow_elf = Off
+suhosin.session.cryptua = Off
+suhosin.session.encrypt = Off
+suhosin.session.max_id_length = 1024
+suhosin.executor.allow_symlink = Off
+suhosin.executor.disable_eval = Off
+suhosin.executor.disable_emodifier = Off
+suhosin.executor.include.max_traversal = 8
+

PHP page with APC return 503 error

Make php.ini for APC as recommended below: +

[apc]...apc.shm_segments=1apc.shm_size=32...
+
+shared memory should be not less than 32MB +

Messages appearing in error_log: Child process with pid: XXXXX was killed by signal: 11, core dump: 0

This means that lsphp was crashed. The solution is:

  • Check if apc for user enabled. Tune its options as described in previous slide.
  • Check if suhosin is enabled for user. Tune its options as described in this article.
  • If previous items do not help, contact us at https://helpdesk.cloudlinux.com/

How to get lsphp core dump on crash

  • Configure mod_lsapi to allow lsphp to generate core dumps. In mod_lsapi.conf:
lsapi_backend_coredump On
+
  • Enable core file generation in sysctl:
sysctl -w ‘kernel.core_uses_pid=1’
+sysctl -w ‘kernel.core_pattern=core.%p’
+
  • Configure system to change max size of core files. In /etc/security/limits.conf add:
user1 soft core unlimited
+user1 hard core unlimited
+
+where user1 is the username for which lsphp crashes. +
  • If /etc/profile.d/limits.sh exists, look up for the following lines:
if [ "$LIMITUSER" != "root" ]; then
+ulimit -n 100 -u 35 -m 200000 -d 200000 -s 8192 -c 200000 -v unlimited 2>/dev/null
+
+Substring “-c 200000” must be replaced with “-c unlimited” . +
  • Add line into ulimit -c unlimited into apachectl script just after another invokes of the ulimit command.

  • Do cold restart of Apache with the command like this:

service httpd stop; sleep 2; killall lsphp; service httpd start
+
  • You can make sure that ulimit for lsphp is changed to unlimited successfully with the following command:
cat /proc/PID/limits | grep ‘Max core file size’
+

where PID is a pid of any lsphp process. ps -u user1 | grep lsphp

  • Core dump of lsphp will be created in the DocumentRoot of the corresponding virtual server. +On cPanel server it should map to

mod_lsapi is not included in output of httpd -M after installation and setup command for cPanel EasyApache 3

  1. Check if the file /usr/local/apache/conf/conf.d/lsapi.conf exists and not empty;

  2. Check if output of the command

cat /usr/local/apache/conf/httpd.conf | grep "/usr/local/apache/conf/conf.d/\*\.conf"
+
+is not empty. +

If it is empty:

  1. Add to "include" section of /var/cpanel/conf/apache/main string:

"include": '"/usr/local/apache/conf/conf.d/*.conf"'
+ "include":
+ "directive": 'include'
+ "items":
+ ...
+ -
+ "include": '"/usr/local/apache/conf/conf.d/*.conf"' 
+ "listen":
+
  1. Do:
mkdir -p /usr/local/apache/conf/conf.d/;                                                                                 
+cp /usr/share/lve/modlscapi/confs/lsapi.conf /usr/local/apache/conf/conf.d/lsapi.conf
+
  1. Call:
/scripts/rebuildhttpdconf/scripts/restartsrv_httpd
+

See also mod_lsapi PRO FAQ here.

CRIU Support

Note

CloudLinux OS Shared 7, CloudLinux OS Shared 7 Hybrid, and CloudLinux OS Shared 8 only

CRIU is Checkpoint/Restore In Userspace , (pronounced kree-oo ), is a software tool for Linux operating system. Using this tool, you can freeze a running application (or part of it) and checkpoint it as a collection of files on disk. You can then use the files to restore the application and run it exactly as it was during the time of freeze (more information on the link https://criu.org/Main_Page ).

mod_lsapi-1.1-1 is the first beta version with freezing PHP implemented. mod_lsapi now supports the following parameters:

Option name Description Values Default
lsapi_criu Enable/disable CRIU for lsphp freezing. On/Off Off
lsapi_criu_socket_path Set path to socket for communication with criu service. [path to socket] /var/run/criu/criu_service.socket
lsapi_backend_semtimedwait Enable/disable flag for notification about lsphp started. This method avoid cycles of waiting for lsphp start. On/Off On
lsapi_backend_initial_start Number of request when lsphp should be freezed. [number] 0 - no freezing 0
lsapi_criu_use_shm Method of requests counting. Off - use shared memory. Signals - use signals from child processes to parent. Off/Signals Off
lsapi_criu_imgs_dir_path Path to folder where imgs of freezed PHP will be stored. [path] /var/mod_lsapi/
lsapi_criu_debug Enable/Disable CRIU related debug logging. On/Off Off

Example: +

lsapi_criu On
+lsapi_criu_socket_path /var/run/criu/criu_service.socket
+lsapi_backend_semtimedwait On
+lsapi_backend_initial_start 15
+lsapi_criu_use_shm Off
+lsapi_criu_debug Off
+

When Apache module mod_lsapi detects CRIU enabled (lsapi_criu On) it prepares a directory for images (on the first request of virtualhost) to store ( lsapi_criu_imgs_dir_path /var/mod_lsapi/[dir_name] ), and starts lsphp process. Lsphp increases counter ( lsapi_criu_use_shm Off|Signals ) via shared memory or signals, when counter reaches limit ( lsapi_backend_initial_start 15 ), lsphp sends the request to CRIU for freezing. CRIU service makes images of requested processes. Lsphp will not be frozen if counter has not reached the limit. The next time when lsphp will be stopped, it will be unfrozen from the images.

The images of the processes will be saved even if Apache is restarted. But all images will be deleted after server restart by default configuration. This can be modified by setting the new path lsapi_criu_imgs_dir_path .

Important!

If php.ini or configuration file from php.d is changed, the images must be deleted manually.

Note

CRIU (version lower than criu-lve-3.6-1) can't correctly freeze lsphp with PrivateTmp enabled. For correct work, PrivateTmp must be disabled in httpd.service file .

To disable it, copy httpd.service to /etc/systemd/system and change there PrivateTmp: + 

# cat httpd.service
+[Unit]
+Description=Apache web server managed by cPanel Easy
+ApacheConditionPathExists=!/etc/httpddisable
+ConditionPathExists=!/etc/apachedisable
+ConditionPathExists=!/etc/httpdisable
+
+[Service]Type=forking
+ExecStart=/usr/local/cpanel/scripts/restartsrv_httpd --no-verbose
+PIDFile=/var/run/apache2/httpd.pid
+PrivateTmp=false 
+
+[Install]
+WantedBy=multi-user.target 
+
+Or it would be technically better to provide a small override of service file rather than copying the whole new version in /etc/systemd/system

http://www.freedesktop.org/software/systemd/man/systemd.unit.html

mkdir /etc/systemd/system/httpd.service.d
+echo "[Service]" >  /etc/systemd/system/httpd.service.d/nopt.conf
+echo "PrivateTmp=false" >> /etc/systemd/system/httpd.service.d/nopt.conf
+

and

# systemctl daemon-reload
+

CRIU Installation

Criu is installed with dependency to mod_lsapi package. To activate it:

  1. Enable service and start it:
systemctl enable criu
+systemctl start criu
+
  1. Edit lsapi.conf file, turn CRIU On and set some defaults:
lsapi_criu On
+lsapi_criu_socket_path /var/run/criu/criu_service.socket
+lsapi_backend_semtimedwait On
+lsapi_backend_initial_start 15
+lsapi_criu_use_shm Off
+
  1. Restart apache:
service httpd restart
+

CRIU Image Cleanup

  1. An option added to the Apache configuration for cleaning all the images earlier saved by CRIU.
Option name Description Value Default
lsapi_reset_criu_on_apache_restart This option allows cleaning all CRIU images on Apache restart. On/Off Off

On the next restart of Apache all of the images will be cleaned.

It can be enabled by writing lsapi_reset_criu_on_apache_restart On in lsapi.conf (Virtual Host and .htaccess do not allow to use this option).

Note that this option works only if lsapi_terminate_backends_on_exit is On (default value is On , it is set in lsapi.conf too).

  1. If you need to clean CRIU images for one user you can simply add file to the user's directory with CRIU images (default /var/mod_lsapi/lsapi * criu_imgs ). On the next restart of lsphp the images will be cleaned.

  2. Global reset flag for cleaning all earlier saved images by CRIU.

Current mod_lsapi allows cleaning all images only with one flag file.

Create /usr/share/criu/mod_lsapi/lsphp.criu.reset file. Also don't forget to set such permissions [nobody:nobody] (or [apache:apache] for non cPanel) and access mode [700] to the /usr/share/criu/mod_lsapi directory.

Steps to do :

mkdir /usr/share/criumkdir /usr/share/criu/mod_lsapi
+chown nobody:nobody /usr/share/criu/mod_lsapi
+touch /usr/share/criu/mod_lsapi/lsphp.criu.reset
+

On the next requests to all virtual hosts images will be recreated (deleted first and created again later - it depends on lsapi_backend_initial_start value).

  1. Аdded possibility to clean CRIU images from user space.

If a user needs to clean CRIU images for lsphp, he should create a file: ~/mod_lsapi_reset_me_[vhost_name] . Where [vhost_name] is a ServerName from the VirtualHost block in the configuration file. On the next restart of lsphp, the images will be cleaned.

Example:

cd; touch mod_lsapi_reset_me_criu.test.com
+

where vhost.conf contains:
ServerName criu.test.com

This mode is enabled by default and creates a separate lsphp process for each virtual host.

mod_lsapi_reset_me[vhost_name] flag will not work for a user when lsapi_per_user option is On.

  1. There is (default off) option in mod_lsapi that creates only one lsphp process for a user, regardless of the number of his virtual hosts. We don't recommend to use this option with CRIU, but if you use it, make sure that your virtual hosts (under the same user) have the same environment configurations. If they are not the same, this may cause undesirable lsphp process operation.

Additional integration components

CloudLinux OS Shared uses various ways to integrate with existing system.

LVE PAM module

pam_lve.so is a PAM module that sets up LVE environment. It provides easy way to setup LVE for SSH sessions, as well as other PAM enabled applications, such as crontab, su, etc.

pam_lve.so is installed by default when you convert existing server.

Installation:

# yum install pam_lve
+

After you install RPM , add the following line to the PAM config file for the required application:

session    required     pam_lve.so 500 1 wheel,other
+

In this line:

  • 500 stands for minimum UID for which LVE will be setup. For any user with UID < 500, LVE will not be setup. If CageFS is installed, use: +cagefsctl --set-min-uid UID to setup minimum UID. The parameter in PAM files will be ignored in that case.
  • 1 stands for CageFS enabled (0 – CageFS disabled)
  • 3rd optional argument defines group of users that will not be placed into LVE or CageFS. Starting with pam_lve 0.3-7 you can specify multiple groups, comma separated.

Warning

It is crucial to place all users that su or sudo to root into that group. Otherwise, once such user gains root, user will be inside LVE, and all applications restarted by that user will be inside that user LVE as well.

Warning

Please do not add the pam_lve.so in the PAM configuration for sudo. It can affect user’s work with the resource usage plugin, and Python/Node.js/PHP selector plugins.

For example, to enable LVE for SSH access, add that line to the /etc/pam.d/sshd. To enable LVE for SU, add that line to the /etc/pam.d/su.

By default, module will not place users with group wheel into lve. If you want to use different group to define users that will not be placed into LVE by pam_lve - pass it as the 3rd argument.

Warning

Be careful when you test it, as if you incorrectly add this line to the /etc/pam.d/sshd, it will lock you out ssh. Don't log out of your current SSH session, until you sure it works.

For preventing cases when user enters under usual user (using ssh) and then tries to enter as super user (via sudo or su) - pam_sulve was created, which tries to enter to LVE=1 and leaves it right away. If action fails, user gets message:

!!!!  WARNING: YOU ARE INSIDE LVE !!!!
+

To check if pam_sulve is enabled on the server:

grep pam_sulve.so /etc/pam.d/*
+

should not be empty.

LVE wrappers

LVE wrappers are the set of tools that allow system administrator to run various users, programs & daemons within Lightweight Virtual Environment. This allows system administrator to have control over system resources such program can have. Additionally it prevents misbehaving programs running within LVE to drain system resources and slow down or take down the whole system. The tools are provided by lve-wrappers RPM.

You can install them by running:

$ yum install lve-wrappers
+

Placing programs inside LVE

LVE Wrappers provide two tools for placing programs inside LVE: lve_wrapper and lve_suwrapper.

/bin/lve_wrapper can be used by any non-root user, as long as that user is in group lve (see /etc/groups file).

Syntax

lve_wrapper <command_to_run>
+

Example

$ lve_wrapper make install
+

The program will be executed within LVE with ID matching user's id.

/bin/lve_suwrapper can be used by root user or any user in group lve (see /etc/groups file) to execute command within specified LVE.

Syntax

lve_suwrapper LVE_ID <command_to_run>
+

Example

# lve_suwrapper 10000 /etc/init.d/postgresql start
+

Switches

  • -f - force namespace
  • -n - without namespace
  • -c - remove CPU limits (requires lve_wrapper >= 2.1.2)

MPM ITK

CloudLinux OS Shared httpd RPM comes with MPM ITK built in. Yet, if you would like to build your own Apache, you need to apply our patch for MPM ITK

When running MPM ITK , you should disable mod_hostinglimits. All the functionality needed by MPM ITK is already built into the patch.

Directives which can be used by Apache with ITK patch:

  • AssignUserID - uses ID as LVE ID
  • LVEErrorCodeITK - error code to display on LVE error (508 by default)
  • LVERetryAfterITK - same as LVERetryAfter - respond with Retry-After header when LVE error 508 occurs
  • LVEId - ovverides id used for LVE ID instead of AssignUserID
  • LVEUser - overrides user to use to retrieve LVE ID, instead of AssignUserID

HostingLimits module for Apache

mod_hostinglimits works with existing CGI/PHP modules, to put them into LVE context. In most cases the CGI/PHP process will be placed into LVE with the ID of the user that sites belongs to. mod_hostinglimits detects the user from SuexecUserGroup (suexec module), SuPHP_UserGroup (from mod_suphp), AssignUserID (MPM ITK), RUidGid (mod_ruid2 ) directives.

This can be overwritten via LVEId or LVEUser parameter on the Directory level.

Note

Those parameters will not work with mod_fcgid and mod_cgid.

The order of detection looks as follows:

  • LVEId
  • LVEUser
  • SuexecUserGroup
  • suPHP_UserGroup
  • RUidGid
  • AssignUserID

Note

LVE doesn't work for mod_include #include due to its "filter" nature.

Example:

LoadModule hostinglimits_module modules/mod_hostinglimits.so
+<IfModule mod_hostinglimits.c>
+ AllowedHandlers cgi-script php5-script php4-script
+ SecureLinks On
+</IfModule>
+

Additional notes

mod_hostinglimits (since version 1.0-22) supports min-uid - cagefsctl --set-min-uid=600.

Min UID is read on Apache start/restart and stored in the memory during apache runtime.

If the min UID has changed, you should restart Apache for mod_hostinglimits applying new min UID value. Full min UID is supported only with APR.

The following message should appear:

[notice] mod_hostinglimits: found apr extention version 3.
+

This means that the correct APR is installed with mod_hostinglimits.

mod_hostinglimist has variable for Apache CustomLog format string %{LVE_ID}y.

How to use:

LogFormat

"%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" req for lve "%{LVE_ID}y"
+

combined

shows in access_log the following info:

*.*.*.* - - [09/Apr/2015:07:17:06 -0400] "GET /1.php HTTP/1.1" 200 43435 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0" req for lve 500
+
+*.*.*.* - - [09/Apr/2015:07:17:06 -0400] "GET /1.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2524 "************/1.php""Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0" req for lve 500
+
+*.*.*.* - - [09/Apr/2015:07:17:06 -0400] "GET /1.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2146 "************/1.php""Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0" req for lve 500
+

Installation

cPanel

Installed by default during EasyApache build. Requires lve-stats & lve-utils packages to be installed.

DirectAdmin

Can be built using custombuild:

$ yum install liblve-devel
+$ cd /usr/local/directadmin/custombuild
+$ ./build update
+$ ./build set cloudlinux yes
+$ ./build apache
+$ ./build rewrite_confs
+

If you run suphp, then run the following:

$ ./build suphp
+

Plesk

$ yum install mod_hostinglimits
+

ISPmanager

$ yum install mod_hostinglimits
+

InterWorx

$ yum install mod_hostinglimits
+

H-Sphere

Included by default in H-Sphere 3.5+

Standard Apache from RPM

$ yum install mod_hostinglimits
+

Custom Apache installation

Compile from the source: https://repo.cloudlinux.com/cloudlinux/sources/mod_hostinglimits.tar.gz

$ wget https://repo.cloudlinux.com/cloudlinux/sources/mod_hostinglimits.tar.gz
+$ yum install cmake
+$ tar -zxvf mod_hostinglimits*.tar.gz
+$ cd mod_hostinglimits*
+$ cmake .
+$ make
+$ make install
+
  • Apache Module Identifier: hostinglimits_module
  • Source Files: mod_hostinglimits.c
  • Compatibility: MPM prefork, worker, event, ITK

Directives

Description Makes sure that for any virtual hosts, only files owned by user specified via SuexecUserGroup or other ways as described above are served. For files owned by any other user apache will return Access Denied error. The directive will not affect VirtualHost without user id specified, or with uid < 100
Syntax SecureLinks On
Default SecureLinks Off
Context server config

Prevents apache from serving files not owned by user, stopping symlink attacks against php config files.

Example

SecureLinks On
+

SkipErrors

Description Allow apache to continue if LVE is not available
Syntax SkipErrors On
Default SkipErrors On
Context server config
Status deprecated

Prevents Apache from exiting if LVE is not available.

Example

SkipErrors Off
+

AllowedHandlers

Description List of handlers that should be placed into LVE, support regexp
Syntax AllowedHandlers cgi-script %^php% my-script
Default cgi-script %php% fcgid-script application/x-miva-compiled
Context server config

This directive allows to list handlers which will be intercepted and placed into LVE.

Examples

  • Match requests handled by cgi-script handler:

    AllowedHandlers cgi-script 
    +
  • Match all requests:

    AllowedHandlers *
    +
  • Match all requests that handled by handler that contains PHP:

    AllowedHandlers %php%
    +
  • Match all requests handled by handler that starts with PHP:

    AllowedHandlers %^php%
    +

The default modhostinglimits module configuration only handles cgi scripts and ignores static content like html files and images. +With the default configuration, an Apache server denial of service situation can occur when there are many requests for large html files and images. But on the other hand, processing all static files is unprofitable, since when processing many small files, the load average will increase significantly due to the overhead of entering/exiting lve. Therefore, it is better to enable processing only for a subset of static files based on criteria such as file location or file name extension using Apache directives as Location, Directory and Files.

This functionality is available since version 1.0-40.

In the following example, the module hostinglimits will process files for a URLs starting with weightcontent, for files with an .avi extension, and for files from the video subdirectory.

<IfModule mod_hostinglimits.c>
+
+ SkipErrors Off
+ AllowedHandlers cgi-script %php% fcgid-script application/x-miva-compiled
+
+<LocationMatch "^/weigthcontent/">
+ AllowedHandlers *
+</LocationMatch>
+
+<Files "*.avi">
+ AllowedHandlers *
+</Files>
+
+<DirectoryMatch "/home/user[0-5]/public_html/video/">
+ AllowedHandlers *
+</DirectoryMatch>
+
+</IfModule>
+

DenyHandlers

Description List of handlers that should not be placed into LVE, support regexp
Syntax DenyHandlers text/html
Default none
Context server config

This directive works together with AllowHandlers, to exclude some handlers from being allowed in LVE.

Example:

Match all requests, but text/*

AllowedHandlers *DenyHandlers %text/*%
+

LVEErrorCode

Description Error code to display once entry is rejected due to maxEntryProcs
Syntax values from 500 to 510
Default 508
Context directory config

Specifies ErrorCode to use on LVE error (like too many concurrent processes running).

The message that will be displayed by default is: +

Resource Limit Is Reached.
+
+The website is temporarily unable to serve your request as it exceeded resource limit. 
+
+Please try again later.
+

You can redefine error message using ErrorDocument directive

Example: +

LVEErrorCode 508ErrorDocument 508 508.html
+

LVEid

Description Allows to setup separate LVE ID on per directory level. If not set, user ID of a corresponding user is used.
Syntax LVEId number
Default User Id is used
Context directory config

Specifies LVE id for particular directory

Example:

<Directory "/home/user1/domain.com/forums">
+ LVEId 10001
+</Directory>
+

LVEUser

Description Allows to setup separate LVE ID on per directory level.
Syntax LVEUser username
Default none
Context directory config

Specifies LVE ID for particular directory.

Example:

<Directory "/home/user1/domain.com/forums">
+       LVEUser user1
+</Directory>
+

LVEUserGroupID

Description Use group ID instead of user ID for LVE container number.
Syntax LVEUserGroupID On/Off
Default User Id is used
Context global config only
  • If the option enabled, group ID will be used instead of a user ID. Apache will display the following string in error logs:
mod_hostinglimits: use GroupID instead of UID 
+mod_hostinglimits: found apr extension version 2 
+mod_hostinglimits: apr_lve_environment_init_group check ok
+
  • If a compatible apr library is not found, the following error message will be display in error logs.
mod_hostinglimits:  apr_lve_* not found!!!
+

Example:

<Directory "/home/user1/domain.com/forums">
+       LVEUserGroupID On
+</Directory>
+

LVERetryAfter

Description Returns Retry-After header when LVE error 508 occurs.
Syntax LERetryAfter MINUTES
Default 240 minutes
Context directory config

Specifies interval for Retry-After header. The Retry-After response-header field can be used to indicate how long the service is expected to be unavailable to the requesting client.

Example:

LVERetryAfter 180
+

LVESitesDebug

Description Provides extended debug info for listed sites.
Syntax LVESitesDebug test.com test2.com
Default none
Context directory config

Specifies virtual hosts to provide extra debugging information.

Example:

<Directory "/home/user1/domain.com/forums">
+       LVESitesDebug abc.com yx.cnet
+</Directory>
+

LVEParseMode

Description Determines the way LVE ID will be extraced. In Conf
Syntax LVEParseMode CONF PATH OWNER REDIS
Default: CONF
Context: directory config
  • In CONF mode, standard way to extract LVE ID is used (SuexecUserGroup, LVEId, or similar directives).

  • In PATH mode, username is extracted from the home directory path. The default way to match username is via the following regexp: /home/([^/]*)/ . Custom regexp can be specified in LVEPathRegexp.

  • In OWNER mode, the owner of the file is used as an LVE ID.

  • In REDIS mode, LVE ID is retrieved from Redis database.

Example:

LVEParseMode CONF
+

LVEPathRegexp

Description Regexp used to extract username from the path. Used in conjuction with LVEParseMode PATH
Syntax LVEPathRegexp regexp
Default /home/([^/]*)/
Context directory config

Used to extract usersname via path.

Example:

LVEPathRegexp /home/([^/]*)/
+

LVELimitRecheckTimeout

Description Timeout in milliseconds, a site will return EP without lve_enter for LA decreasing after this time
Syntax LVELimitRecheckTimeout number
Default 0
Context httpd.conf, virtualhost

Example: +

LVELimitRecheckTimeout 1000
+

LVEUse429

Description Use 429 error code as code returned on max entry limits ( on/off ).
Syntax LVEUse429 on
Default off
Context httpd.conf, virtualhost

Example:

LVEUse429 on
+

Available for RPM based panels, EasyApache 4 and DirectAdmin.

cPanel/WHM JSON API

CloudLinux OS Shared offers JSON API for lvectl and cloudlinux-limits via WHM. You can access it using the following URL:

https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=lvectl&handler=list
+https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=cloudlinux-limits&handler=get
+

The output will look as follows:

{"data":[{"ID":"default","CPU":"30","NCPU":"1","PMEM":"1024M","VMEM":"1024M","EP":"28","NPROC":"0","IO":"2048"}]}
+

Parameters

cgiaction always jsonhandler
command lvectl or cloudlinux-limits (default lvectl)
handler should match lvectl or cloudlinux-limits command

For commands like set, destroy & delete, where you need to specify LVE (user) ID, like lveid=500 (matches user ID 500).

Example:

https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=lvectl&handler=set&lveid=500&speed=30%&io=2048
+
+https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=lvectl&handler=set&lveid=500&speed=300Mhz&io=2048
+
+https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=lvectl&handler=set&lveid=500&speed=3Ghz&io=2048
+
+https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=cloudlinux-limits&handler=set&lveid=500&inodes=9090,8989
+

Note

Speed limit can be specified in several units of measure - %, MHz, GHz . The figures will be different according to the unit of measure.

Output:

{"status":"OK"}
+

To do set default, use lveid=0, like:

https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set&lveid=0&speed=30%&io=2048
+

For commands like apply all, destroy all, use:

handler=apply-all
+
+handler=destroy-all
+

You can use the following commands that allow to specify user name instead of user ID:

set-user Set parameters for a LVE and/or create a LVE using username instead of ID.
list-user List loaded LVEs, display username instead of user ID.
delete-user Delete LVE and set configuration for that user to defaults.

If the limits for users are set with cPanel LVE Extension, then turnkey billing solutions can be applied (e.g. WHMCS).

Manage reseller limits/users/packages via cPanel/WHM JSON API (JSONHandler)

Action lvectl command JSONHandler
enable reseller limits lvectl set-reseller res1 --speed=35% https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set-reseller&lveid=res1&speed=30%&io=2048
disable reseller limits lvectl remove-reseller res1 https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=remove-reseller&lveid=res1
set default limits for reseller lvectl set-reseller-default res1 --speed=91% https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set-reseller-default&lveid=res1&speed=30%
set limits for package, created by reseller lvectl package-set res1_pack1 --reseller res1 --speed=88% https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=package-set&lveid=res1_pack1&reseller=res1&speed=30%
set limits for user, created by reseller lvectl set-user r1user1 --reseller res1 --speed=77% https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set-user&lveid=r1user1&reseller=res1&speed=30%
set unlimited for user, created by reseller lvectl set-user r1user1 --reseller res1 --unlimited https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set-user&lveid=r1user1&reseller=res1&unlimited
set inodes limit cloudlinux-limits set --username=r1user1 --inodes=9090,8989 https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=cloudlinux-limits&handler=set&username=r1user1&inodes=9090,8989

Using a WHM API token

You can use a WHM API token with curl as follows:

curl -X POST -k -s -H "Authorization: whm root:WHM_TOKEN" "https://SERVER_IP:2087/cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=LVE_METHOD&PARAMETERS
+

Where:

  • WHM_TOKEN – a generated WHM API token (see: Creating an API token)
  • LVE_METHOD – lvectl method (for example: list. See also: lvectl)
  • PARAMETERS – all other parametrs and options for a method according to the documentation

mod_proctitle

mod_proctitle is a module for gathering URL information per request. It is available only for Apache 2.4 now.

For installation:

cPanel EasyApache 3 and non cPanel ( CloudLinux 7 only for non cPanel ):

# yum install mod_proctitle --enablerepo=cloudlinux-updates-testing
+# service httpd restart
+

cPanel EasyApache 4:

# yum install ea-apache24-mod_proctitle
+# service httpd restart
+
+DirectAdmin: +
# cd /usr/local/directadmin/custombuild
+# ./build update
+# ./build mod_procticle
+

How to read mod_proctitle information

How to read information gathered by the module

For reading information saved by module use the following script (the script is not in the package): +

#!/bin/bash
+
+httpd=httpd 
+
+for pid in `/usr/bin/pgrep $httpd`; do
+    for tid in `ls /proc/$pid/task`; do
+		found=no
+		for shm in `ls /dev/shm/apache_title_shm_${pid}_${tid}_* 2>/dev/null`; do
+			found=yes
+			title=`/usr/bin/tr -d '\0' < $shm`
+			thread_id=`/bin/basename "${shm}" | sed "s/apache_title_shm_${pid}_${tid}_//"`
+			echo "$pid.$tid - $thread_id - $title"
+		break
+		done
+	if [ "$found" = "no" ]; then
+		echo "$pid.$tid not found"
+	fi
+    done
+done
+
+Here are the examples of saved by module: +
# sh proctitles_info.sh
+571258.571258 NOT FOUND
+571300.571300 NOT FOUND
+571303.571303 - 000000000000000 - 1466513333.6 test.cloudlinux.com GET /1.php HTTP/1.1
+571304.571304 - 000000000000000 - 1466513335.3 test.cloudlinux.com GET /1.php HTTP/1.1
+571305.571305 - 000000000000000 - httpd
+571306.571306 - 000000000000000 - httpd
+571307.571307 - 000000000000000 - httpd
+571372.571372 - 000000000000000 - httpd
+571374.571374 - 000000000000000 - httpd
+
+Item info:
+[pid].[tid] - [posix thread id] - [request info]
+

Request information can contain:

NOT FOUND - means that process of Apache doesn't handle requests.
httpd - request is active and waiting for new connection.
[seconds].[tenths of second] [host] [METHOD] [URL] [PROTOCOL]

Tuning parameters

Module parameters for tuning

WatchHandlers List of handlers for monitoring (httpd.conf, virtualhost).
ProctitleUseFilter On/Off Use old method of cleaning information or new via filter (for prefork better to use Off )

alt-suexec

What is alt-suexec package needed for?

If you use standard httpd from our repository, but your users' sites do not match standard Apache location of /var/www, then you should use alt-suexec. +alt-suexec package brings suEXEC binaries pre-compiled for specific locations, like /home .

How to switch suEXEC with alt-suexec

Based on httpd 2.2.16 basic for Cloudlinux OS Shared 6, httpd 2.4.6 basic for CloudLinux OS Shared 7 and httpd 2.4.37 basic for CloudLinux OS Shared 8, the package brings to a server a set of suEXECs with different DOCUMENT ROOTs and MIN_UID/MIN_GID parameters. The first set of suEXECs is listed by such modes:

# switch_suexec -h
+USE_BIZ - DOCUMENT ROOT /biz/ MIN_UID 500 MIN_GID 100 CALLER apache
+USE_HOSTING - DOCUMENT ROOT /hosting/ MIN_UID 500 MIN_GID 100 CALLER apache
+USE_HSPHERE - DOCUMENT ROOT /hsphere/local MIN_UID 100 MIN_GID 100 CALLER httpd
+USE_HOME - DOCUMENT ROOT /home/ MIN_UID 500 MIN_GID 100 CALLER apache
+USE_WWW - DOCUMENT ROOT /var/www/ MIN_UID 500 MIN_GID 100 CALLER apache
+USE_FSROOT - DOCUMENT ROOT / MIN_UID 500 MIN_GID 100 CALLER apache
+USE_STORAGE - DOCUMENT ROOT /storage/content/ MIN_UID 500 MIN_GID 100 CALLER apache
+USE_DATAS - DOCUMENT ROOT /datas/ MIN_UID 500 MIN_GID 100 CALLER apache
+
+The package also brings its own utility for installing specific suEXEC: +
-l list of available suexec
-u update suexec according to /etc/sysconfig/alt-suexec
-s set new suexec and install it
-p set new suexec path and install it
-o set new suexec owners and install it
-r restore native apache suexec

There are two ways to set up new suEXEC binary:

  1. via config file /etc/sysconfig/alt-suexec
  2. via utility switch_suexec

Here are the examples of how to set up suEXEC with DOC_ROOT = "/home":

1.

  1. add string "USE_HOME" to /etc/sysconfig/alt-suexec
  2. run the command switch_suexec -u

2.

  1. switch_suexec -sUSE_HOME

Result of both methods: +

# cat /etc/sysconfig/alt-suexec
+USE_HOME
+

Here is standard suEXEC for CloudLinux OS Shared 6 clean server: +

# /usr/sbin/suexec -V
+-D AP_DOC_ROOT="/var/www"
+-D AP_GID_MIN=100
+-D AP_HTTPD_USER="apache"
+-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
+-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
+-D AP_UID_MIN=500
+-D AP_USERDIR_SUFFIX="public_html"
+-D AP_SAFE_DIRECTORY="/usr/local/safe-bin"
+

Here is output of new suEXEC after USE_HOME installtion: +

# /usr/sbin/suexec -V
+-D AP_DOC_ROOT="/home/"
+-D AP_GID_MIN=100
+-D AP_HTTPD_USER="apache"
+-D AP_LOG_EXEC="/var/log/httpd/suexec.log"
+-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
+-D AP_UID_MIN=500
+-D AP_USERDIR_SUFFIX="public_html"
+-D AP_SAFE_DIRECTORY="/usr/local/safe-bin"
+

Description of other switch_suexec parameters:

-p if suexec binary file will be placed not in standard way /usr/sbin - specify this new path with p-option
-o if suexec binary file not owned by root:apache - specify new owner with o-option

For most cases -p and -o options for standard Apache are useless.

Correct suEXEC will be restored even after httpd update or reinstall.

List of pre-built suEXEC binary files stored without suid bit and not executable.

How to install alt-suexec?

For installation run the command: +

yum install alt-suexec
+

New suexec with custom parameters

If you need suEXEC with custom parameters absent in current set of alt-suexec, please submit a ticket on https://cloudlinux.zendesk.com and we will add new suEXEC with needed parameters.

cPanel Nginx and application selectors

Recently, cPanel added support for the Nginx web server and for Python and Node.js applications.

We have checked the compatibility of ea-nginx and cPanel application Selectors with CloudLinux OS Shared LVE and CageFS. +All tests passed successfully and all processes started by ea-nginx and cPanel selectors are launched inside LVE and CageFS.

Don’t forget, you can use Ruby/Python/Node.js Selectors from CloudLinux OS Shared. Here you can find a large number of supported versions for Ruby/Python/Node.js applications.

Note

Nginx support is currently experimental.

How to use Certbot with alt-python36

To run Certbot with alt-python36, follow the next steps:

  1. Add a path to the alt-python36 in the environment variable PATH as the first element: /opt/alt/python36/bin/.
  2. Run Certbot with the --no-bootstrap parameter.

Example:

The old command to run Certbot on CentOS 6/Cloudlinux OS Shared 6:

# certbot-auto --nginx
+

The new command to run Certbot on CentOS 6/CloudLinux OS Shared 6:

# PATH="/opt/alt/python36/bin/:$PATH" certbot-auto --no-bootstrap --nginx
+

Apache suexec module

General information and requirements

This module is used by the Apache HTTP Server to switch to another user before executing CGI programs. The suEXEC feature provides users of the Apache HTTP Server with the ability to run CGI and SSI programs under user IDs different from the user ID of the calling web server (apache/nobody). Normally, when a CGI or SSI program executes, it runs as the same user who is running the web server.

If we are talking about shared hosting where different accounts are launched on the same server, the installation of this module is necessary to ensure security.

How does it work with CloudLinux OS Shared?

The DirectAdmin and CloudLinux OS Shared (for httpd, httpd24-httpd and cPanel EasyApache 4) both provide a patched version of suexec. For other distributions you can use patches available here: +https://repo.cloudlinux.com/cloudlinux/sources/da/cl-apache-patches.tar.gz

  1. Besides the ability to run CGI programs under user IDs, suexec with CloudLinux OS Shared patch adds the ability to run that script under CageFS.

NOTE

Therefore, this module is necessary for the proper work of PHP Selector.

  1. This module is also necessary for the proper work of mod_hostinglimits. The SuexecUserGroup directive indicates for mod_hostinglimits in which LVE the user process should be put in.

Configuration

SuexecUserGroup Directive

Syntax: SuexecUserGroup User Group

Context: httpd.conf, virtualhost

Description: The SuexecUserGroup directive allows you to specify a user and a group for CGI programs to run as. Startup will fail if this directive is specified but the suEXEC feature is disabled.

Note

Control panels such as cPanel, Plesk, and DirectAdmin add this directive to the Apache configuration automatically when creating a domain. If you use the server without a control panel, make sure this directive is added for each virtual host.

Installation

The mod_suexec installation process varies depending on the control panel and Apache.

Installing on cPanel servers with EasyApache 4

Via command line

  1. Install mod_suexec through YUM package manager as follows:
$ yum install ea-apache24-mod_suexec
+

NOTE

ea-apache24-mod_suexec conflicts with the mod_ruid2 therefore, before installing the module, remove ea-apache24-mod_ruid2 as follows: $ yum remove ea-apache24-mod_ruid2

  1. Now, when the module is installed, restart Apache:
$ service httpd restart
+

Note

If you use CageFS + PHP Selector, you should run the cagefsctl --force-update command.

Via administrator interface

  1. Open EasyApache4 page.
  2. Click Customize for Currently installed Packages.

  1. Click Apache Modules. Find mod_suexec and click Yes to install it.

  1. Select Review and Provision.

  1. Wait while Provision will be finished.

    Note

    If you use CageFS + PHP Selector, you should run the cagefsctl --force-update command.

Installing on Plesk servers

This module is integrated into Apache for Plesk control panel by default.

Installing on DirectAdmin servers

This module is integrated into Apache for DirectAdmin control panel by default.

Installing on servers with no control panel

This module is integrated into httpd Apache rpm provided by Cloudlinux OS Shared by default.

If you are using an alternative Apache - httpd24, nothing has to be done as this module is also integrated into httpd24-httpd Apache rpm provided by Cloudlinux by default.

+ + + diff --git a/cloudlinux_os_kernel/index.html b/cloudlinux_os_kernel/index.html new file mode 100644 index 000000000..b72642bd9 --- /dev/null +++ b/cloudlinux_os_kernel/index.html @@ -0,0 +1,313 @@ + + + + + + CloudLinux OS kernel | Documentation + + + + + + + + + + + + + + + + + + + + + + + +

CloudLinux OS kernel

This documentation describes specific features of the CloudLinux kernel. In other cases the kernel has the same features and innovations as any similar RHEL kernel. +More information about the actual kernel changes and releases can be obtained from our changelog.

Hybrid Kernels

Hybrid kernels give you the ability to take advantage of the benefits and features available in newer kernels without having to completely upgrade to another version of the operating system. Example - for the CloudLinux 7 kernel, based on version 3.10, you can install a hybrid kernel (same as on CloudLinux 8), which is based on version 4.18. This provides more kernel options, memory and overall optimization, as well as a positive impact on system performance.

How to migrate from the normal kernel to hybrid one

Note

The system must have an active CloudLinux OS license

Warning

If you use yum-plugin-protectbase, please make sure it is disabled before stating the normal-to-hybrid script.

You should perform the following commands:

yum update
+normal-to-hybrid
+

Then if the script execution is completed without errors - perform the server reboot.

Note

You can always migrate from the hybrid kernel to normal one with the following commands:

yum update
+hybrid-to-normal
+

Known limitations and issues of hybrid kernels

CloudLinux OS Shared 6 Hybrid kernel

  1. We do not remove Hybrid kernel after migration from Hybrid to the normal channel, but we remove linux-firmware package which is needed to boot Hybrid kernel. This is because CloudLinux OS Shared 6 does not allow to remove the package of currently running kernel. Thus please don't reboot the server back to Hybrid kernel after you remove it.

  2. Kernel module signature isn't checking for now, as 3.10 kernel is using x509 certificates to generate keys and CloudLinux OS Shared 6 cannot detect signatures created in such way.

Note

Link Traversal Protection is disabled by default for the CloudLinux OS Shared.

CloudLinux OS Shared and CloudLinux OS Admin provides comprehensive protection against +symbolic link attacks popular in shared hosting environment.

The protection requires setting multiple kernel parameters to be enabled:

SecureLinks:

Link Traversal Protection:

Please reffer to this article in order to know how to setup these parameters.

fs.enforce_symlinksifowner

To protect against symlink attack where attacker tricks Apache web server to read some other user PHP config files, or other sensitive file, enable:

fs.enforce_symlinksifowner=1
+

Setting this parameter will deny any process running under gid fs.symlinkown_gid to follow the symlink if owner of the link doesn’t match the owner of the target file.

Defaults:

fs.enforce_symlinksifowner = 1
+fs.symlinkown_gid = 48
+
fs.enforce_symlinksifowner = 0 do not check symlink ownership
fs.enforce_symlinksifowner = 1 deny if symlink ownership doesn’t match target, and process gid matches _symlinkown_gid

When fs.enforce_symlinksifowner set to 1, processes with GID 48 will not be able to follow symlinks if they are owned by user1 , but point to file owned user2 .

Note

fs.enforce_symlinksifowner = 2 is deprecated and can cause issues for the system operation.

fs.symlinkown_gid

On standard Apache installation, this webserver is usually running under GID 48. +On cPanel servers, Apache is running under user nobody, GID 99.

To change GID of processes that cannot follow symlink, edit the file /etc/sysctl.conf , add the line:

fs.symlinkown_gid = XX
+

And execute:

$ sysctl -p
+

To disable symlink owner match protection feature, set fs.enforce_symlinksifowner = 0 in /etc/sysctl.conf , and execute:

$ sysctl -p
+

Note

fs.symlinkown_gid parameter values for httpd service user and fs.proc_super_gid for nagios service user is written to /etc/sysctl.d/90-cloudlinux.conf.

Warning

When used outside CageFS (from cPanel tools for instance), fs.protected_symlinks_create isn't sufficient for symlink protection. +To fully protect symlink access in this case, use fs.process_symlinks_by_task=1 in addition to fs.protected_symlinks_create=1.

CageFS is extremely powerful at stopping most information disclosure attacks, where a hacker could read sensitive files like /etc/passwd .

Yet, CageFS does not work in each and every situation. For example, on cPanel servers, it is not enabled in WebDAV server, cPanel file manager and webmail, as well as some FTP servers don’t include proper change rooting.

This allows an attacker to create symlink or hardlink to a sensitive file like /etc/passwd and then use WebDAV , filemanager, or webmail to read the content of that file.

You can prevent such attacks by preventing user from creating symlinks and hardlinks to files that they don’t own.

This is done by set following kernel options to 1: +

fs.protected_symlinks_create = 1
+fs.protected_hardlinks_create = 1
+

DANGER

We do not recommend to use protected_symlinks option for cPanel users as it might break some of the cPanel functionality. +Please read the known issues section before enabling this feature.

Note

This option only available on CloudLinux 7 Hybrid or on CloudLinux 8 Shared and Admin editions. +Also please note that this feature is available for cPanel only.

This parameter is needed to protect against symlink vulnerability where an attacker might get access to files out of the CageFS via cPanel tools: File Manager, WebDAV, Webmail, etc. When a symlink is accessed from cPanel tools (non-root user case) we check whether the current process UID matches the symlink target UID.

To enable the protection for CloudLinux OS Shared , set the fs.process_symlinks_by_task parameter to 1: +

fs.process_symlinks_by_task=1
+

To disable the protection for CloudLinux OS Shared 7 hybrid, set the fs.process_symlinks_by_task parameter to 0: +

fs.process_symlinks_by_task=0
+

Here are some examples of what may go wrong on cPanel servers. If fs.protected_symlinks_create=1 is set on the server, it can cause the following issues:

  • rsync is failed

If you use the rsync to copy/transfer files and they contain symlinks, you'll see the errors like these:

"rsync error: some files could not be transferred (code 23)" and the transfer will be failed. 
+

It affects rsync tasks as well as cPanel transfer tools.

  • backup extracting may not work. Errors during the restoration:
Error extracting /home/domain/backups/home.tar.gz : /bin/tar: .cagefs/tmp/mysql.sock: Cannot create symlink to `/var/lib/mysql/mysql.sock'.
+Permission denied. /bin/tar: .cagefs/tmp/.s.PGSQL.5432: Cannot create symlink to `/var/run/postgres/.s.PGSQL.5432': No such file or directory.
+

Any backup for accounts (including cPanel backup) cannot be extracted.

  • dmesg is flooded with the may_create_sym_link messages like:
may_create_sym_link: can't find ea-phpXX in cron
+may_create_sym_link: can't find ea-phpXX in ea-php-cli
+

It's popping up each second and may increase the size of the /var/log/messages file.

File change API

General

General description

One of the main problems on a shared hosting system for file backup operations is to figure out which files have changed. Using INOTIFY on a 1T drive with a large number of small files and directories guarantees slow startup times, and a lot of context switching between kernel and userspace - generating additional load. On the other hand scanning disk for newly modified files is very IO intensive, and can kill the performance of the fastest disks.

CloudLinux OS Shared approach

CloudLinux File Change API is a kernel level technology with the user space interface that buffers lists of modified files in the kernel and then off-loads that list to user space daemon.

After that - any software (with enough permissions) can get a list of files that has been modified for the last 24 hours.

The software is very simple to use and produces the list of modified files. As such we expect file backup software, including integrated cPanel backup system to integrate with this API soon.

Usage and integration

Userland utilities

/usr/bin/cloudlinux-backup-helper is a utility for getting the list of changed files.

It is supposed to be run by a super user only.

Command line parameters: +

-t | --timestamp retrieve file names for files modified after specified timestamp
+-u | --uid       retrieve file names for particular UID only
+
+If no UID specified, are retrieved for all users. If no timestamp specified, all database events are shown. +

Output format

protocol version (1 right now), timestamp (in seconds) - up to which time data was collected
+UID:absolute path to file changed
+UID:absolute path to file changed
+…
+

Note

The timestamp in output is needed so you can clearly identify from which timestamp to get list of changed files next.

Examples:

[root@localhost ~]# cloudlinux-backup-helper -t 1495533489 -u <UID>
+1,1495533925
+1001:/home/user2/public_html/output.txt
+1001:/home/user2/public_html/info.php
+[root@localhost ~]# cloudlinux-backup-helper -t 1495533489
+1,1495533925
+1000:/home/user1/.bashrc
+1001:/home/user2/public_html/output.txt
+1001:/home/user2/public_html/info.php
+1003:/home/user3/logs/data.log
+
+**Getting changed files by end user** +

/usr/bin/cloudlinux-backup-helper-uid is a SUID wrapper for the cloudlinux-backup-helper utility that enables an end user to get the list of files changed. It accepts timestamp argument only and retrieves data of the user who is running it only.

Examples:

[user@localhost ~]$ cloudlinux-backup-helper-uid               
+1,1495530576
+1000:/home/user/.bash_history 
+
+[user@localhost ~]$ cloudlinux-backup-helper-uid -t 1495547922
+1,1495548343
+1000:/home/user/file1.txt
+1000:/home/user/file2.txt
+
+This command is available within CageFS. +

Installation and configuration

cloudlinux-fchange-0.1-5

Requirements

CloudLinux OS 6 (requires Hybrid kernel) or 7 +Kernel Version: 3.10.0-427.36.1.lve1.4.47

Installation and configuration

To install cloudlinux-fchange system run:

CloudLinux OS Shared 7:

yum install cloudlinux-fchange --enablerepo=cloudlinux-updates-testing
+

CloudLinux OS Shared 6 Hybrid:

yum install cloudlinux-fchange --enablerepo=cloudlinux-hybrid-testing
+
+Configuration file can be found in /etc/sysconfig/cloudlinux-fchange

Database containing list of modified files is located at /var/lve/cloudlinux-fchange.db by default.

Starting and stopping

After successful installation the event collecting daemon starts automatically, providing all kernel-exposed data are in place.

To start daemon: +CloudLinux OS Shared 7:

systemctl start cloudlinux-file-change-collector
+

CloudLinux OS Shared 6 Hybrid:

service cloudlinux-file-change-collector start
+
+To stop daemon: + +_CloudLinux OS Shared 7:_ +
systemctl stop cloudlinux-file-change-collector
+

CloudLinux OS Shared 6 Hybrid:

service cloudlinux-file-change-collector stop
+

To uninstall cloudlinux-fchange run: +

yum remove cloudlinux-fchange
+

Configuration details

Configuration resides in /etc/sysconfig/cloudlinux-fchange. The following is the default configuration (see comments): +

# sqlite database file path. If commented out a default value is used
+#database_path=/var/lve/cloudlinux-fchange.db
+
+# If uncommented paths starting with 'include' one are processed only
+# Pay attention this parameter is a regular string, not a regex
+# To include more than one item just specify several lines to include:
+# include=/one
+# include=/two
+
+# If uncommented exclude paths which contain 'exclude'
+# Pay attention this parameter is a regular string, not a regex
+# To exclude more than one item just specify several lines to exclude:
+# exclude=var
+# exclude=tmp
+
+# Daemon polling interval in seconds
+polling_interval=5 
+
+# Time to keep entries in days. Does not clean if commented out or zero
+time_to_keep=1
+
+# User read-only mode minimal UID
+# If file change collector stopped, all users with UID >= user_ro_mode_min_uid
+# are restricted to write to their home directory. This prevents to miss
+# a file change event.
+# Value of -1 (default) allows to disable the feature
+user_ro_mode_min_uid=-1
+
+# Minimal UID of events to be processed.
+# Events of users with UID less then specified are not handled.
+# By default 500 (non-system users for redhat-based systems)
+#minimal_event_uid=500
+ 
+# SQLite shared lock prevents setting more restrictive locks. That is a
+# process cannot write to a database table when a concurrent process reads
+# from the table. As saving data to database is considered far more important
+# than getting them (data could be reread a second later after all), database
+# writer could try to terminate concurrent reading processes. Just set
+# terminate rivals to 'yes' to turn this ability on.
+# terminate_rivals=no 
+
+# Events to be handled. Currently the following types of events are processed:
+# 1. file creation
+# 2. file deletion
+# 3. directory creation
+# 4. directory deletion
+# 5. file content/metadata modification
+# 6. file/directory attributes/ownership modification
+# 7. hardlink creation
+# 8. symlink creation
+# 9. file/directory moving/renaming
+# By default all events are processed. Keep in mind that events for a filepath
+# are cached, i.e if a file was deleted and then a file with the same absolute
+# name is created, only the deletion event is triggerred. Changing file
+# modification timestamp with command 'touch' will trigger modification event
+# as if a file content is modified.
+# Currently supported options are:
+# file_created, file_modified, file_deleted, dir_created, dir_deleted,
+# owner_changed, attrib_changed, moved, hardlink_created, symlink_created, all
+# Options that don't have 'file' or 'dir' prefix, applied to both files and
+# directories. To set more than one options, separate them with commas,
+# e.g. event_types=file_created,file_deleted,file_modified. Unknown options are
+# ignored.
+#
+# event_types=all
+

Note

Please keep in mind, that current implementation implies that one process is writing to a database and another is reading from it. As reading sets shared lock to a database table, the writing process cannot write to the table until the lock is released. That’s why passing a timestamp to cloudlinux-backup-helpermatters: this way the number of records to be returned is substantially decreased, lowering the processing time and filtering out old records. Likewise, pay attention to narrowing the scope of events being recorded. Chances are that changing attributes, ownership, directory creation/deletion, symlink events are not relevant and there’s no need to keep them.

Low-level access

Note

Using this options is dangerous, and might cause problems with CloudLinux File Change API.

The kernel exposes the functionality to /proc/sys/fs/datacycle/ folder.

  1. enable - enable/disable the functionality. Write 1 to this file to enable, 0 to disable. If disabled, no events are coming to events file.

  2. events - the modified files log itself. Events in the format <EVENT_ID>:<EVENT_TYPE_ID>:<USER_ID>:<FILE_PATH> are constantly appending to the end of the file if datacycle enabled. File events are never duplicated: if we have file modification event, we would not get file deletion event if the file has been later deleted. This events buffer has limited capacity, therefore from time to time, the events log requires flushing.

  3. flush - a file for clearing events log. For flushing, the last event_id from the events file is written to this file. Right after this, events log is truncated to that event_id .

  4. user_ro_mode - forbidding users with UIDs equal or bigger that set in this file writing to their home directories. At the boot, the file has -1. When it’s written positive value, say 500, the system starts effectively preventing users from modifying their home dirs (on write attempt a user gets ‘read-only filesystem’ error). This feature is designed to prevent users from updating their home dirs when events are not handled.

  5. entries_in_buffer - just counter of log entries of events file.

  6. min_event_uid - this file has minimal UID of events to be handled. Events from users with smaller UID are not handled. By default 500 (non-system users in redhat-based systems).

Tuned-profiles-cloudlinux

The tuned-profiles-cloudlinux package brings a range of kernel under-the-hood tunings to address high LA, iowait issues what were detected earlier on particular users deploys. The package also encloses OOM adjustments to prioritize the elimination of overrun PHP, lsphp, Phusion Passenger workers processes over other processes (e.g. ssh, a cron job).

There are three profiles provided by CloudLinux OS Shared: +

# tuned-adm list | grep cloudlinux
+- cloudlinux-default          - Default CloudLinux tuned profile
+- cloudlinux-dummy            - Empty CloudLinux tuned profile
+- cloudlinux-vz               - Empty CloudLinux tuned profile
+

cloudlinux-dummy and cloudlinux-vz are used for internal needs or when Virtuozzo/OpenVZ detected and actually do nothing.

cloudlinux-default is one to be used, it actually does the following:

  1. Switches CPU power consumption mode to the maximum. CPU operates at maximum performance at the maximum clock rate:
governor=performance
+energy_perf_bias=performance
+

Note

If standard software CPU governors are used.

  1. Applies the following kernel options:
    +vm.force_scan_thresh=100 - Improves kernel memory clean-up in case of big number of running LVE.

UBC parameters set the limits for the containers:

ubc.dirty_ratio=100 - Defines maximum RAM percentage for dirty memory pages. + dirty_background_ratio=75 - Defines RAM percentage when to allow writing dirty pages on the disk.

  1. [CloudLinux OS Shared 7 only] Detects used disk types and changes elevator to 'deadline' for HDD and to 'noop' for SSD in /sys/block/[blockname]/queue/scheduler .

Note

The script uses /sys/block/[blockname]/queue/rotational flag, some RAID controllers can not set it properly. For example, SSD used for RAID but rotational is set to 1 by RAID driver. As a workaround add the following to /etc/rc.d/rc.local to make it applied on boot:

echo "noop" > /sys/block/[blockname]/queue/scheduler  
+echo "0" > /sys/block/[blockname]/queue/rotational
+

Where [blockname] is used device name, like sda/sdb .

And make it executable: +

chmod +x /etc/rc.d/rc.local
+
  1. [CloudLinux OS Shared 7 only] The profile sets I/O scheduler. For the normal discs the Deadline Scheduler is set to improve IO performance and decrease IO latency, for SSD - noop. +When configuring scheduler I/O queue is changed and set to the value 1024 which improves overall I/O subsystem performance by caching IO requests in memory.

  2. Disables transparent HugePage .

  3. Provides adjustment group file for OOM-Killer to kill overrun php, lsphp and Phusion Passenger workers first.

To install:

yum install tuned-profiles-cloudlinux
+

To start using a profile:

tuned-adm profile cloudlinux-default
+

To stop using a profile:

tuned-adm off
+

Kernel config variables

Starting from lvemanager 4.0-25.5, lve-utils 3.0-21.2, and cagefs-6.1-26, CloudLinux OS Shared utilities can read/write kernel config variables from a custom config /etc/sysctl.d/90-cloudlinux.conf (earlier, the parameters were read/written only from sysctl.conf ).

CloudLinux OS Shared utilities get parameter by using sysctl system utility. So for now, even if a config variable is not set in the sysctl.conf and in the /etc/sysctl.d config files, this variable will be read by sysctl utility directly from /proc/sys.

If you changed some kernel variables in /etc/sysctl.d/90-cloudlinux.conf you need to apply these changes to the kernel parameter by running the command:

sysctl --system
+

After that, the variable can be read by the sysctl utility.

Starting from cagefs-6.1-27, fs.proc_can_see_other_uid will be migrated (one time) from /etc/sysctl.conf into /etc/sysctl.d/90-cloudlinux.conf . If this variable is not set in either file, it will default to 0. +It is strongly advised against setting this variable in 90-cloudlinux.conf . Define it in /etc/sysctl.conf or in some other config file with an index number greater than 90-cloudlinux.conf , e.g. /etc/sysctl.d/95-custom.conf.

Starting from lve-utils-3.0-23.7 fs.proc_super_gid and fs.symlinkown_gid will be migrated (one time) from /etc/sysctl.conf into /etc/sysctl.d/90-cloudlinux.conf .

For lve-utils versions from 3.0-21.2 to 3.0-23.7 the migration was performed the same way, but during every package install/update. +Variables setting guidelines are the same as for CageFS (see above).

As requested by some our customers, we've implemented a new kernel setting to hide /proc/net/{tcp,udp,unix} files for additional security/isolation. +You can hide them by runnign sysctl -w kernel.proc_disable_net=1 command, and by default, it's 0 (nothing hidden). +Currently this is implemented for CloudLinux OS Shared 7 only.

Virtualized /proc filesystem

You can prevent user from seeing processes of other users (via ps/top command) as well as special files in /proc file system by setting fs.proc_can_see_other_uid sysctl.

To do that, edit /etc/sysctl.conf +

fs.proc_can_see_other_uid=0
+fs.proc_super_gid=600
+
+And do: +
# sysctl -p
+
+fs.proc_can_see_other_uid=0 +

If fs.proc_can_see_other_uid is set to 0, users will not be able to see special files. If it is set to 1 - user will see other processes IDs in /proc filesystem.

fs.proc_super_gid=XX

The fs.proc_super_gid sets group ID which will see system files in /proc, add any users to that group so they will see all files in /proc. Usually needed by some monitoring users like nagios or zabbix and cldetect utility can configure few most commonly used monitoring software automatically.

Automatic configuration of a group in the fs.proc_super_gid

Starting from lve-utils v.4.2.0-1, when installing (not updating) the lve-utils package it automatically creates the clsupergid group and registers this group in the fs.proc_super_gid (if this group was not created before). +If a group was created in the fs.proc_super_gid earlier all stays the same.

Virtualized /proc filesystem in CloudLinux OS Shared 8/CloudLinux OS Shared 7 hybrid will display all files to unprivileged users. But unprivileged users will have access only to the following files (as well as directories for PIDs for the user): +

/proc/cpuinfo
+/proc/version
+/proc/stat
+/proc/uptime
+/proc/loadavg
+/proc/filesystems
+/proc/stat
+/proc/cmdline
+/proc/meminfo
+/proc/mounts
+/proc/net/tcp
+/proc/net/tcp6
+/proc/net/udp
+/proc/net/udp6
+/proc/net/assocs
+/proc/net/raw
+/proc/net/raw6
+/proc/net/unix
+/proc/net/dev
+

Note

Starting from lve-utils 3.0-21.2, fs.proc_super_gid parameter in da_add_admin utility is written to /etc/sysctl.d/90-cloudlinux.conf.

Remounting procfs with "hidepid" option

In lve-utils-2.1-3.2 and later /proc can be remounted with hidepid=2 option to enable additional protection for procfs. This remount is performed in lve_namespaces service. +This option is in sync with fs.proc_can_see_other_uid kernel parameter described above. +When /etc/sysctl.conf does not contain fs.proc_can_see_other_uid setting, the protection is off (procfs is remounted with hidepid=0 option). In this case fs.proc_super_gid setting is ignored. Users are able to see full /proc including processes of other users on a server. This is a default behavior.

If /etc/sysctl.conf contains fs.proc_can_see_other_uid=1 setting, then /proc will be remounted with hidepid=0 option (disable hidepid protection for all users). +If /etc/sysctl.conf contains fs.proc_can_see_other_uid=0 setting, then /proc will be remounted with hidepid=2 option (enable hidepid protection for all users). +If /etc/sysctl.conf contains fs.proc_can_see_other_uid=0 and fs.proc_super_gid=$GID settings, then /proc will be remounted with hidepid=2, gid=$GID options (enable hidepid for all users except users in group with gid $GID).

To apply /etc/sysctl.conf changes, you should execute +

service lve_namespaces restart
+
+ Or +
/usr/share/cloudlinux/remount_proc.py
+

So, admin can prevent users from seeing processes of other users via fs.proc_can_see_other_uid and fs.proc_super_gid settings in /etc/sysctl.conf, like earlier.

Also, you can override this by specifying desired options for /proc in /etc/fstab.

To disable hidepid, add to /etc/fstab the following: +

proc /proc proc defaults,hidepid=0,gid=0 0 0
+
+Or you can specify desired hidepid and gid values explicitly: +
proc /proc proc defaults,hidepid=2,gid=clsupergid 0 0
+
+ You should execute +
mount -o remount /proc
+

to apply /etc/fstab changes.
+Nevertheless, we recommend to manage procfs mount options via /etc/sysctl.conf as described above for backward compatibility.

Note

There is a known issue on CloudLinux OS Shared 6 systems. User cannot see full /proc inside CageFS even when this user is in “super” group, that should see full /proc. This issue does not affect users with CageFS disabled. CloudLinux OS Shared 7 is not affected.

Note

Starting from lve-utils 3.0-21.2, lve_namespaces service can read parameters from the /etc/sysctl.d/90-cloudlinux.conf.

Note

Even if fs.proc_can_see_other_uid and fs.proc_super_gid parameters are not set in config files but specified in /proc/sys, then when restarting lve_namespaces service the parameters from /proc/sys will be used. So, /proc will be remounted according to these parameters.

Remounting procfs on CloudLinux OS Shared 8

On CloudLinux OS Shared 8, starting from the kernel version 4.18.0-193.28.1.lve1.el8.x86_64 remounting is controlled by the kernel.

As before, admins are able to change the settings fs.proc_can_see_other_uid and fs.proc_super_gid in the /etc/sysctl.d/90-cloudlinux.conf or /etc/sysctl.conf.

To apply changes, execute the following command:

sysctl --system
+

It is no longer needed to manually run the /usr/share/cloudlinux/remount_proc.py to remount /proc.

Note

On Cloudlinux OS Shared 8, changing the /etc/fstab file for setting /proc remounting with the hidepid= option will not cause any effect as remounting is totally controlled by the kernel and depends on the fs.proc_can_see_other_uid option.

Ptrace block

Starting with kernel 3.10.0-427.18.s2.lve1.4.21 ( CloudLinux OS Shared 7) and 2.6.32-673.26.1.lve1.4.17 ( CloudLinux OS Shared 6) we re-implemented ptrace block to protect against ptrace family of vulnerabilities. It prevents end user from using any ptrace related functionality, including such commands as strace, lsof or gdb .

By default, CloudLinux OS Shared doesn't prevent ptrace functionality.

Defaults: +

kernel.user_ptrace = 1
+kernel.user_ptrace_self = 1
+

The option kernel.user_ptrace disables PTRACE_ATTACH functionality, option kernel.user_ptrace_self disables PTRACE_TRACEME .

To disable all ptrace functionality change both sysctl options to 0, add this section to /etc/sysctl.conf : +

## CL. Disable ptrace for users
+kernel.user_ptrace = 0
+kernel.user_ptrace_self = 0
+##
+

Apply changes with: +

$ sysctl -p
+

Different software could need different access to ptrace , you may need to change only one option to 0 to make them working. In this case, there will be only partial ptrace protection.

DANGER

ptrace protection is known to break PSA service for Plesk 11

Xen XVDA

2.6.32 kernels have different mode of naming Xen XVDA drives.

By adding xen_blkfront.sda_is_xvda=0 to kernel boot line in grub.conf you will make sure no naming translation is done, and the drives will be identified as xvde .

By default, this option is set to 1 in the kernel, and drives are detected as xvda . +This is needed only for CloudLinux OS Shared 6 and Hybrid kernels.

Umask behavior

Note

CloudLinux OS Shared 6, CloudLinux OS Shared 6 hybrid, CloudLinux OS Shared 7, CloudLinux OS Shared 7 hybrid kernels.

Starting from the kernel module lve-kmod-2.0-10, the behavior of umask is changed.

Now, when entering LVE task's original umask value is preserved, instead of using LVE's umask value. +This behavior is typical for all kernels: CloudLinux OS Shared 6, CloudLinux OS Shared 6 hybrid, CloudLinux OS Shared 7, CloudLinux OS Shared 7 hybrid kernels.

IO limits latency

[lve1.2.29+]

When customer reaches IO Limit, the processes that are waiting for IO will be placed to sleep to make sure they don't go over the limit. That could make some processes sleep for a very long time. +By defining IO latency, you can make sure that no process sleeps due to IO limit for more then X milliseconds. By doing so, you will also let customers to burst through the limits, and use up more than they were limited too in some instances.

This option is OFF by default.

For CloudLinux OS Shared 6 , CloudLinux OS Shared 7, CloudLinux OS Shared 8 (kmodlve 2.1-2 and later):

To enable IO Limits latency and set it to 10 seconds: +

# echo 10000 > /sys/module/kmodlve/parameters/latency
+
+To disable latency: +
# echo 2000000000 > /sys/module/kmodlve/parameters/latency
+

It is possible to set, for example, 1000 as a permanent value. To do so, create a file /etc/modprobe.d/kmodlve.conf with the following content:
options kmodlve latency=1000

For CloudLinux OS Shared 5 (OBSOLETE):

To enable IO Limits latency and set it to 10 seconds: +

# echo 10000 > /sys/module/iolimits/**parameters/latency
+
+To disable latency: +
# echo 2000000000 > /sys/module/iolimits/**parameters/latency
+

Reading LVE usage

CloudLinux OS Shared kernel provides real time usage data in file.

All the statistics can be read from that file in real time. Depending on your kernel version you will get either Version 6 of the file, or version 4 of the file. +You can detect the version by reading the first line of the file. It should look like:

6:LVE... for version 6
+4:LVE... for version 4

First line presents headers for the data. +Second line shows default limits for the server, with all other values being 0. +The rest of the lines present limits & usage data on per LVE bases.

Version 6 (CL6 & hybrid kernels): +

6:LVE        EP        lCPU        lIO        CPU        MEM        IO        lMEM        lEP        nCPU        fMEM        fEP        lMEMPHY        lCPUW        lNPROC        MEMPHY        fMEMPHY        NPROC        fNPROC
+0        0        25        1024        0        0        0        262144        20        1        0        0        262144        100        0        0        0        00
+300        0        25        1024        1862407        0        0        262144        20        1        0        0        262144        100        0        31        000
+
Label Description Value Supported versions
LVE LVE ID number
EP Number of entry processes number
lCPU CPU Limit % relative to total CPU power
lIO IO limits for CL6 KB/s for v6, from 1 to 100 for v4
CPU CPU usage since reboot in nanoseconds for v6, hertz for v4
MEM Virtual memory usage number of 4k pages
IO IO usage KB/s for v6, 0 for v4
lMEM Virtual memory limit number of 4k pages
lEP Entry Processes limit number
nCPU Number of cores limit number of cores
fMEM Virtual memory faults number of faults
fEP Entry Processes faults number of faults v6+
lMEMPHY Physical memory limit number v6+
lCPUW CPU weight (not used) from 1 to 100 v6+
lNPROC Number of processes limit number v6+
MEMPHY Physical memory usage number of 4k pages v6+
fMEMPHY Physical memory faults number of faults v6+
NPROC Number of processes number v6+
fNPROC Number of processes faults number of faults v6+
IOPS IO operations since reboot number v8+

Flashcache

Note

Available only for x86_64, CloudLinux OS Shared 6 and Hybrid servers

Flashcache is a module originally written and released by Facebook (Mohan Srinivasan, Paul Saab and Vadim Tkachenko ) in April of 2010. It is a kernel module that allows Writethrough caching of a drive on another drive. This is most often used for caching a rotational drive on a smaller solid-state drive for performance reasons. This gives you the speed of an SSD and the size of a standard rotational drive for recently cached files. Facebook originally wrote the module to speed up database I/O , but it is easily extended to any I/O .

To install on CloudLinux OS Shared 6 & Hybrid servers: +

$ yum install flashcache
+

More info on flashcache : https://github.com/facebook/flashcache/

ArchLinux has a good page explaining how to use flashcache : +https://wiki.archlinux.org/index.php/Flashcache

OOM killer for LVE processes

When LVE reaches its memory limit, the processes inside that LVE are killed by OOM Killer and appropriate message is written to /var/log/messages . When any LVE hits huge number of memory limits in short period of time, then OOM Killer could cause system overload. Starting from kernel 2.6.32-673.26.1.lve1.4.15 ( CloudLinux OS Shared 6) and from kernel 3.10.0-427.18.2.lve1.4.14 ( CloudLinux OS Shared 7) heavy OOM Killer could be disabled. If so - lightweight SIGKILL will be used instead.

Note

It is recommended to disable OOM killer for LVE processes and use SIGKILL instead

By default OOM Killer is enabled, to disable it please run:

For CloudLinux OS Shared 6 : +

# echo 1 > /proc/sys/ubc/ubc_oom_disable
+

Also, add the following to /etc/sysctl.conf file to apply the same during boot: +

ubc.ubc_oom_disable=1
+

For CloudLinux OS Shared 7:

# echo 1 > /proc/sys/kernel/memcg_oom_disable
+

Also, add the following to /etc/sysctl.conf file to apply the same during boot:

kernel.memcg_oom_disable=1
+

File system quotas

In Ext4 file system, the process with enabled capability CAP_SYS_RESOURCE is not checked on the quota exceeding by default. It allows userland utilities selectorctl and cagefs to operate without fails even if a user exceeds a quota.

To disable quota checking in XFS file system set cap_res_quota_disable option to 1 using the following command:

# echo 1 > /proc/sys/fs/xfs/cap_res_quota_disable
+

Enter LVE when using cPanel utilities cPanel CloudLinux OS Shared 7 hybrid experimental

cPanel tools might use more resources than desired, so to limit resource usage, you might want to enter the corresponding LVE when using cPanel tools on-behalf of a non-root user.

This feature is considered experimental, as in this case there might be contention for LVE limits between cPanel tools and web-requests for a given user, which might not be suitable.

The lve_setuid_enter parameter controls whether you want to enter the corresponding LVE when using cPanel tools on behalf of a non-root user.

By default, the feature is disabled (0), to enable it, run the following for CloudLinux OS Shared 7 hybrid:

# echo 1 > /sys/module/kmodlve/parameters/lve_setuid_enter
+

Proactive reporting kernel crash events with Sentry and Kernel Panic Receiver

As updating the kernel is one of the most sensitive tasks, we'd like to achieve the maximum stability along the way. +In case something goes wrong, proactive reacting to kernel crashes can help tremendously.

Our new tool, Kernel Panic Receiver, released in June 2020 allows you to to organize kernel panic logs. +Kernel Panic Receiver is an open-source component designed to pre-emptively resolve any kernel-related issues.

Visit the Kernel Panic Receiver project GitHub page.

Usage

To send required kernel logs from the clients' machines to Kernel Panic Receiver, we configure the default Linux kernel feature called netconsole.

The configuration is done by the initscripts package, starting from the following versions:

  • For CloudLinux OS Shared 6: 9.03.61-1.cloudlinux
  • For CloudLinux OS Shared 7: 9.49.49-1.cloudlinux
  • For CloudLinux OS Shared 8: 10.00.4-1.cloudlinux

To update the initscripts package, run the following command:

yum update initscripts --enablerepo=cloudlinux-updates-testing
+

When a kernel panic occurs, the netconsole module sends logs to our server as plain text via the UDP protocol.

What data is transferred by netconsole?

The netconsole sends only OOPs-related messages from the kernel ring buffer. It doesn't transfer any sensitive data, such as usernames, encryption keys, paths, etc. So, there are no security problems you should worry about.

Disabling the feature

If you don't want to send us the data, you can turn the netconsole service off (we don't recommend it, though). +To disable transferring the data, just comment the SYSLOGADDR parameter in the netconsole config file (/etc/sysconfig/netconsole):

# For more information about this data transmission, check this page:
+# https://cloudlinux.zendesk.com/hc/en-us/articles/360016481200
+# SYSLOGADDR=sentrykernel.cloudlinux.com
+

And stop the netconsole service by running the following command:

service netconsole stop
+

Note

Netconsole is used only for Kernel Panic Receiver, so disabling it doesn't lead to issues with other CloudLinux OS Shared services.

+ + + diff --git a/docs/.vuepress/public/cloudlinux_rest_api.pdf b/cloudlinux_rest_api.pdf similarity index 100% rename from docs/.vuepress/public/cloudlinux_rest_api.pdf rename to cloudlinux_rest_api.pdf diff --git a/command-line_tools/index.html b/command-line_tools/index.html new file mode 100644 index 000000000..c852eedd5 --- /dev/null +++ b/command-line_tools/index.html @@ -0,0 +1,711 @@ + + + + + + Command-line tools (CLI) | Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Command-line tools (CLI)

The list of the commands (CLI) you can use to manage CloudLinux OS components.

CageFS

cagefsctl is used to manage CageFS. It allows initializing and updating CageFS, as well as enabling/disabling CageFS for individual users.

Use the following syntax to manage CageFS: +/usr/sbin/cagefsctl [OPTIONS]

Options:

-i --init initialize CageFS (create CageFS if it does not exist)
-r --reinit reinitialize CageFS (make backup and recreate CageFS)
-u --update update files in CageFS (add new and modified files to CageFS, remove unneeded files)
-f --force recreate CageFS (do not make backup, overwrite existing files)
-d --dont-clean do not delete any files from skeleton (use with --update option)
-k --hardlink use hardlinks if possible
--create-mp Creates /etc/cagefs/cagefs.mp file
--mount-skel mount CageFS skeleton directory
--unmount-skel unmount CageFS skeleton directory
--remove-all disable CageFS, remove templates and /var/cagefs directory
--sanity-check perform basic self-diagnistics of common cagefs-related issues (mostly useful for support)
--addrpm add rpm-packages in CageFS (run cagefsctl --update in order to apply changes)
--delrpm remove rpm-packages from CageFS (run cagefsctl --update in order to apply changes)
--list-rpm list rpm-packages that are installed in CageFS
-e --enter enter into user's CageFS as root
--update-list update specified files only (paths are read from stdin)
--update-etc update /etc directory of all or specified users
--set-update-period set min period of update of CageFS in days (default = 1 day)
--force-update force update of CageFS (ignore period of update)
--force-update-etc force update of /etc directories for users in CageFS
--reconfigure-cagefs configure CageFS integration with other software (control panels, database servers, etc)

Use the following syntax to manage users:
/usr/sbin/cagefsctl [OPTIONS] username [more usernames]

Options:

-m --remount remount specified user(s)
-M --remount-all remount CageFS skeleton directory and all users (use this each time you have changed cagefs.mp file
-w --unmount unmount specified user(s)
____ --unmount-dir unmount specified dir for all users
-W --unmount-all unmount CageFS skeleton directory and all users
-l --list list users that entered in CageFS
--list-logged-in list users that entered in CageFS via SSH
--enable enable CageFS for the user
--disable disable CageFS for the user
--enable-all enable all users, except specified in /etc/cagefs/users.disabled
--disable-all disable all users, except specified in /etc/cagefs/users.enabled
--display-user-mode display the current mode ( "Enable All" or "Disable All" )
--toggle-mode toggle mode saving current lists of users (lists of enabled and disabled users remain unchanged)
--list-enabled list enabled users
--list-disabled list disabled users
--user-status print status of specified user (enabled or disabled)
--getprefix display prefix for user

PHP Selector related options:

--setup-cl-selector setup PHP Selector or register new alt-php versions
--remove-cls-selector unregister alt-php versions, switch users to default php version when needed
--rebuild-alt-php-ini rebuild alt_php.ini file for specified users (or all users if none specified)
--validate-alt-php-ini same as --rebuild-alt-php-ini but also validates alt_php.ini options
--cl-selector-reset-versions reset php version for specifed users to default (or all users if none specified)
--cl-selector-reset-modules reset php modules (extensions) for specific users to defaults (or all users if none specified)
--create-virt-mp create virtual mount points for the user
--create-virt-mp-all create virtual mount points for all users
--remount-virtmp create virtual mount points and remount user
--apply-global-php-ini use with 0, 1 or 2 arguments from the list: error_log, date.timezone without arguments applies all global php options including the two above

Common options:

___ --disable-cagefs disable CageFS
--cagefs-status print CageFS status: ( enabled or disabled )
--set-min-uid Set min UID
--get-min-uid Display current MIN_UID setting
--print-suids Print list of SUID and SGID programs in skeleton
--do-not-ask assume "yes" in all queries (should be the first option in command)
--clean-var-cagefs clean /var/cagefs directory (remove data of non-existent users)
--set-tmpwatch set tmpwatch command and parameters (save to /etc/cagefs/cagefs.ini file)
--tmpwatch execute tmpwatch (remove outdated files in tmp directories in CageFS for all users)
--toggle-plugin disable/enable CageFS plugin
-v --verbose verbose output
--wait-lock wait for end of execution of other cagefsctl processes (when needed) before execution of the command
-h --help this message

Running command inside CageFS

Note

lve-wrappers 0.6-1+

Sometimes you will need to execute a command as user inside CageFS.

If a user has shell enabled - you can simply use: +

$ /bin/su - $USERNAME  -c _command_
+
+Yet, if a user have they shell disabled, it wouldn't work. To solve this issue, we have added command: +
$ /sbin/cagefs_enter_user [--root] [--no-fork] $USERNAME _command_
+

Options:

  • --root – tells the utility not to reset UID and GID to user ones. It might be dangerous to call untrusted commands.
  • --no-fork – do not create a child process for a called command. The called command will replace the cagefs_enter process with exec.
  • --no-cpu-limit- remove all CPU limits (requires kmod-lve >= 2.0.36)
  • --no-io-and-memory-limit - remove all limits of IO and Memory (requires kmod-lve >= 2.0.36)

If you disable CageFS for a user, then cagefs_enter will be executed without proxyexec .

You can forcibly disable cagefs_enter start via proxyexec for all users (regardless if CageFS is enabled or disabled) by specifying the parameter cagefs_enter_proxied=0 in /etc/sysconfig/cloudlinux.

/bin/cagefs_enter.proxied can be executed instead of /bin/cagefs_enter to enter CageFS without proxyexec . Note that starting cagefs_enter via proxyexec is necessary to enable sending local notification messages to users with enabled CageFS. cagefs_enter is executed via proxyexec by default.

Sanity check

Note

CageFS 6.0-34+

CageFS --sanity-check utility allows to check CageFS configuration consistency, so that an administrator can save the time investigating issues with CageFS and ensure that custom configuration is correct.

To start, run the command: +

cagefsctl --sanity-check
+
+At the moment 7 types of check are implemented: +
  1. Check cagefs mount points exists - reads cagefs.mp file and verifies if the directories specified in it really exist on the disk. To learn more, visit Mount points and Split by username

  2. Check cagefs users.enabled is a directory - ensures that if /etc/cagefs/users.enabled exists, then it is a directory, not a file (if it is recognized as a file, then it would cause a breakdown).

  3. Check cagefs users.disabled is a directory - ensures that if /etc/cagefs/users.disabled exists, then it is a directory, not a file (if it is recognized as a file, then it would cause a breakdown).

  4. Check cagefs disable.etcfs exists - checks if /etc/cagefs/etc.safe/disable.etcfs exists.

  5. Check cagefs users can enter cagefs - chooses two users in the system with enabled CageFS (the first and the second ones in the unsorted list) and tries to log in to CageFS under their credentials and see what happens. It runs su -l "$USER" -s /bin/bash -c "whoami" and compares the output with the $USER and su command retcode estimation.

Note

If a login fails, it can be due to various reasons, that can only be determined in manual mode. The checker only gives the output of the command.

  1. Check cagefs proxy commands configs are parsable - tries to load /etc/cagefs/*.proxy.commands files and parse them to check the syntax. In case of any parsing error the test will fail. To learn more, visit Executing by proxy.

  2. Check cagefs virt.mp files syntax - reads all /var/cagefs///virt.mp files (if any) and checks their syntax validity. At the moment there are only two checks of the syntax: the file is not empty if it exists, and the file is not starting with the sub directory definitions (with @). To learn more, visit Per-user virtual mount points

  3. Check MultiPHP system default PHP version – checks that MultiPHP system default PHP version is NOT Alt-PHP. That means PHP Selector should work properly. If MultiPHP system default PHP version is Alt-PHP, PHP Selector does not work and should be disabled. To learn more on how to disable PHP Selector, visit cPanel LVE Manager

Possible results of the checks:

  • OK - the check succeeded.

  • FAILED - the check revealed a problem.

  • SKIPPED - the check was skipped as it made no sense in such environment (e.g. wrong control panel) or can not be performed for some reason (e.g no users with enabled CageFS found). The actual result does not mean that a problem exists and can be considered as positive.

  • INTERNAL_TEST_ERROR - the check failed because of a problem inside the checker itself. Must be reported to the developers.

In case if at least one of the checks resulted neither OK nor SKIPPED then the checker will end with ret code >0.

LVE-stats 2

/usr/sbin/lveinfo utility to display historical information about LVE usage.
/usr/sbin/lvechart creates a chart representing LVE usage for user.
/usr/sbin/dbgovchart creates a chart representing MySQL usage for user.
/usr/sbin/lve-read-snapshot displays information from system state (snapshots) for user.
/usr/sbin/lve-create-db creates/recreates database for lve-stats.
/usr/sbin/cloudlinux-top utility provides information about current MySQL and LVE usage of a running system in JSON format.
/usr/sbin/cloudlinux-statistics utility provides historical information about resource usage.

lveinfo

Note

lve-stats-2.2-2

Usage

lveinfo [-h] [-v] [--dbgov DBGOV] [-f YYYY-MM-DD[HH:MM]]
+
+              [-t YYYY-MM-DD[HH:MM]] [--period PERIOD] [-u USER | --id ID]
+
+              [-d] [-o ALIAS] [-b ALIAS [ALIAS ...]] [-p 0..100]
+
+              [--by-fault ALIAS [ALIAS ...]] [-r FAULTS]
+
+              [--style {user,admin}] [-l LIMIT] [-c [PATH] | -j]
+
+              [--server_id SERVER_ID] [--servers-info]
+
+              [--show-all | --show-columns COLUMN_NAME [COLUMN_NAME ...]]
+
+              [--time-unit TIME_UNIT] [-m {v1,v2}]
+
+              [--blank-value [BLANK_VALUE]]
+

lveinfo is an utility to display historical information about LVE usage.

Optional arguments

  • -h, --help – show this help message and exit

  • -v, --version – show program's version number and exit

  • --dbgov DBGOV – show MySql Governor statistic

  • -u USER, --user USER – use username instead of LVE id, and show only record for that user

  • --id ID – will display record only for that LVE id

  • -d, --display-username – try to convert LVE id into username when possible

  • -o ALIAS, --order-by ALIAS – orders results by one of the following:

    ALIAS ALIAS DESCRIPTION
    cpu_avg aCPU average CPU usage
    cpu_max mCPU max CPU usage
    total_cpu_faults CPUf total number of max CPU usage faults
    vmem_avg aVMem average virtual memory usage
    mep_avg aEP average number of entry processes (concurrent connections)
    mep_max mEP max number of entry processes (concurrent connections)
    total_ep_faults EPf total number of max entry processes faults
    pmem_avg aPMem average physical memory usage (LVE version >= 6)
    pmem_max mPMem max physical memory usage (LVE version >= 6)
    nproc_avg aNproc average number of processes (LVE version >= 6)
    nproc_max mNproc max number of processes (LVE version >= 6)
    io_avg aIO average io usage (LVE version >= 6)
    io_max mIO max io usage (LVE version >= 6)
    total_pmem_faults PMemF total number of out of physical memory faults (LVE version >= 6)
    total_nproc_faults NprocF total number of max processes faults (LVE version >= 6)
    total_io_faults IOf total number of max io faults (LVE version >= 6)
    iops_avg aIOPS average io operations (LVE version >= 8)
    iops_max mIOPS max io operations (LVE version >= 8)
    total_iops_faults IOPSf total number of max io operations faults (LVE version >= 8)
    any_faults anyF total number of faults of all types
  • -b ALIAS [ALIAS ...] --by-usage ALIAS [ALIAS ...] – show LVEs with usage (averaged) within 90 percent of the limit available values:

    ALIAS ALIAS ALIAS DESCRIPTION
    cpu_avg cpu aCPU average CPU usage
    cpu_max cpu_max mCPU max CPU usage
    vmem_avg vmem aVMem average virtual memory usage
    vmem_max vmem_max mVMem max virtual memory usage
    mep_avg mep aEP average number of entry processes (concurrent connections)
    mep_max mep_max mEP max number of entry processes (concurrent connections)
    pmem_avg pmem aPMem average physical memory usage (LVE version >= 6)
    pmem_max pmem_max mPMem max physical memory usage (LVE version >= 6)
    nproc_avg nproc aNproc average number of processes (LVE version >= 6)
    nproc_max nproc_max mNproc max number of processes (LVE version >= 6)
    io_avg io aIO average io usage (LVE version >= 6)
    io_max io_max mIO max io usage (LVE version >= 6)
    iops_avg iops aIOPS average io operations (LVE version >= 8)
    iops_max iops_max mIOPS max io operations (LVE version >= 8)
  • -p 0..100, --percentage 0..100 – defines percentage for --by-usage option; default 90

  • --style {user,admin} – deprecated, not used.

  • -l LIMIT, --limit LIMIT – max number of results to display, 10 by default, if 0 no limit

  • -c [PATH], --csv [PATH] – save statistics in CSV format; - by default (output to screen)

  • -j, --json – display output in JSON format

  • --server_id SERVER_ID – used with central database for multiple servers, default localhost

  • --servers-info – show servers LVE versions

  • --show-all – full output (show all limits); brief output is default; equivalent --show-columns all

  • -show-columns COLUMN_NAME [COLUMN_NAME ...] – show only the listed columns; all for all supported columns

    COLUMN_NAME DESCRIPTION
    From Show start period statistics
    To Show end period statistics
    ID LVE Id or username
    aCPU Average CPU usage
    uCPU The percentage of user-allocated resource CPU
    mCPU deprecated
    lCPU CPU limit
    CPUf Out Of CPU usage Faults
    aEP Average Entry Processes
    uEP The percentage of user-allocated resource Entry processes
    mEP deprecated
    lEP maxEntryProc limit
    aVMem Average Virtual Memory Usage
    uVMem The percentage of user-allocated resource Virtual Memory
    mVMem deprecated
    lVMem Virtual Memory Limit
    VMemF Out Of Memory Faults
    EPf Entry processes faults
    aPMem Average Physical Memory Usage (LVE version >= 6)
    uPMem The percentage of user-allocated resource Physical Memory (LVE version >= 6)
    mPMem deprecated (LVE version >= 6)
    lPMem Physical Memory Limit (LVE version >= 6)
    aNproc Average Number of processes (LVE version >= 6)
    uNproc The percentage of user-allocated resource Number of processes (LVE version >= 6)
    mNproc deprecated (LVE version >= 6)
    lNproc Limit of Number of processes (LVE version >= 6)
    PMemF Out Of Physical Memory Faults (LVE version >= 6)
    NprocF Number of processes faults (LVE version >= 6)
    aIO Average I/O (LVE version >= 6)
    uIO The percentage of user-allocated resource I/O (LVE version >= 6)
    mIO deprecated (LVE version >= 6)
    lIO I/O Limit (LVE version >= 6)
    IOf Out Of I/O usage Faults (LVE version >= 6)
    aIOPS Average I/O Operations (LVE version >= 8)
    mIOPS deprecated (LVE version >= 8)
    uIOPS The percentage of user-allocated resource I/O Operations (LVE version >= 8)
    lIOPS I/O Operations Limit (LVE version >= 8)
    IOPSf Out Of I/O Operations Faults (LVE version >= 8)
  • --time-unit TIME_UNIT – time step for grouping statistic in minutes; 1 min., by default; can use m\|h\|d suffixes; for example: 1h or 1h30m or 1d12h

  • -m {v1,v2}, --compat {v1,v2}v1 - return old output mode; v2 - new mode; default v1; you can change default in config

  • --blank-value [BLANK_VALUE] – Use to fill unsupported limits; default -

  • -f YYYY-MM-DD[ HH:MM], --from YYYY-MM-DD[ HH:MM] – run report from date and time in [YY]YY-MM-DD[ HH:MM] format; if not present last 10 minutes are assumed

  • -t YYYY-MM-DD[ HH:MM], --to YYYY-MM-DD[ HH:MM] – run report up to date and time in [YY]YY-MM-DD[ HH:MM] format; if not present, reports results up to now

  • --period PERIOD – time period; specify minutes with m, h - hours, days with d, and values: today, yesterday; 5m - last 5 minutes, 4h - last four hours, 2d - last 2 days, as well as today

  • --by-fault ALIAS [ALIAS ...] – show LVEs which failed on max processes limit or memory limit

    ALIAS ALIAS ALIAS DESCRIPTION
    mcpu cpu CPUf total number of max CPU usage faults
    mem vmem VMemF total number of out of virtual memory faults
    mep ep EPf total number of max entry processes faults
    pmem pmem PMemF total number of out of physical memory faults (LVE version >= 6)
    nproc nproc NprocF total number of max processes faults (LVE version >= 6)
    io io IOf total number of max io faults (LVE version >= 6)
    iops iops IOPSf total number of max io operations faults (LVE version >= 8)
    any_faults any anyF total number of faults of all types
  • -r FAULTS, --threshold FAULTS– in combination with --by-fault, shows only LVEs with number of faults above; default 1

Prefixes Kb, Mb and Gb indicates powers of 1024.

Note

All ALIAS options are not case sensitive.

lvechart

/usr/sbin/lvechart - creates a chart representing LVE usage for user.

Usage

/usr/sbin/lvechart [OPTIONS]
+

Acceptable options

--help This help screen
--version Version number
--from Run report from date and time in YYYY-MM-DD HH:MM format (if not present, last 10 minutes are assumed)
--to= Run report up to date and time in YYYY-MM-DD HH:MM format (if not present, reports results up to now)
--period= Time period: specify minutes with m, h - hours, days with d, and values: today, yesterday; 5m - last 5 minutes, 4h - last four hours, 2d - last 2 days, as well as today
--id= LVE id will display record only for that LVE id
--user= Use username instead of LVE id , and show only record for that user
--server= Server id will display record for that server, instead of default (current)
--output= Filename to save chart as, if not present, output will be sent to STDOUT
--show-all Show all graphs (by default shows graphs for which limits are set)
--style= admin, user set chart style, CPU limits are normalized to 100% in user’s style
--format= svg, png set chart output format

dbgovchart

/usr/sbin/dbgovchart - creates a chart representing MySQL usage for user.`

Usage

/usr/sbin/dbgovchart [OPTIONS]
+

Acceptable options

--help This help screen
--version Version number
--from= Run report from date and time in YYYY-MM-DD HH:MM format (if not present, last 10 minutes are assumed)
--to= Run report up to date and time in YYYY-MM-DD HH:MM format (if not present, reports results up to now)
--period= Time period: specify minutes with m, h - hours, days with d, and values: today, yesterday; 5m - last 5 minutes, 4h - last four hours, 2d - last 2 days, as well as today`
--user= mysql username
--output= Filename to save chart as, if not present, output will be sent to STDOUT
--show-all Show all graphs (by default shows graphs for which limits are set)
--server= Server id will display record for that server, instead of default (current)
--style= admin, user set chart style, CPU limits are normalized to 100% in user’s style
--format= svg, png set chart output format

lve-read-snapshot

Usage

lve-read-snapshot [-h] [--version] [-f FROM [FROM ...]] [-t TO [TO ...]
+                  [ -p PERIOD | --timestamp TIMESTAMP]
+                  [-i ID | -u USER] [-l] [-o file] [-j] [--stats]
+                  [--unit unit]
+

Reads LVE system state snapshots for LVE/user.

Optional arguments

  • -h, --help – show this help message and exit
  • --version – version number
  • -f FROM [FROM ...], --from FROM [FROM ...] – run report from date and time in YYYY-MM-DD HH:MM format, if not present last 10 minutes are assumed (default: 2016-10-24 19:28)
  • -t TO [TO ...], --to TO [TO ...] – run report up to date and time in YYYY-MM-DD HH:MM format, if not present, reports results up to now (default: 2016-10-24 19:38)
  • -p PERIOD, --period PERIOD – time period specify minutes with m, h - hours, days with d, and values: today, yesterday, 5m - last 5 minutes, 4h - last four hours, 2d - last 2 days, as well as today (default: 10m)
  • --timestamp TIMESTAMP – time stamp in unix format for get one snapshot (default: None)
  • -i ID, --id ID – LVE id to show records for (default: None)
  • -u USER, --user USER – user account to show records for (default: None)
  • -l, --list – show timestamp list only (default: False)
  • -o file, --output file – filename to save snaphots report to, if not present,output will be sent to STDOUT (default: None)
  • -j, --json – output in json format (default: False)
  • --stats – output stats, instead of snapshots (default: False)
  • --unit unit – group stats by time unit. Example values 3h, 24h, 1d, 1w. Other possible value is auto for grouping by each incident (default: 1d)

One of -u --user or -i --id should be specified.

lve-create-db

Usage

lve-create-db [-h] [--recreate] [--print-sql]
+                   [--update-serverid-prompt] [--update-serverid-auto]
+                   [--validate]
+

Creates a database for lve-stats.

Optional arguments

  • -h, --help – show this help message and exit
  • --recreate – drops and recreates database even if tables exists (default: False)
  • --print-sql – prints sql and exits, without creating db (default: False)
  • --update-serverid-prompt – update exist server ID or create new one (default: False)
  • --update-serverid-auto – update exist server ID with uuid (default: False)
  • --validate – check the correctness of the database structure (default: False)

cloudlinux-top

Utility provides information about current MySQL and LVE usage of a running system in JSON format.

Usage

cloudlinux_top [-h] [-v] [-j] [--hide-mysql]
+               [-u USERNAME | -r FOR_RESELLER] [-d DOMAIN] [-m MAX]
+               [-o ORDER_BY]
+

Optional arguments

  • -h, --help – show this help message and exit
  • -v, --version – show program version number and exit
  • -j, --json – return data in JSON format
  • --hide-mysql | `don't show MySQL related info
  • -u USERNAME, --username USERNAME – show data only for a specific user. Can be used to filter the output; returns users with username %USERNAME%
  • -r FOR_RESELLER, --for-reseller FOR_RESELLER – get information only about specified reseller and his users
  • -d DOMAIN, --domain DOMAIN – show data only for a specific domain. Can be used to filter the output; returns users with domain %DOMAIN%
  • -m MAX, --max MAX – show up to N records. If --max key is omitted. By default will show top 25 users
  • -o ORDER_BY, --order-by ORDER_BY – sort output by resource usage; available options: cpu, mysql_cpu, io, mysql_io, iops, ep, nproc, pmem

Output format

{
+  "mySqlGov": "enabled",              # possible values: enabled, error
+  "mySqlGovMode": "abusers",          # see “MySQL Governor > Modes Of Operation”
+                                      # if MySQL Governor is not enabled, value is "none"
+ 
+  "resellers": [                      # list of resellers (available only with
+                                      # reseller limits feature)
+      {
+          "id": 1000020005,           # internal record id
+          "limit": <lve_section>,     # current limits (last 5 seconds)
+          "name": "reseller_name",    # reseller’s login in control panel
+          "usage": <lve_section>      # current usage (last 5 seconds)
+      }
+  ],
+  "result": "success",                # see the ‘errors handling’ section
+  "timestamp": 1522858537.337549,
+  "users": [
+      {
+          "domain": "domain.com",     # user’s primary domain (from control panel)
+          "id": 20005,                # lve_id, same as user id in /etc/passwd file
+          "limit": <lve_section>,     # limits for last 5 seconds
+          "reseller": "reseler1",     # user’s reseller (from control panel)
+          "usage": <lve_section>,     # usage for last 5 seconds
+          "username": "user"          # username from /etc/passwd file or “N/A” if user
+                                      # with such id does not exist
+       }
+   ]
+ }
+

The structure * of <lve_section>:

{
+"cpu": {
+ "all": 50.0,      # CPU usage or limit (LVE only)
+ "mysql": 0.0*     # CPU usage or limit (MySQL Governor only)
+},
+"ep": 1.0,           # number of entry processes
+"io": {
+ "all": 0.0,       # IO usage or limit (LVE only)
+ "mysql": 0.0**     # IO usage or limit (MySQL Governor only)
+},
+"iops": 0.0,         # IO operations per second
+"mem": 258048,       # memory usage or limit
+"pno": 1.0           # number of processes
+}
+

Note

  • you can modify this structure using --show option, see usage examples for details.
  • MySQL values are only present when MySQL Governor statistics is available and --hide-mysql options is not used.

Units of measurement

For limits and usage sections we use the following units of measurement.

Value Units of measurement
cpu (lve and mysql) percentage of one CPU core
io (lve and mysql) bytes per second
iops number of IO operations per second
mem bytes
ep number of entry processes
pno number of processes

Errors handling

The format of the error message is the same as in the other cloudlinux- * utilities. When everything is ok, the result value is success. Otherwise, it contains error message. In case of unexpected errors, the output will be as follows.

# cloudlinux-top --json 
+{
+  "context": {
+      "error_text": "Very bad error"
+  },
+  "result": "An error occured: \"%(error_text)s\"",
+  "timestamp": 1523871939.639394
+}
+

Examples

  • get 100 users ordered by CPU usage

    # cloudlinux-top --json --order-by cpu --max=100
    +
  • get information about one user

    # cloudlinux-top --json -u username
    +
  • get information about reseller and his users

    # cloudlinux-top --json --for-reseller=reseller_name
    +
  • show only IO limits and usage

    # cloudlinux-top --json --show=io
    +

cloudlinux-statistics

cloudlinux-statistics is a CLI utility that provides historical information about resource usage.

Usage

cloudlinux-statistics [-h] [-j] [-v] [--by-usage BY_USAGE]
+                      [--percentage 0..100] [--by-fault BY_FAULT]
+                      [--threshold THRESHOLD] [--server_id SERVER_ID]
+                      [-f FROM] [-t TO] [--period PERIOD]
+                      [--limit LIMIT]
+                      [--show COLUMN_NAME [COLUMN_NAME ...]]
+                      [-o ORDER_BY] [--id ID] [--time-unit TIME_UNIT]
+                      [-r FOR_RESELLER]
+

Optional arguments

  • -h, --help – show this help message and exit

  • -j, --json – return data in JSON format

  • -v, --version – show program version number and exit

  • --server_id SERVER_ID, --server-id SERVER_ID – can be used with the central database for multiple servers; default ...

  • --limit LIMIT – limit the number of results to display, 0 is unlimited

  • --show COLUMN_NAME [COLUMN_NAME ...] – show only listed columns; all for all supported columns (fields)

    Key Fields to show
    all all available fields
    cpu CPU field
    io IO field
    iops IOPS field
    ep entry processes (concurrent connections) field
    nproc number of processes field
    pmem physical memory field
    vmem virtual memory field
    mysql mysql_cpu & mysql_io field
  • -o ORDER_BY, --order-by ORDER_BY – order results by one of the following keys (fields):

    FIELD DESCRIPTION
    any_faults total number of faults of all types
    cpu average CPU usage`
    mysql_cpu average MySQL CPU usage`
    io average IO usage`
    mysql_io average MySQL IO usage`
    iops average IO operations; (LVE version >= 8)`
    ep average number of entry processes (concurrent connections)`
    nproc average number of processes`
    pmem average physical memory usage`
    vmem average virtual memory usage`
    cpu_faults total number of CPU usage faults`
    io_faults total number of max IO faults`
    iops_fault total number of max IO operations faults; (LVE version >= 8)`
    ep_faults total number of max entry processes faults`
    nproc_faults total number of max processes faults`
    pmem_faults total number of out of physical memory faults`
    vmem_faults total number of out of virtual memory faults`
  • -r FOR_RESELLER, --for-reseller FOR_RESELLER – show statistics only for given reseller and his users

Filter items by resource usage.

  • --by-usage BY_USAGE – show LVEs with usage (averaged) within 90 percent of the limit available values

    FIELD DESCRIPTION
    cpu average CPU usage
    mysql_cpu average MySQL CPU usage
    io average IO usage
    mysql_io average MySQL IO usage
    iops average IO operations; (LVE version >= 8)
    ep average number of entry processes (concurrent connections)
    nproc average number of processes
    pmem average physical memory usage
    vmem average virtual memory usage
  • -percentage 0..100 – define percentage for --by-usage option; default 90

Filter items by the number of faults.

  • --by-fault BY_FAULT – show only accounts that have some faults for the given limit

    FIELD DESCRIPTION
    any faults of all types
    cpu CPU usage faults
    io max IO usage faults
    iops max IO operations faults; (LVE version >= 8)
    ep max entry processes faults
    nproc max processes faults
    pmem out of physical memory faults
    vmem out of virtual memory faults
  • --threshold THRESHOLD – in combination with --by-fault shows only accounts with the number of faults more than given; default 1

Filter items by a time interval.

Allows to get information for the given period of time; you can either set --from and --to options, or just get information for the recent time period using --period option.

Note

--from and --to values are ignored when --period is set.

  • -f FROM, --from FROM – run report from date and time in [YY]YY-MM-DD[ HH:MM] format; if not present, last 10 minutes are assumed
  • -t TO, --to TO – run report up to date and time in [YY]YY-MM-DD[ HH:MM] format; if not present, reports results up to now
  • --period PERIOD – time period; specify minutes with m, hours with h, days with d, and values: today, yesterday; 5m - last 5 minutes, 4h - last four hours, 2d - last 2 days, and today

Get detailed statistics.

  • --id ID – get detailed statistics for database record with the given id
  • --time-unit TIME_UNIT – group statistics using the given time; 1 minute by default. For example: 1h or 1h30m or dynamic; available only in pair with --id

Output format

There are two different JSON formats used for summary statistics and detailed statistics.

Summary statistics

# cloudlinux-statistics --json
+ {
+ "resellers": [
+   {
+     "usage": <lve_section>,
+     "faults": <lve_section>,
+     "name": "reseller",
+     "limits": <lve_section>,
+     "id": 1000020005
+   }
+ ],
+ "timestamp": 1522920637,
+ "mySqlGov": "enabled",            # possible values: ”enabled”, “error”
+ "result": "success",
+ "users": [
+   {
+     "username": "username",
+     "domain": "example.com",
+     "reseller": "reseller",
+     "limits": <lve_section>,
+     "faults": <lve_section>,
+     "usage": <lve_section>,
+     "id": 20005
+   }
+ ]
+ }
+

Detailed statistics

# cloudlinux-statistics --json --id=20001
+ {
+ "timestamp": 1523011550,
+ "mySqlGov": "enabled",           # possible values: ”enabled”, “error”
+ "result": "success",
+ "user": [
+   {
+     "usage": <lve_section>,
+     "faults": <lve_section>,
+     "from": 1523011144,
+     "limits": <lve_section>,
+     "to": 1523011143
+   },
+ ...
+   {
+     "usage": <lve_section>,
+     "faults": <lve_section>,
+     "from": 1523011204,
+     "limits": <lve_section>,
+     "to": 1523011203
+   }
+ ]
+ }
+

For both, summary statistics and detailed statistics, <lve_section> is the same and looks like following *.

{
+   "ep": {
+     "lve": 1        # number of entry processes
+   },
+   "vmem": {
+     "lve": 2428928  # virtual memory usage or limit (deprecated)
+   },
+   "iops": {
+     "lve": 0        # io operations per second
+   },
+   "io": {
+     "lve": 0.0,     # io usage or limit (lve only)
+     "mysql": 0.0**   # io usage or limit (mysql only)
+   },
+   "nproc": {
+     "lve": 1        # number of processes in lve
+   },
+   "cpu": {
+     "lve": 25.6,    # cpu usage (lve only)
+     "mysql": 0.0*   # cpu usage (mysql governor only)
+   },
+   "pmem": {
+     "lve": 360448   # physical memory usage or limit
+   }
+ }
+

Note

  • you can specify only required fields using --show option;
  • mysql fields are only available with MySQL Governor installed.

Units of measurement

For limits and usage sections we use the following units of measurement.

Value Units of measurement
cpu (LVE and MySQL) percentage of one CPU core
io (LVE and MySQL) bytes per second
iops number of IO operations per second
pmem and vmem bytes
ep number of entry processes
nproc number of processes in LVE

Errors handling

The format of the error message is the same as in the other cloudlinux- * utilities. When everything is ok, the result value is success. Otherwise, it contains error message.

# cloudlinux-statistics --json 
+{
+  "context": {
+      "error_text": "Very bad error"
+  },
+  "result": "An error occured: \"%(error_text)s\"",
+  "timestamp": 1523871939.639394
+}
+

Examples

  • get top 10 users ordered by CPU usage for today
# cloudlinux-statistics --json --order-by=cpu --period=today --limit=10
+
  • get users that hit IO limit more than 10 times for today
# cloudlinux-statistics --json --period=today --by-fault=io --threshold=10
+
  • get users that used more than 80% of CPU in last 24 hours
# cloudlinux-statistics --json --by-usage=cpu --percentage=80 --period=24h
+
  • get information only about reseller and his users
# cloudlinux-statistics --json --for-reseller=reseller_name
+
  • get information only about CPU and IO usage
# cloudlinux-statistics --json --show=cpu,io
+

MySQL Governor

  • dbtop

  • dbctl

  • lveinfo --dbgov

  • dbgovchart

  • dbtop monitors MySQL usage on per user bases.

  • dbctl is a command line tool to manage DB Governor configuration.

  • lveinfo --dbgov provides historical information about usage and customer restrictions.

  • dbgovchart generates charts for MySQL usage.

dbtop

Utility to monitor MySQL usage. Requires db_governor to be running. It shows usage for the current, mid and long intervals.

Options:

-c show one time user list (no interactive mode)
-r interval refresh interval for interactive mode (in seconds)

Control keys

z toggle color mode and two-color mode
q F10, Ctrl-c - quit program
u sort table by username
c sort table by cpu column
r sort table by read column
w sort table by write column
l sort by restriction level
t sort by time before restrictions will be lifted.

Control keys, that sort table, displays into header of table bold and underlined symbol. +Sorted field will be highlighted by *. + CAUSE field shows current stage, reason for restriction and number of seconds before restriction will be lifted: +Values of column ' CAUSE ' - cause of restriction or freezing: +Possible stages:

  • - OK
  • 1 - Restriction 1
  • 2 - Restriction 2
  • 3 - Restriction 3
  • 4 - Restriction level 4
c - current (current value of parameter)
s - short (average value of 5 last values of parameter)
m - middle (average value of 15 last values of parameter)
l - long (average value of 30 last values of parameter)
and parameter which is cause of restriction
1/s:busy_time/12 first level restricted account with short average restriction by busy_time with 12 seconds left before re-enabled.

Display fields:

  • cpu - number in %, shows cpu usage by user +
    • read - number of bytes (kbytes, mbytes, gbytes) which user reads per second
    • write - number of bytes (kbytes, mbytes, gbytes) write user reads per second

Accounts highlighted in red color means that the account is restricted.
+Accounts highlighted in blue color are in cool down period

Command line parameters of dbtop utility:
-r - dbtop refresh period in seconds ( dbtop -r12 )

dbctl

usage: dbctl command [parameter] [options]

Commands:

set set parameters for a db_governor
list list users & their limits. It will list all users who had been active since Governor restart, as well as those for who explicit limits were set
list-restricted list restricted customers, with their limits, restriction reason, and time period they will still be restricted
ignore ignore particular user
watch start observing particular user again
delete remove limits for user/use defaults
restrict restrict user using lowest level (or if --level specified, using the specified level)
unrestrict unrestrict username (configuration file remains unchanged)
unrestrict-all unrestrict all restricted users (configuration file remains unchanged)
--help show this message
--version version number
--lve-mode set DB Governor mode of operation. Available values: off/abusers/all/single/on
off - monitor only, don't throttle
abusers - when user reaches the limit, put user's queries into LVE for that user (experimental)
all - user's queries always run inside LVE for that user (experimental)
single - single LVE for all abusers.
on - same as single (deprecated)

Parameters

default set default parameter
usrename set parameter for user

Options

--cpu=N limit CPU (pct) usage
--read=N limit READ (MB/s) usage
--write=N limit WRITE (MB/s) usage
--level=N level (1,2,3 or 4) specified (deprecated) - this option is available only for period mode:

<restrict_mode use="period"/> (see Configuration)

The default mode is " limit " - when a user hits limits, the account will be marked as restricted and if the user does not hit the limit again during " unlimit=1m " account will be unrestricted. This mode doesn't have any additional levels/penalties.
<restrict_mode use="limit" unlimit="1m"/>

Changing the "unlimit" can be done only via the configuration file (see Configuration).

--slow=N: limit time (in seconds) for long running SELECT queries

Options for parameter list:

--kb show limits in Kbytes no pretty print
--bb show limits in bytes no pretty print
--mb show limits in Mbytes no pretty print

Examples: +

$ dbctl set test2 --cpu=150,100,70,50 --read=2048,1500,1000,800
+

sets individual limits for cpu (current, short, middle period) and read (current, short, middle, long periods) for user test2

$ dbctl set default --cpu=70,60,50,40
+

changes default cpu limits.

All new limits will be applied immediately

To unrestrict user: +

$ dbctl unrestrict username
+

To unrestrict all users: +

$ dbctl unrestrict-all 
+

To restrict user: +

$ dbctl restrict dbgov
+

To restrict user to level 2 restriction: +

$ dbctl restrict dbgov --level=2
+

To make Governor to ignore user: +

$ dbctl ignore username
+

Delete user's limits, and use defaults instead: +

$ dbctl delete username
+

Show limits as bytes: +

$dbctl list --bb
+

lveinfo --dbgov

$ lveinfo --dbgov --help
+

Displays information about DB Governor historical usage

Usage:

lveinfo [OPTIONS]
+

Optional arguments:

-h, --help show this help message and exit
-u USER, --user USER system user name
--id ID user id
-l LIMIT, --limit LIMIT max number of results to display, if 0 – no limit
--by-usage ALIAS [ALIAS ...] show LVEs with usage (averaged) within 90 percent of the limit;
available values:
COLUMN_NAMEALIAS–DESCRIPTION
cpuCPUaverage CPU usage
ioIOaverage IO usage
-p 0..100, --percentage 0..100 defines percentage for the --by-usage option; default is 90
-o ALIAS, --order-by ALIAS orders results by one of the following:
ALIAS – DESCRIPTION
con – average connections (deprecated)
cpu – average CPU usage
read – average READ usage
write – average WRITE usage
io – average READ+WRITE usage
-b ALIAS [ALIAS ...], --format ALIAS [ALIAS ...] show only specific fields into output:
COLUMN_NAME – ALIAS – DESCRIPTION
tsTS – timestamp records
usernameUSER – user name
idIDuser id
cpuCPU – average CPU usage
readREAD – average READ usage
writeWRITE – average WRITE usage
conCON – average connections (deprecated)
lcpulCPU – CPU limit
lreadlREAD – READ limit
lwritelWRITE – WRITE limit
-RESTRICTC - CPU restrict, R - read restrict, W - write restrict
--show-all full output (show all limits); brief output is default
--server_id SERVER_ID, --server-id SERVER_ID used with central database for multiple servers, default is 2d823047-a
--time-unit TIME_UNIT time step for grouping statistic in minutes; 1 min. by default; can use m,h,d suffixes or can use dyn[amic] for using in the v1 mode; for example: 1h or 1h30m or 1d12h
-c [PATH], --csv [PATH] save statistics in CSV format; - by default (output to screen)
-j, --json display output in JSON format
-f FROM, --from FROM run report from date and time in the [YY]YY-MM-DD[ HH:MM] format; if not present, the last 10 minutes are assumed
-t TO, --to TO run a report up to date and time in the [YY]YY-MM-DD[ HH:MM] format; if not present, reports results up to now
--period PERIOD time period; specify minutes with m, hours with h, days with d and values: today, yesterday; 5m - last 5 minutes, 4h - last four hours, 2d - last 2 days, as well as today

dbgovchart

dbgovchart is analog of lvechart tool to create charts representing customer's to MySQL usage

Usage: /usr/sbin/dbgovchart [OPTIONS]

Acceptable options are: +

--help      This help screen
+--version   Version number
+--from=     Run report from date and time in YYYY-MM-DD HH:MM format
+            if not present last 10 minutes are assumed
+--to=       Run report up to date and time in YYYY-MM-DD HH:MM format
+            if not present, reports results up to now
+--period=   Time period
+            specify minutes with m,  h - hours, days with d, and values:
+            today, yesterday
+            5m - last 5 minutes, 4h - last four hours, 2d - last 2 days,
+            as well as today
+--user=     mysql username
+--output=   Filename to save chart as, if not present, output will be sent to STDOUT
+--show-all  Show all graphs (by default shows graphs for which limits are set)
+

Charts examples:

PHP Selector

/usr/bin/alt-php-mysql-reconfigure.py Reconfigures alt-php extensions to use correct MySQL library, based on the one installed in the system.

selectorctl

selectorctl is a new tool that replaces cl-selector (which is deprecated and should not be used anymore) and piniset. It is available starting with CageFS 5.1.3.

All new features will be implemented as part of selectorctl.

Common options

--interpreter (-i) : chooses the interpreter to work with. Currently only PHP is supported. If omitted, --interpreter=php is implied.
--version (-v) : specifies alternatives version to work with
--user (-u) : specifies user to take action upon.
--show-native-version (-V) : prints the version of native interpreter

Global options

The global options modify settings in /etc/cl.selector/defaults.cfg file.

--list (-l) : lists all available alternatives for an interpreter. For instance on server with Alt-PHP installed, it produces the following output. Columns are: short alternative version, full alternative version and path to php-cgi binary.
$ selectorctl --list
5.2 5.2.17 /opt/alt/php52/usr/bin/php-cgi
5.3 5.3.28 /opt/alt/php53/usr/bin/php-cgi
5.4 5.4.23 /opt/alt/php54/usr/bin/php-cgi
5.5 5.5.7 /opt/alt/php55/usr/bin/php-cgi
--summary (-S) : prints alternatives state summary. Output format: alternative version, state ('e' for 'enabled', '-' otherwise), chosen as default one or not ('d' for 'default', '-' otherwise). For example:
$ selectorctl --summary
5.2 e -
5.3 e -
5.4 e -
5.5 e -
native e d
if used with --show-native-version displays version for native interpreter:
$ selectorctl --summary --show-native-version
5.2 e -
5.3 e -
5.4 e -
5.5 e -
native(5.3) e d
--current (-C) : prints currently globally selected default version (it is stored in /etc/cl.selector/defaults.cfg file):
$ selectorctl --current
native native /usr/bin/php
If used with --show-native-version , native interpreter version is displayed as well:
--current --show-native-version
native(5.3) native(5.3.19) /usr/bin/php
--set-current (-B): sets specified version as globally default one (in /etc/cl.selector/defaults.cfg file). For example, to set current default version of PHP to 5.4, use:
$ selectorctl --set-current=5.4
--disable-alternative (-N): adds state=disabled option to alternative section. With it a corresponding alternative gets removed from user alternatives selection list. For instance to disable PHP 5.2, run:
$ selectorctl --disable-alternative=5.2
--enable-alternative (-Y): Enables alternative version, removes state=disabled option, if present, from alternative section. For example to enable PHP 5.2:
$ selectorctl --enable-alternative=5.2
--enable-extensions (-E): enables extensions for particular PHP version by adding comma-separated list of extensions of modules for alternative in /etc/cl.selector/defaults.cfg . Requires --version option. For example:
$ selectorctl --enable-extensions=pdo,phar --version=5.2
--disable-extensions (-D): removes extensions for a particular PHP version. Comma-separated list of extensions will be removed from /etc/cl.selector/defaults.cfg . Requires --version . Example:
$ selectorctl --disable-extensions=pdo,phar --version=5.2
--replace-extensions (-R): replaces all extensions for particular PHP version to the list of comma separated extensions. Requires --version option . Example:
$ selectorctl --replace-extensions=pdo,phar --version=5.2
--list-extensions (-G): lists extensions for an alternative for a particular version. Requires --version . Example:
$ selectorctl --list-extensions --version=5.3
~ xml
- xmlreader
- xmlrpc
- xmlwriter
- xrange
+ xsl
Plus sign (+) stands for 'enabled', minus (–) for 'disabled', tilde (~) means compiled into interpreter or enabled in php global config file /opt/alt/phpXX/etc/php.ini. Enabled and disabled state relates to presence in /etc/cl.selector/defaults.cfg file.

End user options

All end user settings are contained in individual user's alt_php.ini files and controlled using selectorctl command.

--user-summary (-s): prints user alternatives state summary. Example:
$ selectorctl --user-summary --user=user1
5.2 e - -
5.3 e - -
5.4 e - -
5.5 e - -
native e d s
Columns are: alternative version, state ('e' for 'enabled', '-' otherwise), chosen as default one or not('d' for 'default', '-' otherwise), selected as user default one or not ('s' for 'selected', '-' otherwise). If used with --show-native-version , version for native interpreter is shown in parenthesis:
$ selectorctl --user-summary --user=user1 --show-native-version
5.2 e - -
5.3 e - -
5.4 e - -
5.5 e - -
native(5.3) e d s
--user option is required.
--current (-c): prints currently globally selected default version (in /etc/cl.selector/defaults.cfg file):
$ selectorctl --current
5.3 5.3.28 /opt/alt/php53/usr/bin/php-cgi
If used with --show-native-version to display native version:
$ selectorctl --user-current --user=user1
5.3 5.3.28 /opt/alt/php53/usr/bin/php-cgi
--user option is required.
--set-user-current (-b): sets specified version as the one to use for this end user:
$ selectorctl --set-user-current=5.4 --user=user1
changes user symlinks for the PHP interpreter to point to alternative 5.4.
--user option is required.
--enable-user-extensions (-e): Enables comma-separated list of extensions for the user user. Information is saved to alt_php.ini file. Requires --version and --user options.
$ selectorctl --enable-user-extensions=pdo,phar --version=5.2 --user=user1
--disable-user-extensions (-d): Disables extensions provided as comma-separated list. Requires --version and --user options.
$ selectorctl --disable-user-extensions=pdo,phar --version=5.2 --user=user1
--for-all-users: Allows to enable/disable extensions for all users with the required PHP version. Works only with --enable-user-extensions or --disable-user-extensions option.
$ selectorctl --enable-user-extensions=gd --version=5.3 --for-all-users

$ selectorctl --disable-user-extensions=gd --version=5.3 --for-all-users
--replace-user-extensions (-r): Replaces extensions with a provided comma-separated list of extensions Requires --version and --user options:
$ selectorctl --replace-user-extensions=pdo,phar --version=5.2 --user=user1
--reset-user-extensions (-t): Resets extensions for end user to default list of extensions as defined in default.cfg . Requires --version and --user options.
$ selectorctl --reset-user-extensions --version=5.2 --user=user1
--list-user-extensions (-g): lists enabled user extensions for an alternative. Requires --version and --user options.
$ selectorctl --list-user-extensions --version=5.3 --user=user1
xml
xmlreader
xmlrpc
if --all option present, command will list all alternatives extensions marked enabled or disabled for given user. For example:
$ selectorctl --list-user-extensions --version=5.3 --user=user1 --all
- xmlreader
- xmlrpc
- xmlwriter
- xrange
+ xsl
Plus sign (+) stands for 'enabled', minus (–) stands for 'disabled'. Enabled and disabled state relates to presence or absence of corresponding extensions in user alt_php.ini file.
--add-options (-k): adds options (as in php.ini ) to user alt_php.ini file. For example:
$ selectorctl --add-options=log_errors:on,display_errors:on --version=5.2 --user=user1
adds log_error and display_errors options with values 'on' to user alt_php.ini file overwriting default values for a user. Requires --version and --user options.
--replace-options (-m): replaces all options in user alt_php.ini file with specified ones. Requires --version and --user options.
$ selectorctl --replace-options=log_errors:on,display_errors:on --version=5.2 --user=user1
--delete-options (-x): removes custom options from user alt_php.ini file. Requires --version and --user options.
$ selectorctl --delete-options=log_errors,display_errors --version=5.2 --user=user1
--print-options (-P): print options from /etc/cl.selector/php.conf file with default values or ones overwritten in user's alt_php.ini file.
$ selectorctl --print-options --version=5.2 --user=user1
TITLE:allow_url_fopen
DEFAULT:On
COMMENT:Allows PHP file functions to retrieve data from remote
locations over FTP or HTTP. This option is a great security risk,
thus do not turn it on without necessity.
TYPE:bool
...
Requires --user option. --version option is optional. When --version is omitted, options for current selected version will be printed. By default outputs as plain test. If --json , --csv , --perl is specified, outputs data in corresponding format. For example, with --perl option, the output is perl hash structure that can be evaluated.
--reset-options (-z): removes custom options from alt_php.ini files for ALL users and versions. Backup files in home folders are cleared.
$ selectorctl --reset-options
The ranges of affected customers or versions can be narrowed with --version or --user options :
$ selectorctl --reset-options --user=user1,user2 --version=5.3,5.4
--list-users (-L): list users that use particular version of interpreter, specified with --version option. For example, to see all users that use PHP version 5.3:
$ selectorctl --list-users --version=5.3
--change-to-version (-T): changes all (or particular user) from one interpreter version to another.
$ selectorctl --change-to-version=5.2 --version=5.3

Additional options

--base64 (-Q) Sometimes PHP options values can contain commas and other symbols that break command line formatting. In such a case convert a key:value pair into base64 and pass it as value for option-related arguments. For example, to add disable_functions=exec,popen,system and display_errors=on to user options, do the following:
$ selectorctl --add-options=echo disable_functions:exec,popen,system|base64 -w 0,echo display_errors:on|base64 -w 0 --version=5.2 --user=user1 --base64
Option -w 0 of base64 executable stands for 'disable wrapping of lines' . Without it base64 output will break the command.
--quiet makes selectorctl continue when it encounter option not found in php.conf. Without it selectorctl exits with error.

Python Selector

New Python Selector

Warning!

selectorctl command line tool is not supported in the new Python Selector. You can use cloudlinux-selector command line tool instead.

Below, there is a list of commands hoster and end user can run in a command line.

Hoster

Note

When running user command as root, please use --user option.

  • Get all Python-related information: default version, a list of supported versions, status of Python Selector, a list of users, their applications, etc:

    cloudlinux-selector [get] [--json] --interpreter python
    +

    JSON output for get command:

{
+  "selector_enabled": true | false, 
+  "default_version": "2.7.15", 
+  "result": "success", 
+  "timestamp": 1508667174.220027,
+  “cache_status”: “ready”,         //  or “updating” during automatic yum cache rebuild
+  "available_versions": {   //  begin of  “versions”
+      "2.7.15" : {   //   begin of version "2.7.15"
+          "status": "enabled",  //  enabled, disabled, not_installed, installing, removing, locked
+          “base_dir”: “/opt/alt/alt-python27”   //  empty when version is not installed
+          “users”: {   //  begin of  “users”
+              “user1”: {   //  begin of “user1”
+	“homedir”: “/home/user1”,		
+                 “applications”: {    //  begin of “applications”
+                     “apps_dir/app1” : {   //   begin of application “apps_dir/app1”
+                         “domain”: “cltest1.com”,
+                         “app_uri”: “apps/my-app1”,
+                         “startup_file” : “run.py”,
+                         “entry_point” : “app”,
+                         “app_status” : “started”,   // ‘started’ or ‘stopped’
+                         “config_files” : [
+                             “requirements.txt”,
+                             “requirements-migration.txt”
+                         ],
+                         “env_vars” : {
+                             “var1” : “value1”,
+                             “var2” : “value2”
+                         },
+                     },   // end of application “apps_dir/app1”
+                     “apps_dir/app2” : {    //   begin of application “apps_dir/app2”
+                          << data for application “apps_dir/app2”  (same structure as for application “apps_dir/app1” above) >>
+                     },   //  end of application “apps_dir/app2”
+                 },   //  end of “applications”
+              },   //  end of “user1”
+              “user2”: {   //  begin of “user2”
+                  << data for user “user2”  (same structure as for “user1” above) >>
+              },   //  end of “user2”
+          },   // end of “users”
+        },    //  end of version “2.7.15”
+      "8.21.5" : {   //   begin of version "3.3.7"
+            << data for version "3.3.7"  (same structure as for version “2.7.15” above) >>
+        },    //  end of version “3.3.7”
+    },    //  end of “versions”
+}   //   end of json
+
  • Set default version, supported versions, and status of Python Selector:

    cloudlinux-selector set [--json] --interpreter python (--selector-status <enabled,disabled> | --default-version <str> | --supported-versions <str>)
    +

Examples

  1. Enable Python Selector:

    cloudlinux-selector set --json --interpreter python --selector-status enabled
    +
  2. Set default Python Selector version as 3.3:

    cloudlinux-selector set --json --interpreter python --default-version 3.3
    +
  3. Set supported Python Selector version as 3.3:

    cloudlinux-selector set --json --interpreter python --supported-versions='{"2.7": false, "3.3": true}'
    +
  4. Install a specific Python version:

    cloudlinux-selector install-version --json --interpreter python --version 2.7
    +
  5. Uninstall a specific Python version:

    cloudlinux-selector uninstall-version --json --interpreter python --version 2.7
    +
  6. Enable a specific Python version:

    cloudlinux-selector enable-version --json --interpreter python --version 2.7
    +
  7. Disable a specific Python version:

    cloudlinux-selector disable-version --json --interpreter python --version 2.7
    +
  • Change version for an application: +
    • For a specific application:

      cloudlinux-selector set [--json] --interpreter python --user <str> --app-root <str> --new-version <str>
      +
    • For all applications that use specific Python version:

      cloudlinux-selector change-version-multiple --json --interpreter python --from-version <str> --new-version <str>
      +
    • For multiple applications:

      cloudlinux-selector change-version-multiple --json --interpreter python --data  <pairs user:app-root as json> --new-version <str>
      +

Examples

  1. Change version for a specific application:

    cloudlinux-selector set --json --interpreter python --user user1 --app-root apps_dir/app1 --new-version 2.7
    +
  2. Change version for all applications that use version 2.7.15 to version 3.3.5:

    cloudlinux-selector change-version-multiple --json --interpreter python --from-version 2.7 --new-version 3.3
    +
  3. Change version of multiple application(s) and/or multiple users:

    cloudlinux-selector change-version-multiple --json --interpreter python --data <pairs user:app-root as json> --new-version <str>
    +

Example

cloudlinux-selector change-version-multiple --json --interpreter python --data [ {“user”: “user1”, “app_root”: “apps/app1”}, {“user”: “user2”, “app_root”: “apps/app1”} ]  --new-version 2.7
+

Common output for all set commands:

in case of success:

{
+  "result": "success", 
+  "timestamp": 1508666792.863358
+}
+

in case of error:

{
+  "result": "Some error message",
+  "details" : "Traceback: ..." ,
+  "context": {},
+  "timestamp": 1508666792.863358
+}
+

in case of warning:

{
+  "result": "success",
+  "warning" : "Some warning message" ,
+  "context": {},
+  "timestamp": 1508666792.863358
+}
+

End user

Note

To start all users CLI commands use cagefs_enter command:

/bin/cagefs_enter.proxied /usr/sbin/cloudlinux-selector --json <other parameters>
+
  • Get config file for the user application:

    cloudlinux-selector read-config [--json] --interpreter python  [--user <str> | --domain <str>] --app-root <str> --config-file <name>
    +

    JSON output:

    {
    +  	"result": "success", 
    + "timestamp": 1508666792.863358
    + 	 “data”: “content of config file as Base64 encoded string”
    +}
    +

    Example:

    cloudlinux-selector read-config --json --interpreter python  --user user1 --app-root app_dir/app1 --config-file requirements.txt
    +
  • Save config file for user application:

    cloudlinux-selector save-config [--json] --interpreter python  [--user <str> | --domain <str>] --app-root <str> --config-file <path> --content <content of config file as Base64 encoded string>
    +

    JSON output (the same as for all set commands):

    {
    +  	"result": "success", 
    +"timestamp": 1508666792.863358
    +}
    +

    Example:

    cloudlinux-selector save-config --json --interpreter python  --user user1 --app-root app_dir/app1 --config-file requirements.txt  --content VGh1ICAyIE5vdiAxMDo0MzoxMiBFRFQgMjAxNwo=
    +

    Note

    An output for all commands below is like in Hoster’s CLI, but filtered out by username.

  • Get a list of applications for a specific user:

    cloudlinux-selector [get] [--json] --interpreter python  [--user <str> | --domain <str>]
    +

    Example:

    cloudlinux-selector get --json --interpreter python  --user user1
    +
  • Create user application:

    cloudlinux-selector create [--json] --interpreter python  [--user <str> | --domain <str>]  --app-root <str> --app-uri <str> [--version <str>]  [--startup-file <str>] [--entry-point <str>] [--env-vars <json string>]
    +

    Example:

    cloudlinux-selector create --json --interpreter python --app-root my_apps/app1 --domain xyz.com --app-uri apps/app1 --version 2.7 --startup-file run.py --entry-point app
    +
  • Start, restart, stop, and destroy user application:

    cloudlinux-selector (start | restart | stop | destroy) [--json] --interpreter python [--user <str> | --domain <str>] --app-root <str>
    +

    Example:

    cloudlinux-selector start --json --interpreter python --user user1 --app-root my_apps/app1
    +
  • Set a custom path for Passenger log files:

    Example:

    cloudlinux-selector --json create --interpreter=python --version=3.3 --user=cltest1 --app-root=p_app2 --app-uri=p_app2_uri --passenger-log-file=/home/cltest1/passenger.log
    +
  • Remove a custom path for Passenger log files:

    Example:

    cloudlinux-selector --json set --interpreter=python --user=cltest1 --app-root=p_app1 --passenger-log-file=""
    +
  • Change properties for an application:

    cloudlinux-selector set [--json] --interpreter python  [--user <str> | --domain <str>] --app-root <str> [--app-mode <str>]  [--new-app-root <str>]  [--new-domain <str>]  [--new-app-uri <str>]  [--new-version <str>]  [--startup-file <str>] [--entry-point <str>] [--env-vars <json string>] [--config-files <str>]
    +

    Example:

    cloudlinux-selector set --json --interpreter python  --user user1 --app-root my_apps/app1 --app-mode production  --new-app-root new_apps/new_app1  --new-domain new.xyz.com --new-app-uri new_apps/app1  --new-version 8  --startup-file new_app.js --env-vars { “var1” : “value1”, “var2” : “value2” }  --config-files requirements.txt,reqs.txt
    +
  • Run PIP install for user application:

    cloudlinux-selector install-modules [--json] --interpreter python  [--user <str> | --domain <str>] --app-root <str> --requirements-file <path>
    +

    Example:

    cloudlinux-selector install-modules --json --interpreter python --user user1 --app-root my_apps/app --requirements-file requirements.txt
    +
  • Optional: install or uninstall Python packages for user application:

    cloudlinux-selector (install-modules|uninstall-modules) [--json] --interpreter python  [--user <str> | --domain <str>] --app-root <str> --modules <module1[,module2...]>
    +

    Example:

    cloudlinux-selector install-modules --json --interpreter python --user user1 --app-root my_apps/app --modules json-annotate,termcolor
    +
  • Optional: run Python script in virtual environment of user application, arguments <args> are passed to the script:

    cloudlinux-selector run-script [--json] --interpreter python  [--user <str | --domain <str>>] --app-root <str> --script-name <str> [-- <args>...]
    +

    Example:

    cloudlinux-selector run-script --json --interpreter python --user user1 --app-root my_apps/app --script-name test_script -- --script_opt1 --script_opt2 script_arg1 script_arg2
    +

    JSON output:

    {
    +  	"result": "success", 
    + 	"timestamp": 1508666792.863358
    +   	“data”: “script output as Base64 encoded string”
    +}
    +

Old Python Selector

Warning!

selectorctl command line tool is not supported in the new Python Selector. You can use cloudlinux-selector command line tool instead.

To create application run:

/usr/bin/selectorctl --interpreter=python --version=VERSION [--user=USER] [--print-summary] [--json] --create-webapp <FOLDER_NAME> <URI>
+

To delete application:

/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --destroy-webapp <FOLDER_NAME>
+

To change application folder name:

/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --relocate-webapp <FOLDER_NAME> <NEW_FOLDER_NAME>
+

To change application URI :

/usr/bin/selectorctl --interpreter=<python|ruby> [--user=USER] [--print-summary] [--json] --transit-webapp <FOLDER_NAME> <NEW_URI>
+

To change application interpreter version:

/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --set-user-current --version=<NEW VERSION> <FOLDER_NAME>
+

To set application WSGI handler ( Python only):

/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --setup-wsgi=<file_path:callable> <FOLDER_NAME>
+

To install modules to application environment:

/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --enable-user-extensions=<module1[,module2...]> <FOLDER_NAME>
+

To remove modules from application environment:

/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --disable-user-extensions=<module1[,module2...]> <FOLDER_NAME>
+

To list modules installed in application environment:

/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --list-user-extensions <FOLDER_NAME>
+

To print applications summary for a user:

/usr/bin/selectorctl --interpreter=python [--user=USER] [--json] --user-summary
+

To list available interpreters:

/usr/bin/selectorctl --interpreter=python [--user=USER] [--json] --list
+

Ruby Selector

To create application run: +

/usr/bin/selectorctl --interpreter=ruby --version=VERSION [--user=USER] [--print-summary] [--json] --create-webapp <FOLDER_NAME> <URI>
+
+To delete application: +
/usr/bin/selectorctl --interpreter=ruby [--user=USER] [--print-summary] [--json] --destroy-webapp <FOLDER_NAME>
+
+To change application folder name: +
/usr/bin/selectorctl --interpreter=ruby [--user=USER] [--print-summary] [--json] --relocate-webapp <FOLDER_NAME> <NEW_FOLDER_NAME>
+

To change application URI : +

/usr/bin/selectorctl --interpreter=ruby [--user=USER] [--print-summary] [--json] --transit-webapp <FOLDER_NAME> <NEW_URI>
+

To change application interpreter version: +

/usr/bin/selectorctl --interpreter=ruby [--user=USER] [--print-summary] [--json] --set-user-current --version=<NEW VERSION> <FOLDER_NAME>
+

To restart application: +

selectorctl --interpreter ruby --user cltest1 --domain cltest1.com --restart-webapp testapp
+
+To choose Ruby version: +
selectorctl --interpreter=ruby --user=$USER -v 2.0
+

Node.js Selector

Below is a list of commands hoster and end user can run in a command line.

Hoster

Get information related to Node.js: default version, list of supported versions, status of Node.js Selector , list of users, their applications, etc: +

cloudlinux-selector [get] [--json] --interpreter nodejs
+

JSON output for get command: +

{  
+"selector_enabled": true | false,   
+"default_version": "6.11.3",   
+"result": "success",   
+"timestamp": 1508667174.220027  
+"cache_status": "ready"         //  or “updating” during automatic yum cache rebuild  
+"available_versions": {   //  begin of  “versions”
+      "6.11.3" : {   //   begin of version "6.11.3"
+		"name_modifier": "",
+		"status": "enabled",  //  enabled, disabled, not_installed, installing, removing
+		“base_dir”: “/opt/alt/alt-nodejs6”   //  empty when version is not installed
+		“users”: {   //  begin of  “users”                      
+			“user1”: {   //  begin of “user1”
+				“homedir”: “/home/user1”,
+				“applications”: {    //  begin of “applications”
+					“apps_dir/app1” : {   //   begin of application “apps_dir/app1”
+						“domain”: “cltest1.com”,
+						“app_uri”: “apps/my-app1”,
+						“app_mode” : “development”,
+						“startup_file” : “app.js”,
+						“app_status” : “started”,   // ‘started’ or ‘stopped’
+						“config_files” : [
+							“package.json”,
+							“gruntfile.js”
+						],
+						“env_vars” : {
+							“var1” : “value1”,
+							“var2” : “value2”
+						},
+					},   // end of application “apps_dir/app1”
+					“apps_dir/app2” : {    //   begin of application “apps_dir/app2”
+						<< data for application “apps_dir/app2”  (same structure as for application “apps_dir/app1” above) >>
+					},   //  end of application “apps_dir/app2”
+				},   //  end of “applications”
+			},   //  end of “user1”
+			“user2”: {   //  begin of “user2”
+				<< data for user “user2”  (same structure as for “user1” above) >>
+			},   //  end of “user2”
+		},   // end of “users”
+	},    //  end of version “6.11.3”
+	"8.21.5" : {   //   begin of version "8.21.5"
+		<< data for version "8.21.5"  (same structure as for version “6.11.3” above) >>
+	},    //  end of version “8.21.5”
+},    //  end of “versions”}   //   end of json
+

Set default version, supported versions, and status of Node.js Selector : +

cloudlinux-selector set [--json] --interpreter nodejs (--selector-status <enabled,disabled> | --default-version <str> | --supported-versions <str>)
+

Note

Node.js Selector is disabled by default. If an available Node.js version is not installed Node.js Selector is always disabled and it is impossible to enable it.

To set default Node.js version, please use the following command (note that required Node.js version should be enabled): +

cloudlinux-selector set --json --interpreter=nodejs --default-version=<ver>
+

Examples:
+This command enables Node.js Selector :

cloudlinux-selector set --json --interpreter nodejs --selector-status enabled
+

This command sets default Node.js version as 6: +

cloudlinux-selector set --json --interpreter nodejs --default-version 6
+

This command sets supported Node.js version as 8: +

cloudlinux-selector set --json --interpreter nodejs --supported-versions='{"6": false, "8": true}'
+

Install required Node.js version: +

cloudlinux-selector install-version --json --interpreter nodejs --version 8
+

Uninstall required Node.js version: +

cloudlinux-selector uninstall-version --json --interpreter nodejs --version 8
+

Enable required Node.js version: +

cloudlinux-selector enable-version --json --interpreter nodejs --version 8
+

Disable required Node.js version (note that it is impossible to disable default Node.js version): +

cloudlinux-selector disable-version --json --interpreter nodejs --version 8
+

Change version for application(s): +

cloudlinux-selector set [--json] --interpreter nodejs ((--user <str> |  --domain <str>) --app-root <str> | --from-version <str>) --new-version <str>
+

Examples :
+This command changes version for the specific application: +

cloudlinux-selector set --json --interpreter nodejs --user user1 --app-root apps_dir/app1 --new-version 8
+

Common output for all set commands:

in case of success : +

{  "result": "success",   "timestamp": 1508666792.863358}
+

in case of error:

{  "result": "Some error message",  "details" : "Traceback: ..." ,  "context": {},  "timestamp": 1508666792.863358}
+

in case of warning:

{  "result": "success",  "warning" : "Some warning message" ,  "context": {},  "timestamp": 1508666792.863358}
+

To resolve issues related to install-version/uninstall-version commands (because they are running in the background) you may use this log file /var/log/cl-nodejs-last-yum.log +It contains full yum output from the latest performed operation (install or uninstall) and it will be rewritten with each operation.

End user

DANGER

options --user and --domain are mutually exclusive now.

Get config file for the user applications

cloudlinux-selector read-config [--json] --interpreter nodejs  [(--user <str> |  --domain <str>)] --app-root <str> --config-file <name>
+

JSON output:

{
+    "result": "success",
+	"timestamp": 1508666792.863358
+	"data": "content of config file as Base64 encoded string"
+}
+

Example:

This command gets config file for user1 ’s application app1 :

cloudlinux-selector read-config --json --interpreter nodejs  --user user1 --app-root app_dir/app1 --config-file package.json
+
+Save config file for the user applications +
cloudlinux-selector save-config [--json] --interpreter nodejs  [(--user <str> | --domain <str>)] --app-root <str> --config-file <path> --content <content of config file as Base64 encoded string>
+

JSON output (the same as for all set commands):

{
+          "result": "success",
+		  "timestamp": 1508666792.863358
+}
+

Example:
+This command saves config file for user1 ’s application app1 :

cloudlinux-selector save-config --json --interpreter nodejs  --user user1 --app-root app_dir/app1 --config-file package.json  --content                                         VGh1ICAyIE5vdiAxMDo0MzoxMiBFRFQgMjAxNwo=
+
+Get a list of applications for the specific user +
cloudlinux-selector [get] [--json] --interpreter nodejs  [(--user <str> |  --domain <str>)]
+

Example:
+This command gets a list of applications for the user1 :

cloudlinux-selector get --json --interpreter nodejs  --user user1
+
+Create user application +
cloudlinux-selector create [--json] --interpreter nodejs [(--user <str> | --domain <str>)] --app-root <str> --app-uri <str> [--version <str>] [--app-mode <str>] [--startup-file <str>] [--env-vars <json string>]
+

Example:
+This command creates user1 's application for the domain xyz.com : +

cloudlinux-selector create --json --interpreter nodejs --user user1 --app-root my_apps/app1 --app-uri apps/app1
+
+or +
cloudlinux-selector create --json --interpreter nodejs --app-root my_apps/app1 --domain xyz.com --app-uri apps/app1
+
+Start, restart, stop, and destroy user application +
cloudlinux-selector (start | restart | stop | destroy) [--json] --interpreter nodejs  [(--user <str> | --domain <str>)] --app-root <str>
+

Example: +This command starts user1 's application: +

cloudlinux-selector start --json --interpreter nodejs --user user1 --app-root my_apps/app1
+
+Change properties for an application +
cloudlinux-selector set [--json] --interpreter nodejs  [(--user <str> | --domain <str>)] --app-root <str> [--app-mode <str>] [--new-app-root <str>] [--new-domain <str>] [--new-app-uri <str>] [--new-version <str>] [--startup-file <str>] [--env-vars <json string>]
+

Examples:

This command sets a custom path for Passenger log files: +

cloudlinux-selector --json create --interpreter=nodejs --user=cltest1 --app-root=p_app2 --app-uri=p_app2_uri --passenger-log-file=/home/cltest1/passenger.log
+

This command removes a custom path for Passenger log files: +

cloudlinux-selector --json set --interpreter=nodejs --user=cltest1 --app-root=p_app1 --passenger-log-file=""
+

Example 1: +This command sets a production mode, new domain new.xyz.com , new Node.js version 8, new URI , new application root directory and new startup file for user1 application located on the domain xyz.com : +

cloudlinux-selector set --json --interpreter nodejs  --user user1 --app-root my_apps/app1 --mode production  --new-app-root new_apps/new_app1  --new-domain new.xyz.com --new-app-uri new_apps/app1  --new-version 8  --startup-file new_app.js --env-vars '{ "var1" : "value1", "var2" : "value2" }'
+

Example 2:

cloudlinux-selector set --json --interpreter nodejs  --domain xyz.com --app-root my_apps/app1 --mode production  --new-app-root new_apps/new_app1  --new-domain new.xyz.com --new-app-uri new_apps/app1  --new-version 8  --startup-file new_app.js --env-vars '{ "var1" : "value1", "var2" : "value2" }'
+

Note

When changing Node.js version all replies from web application to get request will be checked in Node.js Selector (before and after version changing). HTTP response codes and MIME type are comparing. So, make sure application is available via http(s) at least locally.

Run npm install command for the user application +

cloudlinux-selector install-modules [--json] --interpreter nodejs  [(--user <str> |  --domain <str>)] --app-root <str>
+

Example: +This command runs npm install for user1 application:

cloudlinux-selector install-modules --json --interpreter nodejs --user user1 --app-root my_apps/app
+

Note

All replies from web application to get request will be checked in Node.js Selector (before and after modules installation). HTTP response codes and MIME type are comparing. So, make sure application is available via http(s) at least locally.

Run a script from package.json file of a user application, arguments args are passed to the script +

cloudlinux-selector run-script [--json] --interpreter nodejs  [(--user <str> | --domain <str>)] --app-root <str> --script-name <str> [-- <args>...]
+

Example: +

cloudlinux-selector run-script --json --interpreter nodejs --user user1 --app-root my_apps/app --script-name test_script -- --script_opt1 --script_opt2 script_arg1 script_arg2
+

JSON output:

{
+          "result": "success",
+		  "timestamp": 1508666792.863358
+		  "data": "script output as Base64 encoded string"
+}
+

Activate virtual environment of NodeJS: +

source <home_of_user>/nodevenv/<app_root>/<nodejs_version>/bin/activate
+

This command changes prompt to +Example:

[newusr@192-168-245-108 ~]$ source /home/newusr/nodevenv/newapp4/newapp3/8/bin/activate
+[newapp4/newapp3 (8)] [newusr@192-168-245-108 ~]$
+

After activation user can use npm and node from a virtual environment without full paths.

Apache mod_lsapi PRO

switch_mod_lsapi is the command line tool used to manage mod_lsapi PRO.

It has the following syntax:

/usr/bin/switch_mod_lsapi [OPTIONS]

[OPTIONS] can be the main and an additional (for usage together with any other main option).

Main options

Option Description
--setup setup mod_lsapi configurations for Apache, including PHP handlers setup; create native lsphp (if it doesn't exist) by doing: cp /opt/alt/php56/usr/bin/lsphp /usr/local/bin/
* NOT supported for DirectAdmin
--setup-light setup PHP handlers only
* supported for cPanel EasyApache 4 only
--uninstall uninstall mod_lsapi from Apache
* supported for cPanel (EasyApache 3 and EasyApache 4), Plesk, and servers without control panel
--enable-domain enable mod_lsapi for individual domain
* supported for cPanel EasyApache 3 only
--disable-domain disable mod_lsapi for individual domain
* supported for cPanel EasyApache 3 only
--enable-global sets up mod_lsapi as a default way to serve PHP, making it enabled for all domains. Once that mode is enabled, you cannot disable mod_lsapi for an individual domain.
* supported for cPanel only (EasyApache 3 and EasyApache 4)
--disable-global disable mod_lsapi as a default way to serve PHP, disabling mod_lsapi for all domains, including those selected earlier using
--enable-domain * supported for cPanel EasyApache 3 only
--build-native-lsphp build native lsphp for cPanel EasyApache 3
* supported for cPanel EasyApache 3 only
--build-native-lsphp-cust build native lsphp for cPanel EasyApache 3 (with custom PHP source path)
* supported for cPanel EasyApache 3 only
--check-php check PHP configuration
* NOT supported for DirectAdmin
--stat return usage statistics in JSON format; the following statistics metrics are collected:
• control panel name;
• mod_lsapi version;
• liblsapi version;
• criu version and status;
• whether mod_lsapi is enabled;
• lsapi configuration options;
• number of domains, that use mod_lsapi, per each installed PHP version including those set in PHP Selector (this metric is supported for cPanel EasyApache 4, Plesk and DirectAdmin) .

Additional options

Option Description
--verbose switch verbose level on
--force switch force mode on

The following table presents which [OPTIONS] are supported for various panels:

No Control Panel cPanel EA3 cPanel EA4 DirectAdmin Plesk InterWorx ISPManager
setup + + + custombuild + + +
setup-light - - + - - - -
uninstall + + + custombuild + + +
enable-domain - + - - - - -
disable-domain - + - - - - -
enable-global - + + custombuild - - -
disable-global - + - custombuild - - -
build-native-lsphp - + - - - - -
build-native-lsphp-cust - + - - - - -
check-php + + + - + + +
verbose + + + - + + +
force + + + - + + +
stat +
*without domain info
+
*without domain info
+ + + +
*without domain info
+
*without domain info

Website Monitoring tool and Slow Site analyzer

The cloudlinux-ssa-manager utility

The cloudlinux-ssa-manager utility allows to manage Slow Site analyzer via CLI.

Usage

# /usr/sbin/cloudlinux-ssa-manager [command] [--optional arguments]
+

Optional arguments:

-h, --help show help message and exit

Commands:

set-config set the SSA configuration
get-config get the SSA configuration
get-ssa-status get a current status of SSA
enable-ssa enable SSA
disable-ssa disable SSA
get-report get the latest report

You can use the -h, --help option with commands to get a full list of available optional arguments for each command.

Example of the /usr/sbin/cloudlinux-ssa-manager set-config --help command output:

# /usr/sbin/cloudlinux-ssa-manager set-config --help
+usage: cloudlinux-ssa-manager set-config [-h]
+                                         [--domains-number DOMAINS_NUMBER]
+                                         [--urls-number URLS_NUMBER]
+                                         [--requests-duration REQUESTS_DURATION]
+                                         [--request-number REQUEST_NUMBER]
+                                         [--time TIME]
+                                         [--correlation CORRELATION]
+                                         [--correlation-coefficient CORRELATION_COEFFICIENT]
+                                         [--ignore-list IGNORE_LIST]
+optional arguments:
+  -h, --help            show this help message and exit
+  --domains-number DOMAINS_NUMBER
+                        Size of TOP list for slow domains
+  --urls-number URLS_NUMBER
+                        Size of TOP list for slow urls
+  --requests-duration REQUESTS_DURATION
+                        The threshold value of request duration in seconds
+  --request-number REQUEST_NUMBER
+                        The threshold value of slow requests number in the
+                        period of time to mark URL as a slow one
+  --time TIME           Period of time in hours required to analyze these
+                        requests
+  --correlation CORRELATION
+                        Flag to enable or disable correlation
+  --correlation-coefficient CORRELATION_COEFFICIENT
+                        The threshold value of correlation coefficient
+  --ignore-list IGNORE_LIST
+                        List of URLs or domains that should not be included in
+                        the daily report
+

The wmt-api utility

The wmt-api utility allows to manage Website Monitoring tool via CLI.

Usage

# /usr/share/web-monitoring-tool/wmtbin/wmt-api [command] [--optional arguments]
+

Optional arguments:

-h, --help show help message and exit

Commands:

config-change set the WMT configuration using the JSON string that follows
config-get get the WMT configuration as JSON
email-get get WMT email from the config file
report-generate Generate a report JSON file
send-clickhouse Send the summary report to ClickHouse
start Start the WMT system
status Check the status of the WMT system
stop Stop the WMT system

Example of the /usr/share/web-monitoring-tool/wmtbin/wmt-api command usage:

# /usr/share/web-monitoring-tool/wmtbin/wmt-api -config-change "{\"ping_connections\":8,\"report_top\":5,\"report_email\":\"user@example.com\"}"
+

This way you can set all or only certain parameters.

X-Ray Autotracing

The cloudlinux-autotracing utility

The cloudlinux-autotracing utility allows to manage the X-Ray Autotracing via CLI.

Usage

# /usr/sbin/cloudlinux-autotracing [command] [--optional arguments]
+

Commands:

enable Enable X-Ray Autotracing
disable Disable X-Ray Autotracing
status Get current status of the X-Ray Autotracing

Optional arguments:

-h, --help Show help message and exit
--all Enable or disable for all users
{username} Enable/disable the specified user
--list-disabled Show list of disabled users

You can use the -h, --help option with commands to get a full list of available optional arguments for each command.

Example usage:

Disable user1:

# /usr/sbin/cloudlinux-autotracing disable user1
+{"result": "success"}
+

Show list of disabled users:

# /usr/sbin/cloudlinux-autotracing status --list-disabled
+{"result": "success", "disabled_users": ["user1"]}
+

Enable all:

# /usr/sbin/cloudlinux-autotracing enable --all
+{"result": "success"}
+

Other CLI tools

cldeploy

sh cldeploy --help

Usage:

-h, --help Print this message
-k, --key &lt;key&gt; Update your system to CloudLinux OS Shared with activation key
-i, --byip Update your system to CloudLinux OS Shared and register by IP
-c, --uninstall Convert CloudLinux OS Shared back to CentOS
--serverurl Use non-default registration server (default is https://xmlrpc.cln.cloudlinux.com/XMLRPC)
--components-only Install control panel components only
--conversion-only Do not install control panel components after converting
--hostinglimits Install mod_hostinglimits rpm
--skip-kmod-check Skip check for unsupported kmods
--skip-version-check Do not check for script updates
--skip-registration Don't register on CLN if already have access to CL repository
--force-hybridize Option allows to convert CloudLinux OS Shared 7 to CloudLinux OS Shared 7 Hybrid which has a newer kernel (from v1.61)
--no-force-hybridize Don't hybridize machine from CloudLinux 7 to CloudLinux 7 Hybrid automatically, even though machine has a new hardware
--to-solo-edition Convert to CloudLinux Solo edition (only allowed with --skip-registration option)
--to-admin-edition Convert to CloudLinux Admin edition (only allowed with --skip-registration option)
--to-container-environment Convert to CloudLinux which supports working inside containers
--force-packages-installation Automatically resolve dependencies and remove conflicting packages
--allow-lower-version Convert to lower minor version (Almalinux x.y to CL x.y-1) if current version (CL x.y) is not available

The script will perform the following actions:

  1. Register server with CLN.
  2. Install CloudLinux OS Shared kernel, lve libraries, lve-utils, lve-stats and pam_lve packages.
  3. Attempt to detect control panel and do the following actions:
  • For cPanel:

    • install mod_hostinglimits;
    • install LVE Manager.
  • For DirectAdmin:

    • recompile Apache to install mod_hostinglimits;
    • install LVE Manager.
  • For Plesk, ISPManager & InterWorx:

    • update httpd and install mod_hostinglimits;
    • install LVE Manager.
  • To disable installation of LVE Manager and mod_hostinglimits, please use --conversion-only option.

  • To disable installation of kernel & CLN registration, please use --components-only option.

  • To install mod_hostinglimits only, use --hostinglimits option.

Examples:

$ cldeploy --key xx-xxxxxx                            # convert RHEL/CentOS to CL by using activation key, install control panel components
+$ cldeploy --key xx-xxxxxx --force-hybridize           # convert RHEL/CentOS 7 to CL7h by using activation key, install control panel components (from v1.61)
+$ cldeploy --byip --conversion-only                   # convert RHEL/CentOS to CL by ip, don't install control panel components
+$ cldeploy --components-only                          # install control panel components on already converted system
+$ cldeploy --hostinglimits                            # update httpd and install mod_hostinglimits 
+

lvectl

lvectl is the primary tool for LVE management. To use it, you have to have administrator access. lvectl is a part of lve-utils package.

lvectl syntax

Usage: lvectl command [lveid] [options]

Commands

apply apply config settings to specified LVE
apply all apply config settings to all the LVEs
apply-many to apply LVE limits to multiple distinct LVEs (uids of users are read from stdin)
set set parameters for a LVE and/or create a LVE
set-user set parameters for a LVE and/or create a LVE using username instead of ID
list list loaded LVEs
list-user list loaded LVEs, display username instead of user id
limits show limits for loaded LVEs
delete delete LVE and set configuration for that LVE to defaults
delete-user delete LVE and set configuration for that user to defaults
destroy destroy LVE (configuration file remains unchanged)
destroy all destroy all LVE (configuration file remains unchanged)
destroy-many to destroy LVE limits to multiple distinct LVEs (uids of users are read from stdin)
package-set set LVE parameters for a package
package-list list LVE parameters for packages
package-delete delete LVE parameters for a package
paneluserslimits show current user's limits for control panel
limit limit PID into specified LVE. Parameters PID LVE_ID
release release PID from LVE. Parameters PID
set-binary add binary to be run inside LVE on execution
del-binary remove binary from being run inside LVE on execution
list-binaries list all binaries to be run inside LVE on execution
load-binaries load binaries (used on startup) from config file
reload-binaries re-load list of binaries from config file
help (-h) show this message
version (-v) version number
lve-version LVE version number
set-reseller create LVE container and set LVE parameters for a reseller
set-reseller-default set default limits for resellers users
remove-reseller delete LVE container and the record in the config, move LVE containers to the host container

Options

--enter-count enable limit for enters count (by default disabled), use only with command "limit". Supported in lve-utils-6.1.2-1 or later.
--io-and-memory enable limit for IO and memory (by default disabled), use only with command "limit". Supported in lve-utils-6.1.2-1 or later.
--cpu=N limit CPU usage; (deprecated. Use --speed)
--speed=N% limit CPU usage in percentage; 100% is one core
--speed=Nmhz\ghz limit CPU usage in mhz\ghz
--ncpu=N limit VCPU usage (deprecated)
--io=N define io limits (KB/s)
--nproc=N limit number of processes
--pmem=N limit physical memory usage for applications inside LVE
--iops=N limit io per second
--mem=N mem alias for vmem (deprecated)
--vmem=N limit virtual memory for applications inside LVE
--maxEntryProcs=N limit number of entry processes
--save save configuration settings (use with set) (deprecated)
--save-all-parameters save all parameters even if they match with defaults settings
--json returns result of command json formatted
--unlimited set all limits to unlimited
--save-username save username in the config file. This parameter is used in conjunction with set-user

Examples

  • Reset all LVEs settings based on configuration in /etc/container/ve.cfg:

    $ lvectl apply all
    +
  • Set new default CPU & Physical memory limit:

    $ lvectl set default --speed=100% --pmem=256m
    +
  • Reset all LVE's killing processes inside them:

    $ lvectl destroy all
    +
  • Show list of LVEs and their limits:

    $ lvectl list
    +

lveps

lveps tool shows information about running LVEs, processes and threads belonging to them, CPU/memory/IO usage consumed by LVEs and their individual processes/threads. LVE is only reported if it is considered active (at least one thread belongs to that LVE or was running during measurement in dynamic mode).

Usage:

lveps [-p] [-n] [-o <fmt1:width1,...>] [-d] [-c <time>] [-s <style>] [-t] [-h]
+

Options:

-p to print per-process/per-thread statistics
-n to print LVE ID instead of username
-o to use formatted output (fmt=id,ep,pid,tid,cpu,mem,io)
-d to show dynamic cpu usage instead of total cpu usage
-c to calculate average cpu usage for <time> seconds (used with -d)
-r to run under realtime priority for more accuracy (needs privileges)
-s to sort LVEs in output (cpu, process, thread, mem, io)
-t to run in the top-mode
-h to print this brief help message

Command like lveps -p will display processes running inside 'active' LVEs.

CPU The number of seconds LVE/process/thread has been running (each CPU /core is counted separately), or the average CPU load (100% is all CPU resources) if used with -d.
MEM The number of megabytes of resident memory in use by LVE/process/thread (shared memory is not included).
IO The number of kilobytes read and written in sum by LVE, or kb/sec if used with -d.
ID LVE ID or username.
EP The number of entry processes inside LVE.
COM Command name for this process.
PID PID of the process.
PNO The number of processes belonging to the LVE.
TID TID of the thread.
TNO The number of threads belonging to the LVE.
DO The number of disk operations belonging to the LVE from the time it was created.
DT Total amount of disk transfer in megabytes from LVE creation time.
IOPS The number of I/O operations per second

lvetop

lvetop utility allows to monitor LVE usage:

ID        EP PNO TNO SPEED MEM  IO   IPOS
+testuser1 0  1   1   0%    7    0    0
+testuser2 0  0   0   5%    0    3    0
+testuser3 1  2   2   0%    102  2727 0
+testuser4 0  1   1   0%    12   84   1
+testuser5 0  2   2   1%    52   0    0
+

lvetop fields:

ID user name if LVE id matches user id in /etc/passwd, or LVE id
EP number of entry processes (concurrent scripts executed)
PNO number of processes within LVE
TNO number of threads within LVE
CPU CPU usage by LVE, relative to total CPU resources of the server
MEM Memory usage by LVE, in KB
I/O I/O usage
IOPS number of read/write operations per second

cldetect

Note

lve-utils 1.2-10+

cldetect is used to detect installed software, and adjust CloudLinux OS Shared options accordingly.

Usage: +

/usr/bin/cldetect [--options]
+
cldetect -h/-h/--help show this message
--detect-cp prints control panel and its version (CP_NAME,CP_VERSION)
--detect-cp-full prints control panel, version and panel specific data (CP_NAME,CP_VERSION,...). Specific data: for ISP Manager5 - Master/Node
--detect-cp-nameonly prints control panel name (CP_NAME)
--get-admin-email prints control panel admin email (CP_ADMIN_EMAIL)
--cxs-installed check if CXS is installed. Returns 0 if installed, 1 otherwise
--cpanel-suphp-enabled check if suPHP is enabled in cPanel.Returns 0 if enabled, 1 otherwise
--detect-litespeed check if LiteSpeed is installed. Returns 0 if installed, 1 otherwise
--detect-postgresql check if PostGreSQL is installed. Returns 0 if installed, 1 otherwise
--print-apache-gid prints current apache gid
--print-da-admin prints DirectAdmin admin user
--set-securelinks-gid changes /etc/sysctl.conf if apache gid != 48 (default)
--set-nagios do some adjustments to make nagios work correctly if it's installed. Called as a part of --setup-supergids
--setup-supergids do some adjustments to make special users/software (nagios, cPanel’s mailman) work correctly if it is installed to the system
--cl-setup check if CloudLinux OS Shared is installing. Returns 0 if installing, 1 otherwise
--update-license updates license
--update-new-key updates license with new key
--check-license check license. Returns OK if license is not older than 3 days, error message otherwise
-q check license. Returns 0 if license is not older than 3 days, 1 otherwise
--no-valid-license-screen returns no valid license found screen
--license-out-of-date-email returns License out of Date Email.
--check-openvz returns enviroment id

clsupergid auto-configuration

Each time lve-utils package is installed or upgraded it does some automatic system re-configuration to make some software (like nagios) work correctly, if it’s installed, by calling cldetect --setup-supergids command.

Starting from lve-utils 3.0-21 a behaviour of cldetect --set-nagios (now, it’s a part of cldetect --setup-supergids) command slightly changed.

Old behavior New behavior
If fs.proc_super_gid is 0 (which means it’s not configured) or it’s set to some GID that doesn’t exist in the system. Command will set sysctl fs.proc_super_gid to point to Nagios GID. Command will create special clsupergid group, setup sysctl fs.proc_super_gid to point to it’s GID and add Nagios user to this group. If no such user exists, then no actions with the group will be done.

If fs.proc_super_gid was configured by an admin to some existing group, the command will just add Nagios user to this group.

cldiag

cldiag utility is included in lve-utils package and is intended for:

  • server diagnostics performed by a server administrator for detecting the most common errors in the configuration or software operation;
  • the focused check of the servers for typical errors performed by the support engineers before proceeding to the detailed analysis of the customer tickets;
  • servers automatic check by cron with the following generation of the reports and email them to the server administrator. +
    • Set option ENABLE_CLDIAG to false in config /etc/sysconfig/cloudlinux if you want to disable automatic check by cron permanently
    • Use the cldiag key --disable-cron-checkers for disabling separate checkers if you want to disable only some checkers (lve-utils >= 4.2.18-1)
    • A default email is root@localhost.localdomain. Note that the settings of the mail server can change the final email.

You can change the email in the following ways:

  • In your control panel by changing the mail server settings
  • By changing the /etc/sysconfig/cloudlinux config: +
    • Set the desired email instead of the default CP value in the EMAIL option
    • Set the CP value in the EMAIL option in the license_check section. Add an option with the path to the panel script for receiving emails:
      {PANEL_NAME}_getemail_script=/path/to/getemail_script)
      +
    {PANEL_NAME} is the name of the panel from the cldetect --detect-cp-name command output. +
    • If there is no panel script, the default email (root@localhost.localdomain) will be used.
    • The /path/to/getemail_script file should be executable and output to stdout the admin email to which an email with checks results will be sent. Note that the settings of the mail server can change the final email.

In all cases, for the negative checker result, the exit code will be > 0 (at the moment it will be equal to the number of failed checkers).

All the checkers support additional --json option with the unified output in an appropriate format.

For example:

# cldiag --symlinksifowner --json
+
+{"total_errors": 0, "Check fs.enforce_symlinksifowner is correctly enabled in /etc/sysctl.conf": {"res": "OK", "msg": "fs.enforce_symlinksifowner = 1"}}
+

Each checker returns a typical result with the name of the check performed (brief description), one of the possible statuses of its execution, and detailed information on its fail or success.

For example:

Check fs.enforce_symlinksifowner is correctly enabled in /etc/sysctl.conf:
+
+OK: fs.enforce_symlinksifowner = 1
+
+Check suexec has cagefs jail:
+
+SKIPPED: SuEXEC is not enabled
+

Possible checkers results:

  1. OK - the check succeeded.
  2. FAILED - the check revealed a problem.
  3. SKIPPED - the check was skipped as it made no sense in the actual environment (e.g. wrong control panel) or it could not be executed for some reason (e.g. no users with enabled CageFS found). Such result doesn’t mean there is a problem and can be considered as a positive.
  4. INTERNAL_TEST_ERROR - the check has failed because of a problem in the checker itself. Please report such problems using https://cloudlinux.zendesk.com/agent/.

The utility includes several built-in checkers, and can also import and run checkers from other utilities.

Currently implemented checkers:

diag-cp

Checks control panel and its configuration (for DirectAdmin only).

Checking control panel availability, thereby detecting it with our code. Displaying control panel name and version. Also, for DirectAdmin, checking if CloudLinux OS Shared support is enabled in its config.

Fails if /usr/local/directadmin/custombuild/options.conf does not contain cloudlinux=yes line (for DirectAdmin control panel).

symlinksifowner

Checks fs.enforce_symlinksifowner is correctly enabled in /etc/sysctl.conf.

Checking specified kernel setup described in this docs section for deprecated value and displaying its current value.

Fails if /proc/sys/fs/enforce_symlinksifowner contains value 2 (it is deprecated and can cause issues for the system operation).

check-suexec

Checks suexec has cagefs jail.

In case if CageFS is installed and SuEXEC is on, checking if CageFS is enabled for SuEXEC.

Fails if CageFS is not enabled for suexec binary.

check-suphp

Checks suphp has cagefs jail.

In case if CageFS is installed and SuPHP is on, checking if CageFS is enabled for SuPHP.

Fails if CageFS is not enabled for suphp binary.

check-usepam

Checks UsePAM in /etc/ssh/sshd_config.

Checking if /etc/ssh/sshd_config config file contains UsePAM yes line, which is required for pam_lve correct work with sshd.

Fails if /etc/ssh/sshd_config contains UsePAM no line.

check-symlinkowngid

Checks fs.symlinkown_gid.

First checking if user Apache is available in the system (on some panels users httpd or nobody with special GID are present instead of Apache, they are detected correctly as well). Then, if such user exists, checking that his GID equals to the one specified in sysctl or that this user belongs to this supplemental group. If these conditions are met, then the protection effect described in this docs section is applied to this user, and the appropriate message will be displayed.

Fails if Apache user is not in the group specified in /proc/sys/fs/symlinkown_gid.

check-cpanel-packages

Checks existence of all user's packages (cPanel only)

Reading PLAN= for all users from /var/cpanel/users and checking if all of them are present in /var/cpanel/packages and if not, then displaying them in pairs like user: plan. default and undefined packages are excluded from the check.

Fails if users from /var/cpanel/users/ directory have non-existing packages (packages do not exist in /var/cpanel/packages/ directory, except for undefined and default).

check-defaults-cfg

Checks /etc/cl.selector/default.cfg.

Checking that if this config exists, the default PHP version is not disabled in it. Also performing minimal syntax checks for PHP modules settings and displaying the incorrect.

Fails if there are some problems in /etc/cl.selector/default.cfg found.

Possible reasons for failure:

  • Default version is undefined, which means /etc/cl.selector/default.cfg file does not contain section [versions] with the defined default version.
  • Default PHP version is disabled.

check-cagefs

All checks for CageFS are described separately in this docs section and their start from cagefsctl utility is completely equivalent to the start from cldiag and is designed only for a better experience.

This checker includes a set of CageFS sub-checkers, failure of one (or more) of them causes general checker failure.

check-php-conf

Checks /etc/cl.selector/php.conf.

Checking the config syntax for acceptable blocks and directives.

Fails if /etc/cl.selector/php.conf has incorrect format.

  • File contains an invalid parameter (valid parameters: Directive, Default, Type, Comment, Range, Remark).

  • File contains an invalid setting for the parameter Type (valid settings for the Type parameter: value, list, bool)

check-phpselector

Checks compatibility for the PHP Selector

Detecting which PHP handler has been configured on the server and checking its compatibility with the CloudLinux OS Shared PHP Selector according to this table and displaying the corresponding message with the link to the documentation in case of a problem detected. No checks are performed for EasyApache3.

Failure reasons:

  • The installed mod_ruid package is incompatible with the PHP Selector
  • mod_suexec is not installed
  • mod_suphp is not installed
  • Absence of the /usr/local/lsws/conf/httpd_config.xml file (only for LiteSpeed server)

Note

The following checkers are available in lve-utils >= 3.1.2

check-lve-limits

Checks the validity of LVE limits on the server.

See this page for detailed description.

check-rpmdb

Warning

This checker was removed from the cldiag utility as cldiag --check-rpmdb can in some cases hang up during rpmdb check, which can brake access to the database for rpm/yum utilities.

check-hidepid

A new checker check-hidepid is available starting from lve-utils-4.2.18-1 and later. It checks if CageFS is installed and if /proc is mounted without the hidepid=2 parameter.

  • If CageFS is not installed, check-hidepid skips and outputs the following:

      Check mount with hidepid=2 option:
    +      SKIPPED: Cagefs is not installed
    +
  • If check-hidepid triggers and finds an issue, it outputs the following:

      Check mount with hidepid=2 option:
    +      FAILED: Details: hidepid protection disabled.
    +  Please, mount system with hidepid=2 for better security.
    +  Read more about hidepid option here: https://docs.cloudlinux.com/cloudlinux_os_kernel/#remounting-procfs-with-hidepid-option
    +
  • If check-hidepid triggers and it's OK, it outputs the following:

      Check mount with hidepid=2 option:
    +      OK: hidepid protection enabled
    +

check-jwt-token

This new checker is available starting from LVE-Utils 4.2.21-2

Checks the validity and presence of the JWT token which is required for correct work of client part of Centralized Monitoring.

Failure reasons:

  • The JWT token is absent in path /etc/sysconfig/rhn/jwt.token
  • The JWT token is malformed
  • The JWT token is expired.
  • The issuer of JWT token is invalid.

In all cases try running rhn_check for getting a new token.

check-cm-all

This new checker is available starting from LVE-Utils 4.2.21-2

Checks the things on a server of client which are required for correct work of client part of Centralized Monitoring:

  • Checks the validity and presence of JWT token
  • Checks that service cl_plus_sender is present, enabled and active
  • Checks that service node_exporter is present, enabled and active
  • Checks that service lvestats is present, enabled and active
  • Checks that RPM packages cl-end-server-tools and cl-node-exporter are installed

all

Performs diagnostic checks from the list:

  • check_cp_diag
  • check_symlinksifowner
  • check_suexec
  • check_suphp
  • check_use_pam
  • check_symlinkowngid
  • check_existence_of_all_users_packages
  • check_phpselector
  • check_defaults_cfg
  • check_php_conf
  • check_lve_limits
  • check_hidepid
  • check_cagefs_partition_disk_quota
  • fake_cagefs_checker

generate-email

Performs diagnostic checks (from the list above) and generates HTML report sent to the administrator's email.

cron-check

Performs the same diagnostic checks as generate-email but with considering the ENABLE_CLDIAG option in the /etc/sysconfig/cloudlinux.

Performs diagnostic checks from the list:

  • check_symlinksifowner
  • check_use_pam
  • check_symlinkowngid
  • check_existence_of_all_users_packages
  • check_lve_limits
  • check_hidepid
  • check_cagefs_partition_disk_quota
  • check_jwt_token
  • check_cl_plus_sender_service
  • check_node_exporter_service
  • check_cmt_packages
  • check_lvestats_service

doctor

Note

Available starting from lve-utils version 6.3.9-1.

This option can be used instead of the following command:

wget -qq -O - https://repo.cloudlinux.com/cloudlinux/cldoctor/cldoctor.sh | bash
+

If this option is provided cldoctor script will be downloaded to a temp directory and executed by cldiag. Also the report will be automatically sent to our support team.

cloudlinux-config

cloudlinux-config utility shows/sets various parameters related to LVE Manager UI, MySQL Governor and faults notifications for LVE-Stats 2

Usage:

cloudlinux-config get [--json] [--for-reseller resname ]
+cloudlinux-config set [--json] --data <str> [--for-reseller resname ]
+cloudlinux-config set [--json] --reset-inodes-limit
+

Commands:

get Shows the values of all supported parameters
set Sets values for supported parameters

Options

--json Sets/returns values in json format
--data Sets values from the data string that follows
--for-reseller Sets/limits the output only to the data related to reseller resname
--reset-inodes-limit Resets inode limits (in case disk quota breaks)

JSON data structure

All options are enclosed inside options (Level 0) string. All options are enclosed in " ", while values come as is. Here's an example:

'{"options":{"L1_option1":value1, "L1_option2":value2}}'
+

Each Level1 option can have nested Level2 options specified using the same syntax, the same goes for Level2 and Level3 options respectively.

LVE-Stats 2 faults notification settings

Level1 Level2 Level3 Level4 Possible values Description
faultsNotification faultsToInclude concurrentConnections true/false Include concurrent connection value in notification emails
faultsNotification faultsToInclude cpu true/false Include CPU consumption value in notification emails
faultsNotification faultsToInclude io true/false Include IO value in notification emails
faultsNotification faultsToInclude iops true/false Include IOPS value in notification emails
faultsNotification faultsToInclude mem true/false Include RAM consumption value in notification emails
faultsNotification faultsToInclude nproc true/false Include number of processes value in notification emails
faultsNotification fminimumNumberOfFaultsToNotify admin N The minimum number of faults to notify for admin
faultsNotification fminimumNumberOfFaultsToNotify user N The minimum number of faults to notify for users
faultsNotification fminimumNumberOfFaultsToNotify reseller * N The minimum number of faults to notify for reseller
faultsNotification fminimumNumberOfFaultsToNotify customer * N The minimum number of faults to notify for reseller's customers
faultsNotification notify admin period N The period of faults notifications for admin
faultsNotification notify admin unitOfTime minutes/hours/days Time units of period of faults notifications for admin
faultsNotification notify user period N The period of faults notifications for users
faultsNotification notify user|<span class="notranslate">unitOfTime</span>|<span class="notranslate">minutes</span>/<span class="notranslate">hours</span>/<span class="notranslate">days` Time units of period of faults notifications for users
faultsNotification notify reseller * period N The period of faults notifications for resellers
faultsNotification notify reseller * unitOfTime minutes/hours/days Time units of period of faults notifications for resellers
faultsNotification notify customer * period N The period of faults notifications for reseller's customers
faultsNotification notify customer*|<span class="notranslate">unitOfTime</span>|<span class="notranslate">minutes</span>/<span class="notranslate">hours</span>/<span class="notranslate">days` Time units of period of faults notifications for reseller's customers
faultsNotification notifyAdmin true/false Send faults notifications to admin
faultsNotification notifyResellerCustomers true/false Send faults notification to reseller users
faultsNotification notifyResellerOnCustomers * true/false Send users' faults notifications to the respective reseller
faultsNotification notifyReseller * true/false Send faults notification to reseller
faultsNotification notifyCustomers true/false Send faults notifications to users
faultsNotification notifyResellers true/false Send faults notification to resellers
faultsNotification email notifyCharset** utf-8/null Set charset used in email
faultsNotification email notifyFromEmail** admin@email.com/null Set email to notify from
faultsNotification email notifySubject** Subject/null Set email subject
faultsNotification email reportAdminEmail** admin@email.com/null Set admin email for notifications

Note

To reset options marked with ** set null.

Note

Options marked with * are for reseller use only

MySQL Governor settings

Level1 Level2 Level3 Level4 Possible values Description
mySQLGovSettings errorLog level DEBUG/ERROR Sets error log level
mySQLGovSettings errorLog logPath /var/log/dbgovernor-error.log Sets error log destination file
mySQLGovSettings gatherDataForDetailedStats true/false Enables gathering data for detailed statistics
mySQLGovSettings logRestrictedUsersQueries true/false Enables logging of restricted user queries
mySQLGovSettings modeOfOperation off/single/abusers/all Sets the mode of operation
mySQLGovSettings restrictLog format SHORT/MEDIUM/LONG/VERYLONG Sets the format for restrict log
mySQLGovSettings restrictLog logPath /var/log/dbgovernor-restrict.log Sets the format for restrict log
mySQLGovSettings restrictType mode period/limit Sets the restriction mode
mySQLGovSettings restrictType unlimit period N Sets the restriction expiration period
mySQLGovSettings restrictType unlimit unitOfTime seconds/minutes/hours/days Sets the restriction expiration period units of time
mySQLGovSettings restrictedTimePeriods level1 period N Sets L1 restriction time period
mySQLGovSettings restrictedTimePeriods level1 unitOfTime seconds/minutes/hours/days Sets L1 restriction time period units of time
mySQLGovSettings restrictedTimePeriods level2 period N Sets L2 restriction time period
mySQLGovSettings restrictedTimePeriods level2 unitOfTime seconds/minutes/hours/days Sets L2 restriction time period units of time
mySQLGovSettings restrictedTimePeriods level3 period N Sets L3 restriction time period
mySQLGovSettings restrictedTimePeriods level3 unitOfTime seconds/minutes/hours/days Sets L3 restriction time period units of time
mySQLGovSettings restrictedTimePeriods level4 period N Sets L4 restriction time period
mySQLGovSettings restrictedTimePeriods level4 unitOfTime seconds/minutes/hours/days Sets L4 restriction time period units of time
mySQLGovSettings restrictedTimePeriods timeout period N Sets restriction time period timeout
mySQLGovSettings restrictedTimePeriods timeout unitOfTime seconds/minutes/hours/days Sets L1 restriction time period timeout units of time
mySQLGovSettings scriptPath /path/to/script Path to script to be triggered when account is restricted
mySQLGovSettings slowQueries kill true/false Enables killing of slow queries
mySQLGovSettings slowQueries logPath /path/to/sqkill.log Sets the path to slow query kill log file
mySQLGovSettings slowQueries timeout N Time to kill slow SELECT queries for account (seconds)
mySQLGovSettings userMaxConnections N Sets the maximum number of user connections to database

LVE Manager UI settings

Level1 Level2 Possible values Description
inodeLimits showUserInodesUsage true/false Show end user inode usage
uiSettings hideLVEUserStat true/false Hide LVE end user usage statistic
uiSettings hidePHPextensions true/false Hide PHP extension selection
uiSettings hidePythonApp true/false Hide Python App in web-interface
uiSettings hideRubyApp true/false Hide Ruby App in web-interface

Examples

  • display Python/Ruby Selector in User UI (cPanel)
$ cloudlinux-config set --json --data '{"options":{"uiSettings":{"hideRubyApp":false, "hidePythonApp":false}}}'
+

cl-quota

cl-quota utility is designed to control disk quotas and provides:

  • Setting user and package limits.

  • Integration with panel packages.

  • Limits synchronization.

  • Automatic inheritance of panel limits to all appropriate users.

Note

cl-quota works only with inodes soft/hard limits (soft/hard file limits in setquota/repquota utilities terminology). Block limits are not controlled by cl-quota utility in any way, they are not taken into account and do not affect the data that they issue. That is why hereinafter it is the inode limits that are implied by the word “limits”.

General provisions

cl-quota utility never sets/reads limits directly in the system, it uses standard setquota/repquota utilities included into the quota package for this purpose.

cl-quota will not work in the following cases:

  • setquota/repquota are missing or working incorrectly;

  • the quotas are not configured in the system.

cl-quota only performs the minimal diagnostics of quota related errors:

  • verifies the availability of setquota/repquota utilities on the disk;

  • verifies if quotas are activated for a specified user (with a separate command), see below.

quota package which contains the required setquota/repquota utilities, is not included in lvemanager package dependencies by default, and quotas activation is a long process which sometimes depends on the panel used, therefore, all the steps on quotas configuration and activation must be carried out by yourself, cl-quota does not perform these actions.

Error messages sent back to the console are extremely rare, to receive error messages use the command: +

# cat /var/log/messages | grep clquota
+

Note

You should not set soft limit higher than hard limit. cl-quota does not control it in any way, but in some cases, the system can ban such limits combination and they won’t be set or will be set in some other way.

Setting limits and integration with panel packages

cl-quota utility allows setting inodes limits for users of the system.

cl-quota integrates with the panels through a standard mechanism - Integrating LVE Limits with Packages.

Panel users are such users whose UIDs are issued by the above panel integration mechanism. The list of panel packages and the information on the user's affiliation to a particular package is obtained from there as well.

When installing/reading the limits, the following peculiarities are applied:

  1. When displaying quotas, cl-quota displays information about the limits of all users - system and panel. No filter applied. The actual limit values are always displayed.

  2. Limit value -1 for the packages (see below) is displayed as dash (-).

  3. If cl-quota is running under root , it will display the limits returned by repquota utility with no changes. If it is running under some other user, it will return data from a special cache file, see Quotas cache and synchronization.

  4. Limits setting only works for panel users, for all other users limits are not set (the command is ignored). The only exception - uid=0 . The limits are never set for the root user (uid=0) , but they are stored in DB file and are used by inheritance mechanism. See Limits Inheritance.

  5. Hard and soft limits are completely independent, сl-quota does not apply any interdependencies to them. Setting only one of them (any) is acceptable, the other one will not change.

cl-quota utility also supports package limits set/read. When setting package limits, they are set for all users of a particular package except for those whose limits are set individually. See also Limits Inheritance.

If package name is "default" , then setting limits command is ignored. If some limits are set for this package in DB file, they will be displayed along with all the others, but will not be used. See also Limits inheritance.

Any positive numbers are allowed as limit values. cl-quota neither controls nor changes these values except the following cases:

negative values are taken modulo;

fractional values are converted to integers by discarding the fractional part;

if the transferred value can not be turned into a number (for example, 67wg76), it is completely ignored and the limit is not set at all.

Then these values are transmitted directly to setquota system utility for the actual setting of the limits.

Thus cl-quota has two limit values, which are processed in a special way:

  • 0: Means inheritance of the limit from the package where the user is located, or from uid=0 . See also Limits inheritance for more detailed information.

  • -1: The real limits are set to 0, which means no limits, literally "unlimited". This is legit both for individual and for package limits. Limit value -1 is stored in the database as well as any other but is never displayed.

You can use the words “default” and “unlimited” instead of 0 and -1 respectively, they are fully interchangeable. See also DB File and CLI Options.

Individual and package limits are always saved in DB file. Limits from there are used when synchronizing quotas . Please find more details in Limits Synchronization.

Also, find detailed information on DB file itself in Quotas DB File section.

Utility options are described in CLI Options section.

Limits inheritance

When setting package limits to the package users, the inheritance principle is applied. It means that:

  • If no individual limit is set to a user, then he inherits the limits of the package he belongs to.

  • If no limit is set to a package (=0), then the users inherit uid=0 limits.

Limits of the package named “default” (if found in the DB file) will always be ignored and all the users of this package will get uid=0 limits.

Caching and synchronizing the limits

Any user of the system (including panel users) is always created with limits equal to 0. To assign him the limits of the corresponding package, the synchronization process is used.

During the synchronization, cl-quota utility reads the database file and sets the limits from it to the users and packages specified therein. +This mode is designed to set the correct limits for the new users and to restore them for the existing ones. When recovering, the current limits are neither read nor analyzed.

Caching - is writing current limits to /etc/container/cl-quotas.cache file. If cl-quota is not started from the root for reading the current limits, then it returns data from this file.

When installing LVE Manager package, a special cron job is installed, which performs synchronization and caching ( cl-quota -YC ) every 5 minutes. Therefore, the correct limits will be set for the user within 5 minutes from the moment of its creation.

Caching and synchronization can also be performed separately, see "CLI Options" section.

To disable this feature add to the config file /etc/sysconfig/cloudlinux.

Quotas DB file

All cl-quota limits settings are stored in along with the UID or the name of the package the limit was set for.

When saving the limits to a file, the following rules are applied:

  • If a limit value is non-integer or non-numeric, then the rules from "Setting limits and integrating with panel packages" section are applied. The assigned value is saved to the file.

  • Limits are always saved in pairs, no matter if only one limit was set or both. The pair looks as follows: soft_limit:hard_limit .

  • The values 0 and -1, when having a predetermined meaning, are saved as is without any transformations.

  • The words “default” and “unlimited” are saved as 0 and -1 respectively.

  • If both limits for a user/package were set as 0, then such user/package is not saved in the file, and if it was previously there - it will be removed. Therefore, if a user/package is not mentioned in the file, then all its limits are inherited. See Limits Inheritance section.

The lists of panel users, packages, and user-package correspondence are not saved anywhere, this information is always subtracted from the panel.

Example: +

/etc/container/cl-quotas.dat
+[users]
+0 = 1000:2000
+500 = -1:-1
+958 = 0:20000
+[packages]
+pack1 = 5000:-1
+
+It follows that: +
  • uid=0 limits are set to 1000:2000 - all users in the default package will obtain these limits.

  • Both limits are set as unlimited for a user with uid=500, which means that its real limits will always be 0:0. The package limits do not affect this user.

  • Soft limit of the user with uid=958 is inherited (0 means inheritance), his hard limit is set to 20000 and it will not depend on the package limits or uid=0 limits.

  • Limits 5000:-1 are set for pack1 package, therefore its real limits are: soft_limit=5000 and hard_limit=0 (unlimited).

  • The users of pack1 package will get pack1 limits (5000:-1), the users of all the rest of the packages will get the limits of uid=0 because no limits are set for them. Exceptions: uid=500 and 958. uid=500 has both limits set individually, and uid=958 inherits only soft limits.

CLI options/examples

cl-quotа utility has the following command line options: +

-u | --user                  : specifies the user
+-U | --user-id              : specifies the user ID
+-S | --soft-limit            : sets the soft limit for a user. Pass 0 or 'default' to set package default limit. Pass -1 or 'unlimited' to cancel limit
+-H | --hard-limit            : sets the hard limit for a user. Pass 0 or 'default' to set package default limit. Pass -1 or 'unlimited' to cancel limit
+-V | --csv                  : returns data as comma separated values
+-p | --package              : specifies a package to set or get limits
+-P | --package-limits        : prints package limits
+-a | --all-package-limits : prints all package limits (including packages without limits)
+-Y | --sync                  : synchronizes packages and users limits with the database
+-C | --cache-content        : cache quota data to a file the database
+-F | --force                : save user quotas even when they are equal to defaults
+       --check                : check if quotas is enabled/activated/suported; if disabled show diagnostic information; using with --user or --user-id options
+

--user and --user-id options are designed to specify user whose limits are required to be set or displayed. --user specifies user name, --user-id - uid . It is acceptable to specify one or another.

--package - specifies package name.

--soft-limit , --hard-limit - specify soft and hard limits values respectively. It is acceptable to use words “default” or “unlimited” as limit value.

--csv - displays limits in csv format (instead of data formatted in the table).

--package-limits - displaying the limits of the packages created by the panel admin.

--all-package-limits - displaying the limits of all the packages, including the ones created by the resellers and packages with no users.

--sync - synchronizes users quotas and packages with the database.

--cache-contents - performs quotas caching.

--force - saving user quotas even if they are equal to the current.

--check - performs diagnostics for a specified user. Can be used only when a user is specified (along with --user / --user-id ).

Examples:

  1. Reading current user limits:
# cl-quota
+# cl-quota --csv
+
  1. Reading current package limits:
# cl-quota --package-limits
+# cl-quota --all-package-limits
+# cl-quota --package-limits --csv
+# cl-quota --all-package-limits --csv
+
  1. Specifying limits for a user:
# cl-quota --user-id=500 --soft-limit=0 --hard-limit=0
+# cl-quota --user-id=500 --soft-limit=unlimited
+# cl-quota --user-id=500 --soft-limit=0 --hard-limit=-1
+# cl-quota --user-id=958 --hard-limit=20000 --soft-limit=0 --force
+
  1. Specifying limits for a package:
# cl-quota --package pack1 --hard-limit=-1 --soft-limit=5000
+# cl-quota --package pack1 --hard-limit=10000
+# cl-quota --package pack1 --soft-limit=default
+
  1. User diagnostics (with example output):
# cl-quota --user-id=500 --check
+Quota disabled for user id 500 (home directory /home/cltest1); quotaon: Mountpoint (or device) / not found or has no quota enabled.
+
  1. Synchronizing quotas with caching (executed in cron):
# cl-quota -YC
+

cloudlinux-limits

cloudlinux-limits is an alternative to lvectl CLI tool for LVE management. cloudlinux-limits utility allows you to get/set any CloudLinux OS Shared limits.

Usage:

cloudlinux-limits command [options] [options]
+

Commands

set set parameters for LVE/username/reseller
get get information about LVE/username/reseller

Options

--json return data in JSON format
--lve-id <int> Display record only for that LVE ID
--username <str> Execute command only for that specific user
--reseller-name <str> Execute command only for that specific reseller
--reseller-id <int> Execute command only for that specific reseller ID
--all Execute command for all resellers
--for-reseller <str> Use a supplied reseller for get/set data
--domain <str> Show data only for that specific domain
--limits <keys> Available keys: speed, nproc, pmem, vmem, maxEntryProcs, io, iops, mysql-gov, mysql-cpu, mysql-io, cagefs, inodes
--human-readable-numbers Return PMEM and VMEM limits in KBytes, MBytes or GBytes
--unlimited Set all limits to unlimited
--default [limits] Reset limits to the Package defaults. List of comma-separated limits to reset them to default or all
--mysql-gov <ignored|watched> Monitor or ignore by MySQL Governor
--cagefs <enabled|disabled> Enable or disable CageFS for a user
--mysql-restrict <[un]restricted> Set user restrict status with dbctl (restricted or unrestricted)
--mysql-unrestrict-all Unrestrict all restricted users with dbctl
--speed <str> Limit CPU usage for LVE
--pmem <str> Limit physical memory usage for applications inside LVE
--vmem <str> Limit virtual memory for applications inside LVE
--nproc <str> Limit number of processes for LVE
--io <str> Define IO limits for LVE
--iops <str> Limit IO per second for LVE
--maxEntryProcs <str> Limit number of entry processes for LVE
--mysql-cpu <int> Set MySQL Governor CPU limit (pct)
--mysql-io <int> Set MySQL Governor IO limit (read + write MB/s)
--inodes <N,M> Set inode limits. N - soft, M - hard
--save-all-parameters Save all parameters even if they match with default settings
-h, --help Show this help message and exit
disable-reseller-limits disable Reseller Limits for a reseller/all resellers
enable-reseller-limits enable Reseller Limits for a reseller/all resellers

cloudlinux-limits allows you to manage limits and states for the next types of users:

  • users, created by admin;
  • users, created by resellers with reseller limits enabled (see documentation)
  • users, created by resellers without reseller limits enabled.

For resellers' users with reseller limits enabled admin should use the --for-reseller option.

Examples

  1. Get limits

    • Return data in JSON format
    cloudlinux-limits get --json 
    +
    • Get data for the user user1 in JSON format
    cloudlinux-limits get --username user1  --json 
    +
    • Get data for the reseller res1 in JSON format
    cloudlinux-limits get --reseller-name res1 --json
    +
    • Get data for the domain myapp.com in JSON format
    cloudlinux-limits get --domain myapp.com --json
    +
    • Get data about entry processes and virtual memory for LVE for the user myapp in JSON format
    cloudlinux-limits get --username myapp --limits=maxEntryProcs,vmem  --json
    +
  2. Change CageFS status

    Note

    • CageFS should be installed and initialized
    • --cagefs option is not compatible with the --reseller-name, --for-reseller options
    • Enable CageFS for the user user1.

    Note

    This example is suitable for any type of user.

    cloudlinux-limits set --username user1 --cagefs enable --json
    +
  3. Change MySQL Governor status ignored|watched, restricted|unrestricted

    Note

    • MySQL Governor should be installed; see documentation
    • --mysql-gov and --mysql-restrict options are not compatible with the --reseller-name, --for-reseller options

    Note

    These examples are suitable for any type of user.

    • Change MySQL Governor status to ignored for the user user1
    cloudlinux-limits set --username user1 --mysql-gov ignored --json
    +
    • Change MySQL Governor status to restricted for the user user1
    cloudlinux-limits set --username user1 --mysql-restrict restricted --json
    +
  4. Change limits for a user

    Note

    • MySQL Governor should be installed to change the mysql-cpu and mysql-io options
    • --inodes, --mysql-cpu, and --mysql-io options are not compatible with the --for-reseller and --reseller-name options
    • --username option is suitable for any type of user
    • Set speed, io, nproc, pmem, vmem, iops, inodes, maxEntryProcs, mysql-cpu, and mysql-io limits for the LVE ID 1000
    cloudlinux-limits set --lve-id 1000 --speed 78% --io 8090 --nproc 900 --pmem 300 --vmem 800 --iops 900 --inodes 9090,8989 --maxEntryProcs 90 --mysql-cpu 30 --mysql-io 500 --json 
    +
    • Set speed, io, nproc, pmem, vmem, iops, and maxEntryProcs limits for the reseller res1
    cloudlinux-limits set --reseller-name res1 --speed 78% --io 8090 --nproc 900 --pmem 300 --vmem 800 --iops 900 --maxEntryProcs 90 --json
    +
  5. Set limits for a DEFAULT user

    Note

    A default user is used to set some preselected limits for just created user\package.

    • Set limits for the admin's default user
    cloudlinux-limits set --lve-id DEFAULT --speed 78% --io 8090 --nproc 900 --pmem 300 --vmem 800 --iops 900 --inodes 9090,8989 --maxEntryProcs 90 --mysql-cpu 30 --mysql-io 500 --json
    +
    • Set limits for the reseller's (with reseller limits enabled) default user
    cloudlinux-limits set --lve-id DEFAULT --speed 48% --io 8990 --nproc 900 --pmem 300 --vmem 800 --iops 900 --maxEntryProcs 90 --for-reseller res1 --json
    +
  6. Reset all limits to default values (package limits) for a user

    • Reset all limits to default values for the user user1
    cloudlinux-limits set --username user1 --default all --json
    +
    • Reset all limits to default values for the reseller's res1 user r1user1
    cloudlinux-limits set --username r1user1 --default all --for-reseller res1 --json
    +
  7. Reset all limits to unlimited values for a user

    • Reset all limits to unlimited for the user user1
    cloudlinux-limits set --username user1 --unlimited --json
    +
    • Reset all limits to unlimited for the reseller's res1 user r1user1
    cloudlinux-limits set --username r1user1 --unlimited --for-reseller res1 --json
    +
  8. Enable reseller limits

    • Enable reseller limits for the reseller res1
    cloudlinux-limits enable-reseller-limits --reseller-name res1 --json
    +
  9. Get info about a reseller

    • Get info about the reseller res1
    cloudlinux-limits get --reseller-name res1 --json 
    +
  10. Change reseller limits

    • Change speed limit for the reseller res1
    cloudlinux-limits set --reseller-name res1 --speed 78% --json
    +
    • Reset all limits to unlimited for the reseller res1
    cloudlinux-limits set --reseller-name res1 --unlimited --json
    +
    • Reset all limits to default for the reseller res1
    cloudlinux-limits set --reseller-name res1 --default all --json
    +
+ + + diff --git a/config.js b/config.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/control_panel_integration/index.html b/control_panel_integration/index.html new file mode 100644 index 000000000..05247b877 --- /dev/null +++ b/control_panel_integration/index.html @@ -0,0 +1,673 @@ + + + + + + Control panel integration | Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Control panel integration

Note

We encourage you to create a pull request with your feedback at the bottom of the page.

Introduction

There are several possible ways of integration with CloudLinux OS OS:

  • Complete integration using new API - exactly what is described in this document. This way a panel vendor will get all CloudLinux OS features (current and future) and maximum support. It’s recommended.
  • Manually Ad-hoc - using low-level CLI utils. It is not recommended. It’s kind of “do it yourself way” - a control panel might use low-level utils like lvectl to set limits directly to a raw LVE by ID and control everything (including edge-cases) in its own code. There are many downsides of such approach e.g. only a small number of features can be implemented this way and any new changes in CloudLinux OS will require more and more updates to the control panel code, and can possibly even introduce bugs, etc. And although this way looks easier at first, it will become more and more difficult to maintain it over time.
  • Old API for CloudLinux OS limits - described here. It’s deprecated. It still works but will not get any updates.

New API in a nutshell

The goal of the new API is to shift all complexity for controlling CloudLinux OS components from a control panel to the CloudLinux OS web UI and utils. +Most of the integration is done within a few steps:

  1. A control panel vendor implements 7 simple scripts (any language) and specifies them in a special config file. All Cloudlinux OS components will look up and call them with some arguments to get all needed information from the control panel (e.g. users list, their hosting plans, domains, etc.)
  2. Control panel should call hooks described below in a response to Admin/Users actions (e.g. changing end-user’s domain, creating new end-user, etc.). CloudLinux OS utils will do their stuff to reconfigure itself according to these events. There is no need to worry about what exactly they do because it will be related only to CloudLinux OS components and control panel will not be affected.
  3. Configure the control panel and CageFS to work together by changing some configs.
  4. Optionally embed CloudLinux OS web UI into the control panel. It is highly recommended because it does all you may need. You can use PHP scripts to embed SPA application to the specially prepared pages (with your menus) for LVE Manager and Selectors.

General

To integrate CloudLinux OS into a control panel, you should implement the following interfaces required by the CloudLinux OS utilities:

  • CPAPI — a small scripts/files-type interface to get the required information from the control panel
  • CP Hooks Integration — a set of the CloudLinux OS scripts/commands. Control panel calls this set in response to its internal events
  • Web UI Integration(optional) — various configuration parameters and scripts to embed interface SPA application into the control panel native interface. Optional, if CLI is enough
  • CageFS Integration — some changes may be required in the config files to work and integrate with CageFS as well as additional support from a control panel
  • CloudLinux OS kernel set-up

Files related to integration (integration config file, CPAPI integration scripts and all their dependencies) as well as parent directories to place them (e.g. /opt/cpvendor/etc/) should be delivered/managed by the control panel vendor. They don't exist by default and should be created to activate integration mechanism. Most likely, they should be bundled with the control panel or installed with some CloudLinux OS support module (if CloudLinux OS Shared support is not built-in).

Configuration related to integration should be placed in a valid INI file (further “integration config file”):

-rw-r--r-- root root /opt/cpvendor/etc/integration.ini
+

All users (and in CageFS too) should have read access to this file because some CPAPI methods have to work from end-user too. CloudLinux OS components only read this file and never write/create it.

The control panel vendor decides where to put CPAPI scripts (CloudLinux OS utils will read path to scripts from the integration file) but we recommend to put them into /opt/cpvendor/bin/ (should be created by the vendor first) because /opt/* is mounted to CageFS by default and the standard location will save some time during possible support incidents.

We recommend to deliver a set of scripts for CPAPI and integration file as a separate RPM package. This can greatly simplify support for vendors as they will be able to release any updates and compatibility fixes separately from the panel updates and use dependencies/conflicts management provided by a package manager.

Assumed that this package contains a list of paths to the integration scripts (or to the one script if it deals with all cpapi commands). You can specify default script arguments in the integration_scripts section, additional arguments like filter and --name will be automatically added after the defined ones.

Versioning

We provide information about the current version of the API in the form of rpm package capability (Provides public_cp_vendors_api = VERSION) added to our packages. While improving integration API, we may add new features and scripts and change VERSION.

That means that you can add Conficts: public_cp_vendors_api < VERSION to the spec of rpm package with your integration scripts and that will force yum to search and update our packages in order to support public_cp_vendors_api that your scripts require. It also means that you can protect your Control Panel from situations when your scripts and our API version are incompatible.

Changelog

Changelog

Version 1.2

Summary: ability to integrate X-Ray added.

  1. Provides public_cp_vendors_api = 1.2 added to rpm spec of alt-python27-cllib package (see versioning).
  2. domains integration script updated: new optional flag --with-php added. This option is required for X-Ray integration only.
  3. New X-Ray feature added to supported_cl_features of panel_info script. Now the X-Ray UI tab is hidden by default until the panel makes the support clear by setting the xray feature to true.

Version 1.1

  1. Added Provides public_cp_vendors_api = 1.1 to rpm spec of alt-python27-cllib package (see versioning).
  2. New supported_cl_features key added to panel_info script. You can specify CloudLinux OS features that you want to show in LVE Manager, Wizard, Dashboard and other UI and hide others.

Example of the integration config

[integration_scripts]
+
+panel_info = /opt/cpvendor/bin/panel_info
+db_info = /opt/cpvendor/bin/db_info
+packages = /opt/cpvendor/bin/packages
+users = /opt/cpvendor/bin/users
+domains = /opt/cpvendor/bin/vendor_integration_script domains
+resellers = /opt/cpvendor/bin/vendor_integration_script resellers
+admins = /opt/cpvendor/bin/vendor_integration_script admins
+
+
+
+[lvemanager_config]
+ui_user_info = /panel/path/ui_user_info.sh
+base_path = /panel/path/lvemanager
+
+run_service = 1
+service_port = 9000
+use_ssl = 1
+ssl_cert = /path/to/domain_srv.crt
+ssl_key = /path/to/domain_srv.key
+

Control panel API integration

To integrate CPAPI, set the paths to the scripts in the integration file in the integration_scripts section (see example above).

You can use different scripts for different CPAPI methods or only one script and call it with different arguments. The script is any executable file written in any programming language, that returns a valid JSON file of the specified format in response to arguments it is expected to be called.

Integration scripts requirements

  • Legend

  • By default, integration scripts should run only from UNIX user with the same credentials as LVE Manager is run, unless otherwise stated in the script description.

  • Some scripts are run from both root and end-user. If the script is run from end-user it should return information related to this user only, filtering the irrelevant data for security/isolation purposes or return PermissionDenied if script is not intended to be run as this user at all.

  • Scripts run from the end-user should also work from inside CageFS. You can find details on how to implement this here

IMPORTANT

When a user employs CloudLinux utilities through a user interface, it is important to take note that integration scripts may be executed prior to entering CageFS. Certain interpreters, such as Python, have the capability to execute arbitrary code during interpreter startup before the main code is executed. This presents a potential security risk for servers that utilize Python as an interpreter for executing integration scripts, as users may gain an ability to run their code outside of CageFS. This could lead to unauthorized access and exposure of sensitive system files. +To prevent such incidents, it is crucial to ensure that your integration scripts do not possess similar capabilities or to take necessary measures to eliminate such risks prior to utilization. +In case of any uncertainty, it is recommended to seek assistance from CloudLinux support.

Legend

  • Necessity always means it’s required nearly by all CloudLinux OS code and should be implemented no matter what features you are interested in. Other methods might not be implemented and this will affect only some CloudLinux OS Shared features leaving others to work fine.
  • All UNIX users means any Linux system account (from /etc/passwd) that is able to execute CloudLinux OS utilities directly or indirectly.
Script name Necessity Accessed by Must work inside CageFS also
panel_info Always All UNIX users +
db_info Only for LVE-Stats, otherwise optional admins (UNIX users) -
packages For limits functionality admins (UNIX users) -
users Always admins (UNIX users) -
domains Selectors, some UI features/X-Ray All UNIX users/administrators (UNIX users) +/-
resellers Always admins (UNIX users) -
admins Always admins (UNIX users) -

Working with CPAPI & CageFS

Some integration scripts required to be called not only from root but from end-user. Developing such scripts, you should keep in mind that CageFS is an optional component, so anything that works in CageFS must also work even if CageFS is disabled for a particular user or not installed at all.

This means that you should do one of the following:

  • all required information (code, all its dependencies, all called binaries, all configs/files/caches it reads) should be available for a user (even in CageFS)
  • you should use CageFS's proxyexec mechanism to make your script run itself in a real system but with user privileges
  • use both configured sudo and proxyexec if your script needs privilege escalation (e.g. to read some credentials or other files that shouldn't be disclosed to end-user). SUDO mechanism is needed for cases when CageFS is not installed or disabled for a user and proxyexec is needed when a user executes script in CageFS

When using SUDO you should create the wrapper that will call your script using SUDO command, like this:

[root]# cat /opt/cpvendor/bin/domains
+#!/usr/bin/env bash
+sudo opt/cpvendor/bin/domains_real
+

Of course, you must configure /etc/sudoers to make it work without a password prompt and with enough security.

Note

Your script will run with root permissions, but limited with user's LVE. +You may see the following warning:

***************************************************************************
+*                                                                         *
+*             !!!!  WARNING: YOU ARE INSIDE LVE !!!!                      *
+*IF YOU RESTART ANY SERVICES STABILITY OF YOUR SYSTEM WILL BE COMPROMIZED *
+*        CHANGE YOUR USER'S GROUP TO wheel to safely use SU/SUDO          *
+*                             MORE INFO:                                  *
+*      https://docs.cloudlinux.com/index.html?lve_pam_module.html          *
+*                                                                         *
+***************************************************************************
+

This is the default behavior so users cannot overload a server with a lot of API requests.

Warning

When using sudo, you must configure sudo with NOSETENV tag in order to forbid the user to override SUDO_USER environment or use other secure methods (e.g. logname) to get the user who ran the command through sudo.

As an alternative for sudo you can use regular SUID scripts, but we strongly recommend using SUDO because of builtin logging of permissions escalation.

You can find more details on how to configure your scripts in CageFS properly here:

Expected scripts responses

Any integration script should return a valid UTF-8 encoded JSON.

There are two expected formats of integration script responses. In case of success, the metadata.result field is ok and the data field contains data according to the specification of the specific integration script. Return code is 0.

{
+  "data": object or array,
+  "metadata": {
+    "result": "ok"
+  }
+}
+

In case of error, the output should be one of the following: Internal errors, Restricted access, Error in arguments, Nonexistent entities.

Internal errors

When data is temporarily unavailable due to internal errors in the integration script (database unavailable, file access problems, etc), the output is as follows:

{
+  "data": null,
+  "metadata": {
+    "result": "InternalAPIError",
+    "message": "API is restarting, try again later"
+  }
+}
+

Data description

Key Nullable Description
message False Error message for an administrator printed by CloudLinux OS utility

Restricted access

When data is unavailable due to restricted access of a user that called the script, the output is as follows:

{
+  "data": null,
+  "metadata": {
+    "result": "PermissionDenied",
+    "message": "Only sudoers can view this section."
+  }
+}
+

Data description

Key Nullable Description
message False Error message for an administrator printed by CloudLinux OS utility

Info

This kind of error should be used in the case when a user is requesting data that he does not have access to. +E.g., when a user named user1 is running domains script with the argument --owner=user2, you must return this error.

Error in arguments

When wrong arguments are passed to the utility, for example:

  • unknown argument
  • unknown fields in --fields

The output is as follows:

{
+  "data": null,
+  "metadata": {
+    "result": "BadRequest",
+    "message": "Unknown field ‘nosuchfield’"
+  }
+}
+

Data description

Key Nullable Description
message False Error message for an administrator printed by CloudLinux OS utility

Nonexistent entities

When during data filtering the target entity doesn't exist in the control panel, the output is as follows:

{
+  "data": null,
+  "metadata": {
+    "result": "NotFound",
+    "message": "No such user `unix_user_name`"
+  }
+}
+

Info

This kind of error should be used only in the filtering case. In case when some script is called without filtering arguments and the control panel has no entities to return (e.g. domains) you should return an empty list/object.

Data description

Key Nullable Description
message False Error message for an administrator printed by CloudLinux OS utility

The list of the integration scripts

panel_info

Returns the information about the control panel in the specified format.

Usage example

/scripts/panel_info
+

Output example

{
+	"data": {
+		"name": "SomeCoolWebPanel",
+		"version": "1.0.1",
+		"user_login_url": "https://{domain}:1111/",
+		"supported_cl_features": {
+			"php_selector": true,
+			"ruby_selector": true,
+			"python_selector": true,
+			"nodejs_selector": false,
+			"mod_lsapi": true,
+			"mysql_governor": true,
+			"cagefs": true,
+			"reseller_limits": true,
+			"xray": false
+		}
+	},
+	"metadata": {
+		"result": "ok"
+	}
+}
+

Data description

Key Nullable Description
name False Control panel name
version False Control panel version
user_login_url_template False URL template for a user entering to control panel. Used in the lve-stats default templates reporting that user is exceeding server load. You can use the following placeholders in the template: {domain}. CloudLinux OS utility automatically replaces placeholders to the real values. Example:“user_login_url_template”: “https://{domain}:2087/login” CloudLinux OS Shared utility automatically replaces {domain}, and the link will look like https://domain.zone:2087/login
supported_cl_features False Available since API v1.1 (see versioning)
Object that describes which CloudLinux OS features are supported by your control panel and which must be hidden in web interface.
When supported_cl_features is omitted, we assume that all modules are supported. When supported_cl_features is empty object, all modules will be hidden. All features that are not listed in supported_cl_features are considered to be disabled.
We recommend you to always return object as we can add more features in the future and you will be able to test them and make them visible after checking and tuning.

Features that you currently can disable: Available since API v1.2 (see versioning)
  • xray (CloudLinuxOS+ license only)

db_info

Returns the information about databases that are available to the control panel users and are managed by the control panel.

WARNING!

For now, CloudLinux OS supports control panels only with MySQL databases.

Integration script is optional, when there is no script, lve-stats won’t collect SQL snapshots.

Usage example

/scripts/db_info
+

Output

{
+  "data": {
+    "mysql": {
+      "access": {
+        "login": "root",
+        "password": "Cphxo6z",
+        "host": "localhost",
+        "port": 3306
+      },
+      "mapping": {
+        "unix_user_name": [
+          "db_user_name1",
+          "db_user_name2"
+        ],
+        "unix_user_name2": [
+          "db_user_name3",
+          "db_user_name4"
+        ]
+      }
+    }
+  },
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Data description

Key Nullable Description
mysql True Data section for the MySQL database. Used in lve-stats; if there is no data, snapshots of SQL queries won’t be collected.
mysql.access.login False User name to enter to the database to view a list of SQL queries that are executing at the moment.
mysql.access.password False Open password.
mysql.access.host False Host to access the database.
mysql.access.port False Port to access the database.
mysql.mapping False A mapping file where the key is the name of a UNIX user managed by the control panel and the value is a list of the corresponding database users.

packages

The package is an abstraction that represents a group of users that have the same default limits.

Usage example

/scripts/packages [--owner=<owner>]
+

Arguments

Key Required Description
--owner, -o False Set the name of the packages' owner to output.

Output example

{
+  "data": [
+    {
+      "name": "package",
+      "owner": "root"
+    },
+    {
+      "name": "package",
+      "owner": "admin"
+    },
+    {
+      "name": "package",
+      "owner": "reseller"
+    }  
+  ],
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Data description

Key Nullable Description
name False Package name
owner False Package’s owner name. The owner can be the administrator or reseller.

users

Returns information about UNIX users, created and managed by the control panel. You will be able to manage the limits of these users via LVE Manager.

If a reseller user or administrator user has a corresponding UNIX-user in the system, this user should be included into this list.

Usage example

/scripts/users [--owner=<string> | (--package-name=<string> & --package-owner=<string>) | --username=<string> | --unix-id=<int>] [--fields=id,username,package,...]
+

Arguments

Key Required Description
--owner, -o False Used for filtering. When the argument is set, output only this owner users.
--package-name False Used for filtering. Set the name of the package which users to output. Used ONLY in pair with --package-owner.
--package-owner False Used in pair with package.name. Set the owner of the specified package.
--username False Used for filtering. When the parameter is set, output the information about this UNIX user only.
--unix-id False Used for filtering. When the parameter is set, output the information about this UNIX user only.
--fields False List fields to output. Fields are divided with a comma; when there is no key, output all available fields.

The key is used to reduce the data size for the large systems. You can ignore the key and always output the full set of data. Note that in this case, CloudLinux OS will work more slowly.

Output example

{
+  "data": [
+    {
+      "id": 1000,
+      "username": "ins5yo3",
+      "owner": "root",
+      "domain": "ins5yo3.com",
+      "package": {
+        "name": "package", 
+        "owner": "root"
+      },
+      "email": "ins5yo3@ins5yo3.com",
+      "locale_code": "EN_us"
+    },
+    {
+      "id": 1001,
+      "username": "ins5yo4",
+      "owner": "root",
+      "domain": "ins5yo4.com",
+      "package": {
+        "name": "package", 
+        "owner": "root"
+      },
+      "email": "ins5yo4@ins5yo4.com",
+      "locale_code": "EN_us"
+    }  
+  ],
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Example to output specific data fields

/scripts/users --fields=id,email
+

Output

{
+  "data": [
+    {
+      "id": 1000,
+      "email": "ins5yo3@ins5yo3.com"
+    },
+    {
+      "id": 1001,
+      "email": "ins5yo3@ins5yo3.com"
+    }  
+  ],
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Data description

Key Nullable Description
id False ID of the UNIX account in the system.
username False The name of the UNIX account in the system.
owner False The name of the account owner in the control panel. The owner can be an administrator (in this case he should be included in the admins() output) or a reseller (in this case he should be included in the resellers() output).
locale_code True The control panel locale selected by a user (the values are according to ISO 639-1). Used when sending lve-stats emails. If not selected, EN_us used.
email True Email to send lve-stats notifications about hitting limits. If there is no email, should return null.
domain False Main domain of user (used to display in LVE Manager UI and create applications in Selectors)
package True Information about the package to which a user belongs to. If the user doesn’t belong to any package, should return null.
package.name False The name of the package to which a user belongs to.
package.owner False The owner of the package to which a user belongs to (reseller or administrator).

domains

Returns key-value object, where a key is a domain (or subdomain) and a value is a key-value object contains the owner name (UNIX users), the path to the site root specified in the HTTP server config, and the domain status (main or alternative).

X-Ray support is available since API v1.2 (see versioning). In order to enable X-Ray support, the value for each domain should include php configuration. Full X-Ray integration documentation can be found here

WARNING

To make Python/Node.js/Ruby/PHP Selector workable, this script should be executed with user access and inside CageFS. When running this script as the user, you must limit answer scope to values, allowed for the user to view. +E.g. if the control panel has two domains: user1.com and user2.com, and user1 Unix user owns only one of them, you should not return second one even if --name argument is not set explicitly.

Usage example

/scripts/domains ([--owner=<unix_user>] | [--name=<name>] | [--with-php])
+

Arguments

Key Required Description
--owner, -o False Used for filtering output; set a name of the owner whose domains to print
--name, -n False Used for filtering output; set a name of the domain, to display information about it
--with-php False (X-Ray support only) Used for extending output with PHP configuration, required by X-Ray (available since API v1.2, see versioning)

Output example

{
+  "data": {
+    "domain.com": {
+      "owner": "username",
+      "document_root": "/home/username/public_html/",
+      "is_main": true
+    },
+    "subdomain.domain.com": {
+      "owner": "username",
+      "document_root": "/home/username/public_html/subdomain/",
+      "is_main": false  
+    }
+  },
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Output example with optional flag --with-php (X-Ray support only)

{
+  "data": {
+    "domain.com": {
+      "owner": "username",
+      "document_root": "/home/username/public_html/",
+      "is_main": true,
+      "php": {
+        "version": "56",
+        "ini_path": "/opt/alt/php56/link/conf",
+        "is_native": true
+       }
+    },
+    "subdomain.domain.com": {
+      "owner": "username",
+      "document_root": "/home/username/public_html/subdomain/",
+      "is_main": false,
+      "php": {
+        "version": "72",
+        "ini_path": "/opt/alt/php72/link/conf",
+        "fpm": "alt-php72-fpm"
+      }
+    }
+  },
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Data description

Key Nullable Description
Dictionary (named array) key False Domain name (subdomains are acceptable)
owner False UNIX user who is a domain owner
document_root False Absolute path to the site root directory
is_main False Is the domain the main domain for a user
Nested dictionary (named array) php True (False if X-Ray support is enabled) PHP configuration for a domain, required by X-Ray, see details here (available since API v1.2, see versioning)

resellers

This script returns the information about resellers. A reseller is an entity that can own users in the control panel. Resellers do not obligatory have UNIX account with the same name. It can exist only as an account in the control panel.

Usage example

/scripts/resellers ([--id=<id>] | [--name=<name>])
+

Arguments

Key Required Description
--id False Used for filtering output; set a reseller ID to output information about it
--name, -n False Used for filtering output; set a reseller name to output information about it

Output example

{
+  "data": [
+    {
+      "name": "reseller",
+      "locale_code": "EN_us",
+      "email": "reseller@domain.zone",
+      "id": 10001   
+    }
+  ],
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Data description

Key Nullable Description
name False Reseller name in the control panel; unique on the server, should not be the same as administrators names
locale_code True Control panel locale selected by a reseller (according to ISO 639-1). Default is EN_us.
id True Unique reseller ID in the system. From MAX_UID to 0xFFFFFFFF, where MAX_UID is a value from /etc/login.defs. Required for the second level reseller limits. Set null if not needed.
email True Reseller email to send notifications from lve-stats about reseller’s users limits hitting. If no email, output null.

admins

Gives information about panel’s administrators, output information about all panel’s administrators who:

  • could be (or actually are) the owners of the users, listed in users()
  • could be (or actually are) the owners of the packages, listed in packages()
  • has UNIX users with the rights to run LVE Manager UI

Usage example

/scripts/admins ([--name=<string>] | [--is-main=<true|false>])
+

Arguments

Key Required Description
--name, -n False Used for filtering; set the administrator name to output information about it
--is-main, -m False Used for filtering output to get the main and the alternative administrators of the control panel

Output example

{
+  "data": [
+    {
+      "name": "admin1",
+      "unix_user": "admin",
+      "locale_code": "EN_us",
+      "email": "admin1@domain.zone",
+      "is_main": true
+    },
+	{
+      "name": "admin2",
+      "unix_user": "admin",
+      "locale_code": "Ru_ru",
+      "email": "admin2@domain.zone",
+      "is_main": false
+    },
+  ],
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Data description

Key Nullable Description
name False The name of the administrator in the control panel; unique, should not be the same as resellers’ names
unix_user True The name of the UNIX account in the system; it corresponds to the administrator account in the control panel. If an administrator already has UNIX account, it is automatically added to the special group on the server using hook, so this administrator can enter to the LVE Manager and manage users limits. If an administrator doesn't have UNIX account and he can only own users, output null.
locale_code True Control panel locale selected by the administrator (values are according to ISO 639-1). Default is EN_us.
email True Email to send notifications from lve-stats. If email is not set in the control panel, output null.
is_main False Assumed that one of the control panel’s administrators is the main administrator. That particular administrator will receive server status notifications from lve-stats to his email.

Control panel hooks integration

For proper CloudLinux OS operation, you should implement a hooks mechanism. Hooks are scripts that control panel invokes with the exact arguments at a specific time. The control panel is responsible for executing these scripts as a system root user.

Managing administrators

Note

Some control panels allow to create several administrator accounts, each of which has a system user who is used to work with the LVE Manager plugin. In this case, all administrator accounts should be added to the sudoers and clsupergid. To do so, you can use our user-friendly interface.

Note

If you don’t have several administrator accounts (or LVE Manager plugin always runs from the root) you don’t need to implement these hooks.

After creating a new administrator, the control panel should call the following command:

/usr/share/cloudlinux/hooks/post_modify_admin.py create --username admin
+
Argument Default Description
--name, -n - The name of the newly created administrator account

After removing the administrator, the following command should be called by the control panel:

/usr/share/cloudlinux/hooks/post_modify_admin.py delete --name admin
+
Argument Default Description
--name, -n - The name of removed UNIX user of administrator

Managing users

To manage user limits properly, CloudLinux OS utilities need information about the following control panel events.

After creating a new user, the following script should be called:

/usr/share/cloudlinux/hooks/post_modify_user.py create --username user --owner owner
+
Argument Mandatory Default Description
--username, -u Yes - The name of administrator account to be removed
--owner, -o Yes - A name of the account owner. The owner can be an administrator or a reseller

After renaming a user (when a user name or a home directory was changed), the following script should be called:

/usr/share/cloudlinux/hooks/post_modify_user.py modify -u user --new-username newuser
+
Argument Mandatory Default Description
-u ,--username Yes - The user name to be changed
--new-username Yes - A new user name

After moving the user to the new owner, the following command should be run:

/usr/share/cloudlinux/hooks/post_modify_user.py modify -u user --new-owner new_owner
+
Argument Default Description
--new-owner - The name of the new account owner. The owner can be an administrator or a reseller.
--username, -u - The account name (should be the same as the name in /etc/passwd).

Before removing a user, the following command should be run:

/usr/share/cloudlinux/hooks/pre_modify_user.py delete --username user
+
Argument Default Description
--username, -u - The name of the account to be removed (should be the same as the name in /etc/passwd).

After removing the user, you should call the following command:

/usr/share/cloudlinux/hooks/post_modify_user.py delete --username user
+
Argument Default Description
--username, -u - The name of the removed account

Managing domains

We expect that all domain-related data is stored inside the user's home directory. If your control panel stores domain-related data outside the user's home directory and that data can potentially change, please contact us so we can add support for this to our integration mechanism.

After renaming a domain (or any equivalent domain removal operation with transfer of all data to another domain), the following command should be run:

/usr/share/cloudlinux/hooks/post_modify_domain.py modify -u user --domain old_domain --new-domain new_domain [--include-subdomains]
+
Argument Mandatory Default Description
--username, -u Yes - The name of the new domain owner (should be the same as the name in /etc/passwd).
--domain Yes - The domain name to be changed
--new-domain Yes - A new domain name
--include-subdomains No False If set, all subdomains are renamed as well, i.e. when renaming domain.com → domain.eu the corresponding subdomain will be renamed as well test.domain.com → test.domain.eu.

Managing packages (hosting plans)

To manage packages limits properly, CloudLinux OS utilities need information about the following control panel events.

After renaming a package, the following command should be run:

/usr/share/cloudlinux/hooks/post_modify_package.py rename --name package_name --new_name new_package_name
+
Argument Mandatory Default Description
--name Yes - The package name to be changed
--new-name No - A new package name

Web UI integration

ui-user-info script

This script should return information about the current user opening Web UI. It is only used in UI part of the LVE Manager and utilities.

  • Input value (first positional argument) — the current authentication token, passed on plugin open (for example, open.php?token=hash)
  • Expected data format
{
+    "userName": "user1",
+    "userId": 1000,
+    "userType": "user",
+    "baseUri": "/user2/lvemanager/",
+    "assetsUri": "/userdata/assets/lvemanager",
+    "lang": "en",
+    "userDomain": "current-user-domain.com"
+}
+
  • userName is used in queries to Selectors.
  • userId - system user ID if exist.
  • userType - can have the following values: “user”, “reseller”, “admin”
  • lang - used to identify a current locale in the user interface (‘en’, ‘ru’ - two-character language code)
  • userDomain - a current user domain. It can be the default domain or any selected user domain. Used to display in Selector. For example, in DirectAdmin the control panel opens only if a domain is selected — the selected domain is set. In cPanel, a domain is not selected — the default domain is set. If a domain is absent — leave empty.
  • baseUri - URI where LVE Manager files are available on the webserver
  • assetsUri - URI where assets files for LVE Manager are available on the webserver

The following configuration file parameters are used to determine the location of the plugin UI part.

  • base_path - the path to copy file assets to make them available from the control panel. Optional if /usr/share/l.v.e-manager/commons and /usr/share/l.v.e-manager/panelless-version/lvemanager are available from the control panel and the paths to this directory in web server are set. +Files are copied or replaced by yum update lvemanager command.
  • run_service - enable LVE Manager web server. If it is set to 1 when installing or updating LVE Manager, we enable and run the web server with LVE Manager
  • service_port - a port used for running a web server for access LVE Manager without the control panel
  • use_ssl - use HTTPS for LVE Manager web server.
  • ssl_cert - path to domain ssl cert file
  • ssl_key - path to domain ssl cert key file

Known issues for GUI unification

Known issues for GUI unification

A user can run standalone services to provide access to LVE Manager without UI integration. These services use system authentication for users and the integration script ui-user-info script to get information about the current user.

These services have some issues:

  • The ability to download log files from CloudLinux OS Wizard is missed
  • Incorrect layout for some UI forms (Node.js Selector/Python Selector)
  • Some errors are not displayed

These issues will be fixed in the near future.

PHP-based integration of WEB UI with the control panel

The first use case:

require_once('lvemanager/widget.php');
+

This script defines the type of user and displays icons to open plugins included in LVE Manager. +You can customize your styles by copying the file content and setting your control panel styles. +In this case, all LVE Manager plugins will be opened in a new window.

The second use case:

Embedding the specific plugin into the control panel page.

<?php
+require_once('lvemanager/LveManager.php');
+$manager = new LveManager(‘<pluginName>’);
+$manager->setCSRFToken();
+?>
+<html><body>
+<?php
+echo $manager->insertPanel();
+?>
+</body></html>
+

Pass the plugin name to the class constructor to initialize the plugin (user name will be defined). +At the time of the insertPanel method invocation, the SPA application with the specified Selector will be embedded.

vendor_php (optional for PHP integration only) - a full path to the vendor.php file. This option allows the vendor to implement specific logic before initializing the plugin (for example drop permission).

Example:

vendor_php = /opt/cpvendor/etc/vendor.php
+

Queries to the backend are created separately in the points (PHP files) which are located in the LVE Manager catalog.

UI with CageFS enabled

LVE Manager scripts run outside of CageFS (on production systems). When calling API, LVE Manager scripts enter CageFS if needed (Node.js Selector, Python Selector). PHP Selector API does not work if the script is started inside CageFS and returns an error.

As for Node.js Selector and Python Selector, they are supposed to be contained inside CageFS because end-users can start scripts from UI (npm run, pip install). That is the reason why they should run inside LVE.

PHP Selector run outside of CageFS. When PHP Selector is called, it is not limited by LVE which allows an end-user whose web site is reaching its limits to use PHP Selector UI without problems.

How to integrate CageFS with a control panel

CageFS documentation can be found here: CageFS

CageFS MIN_UID

CageFS has MIN_UID setting. Users with UIDs < MIN_UID will not be limited by CageFS. This setting is configured based on UID_MIN setting from /etc/login.defs file by default. So, typically MIN_UID is 500 on CloudLinux OS 6 and 1000 on CloudLinux OS Shared 7.

You can obtain current MIN_UID value by executing the following command:

cagefsctl --get-min-uid
+

You can set MIN_UID by executing the following command:

cagefsctl --set-min-uid <value>
+

For example, to set MIN_UID to 10000, you should execute the following command:

cagefsctl --set-min-uid 10000
+

PAM configuration for CageFS

CageFS is enabled for su, ssh and cron services by default. +PAM Configuration

Also you can enable CageFS for any service that uses PAM. +LVE PAM Module

TIP

It is safe to enable an interactive shell (e.g. /bin/bash) for users when CageFS is enabled.

Integrating CageFS with Apache

You should apply CloudLinux OS Shared patches to integrate CageFS with Apache. Details can be found here: +Integration of Apache modules in Control Panels

Note that it may be required to execute cagefsctl --force-update after Apache rebuild in order to update CageFS.

Running commands inside CageFS

You may want to execute commands inside CageFS for security reasons. To do so, you can execute a command inside CageFS in the following way:

/bin/su -s /bin/bash -c “$COMMAND” - $USER
+/sbin/cagefs_enter_user $USER "$COMMAND"
+

The commands above require root privileges. You can use the following command when running as a user:

/bin/cagefs_enter "$COMMAND"
+

CageFS - temporary LVEs with lvectl options

Starting from lve-wrappers 0.7.5-1, cagefs_enter_user accepts a subset of lvectl limit parameters as input. Using any of them will result in a creation of a temporary LVE with a unique ID. That LVE will have the provided limits set and will be destroyed after the given command is run.

The following parameters are accepted: --speed, --pmem, --vmem, --io, --iops, --nproc, --maxEntryProcs.

cagefs_enter_user --pmem=512M --speed=70% <user> <command>
+

Refer to documentation on limits for more details on the provided parameters.

Note

Temporary LVE is destroyed after the process terminates unless the option --no-fork passed.

Updating CageFS skeleton

Updating CageFS skeleton is required after update of the system RPM packages. It may be also required after update of hosting control panel itself.

To update CageFS skeleton, execute the following command:

cagefsctl --force-update
+

CageFS RPM package installs a daily cron job that updates CageFS skeleton

/etc/cron.d/cp-cagefs-cron
+

You can set update period for CageFS skeleton in days using

cagefsctl --set-update-period <days>
+

Setting up directories for PHP sessions

Each user in CageFS has its own /tmp directory that is not visible for other users. PHP scripts save sessions in /tmp directory by default (when session.save_path directive is empty). However, you can set up a different location for PHP sessions specific to each PHP versions using CageFS per-user mounts like it is done for alt-php. Simply add a line like below to /etc/cagefs/cagefs.mp

@/opt/alt/php54/var/lib/php/session,700
+

and then execute

cagefsctl --remount-all
+

to apply changes. After that, session files will be stored in /opt/alt/php54/var/lib/php/session inside user’s CageFS. In real file systems these files can be found inside .cagefs directory in user’s home directory. For above example, given that user’s home directory is /home/user, the files will reside in /home/user/.cagefs/opt/alt/php54/var/lib/php/session directory. TMP directory for the user will be located in /home/user/.cagefs/tmp. +Temporary files including php sessions in /tmp directories in CageFS are cleaned using tmpwatch. You can change the period of removing old temporary files or set up additional directories for cleaning according to the documentation: +TMP directories.

Knowing the location where PHP sessions are stored (described above), you can also implement any custom script for cleaning PHP sessions. Remember to drop permissions (switch to the appropriate user) when removing the files (for example using sudo).

Creating new user account

When user or admin account has been created, you should execute an appropriate hook script. +More about CloudLinux OS Shared hooks subsystem: Control Panel Hooks Integration

Note

It is safe to enable an interactive shell (/bin/bash) for users when CageFS is enabled.

IMPORTANT

Execute the post hook described in the link above after the account has been created completely. When the account is being transferred to another server or restored from backup, all files in user’s home directory should be written/restored completely BEFORE executing the post hooks, including files in ~/.cl.selector directory. This is required to setup/restore PHP Selector settings for the user correctly. If PHP Selector settings were not restored correctly, you can recreate them by executing

rm -rf /var/cagefs/`/usr/sbin/cagefsctl --getprefix $username`/$username/etc/cl.selector
+rm -rf /var/cagefs/`/usr/sbin/cagefsctl --getprefix $username`/$username/etc/cl.php.d
+/usr/sbin/cagefsctl --force-update-etc "$username"
+

IMPORTANT

You should create /etc/cagefs/enable.duplicate.uids empty file when your control panel creates users with duplicate UIDs. It is required for CageFS to operate properly.

Modifying user accounts

You should execute appropriate hook script when an account has been modified: Control Panel Hooks Integration

Removing user accounts

CageFS has userdel hook script /usr/bin/userdel.cagefs, that is configured in /etc/login.defs file:

USERDEL_CMD /usr/bin/userdel.cagefs
+

This script performs all necessary actions when a user is being removed. +Anyway, you should execute appropriate hook script when removing an account: +Control Panel Hooks Integration

Excluding users from CageFS

If you need to exclude some system users from CageFS that are specific to your control panel, you can do this by creating a file (any name would work) inside /etc/cagefs/exclude folder, and list users that you would like to exclude from CageFS in that file (each user in separate line). Then execute

cagefsctl --user-status USER
+

to apply changes and check that the command shows Disabled: +Excluding users

How to add a file or a directory to CageFS

There are two major ways to add files and directories to CageFS:

  1. copy files and directories to CageFS
  2. mount an entire directory with needed files to CageFS

Copy files and directories to CageFS

Note

Please do not modify any existing files in the /etc/cagefs/conf.d directory because they may be overwritten while updating CageFS package. You should create a new file with a unique name instead.

In order to copy files and directories to CageFS, you can manually create a custom config file with *.cfg extension in /etc/cagefs/conf.d directory.

Also, you can add files and directories that belong to rpm package to CageFS as follows:

  • execute cagefsctl --addrpm PACKAGE command
  • execute cagefsctl --force-update command to apply changes, i.e. to copy files and directories to the /usr/share/cagefs-skeleton directory.

There is a daily cron job that copies new and removes unneeded files and directories, i.e. updates cagefs-skeleton.

You should execute cagefsctl --force-update after each change of system configuration or after installing new software. Otherwise, CageFS will only be updated every 24 hours by a daily cron job.

The benefits of this approach:

  • users in CageFS cannot modify files in the real file system (for example, in case of wrong permissions), because files in cagefs-skeleton are the copies of files from the real file system (and not mounted to CageFS)
  • you can copy specific safe files from some directory from the real file system to CageFS, and not copy all files and not mount the entire directory.

You can find more info here.

Mount an entire directory with needed files to CageFS

The second way to add files and directories to CageFS is to mount the entire directory containing the files to CageFS.

This approach should be used for frequently updated files (like UNIX sockets) or for directories with a large number of files or with files that occupy much disk space.

The benefits of this approach:

  • no delay between update of the file in the real file system and update of the file in CageFS; when file or directory is changed in the real file system they will be changed in CageFS immediately
  • data is mounted but not copied to CageFS, so this minimizes IO load while updating cagefs-skeleton

Please make sure that the mounted directory does not contain sensitive data.

You can mount a directory from the real system to CageFS via /etc/cagefs/cagefs.mp config file.

To apply changes of mount points in /etc/cagefs/cagefs.mp file you should execute the following command:

cagefsctl --remount-all
+

You can find more info here.

Users' home directory

CageFS mounts users' home directories to CageFS automatically. Usually, there is no need to configure anything. However, if your control panel uses a custom path to users' home directories (for example /home/$USER/data instead of /home/$USER), then it may be necessary to configure Base Home Directory setting: +Base Home Directory

The modes of mounting users' home directories into CageFS are described here: +Mounting user’s home directory inside CageFS

Excluding files from CageFS

CageFS has a default set of files and directories that are visible to users inside CageFS. If you wish to exclude some of these files or directories from CageFS, you can do this as described below: +Excluding files

Executing commands outside CageFS via proxyexec

SUID programs cannot run inside CageFS due to “nosuid” mounts. But you can give users in CageFS the ability to execute some specific commands outside CageFS via proxyexec.

Typically, these commands are suid programs or other programs that cannot run inside CageFS (due to complex dependencies, for example). Examples of such programs are passwd, exim or sendmail commands.

  • Regular (not suid) commands will be executed as user inside the user’s LVE, but outside of CageFS.
  • SUID commands will be executed in the user’s LVE outside of CageFS with the effective UID set to the owner of the file being executed.

You can find more details here.

Note

You should use this feature with caution because it gives users the ability to execute specified commands outside of CageFS. SUID commands are extremely dangerous because they are executed not as a user, but as an owner of the file (typically root). You should give users the ability to execute safe commands only. These commands should not have known vulnerabilities. +You should check that users cannot use these commands to get sensitive information on a server. You can disable specific dangerous options of programs executed via proxyexec (see below).

Filtering options for commands executed by proxyexec

It is possible to disable specific dangerous options of programs executed via proxyexec. More details: +Filtering options for commands executed by proxyexec.

Integrating CloudLinux OS Shared PHP Selector

Complete documentation for CloudLinux OS Shared PHP Selector can be found here: +PHP Selector

Note

CloudLinux OS Shared PHP Selector requires CageFS, so integration of CageFS must be completed before starting PHP Selector integration.

If your control panel has some PHP version selector installed already, we suggest you not to enable CloudLinux OS Shared PHP Selector for your users, so they will not be confused by two multiple PHP Selectors. However, if you want to use CloudLinux OS Shared PHP Selector anyway, you can refer to the following article to configure loading of extensions for alt-php: PHP extensions

For proper operation of CloudLinux OS Shared PHP Selector, you should specify location of native PHP binaries of your control panel in /etc/cl.selector/native.conf. Then execute

cagefsctl --setup-cl-selector
+

to apply changes. +More details: Native PHP Configuration

You can configure CloudLinux OS Shared PHP Selector to allow your customers to select any custom PHP version specific to your control panel. Here's how to do this: +Roll your own PHP

Also, you can compile and add your own PHP extensions to CloudLinux OS Shared PHP Selector: +Compiling your own extensions

Integration of Apache modules in control panels

We provide control panels with the ability to build their own Apache packages with modules such as alt-mod-passenger, mod_lsapi, mod_hostinglimits. This is due to the fact that control panels often have their own customly-built Apache. At the same time, the modules must be compiled with the version of Apache and APR libraries that control panels use. Therefore, if your control panel uses Apache that is provided by CloudLinux OS Shared, you can use native packages with modules. The following table represents the RPM package compatibility.

RPMs of Apache provided by CloudLinux OS Shared, if you are using:

httpd httpd24-httpd
then install:
mod_lsapi
mod_hostinglimits
alt-mod-passenger
then install:
httpd24-mod_lsapi
httpd24-mod_hostinglimits
httpd24-alt-mod-passenger

If you use custom Apache, follow this documentation on how to build a package for your Apache.

Note

The supported Apache versions are 2.2 and 2.4.

alt-mod-passenger

  1. Download alt-mod-passenger sources
yumdownloader --source alt-mod-passenger --enablerepo=*source
+
  1. Rebuild the package with your Apache using rpmbuild
rpmbuild --rebuild alt-mod-passenger-ver.cloudlinux.src.rpm
+
  1. Remove dependencies from httpd, apr, apr-util packages (-devel packages as well) and set your Apache packages instead, in the alt-mod-passenger spec file. Also, set the path for the directory where your Apache configs are located with __apache_conf_dir in the spec file.

  2. Rebuild the package again, this time you should get to the compilation stage. During compilation, you may encounter such errors:

* Checking for Apache 2 development headers...
+     Found: no
+* Checking for Apache Portable Runtime (APR) development headers...
+     Found: no
+* Checking for Apache Portable Runtime Utility (APU) development headers...
+     Found: no
+

In this case, you should specify the paths of your custom Apache in alt-mod-passenger-5.3.7/utils/passenger file. You need to add paths to binaries such as httpd, apu-1-config, and apxs. For example the following lines should be added before the passenger-install-apache2-module call:

export APU_CONFIG="${PATH_IN_YOUR_SYSTEM}/bin/apu-1-config"
+export HTTPD="${PATH_IN_YOUR_SYSTEM}/sbin/httpd"
+export APXS2="${PATH_IN_YOUR_SYSTEM}/bin/apxs"
+
  1. Rebuild the package again, if everything is set correctly, there shouldn't be any problems.

  2. Install the module, check that it is successfully loaded into Apache.

mod_hostinglimits

  1. Download mod_hostinglimits sources
yumdownloader --source mod_hostinglimits --enablerepo=*source
+
  1. Rebuild the package with your Apache using rpmbuild
rpmbuild --rebuild mod_hostinglimits-ver.el7.cloudlinux.1.src.rpm
+
  1. Remove dependencies such as httpd, (-devel packages as well) and set your Apache packages instead, in the mod_hostinglimits spec file. Also, check the paths that lead to the modules or conf.d directories and change them if they are different on your system.

  2. Rebuild the package again, this time you should get to the compilation stage. During compilation, you may encounter the following errors:

-- Not Found Apache Bin Directory: APACHE2_2_HTTPD_BIN-NOTFOUND, APACHE2_2_HTTPD_MODULES-NOTFOUND
+-- Can't find Apache2.2: APACHE2_2_HTTPD_INCLUDE_DIR-NOTFOUND
+

In this case, you should specify the paths of your custom Apache in mod_hostinglimits-1.0/cmake/FindApacheForBuild.cmake file. According to macros above, add the paths to the directory where httpd bin is located, to the dir where apache modules are located and to the dir where include files are located. It may look the following way:

FIND_PATH (APACHE2_2_HTTPD_INCLUDE_DIR 
+   NAMES 
+      httpd.h
+   PATHS
+      ${APACHE2_2_INCLUDES_DIR}
+      /usr/local/include/httpd
+      /usr/include/httpd
+      /usr/include/apache
+      /usr/local/apache/include/       # added line
+)
+
  1. Rebuild the package again, if you set everything correctly, there shouldn't be any problems.

  2. Install the module, check that it is successfully loaded into Apache.

mod_lsapi

  1. Install the packages needed to build mod_lsapi from the source. Some packages may be missing on some platforms, this is not critical
yum install -y rpm-build
+yum install -y liblsapi liblsapi-devel
+yum install -y autoconf cmake apr-devel apr-util-devel
+yum install -y python-lxml pytest python-mock
+

On CloudLinux OS Shared 7 and above you also should install criu related packages

yum install -y criu-lve python-criu-lve criu-lve-devel crit-lve
+

On CloudLinux OS Shared 8 and above you also should install next packages

yum install -y alt-python37-mock alt-python37-pytest httpd-devel
+
  1. Download mod_lsapi sources
yumdownloader --source mod_lsapi --enablerepo=*source
+
  1. Rebuild the package with your Apache using rpmbuild
rpmbuild --rebuild mod_lsapi-ver.el7.cloudlinux.src.rpm
+

Note

This command will fail, but it will create a ~/rpmbuild/SPECS/mod_lsapi.spec file. +This ~/rpmbuild/SPECS/mod_lsapi.spec file will need to be modified.

  1. Remove building dependency from httpd-devel in the mod_lsapi.spec spec file located in the ~/rpmbuild/SPECS/ directory.

  2. Change the paths to copy mod_lsapi.so and mod_lsapi.conf in the %install section of the mod_lsapi.spec file. For example, if Apache root is /usr/local/apache, then modules directory and config files directory will be /usr/local/apache/modules and /usr/local/apache/conf.d respectively. So for the config file you should substitute the following line in the %install section:

install -D -m 644 conf/mod_lsapi.conf $RPM_BUILD_ROOT%{g_path}/confs/lsapi.conf
+

with the following line:

install -D -m 644 conf/mod_lsapi.conf $RPM_BUILD_ROOT/usr/local/apache/conf/lsapi.conf
+

And, also, for the module you should substitute the following line in the %install section:

install -D -m 755 build/lib/mod_lsapi.so $RPM_BUILD_ROOT%{g_path}standard/mod_lsapi.so 
+

with the following line:

install -D -m 755 build/lib/mod_lsapi.so $RPM_BUILD_ROOT/usr/local/apache/modules/mod_lsapi.so
+

Also you should add mentions of both module and config files in the %files section of mod_lsapi.spec. For example, for /usr/local/apache Apache root the following two lines should be added:

%config /usr/local/apache/conf.d/lsapi.conf
+/usr/local/apache/modules/mod_lsapi.conf
+
  1. Rebuild the package again, this time you should get to the compilation stage.

Use this command to rebuild a package +

rpmbuild -bb ~/rpmbuild/SPECS/mod_lsapi.spec
+

During compilation, you may encounter some errors: +

-- Not Found Apache Bin Directory: APACHE2_2_HTTPD_BIN-NOTFOUND, APACHE2_2_HTTPD_MODULES-NOTFOUND
+-- Can't find Apache2.2: APACHE2_2_HTTPD_INCLUDE_DIR-NOTFOUND
+

In this case, you should specify the paths of your custom Apache in the mod_lsapi-1.1/cmake/FindApacheForBuild.cmake file. According to macros above, add the paths to the directory where httpd binary is located, to the dir where apache modules are located and to the dir where include files are located. It may look a such way:

FIND_PATH (APACHE2_2_HTTPD_INCLUDE_DIR 
+   NAMES 
+      httpd.h
+   PATHS
+      ${APACHE2_2_INCLUDES_DIR}
+      /usr/local/include/httpd
+      /usr/include/httpd
+      /usr/include/apache
+      /usr/local/apache/include/       # added line
+)
+

Starting from mod_lsapi-1.1-57, you can use macros for custom paths to the Apache/APR includes/binaries.

A custom Apache location can be defined via the CUSTOM_APACHE_ROOT variable. This implies the following structure under the ${CUSTOM_APACHE_ROOT}:

${CUSTOM_APACHE_ROOT}/bin Apache binary directory, apachectl location
${CUSTOM_APACHE_ROOT}/include Apache include directory, httpd.h location
${CUSTOM_APACHE_ROOT}/include apr include directory, apr.h location
${CUSTOM_APACHE_ROOT}/include apr-util include directory, apu.h location
${CUSTOM_APACHE_ROOT}/lib apr lib directory, libapr.so location
${CUSTOM_APACHE_ROOT}/lib apr-util lib directory, libaprutil.so location
${CUSTOM_APACHE_ROOT}/modules Apache modules directory, mod_alias.so location

If the real structure of Apache root differs from the implied one, it's possible to define a custom location for every single component.

CUSTOM_APACHE_BIN Apache binary directory, apachectl location
CUSTOM_APACHE_INC_HTTPD Apache include directory, httpd.h location
CUSTOM_APACHE_INC_APR apr include directory, apr.h location
CUSTOM_APACHE_INC_APU apr-util include directory, apu.h location
CUSTOM_APACHE_LIB_APR apr lib directory, libapr.so location
CUSTOM_APACHE_LIB_APU apr-util lib directory, libaprutil.so location
CUSTOM_APACHE_MODULES Apache modules directory, mod_alias.so location
  1. To customize the switch_mod_lsapi script add into mod_lsapi.spec custom script and its configuration file. Configuration file name should be config.ini file. Script file name can be arbitrary, because its name should be mentioned in config.ini file. Both of them should be copied into /usr/share/lve/modlscapi/custom in the %install section of the mod_lsapi.spec file. For example, if script file name is custom.sh, you should add the following lines into %install section of mod_lsapi.spec file:
install -D -m 644 config.ini $RPM_BUILD_ROOT%{g_path}/custom/config.ini
+install -D -m 755 custom.sh $RPM_BUILD_ROOT%{g_path}/custom/custom.sh
+

Also you should add mentions of both files in the %files section of mod_lsapi.spec:

/usr/share/lve/modlscapi/custom/config.ini 
+/usr/share/lve/modlscapi/custom/custom.sh
+

The requirements to the config.ini file and script file are described in the following section

  1. Rebuild the package again, if you set everything correctly, there shouldn't be any problems.

Use this command to rebuild a package +

rpmbuild -bb ~/rpmbuild/SPECS/mod_lsapi.spec
+
  1. Install the module, check that it is successfully loaded into Apache.

How to integrate switch_mod_lsapi script with custom panels

To be able to use switch_mod_lsapi you have to do the steps mentioned below. We assume that if the /usr/share/lve/modlscapi/custom/config.ini file exists, then it is a Custom Panel.

  1. Create config.ini file /usr/share/lve/mod_lsapi/custom/ directory. As an example we have created a config.ini.example file. All directives that are shown in example file needed in GLOBAL section:
[GLOBAL]
+VERSION = 1.0.0
+APACHECTL_BIN_LOCATION = /usr/sbin/apachectl
+DOC_URL = http://docs.cloudlinux.com/index.html?apache_mod_lsapi.html
+EXECUTABLE_BIN = custom.sh
+PANEL_NAME=CustomPanel
+
  1. Create executable script in /usr/share/lve/mod_lsapi/custom/executable.sh. Name it as you want and specify in the config.ini file. Set EXECUTABLE_BIN=executable.sh in the GLOBAL section of the ini file. Script must be located in the /usr/share/lve/mod_lsapi/custom/ directory.

  2. Custom script options correspond to the options of the switch_mod_lsapi. For more information use the this document.

What you need to write in your custom executable.sh file.

You have to implement options in your script. Switch_mod_lsapi will call executable with corresponding arguments. Script must return exit code 0 as success or some integer in case of fail.

Supported options are:

switch_mod_lsapi --setup
+/usr/share/lve/modlscapi/custom/executable.sh --setup
+
+switch_mod_lsapi --uninstall
+/usr/share/lve/modlscapi/custom/executable.sh --uninstall
+
+switch_mod_lsapi --enable-domain test.com
+/usr/share/lve/modlscapi/custom/executable.sh --enable-domain test.com
+

Script executable.sh executed with two arguments --disable-domain and domain name:

switch_mod_lsapi --disable-domain test.com
+/usr/share/lve/modlscapi/custom/executable.sh --disable-domain test.com
+

Script executable.sh executed with --enable-global argument:

switch_mod_lsapi --enable-global
+/usr/share/lve/modlscapi/custom/executable.sh --enable-global
+

Script executable.sh executed with --disable-global argument:

switch_mod_lsapi --disable-global
+/usr/share/lve/modlscapi/custom/executable.sh --disable-global
+

Сustom script executed with --verbose and --force arguments if switch_mod_lsapi are called with.

Not supported options are:

--setup-light
+--build-native-lsphp
+--build-native-lsphp-cust
+--check-php
+--stat
+

mod_lsapi uses one predefined lsphp handler application/x-httpd-lsphp, which relates to /usr/local/bin/lsphp binary. All other lsphp handlers should be added by custom script into /etc/container/php.handler file.

An example of /etc/container/php.handler file

application/x-lsphp52 /opt/alt/php52/usr/bin/lsphp
+application/x-lsphp53 /opt/alt/php53/usr/bin/lsphp
+application/x-lsphp54 /opt/alt/php54/usr/bin/lsphp
+application/x-lsphp55 /opt/alt/php55/usr/bin/lsphp
+application/x-lsphp56 /opt/alt/php56/usr/bin/lsphp
+application/x-lsphp70 /opt/alt/php70/usr/bin/lsphp
+application/x-lsphp71 /opt/alt/php71/usr/bin/lsphp
+application/x-lsphp72 /opt/alt/php72/usr/bin/lsphp
+
+application/x-httpd-php81-lsphp /usr/local/apps/php81/bin/lsphp
+

An example of executable.sh script:

#!/bin/bash
+ 
+CMD=$1
+ 
+if [ "$CMD" == "--setup" ]; then
+    echo "application/x-httpd-php81-lsphp /usr/local/apps/php81/bin/lsphp"     >>/etc/container/php.handler
+fi 
+ 
+if [ "$CMD" == "--uninstall" ]; then
+    sed -i #application/x-httpd-php81-lsphp#d" /etc/container/php.handler
+fi
+ 
+if [ "$CMD" == "--enable-domain" ]; then
+    http_root=`/opt/ExamplePanel/domain2root $2`
+    if [ -e $http_root/.htaccess ]; then
+        sed -i '/lsphp/d' $http_root/.htaccess
+    fi
+fi 
+ 
+if [ "$CMD" == "--disable-domain" ]; then
+    http_root=`/opt/ExamplePanel/domain2root $2`
+    if [ -e $http_root/.htaccess ]; then
+        sed -i '/lsphp/d' $http_root/.htaccess
+    fi
+fi 
+ 
+# if command not supported
+if [ "$CMD" == "--enable-global" ]; then
+    echo "LSAPI enable global command is not supported by ExamplePanel"; exit 1
+fi 
+

MySQL Governor

:::Warning +MySQL Governor is not available in CloudLinux OS Admin edition. +:::

  1. Install MySQL Governor
yum install governor-mysql
+
  1. MySQL Governor supports only cl-MariaDB** or cl-MySQL** packages. Follow the documentation to figure out all supported versions.
/usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=mysqlXX
+
  1. Backup your databases.

  2. Run the cl-MySQL/cl-MariaDB installation.

/usr/share/lve/dbgovernor/mysqlgovernor.py --install
+
  1. After installation, check that the database server is working properly. If you have any problems, contact support

  2. Configure user mapping to the database. The mapping format is described in the following section. The control panel should automatically generate such mapping and write it to /etc/container/dbuser-map. Usually, it is enough to write a hook when adding, deleting or renaming a database for a user. The control panel should implement such a mechanism for MySQL Governor to operate properly. MySQL Governor automatically applies changes from the dbuser-map file every five minutes.

  3. MySQL Governor configuration can be found in the following section.

  4. MySQL Governor CLI tools description can be found in the following section

  5. Having configured the mapping use dbtop to see the current user load on the database (you'd need to make some database queries).

dbtop
+
  1. If the load appears in the dbtop output, then you have successfully configured MySQL Governor.

CloudLinux OS Shared LVE and CageFS patches

Note

If you are using Apache from the CloudLinux OS Shared repository (such as httpd or httpd24-httpd), skip this section.

If you use custom Apache, you need to apply patches so that the processes launched by the Apache are working with LVE and CageFS properly. +Cloudlinux OS Shared provides patches for the following packages:

  • suphp
  • suexec
  • php-fpm
  • apr library
  • Apache mpm itk

First of all, download patches using the following link https://repo.cloudlinux.com/cloudlinux/sources/da/cl-apache-patches.tar.gz

To apply the patch, follow these steps.

  1. Untar archive which you were going to patch and go to the created directory with sources.

  2. Transfer the patch to the directory with sources.

  3. Use the patch utility inside the directory with sources

  4. Recompile your project.

Here's an example with apr library:

# ls 
+apr-1.4.8.tar.bz2  apr-2.4-httpd.2.patch
+# tar xvjf apr-1.4.8.tar.bz2
+# cp apr-2.4-httpd.2.patch ./apr-1.4.8
+# cd ./apr-1.4.8
+# patch -p3 < apr-2.4-httpd.2.patch 
+patching file include/apr_thread_proc.h
+Hunk #1 succeeded at 204 (offset -2 lines).
+patching file threadproc/unix/proc.c
+
+Patch applied Successfully, recompile apr. 
+

If you build custom RPM packages, it might make sense to apply patches using spec file.

In this case, add to the Source section (example for apr):

Source0: apr-1.4.8.tar.bz2
+Patch100: apr-2.4-httpd.2.patch
+

Then apply this patch in the %setup section:

%prep
+%setup -q
+%patch100 -p3 -b .lve
+

If no errors appear during the build, the patch has been successfully applied.

Hardened PHP

All versions of alt-php should work properly in any control panel.

To install all PHP versions, run:

yum groupinstall alt-php
+

To install a particular version of PHP, run:

yum groupinstall alt-php{some_version}
+

For details, see PHP Selector Installation and Update

CloudLinux OS Shared kernel set-up

/proc filesystem access control

CloudLinux OS Shared kernel allows the server administrator to control the user access to the /proc filesystem with the special parameters. +Unprivileged system users will not be able to see the processes of other system users, they can only see their processes. See details here.

If the fs.proc_can_see_other_uid parameter is not defined in sysctl config during the CageFS package installation, it is set to 0: fs.proc_can_see_other_uid=0.

You can also set this parameter in the /etc/sysctl.conf file and then run the sysctl -p command.

hidepid parameter is set based on the fs.proc_can_see_other_uid parameter value automatically during the lve_namespaces service starting (i.e. during lve-utils package installation and server booting).

Integrating control panel with CloudLinux OS Shared

Run the following command to add administrators into proc_super_gid group (if the panel administrator is not a root user or there are several administrators):

/usr/share/cloudlinux/hooks/post_modify_admin.py create --username <admin_name>
+

Note

This administrator should exist as a system user.

This command also adds a specified administrator to the clsudoers group, so the LVE Manager admin's plugin works properly.

This command is a hook that the control panel should call after adding the admin user to the system.

If the admins list script exists when installing lve-utils package then the existing administrators will be processed automatically. It the script does not exist, you should run the above mentioned command for each administrator.

CloudLinux OS Shared kernels have symlink attacks protection. When this protection is enabled, the system does not allow users to create symlinks (and hard links) to non-existent/not their own files.

Here you can find all protection mechanism parameters.

See also: the special module to protect web-server.

You can run cldiag utility with the --check-symlinkowngid parameter to check whether your web-server protection mechanisms are correctly set-up.

# cldiag --symlinksifowner
+Check fs.enforce_symlinksifowner is correctly enabled in sysctl conf:
+	OK: fs.enforce_symlinksifowner = 1
+
+There are 0 errors found.
+# cldiag --check-symlinkowngid
+Check fs.symlinkown_gid:
+	OK: Web-server user is protected by Symlink Owner Match Protection
+
+There are 0 errors found.
+
  • Symlink traversal protection is disabled by default.
  • Symlink owner match protection is enabled by default.

Set the symlinkown_gid parameter to the value of the GID group of the web-server process.

Before enabling symlink protection, ensure it does not break the control panel functionality.

For example, if an unprivileged user is allowed to create symlinks or hard links to files or directories he doesn’t own then when enabling symlink traversal protection he will not be able to do so.

To allow an unprivileged user to create such symlink or hard link, a file/directory which symlink is referred to should have linksafe group.

File system quotas

Some of CloudLinux OS Shared utilities (cagefsctl, selectorctl, cloudlinux-selector, etc) writes files to the user’s home directory on behalf of this user.

So they are subject to the disk quotas if any are set for the user. The utilities can override these quotas to avoid failures. +See File system quotas for kernel parameters controlling these permissions. This parameter is used only for XFS file system.

How to integrate X-Ray with a control panel

WARNING!

Please note that cPanel, Plesk and DirectAdmin are already supported by X-Ray and do not require any integration effort.

Note

X-Ray support is available since API v1.2 (see versioning)

In order to integrate X-Ray into your panel, you should follow two simple steps.

  1. Extend the output of your existing domains integration script as follows:

1.1. Implement an optional flag --with-php, upon which all domains with their PHP configuration will be returned. +Thus, if your integration config file /opt/cpvendor/etc/integration.ini has

domains = /opt/cpvendor/bin/vendor_integration_script domains
+

in [integration_scripts] section, X-Ray would call this script as +

/opt/cpvendor/bin/vendor_integration_script domains --with-php
+

1.2. In order to enable X-Ray support, the script output should return a representation of all domains on the server: a key-value object, where a key is a domain (or subdomain) and a value is a key-value object contains the owner name (UNIX users) and PHP interpreter configuration. If you are extending the existing domains integration script, you just include the PHP configuration.

PHP interpreter configuration for each domain is to be placed in the nested key-value object of the following format:

“php”: {
+   “version”: str
+   “ini_path”: str
+   “is_native”: bool
+   “fpm”: str
+}
+

Output example

{
+  "data": {
+    "domain.com": {
+      "owner": "username",
+      "document_root": "/home/username/public_html/",
+      "is_main": true,
+      "php": {
+        "version": "56",
+        "ini_path": "/opt/alt/php56/link/conf",
+        "is_native": true
+       }
+    },
+    "subdomain.domain.com": {
+      "owner": "username",
+      "document_root": "/home/username/public_html/subdomain/",
+      "is_main": false,
+      "php": {
+        "version": "72",
+        "ini_path": "/opt/alt/php72/link/conf",
+        "fpm": "alt-php72-fpm"
+      }
+    }
+  },
+  "metadata": {
+    "result": "ok"
+  }
+}
+

Data description

Key Required Description
version True The version of php that is selected by the end user or administrator in the panel for this domain. Should be presented in the format XY where XY is the exact version of PHP. List of supported versions is presented below.
ini_path True Path where PHP expects additional .ini files to scan, usually compiled path into binary PHP.Example where to get this value:
is_native False If your panel has integrated CloudLinux OS Shared PHP Selector, then there is the list of native PHP binaries in the native.conf (see details here). The is_native value must be set to true if the binary of the above version of PHP is specified in the native.conf, false or omitted otherwise. This way the X-Ray will determine if CloudLinux OS Shared PHP Selector is enabled for a given domain
fpm False The name of the FPM service that uses specified domain, optional value. To make the X-Ray work on domains using FPM, you need to restart FPM service. In X-Ray added automatic restart of the FPM service if the tracing task is created for the domain that uses the FPM therefore we need this field, otherwise it can be omitted
  1. After finishing the X-Ray integration script, enable X-Ray support through panel_info integration script: add xray component into supported_cl_features object.

Output example

{
+	"data": {
+		"name": "SomeCoolWebPanel",
+		"version": "1.0.1",
+		"user_login_url": "https://{domain}:1111/",
+		"supported_cl_features": {
+			"php_selector": true,
+			"ruby_selector": true,
+			"python_selector": true,
+			"nodejs_selector": false,
+			"mod_lsapi": true,
+			"mysql_governor": true,
+			"cagefs": true,
+			"reseller_limits": true,
+			"xray": true
+		}
+	},
+	"metadata": {
+		"result": "ok"
+	}
+}
+
+ + + diff --git a/deploy.sh b/deploy.sh deleted file mode 100644 index b6b0e948f..000000000 --- a/deploy.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env sh - -# abort on errors -set -e - -# build -yarn docs:build - -# navigate into the build output directory -cd docs/.vuepress/dist - -# if you are deploying to a custom domain -echo 'docs.cloudlinux.com' > CNAME - -git config --global user.email "telepenin.nikolay@gmail.com" -git config --global user.name "circle-ci" - -git init -git add -A -git commit -m 'deploy [skip ci]' - -# if you are deploying to https://.github.io/ -git push -f git@github.com:cloudlinux/cloudlinux-doc.git master:gh-pages - -cd - diff --git a/deprecated/index.html b/deprecated/index.html new file mode 100644 index 000000000..77a9008e9 --- /dev/null +++ b/deprecated/index.html @@ -0,0 +1,645 @@ + + + + + + Deprecated | Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Deprecated

Python Selector (Old)

Note

This documentation is for the old version of Python Selector. You can find documentation for the new Python Selector here

We have the ability to deploy Python applications via application server. Python Selector uses mod_passenger to host Python.

This feature is available for CloudLinux OS Shared 6 or later. It supports only cPanel servers.

You can find a list of supported alt-python versions using the following command.

yum grouplist | grep alt-python
+

Installation

Note

The instructions below are suitable only for EasyApache 3 and EasyApache 4. You should follow this instruction if you use LiteSpeed.

Install tools to create isolated Python environments and Passenger Apache module. For servers with EasyApache3:

yum install lvemanager alt-python-virtualenv alt-mod-passenger
+

for EasyApache4:

yum install lvemanager alt-python-virtualenv ea-apache24-mod-alt-passenger
+

To use Python Selector you should install alternative Python packages:

yum groupinstall alt-python
+

To use MySQL database you should install alt-python27-devel package:

yum install alt-python27-devel
+

Note

After installation, please make sure that you have unmarked appropriate checkboxes in LVE Manager Options tab to show Python App in web-interface.

Note

Adding Python modules requires executing permissions to gcc/make binaries. Please enable compilers in Compiler Access section of WHM, then run: cagefsctl --force-update

End user access

  1. In Software/Services area choose Select Python Environment.

  1. Create project form will appear. Choose interpreter version for your application, application folder name (project path) and URI for accessing your application. Click “Create project” to create an application.

After a little while a new application entry will be appended to the web-page.

  1. You can edit path (folder name of the project in the home directory, for example, /home/clman1/project_name ), uri for application, wsgi handler. If you click Edit - the value is converted to input field and thus becomes editable. When editing is complete, click Save .

  1. Wsgi entry is to specify python wsgi application entry point. It must be specified as filename, must be callable and separated by colon. If your app is running from file flask/run.py by calling callable app, set flask/run.py:app .

  1. When Show control is clicked, python extensions section will be expanded. It gives the ability to add or remove python modules. When start typing in input field, appropriate hints are shown in drop-down list. Choose the entry you want from drop-down and click Add .

If you click Delete , the corresponding module entry will disappear. +In addition to setting path, uri and wsgi , the interpreter version can be changed as well by changing the value in select drop-down.

  1. No changes are applied to application environment until Update button is clicked. Before the Update button is clicked, all changes can be reverted with Reset button.

The newly created application will be supplied with stub only. A real application ought to be put into application folder. After application is placed into application folder, the wsgi parameter can be set.

Click Remove to delete the application - the application folder itself will remain unmoved.

Note. For LVE Manager version 0.9-10 and higher:

When creating an application you can use the key --domain , which attaches application to domain. If --domain key is not specified, then the main users domain will be used by default. +To create application run:

/usr/bin/selectorctl --interpreter=python --version=VERSION[--user=USER] [--domain=DOMAIN] [--print-summary] [--json]–-create-webapp <FOLDER_NAME> <URI>
+

When changing application URI, --domain key can be used simultaneously, in this case not only URI will be changed, but also the application domain.

To change application URI run:

/usr/bin/selectorctl --interpreter=python [--user=USER][--domain=NEW_DOMAIN] [--print-summary] [--json] --transit-webapp<FOLDER_NAME> <NEW_URI> 
+

The possibility to choose domain when creating an application was added to web interface as well.

Also, you can run simple commands from web interface (e.g. you can install packages from specific repositories or control web applications by means of django -admin).

Hide Python Selector icon

It is possible to hide or show Python Selector icons by marking or unmarking proper checkbox in LVE Manager Options tab.

The same result can be accomplished in CLI by running:

cloudlinux-config set --json --data '{"options":{"uiSettings":{"hideRubyApp":false, "hidePythonApp":false}}}'
+

Note

If you are using cPanel/WHM, you can also configure hide/show CloudLinux OS Shared Python Selectors in WHM | Feature Manager. +For that, you’d need to first uncheck Hide Python App in web-interface in the LVE Manager. This will make the menu appear for all accounts. After that, you are free to disable this app in WHM | Feature Manager for the required feature lists.

Git for cPanel

Note

This package is no longer supported as it may cause dependency issues

Please note that this package is no longer needed, as since cPanel 11.38, you can install git without any issues on cPanel by running:

$ yum install git
+

To install git on cPanel servers:

$ yum install git-cpanel
+

LVE-Stats 0.x

Note

LVE-STATS-0.X IS NO LONGER SUPPORTED, PLEASE USE LVE-STATS 2

lve-stats package collects LVE usage statistics and allows to query the data.

To install, run:

$ yum install lve-stats
+

If you are already running lve-stats (in case you are running cPanel LVE plugin), run:

$ yum update lve-stats
+

This should also be updated automatically next time your system runs system wide update.

The package installs lvestats-server. You can re-start the server by running:

$ service lvestats restart
+

The package creates sqlite database /var/lve/lveinfo.db that stores history information about LVE usage. Up to two months of hourly info is stored for each client. The data for the last hour is stored with 5 minutes interval, and the data for the past 10 minutes is stored with 1 minute interval.

LVE Stats updates /var/lve/info every few seconds. That info is used by LVE Manager plugin.

Package consists of lveinfo utility to query LVE usage, and lvechart that allows you to chart usage for individual LVE.

To query historical LVE info, lveinfo command provided. It is located at /usr/sbin/lveinfo: +  +

# /usr/sbin/lveinfo [OPTIONS]
+-h --help              : this help screen
+-v, --version          : version number
+-d, --display-username : try to convert LVE id into username when possible
+-f, --from=            : run report from date and time in YYYY-MM-DD HH:MM format
+      if not present last 10 minutes are assumed
+-t, --to=              : run report up to date and time in YYYY-MM-DD HH:MM format
+      if not present, reports results up to now
+-o, --order-by=        : orders results by one of the following:
+      cpu_avg          : average CPU usage
+      cpu_max          : max CPU usage
+      mep_avg          : average number of entry processes (concurrent connections)
+      mep_max          : max number of entry processes (concurrent connections)
+      vmem_avg         : average virtual memory usage
+      vmem_max         : max virtual memory usage
+      pmem_avg         : average physical memory usage
+      pmem_max         : max physical memory usage
+      nproc_avg        : average number of processes usage
+      nproc_max        : max number of processes usage
+      io_avg           : average IO usage
+      io_max           : max IO usage
+      total_mem_faults : total number of out of virtual memory faults (deprecated since 0.8-6)
+      total_vmem_faults: total number of out of virtual memory faults (since 0.8-6)
+      total_pmem_faults: total number of out of physical memory faults (since 0.8-6)
+      total_mep_faults : total number of entry processes faults (deprecated since 0.8-6)
+      total_ep_faults  : total number of entry processes faults (since 0.8-6)
+      total_nproc_faults: total number of number of processes faults (since 0.8-6)
+      any_faults       : total number of any types of faults (since 0.8-6)
+    --id=              : LVE id -- will display record only for that LVE id
+-u, --user=            : Use username instead of LVE id, and show only record for that user
+-l, --limit=           : max number of results to display, 10 by default
+-c, --csv              : display output in CSV format
+-b, --by-usage         : show LVEs with usage (averaged or max) within 90% percent of the limit
+      available values:
+      cpu_avg          : average CPU usage
+      cpu_max          : max CPU usage
+      mep_avg          : average number of entry processes (concurrent connections)
+      ep_avg           : average number of entry processes (since 0.8-6)
+      mep_max          : max number of entry processes (concurrent connections)
+      ep_max           : max number of entry processes (since 0.8-6)
+      mem_avg          : average virtual memory usage
+      mem_max          : max virtual memory usage
+      vmem_avg         : average virtual memory usage
+      vmem_max         : max virtual memory usage
+      pmem_avg         : average physical memory usage
+      pmem_max         : max physical memory usage
+      nproc_avg        : average number of processes
+      nproc_max        : max number of processes
+      io_avg           : average IO usage
+      io_max           : max IO usage
+-p, --percentage       : defines percentage for --by-usage option
+-f, --by-fault         : show LVEs which failed on max entry processes limit or memory limit
+      available values: mem, mep.
+      since 0.8-6      : vmem, pmem, ep, nproc
+    --show-all         : since 0.8-6 only columns for enabled limits will show up. 
+-r, --threshold        : in combination with --by-fault, shows only LVEs with number of faults above threshold specified
+    --server_id        : used in combination with centralized storage, to access info from any server
+    --show-all         : full output (show all limits); brief output by default
+

Output

ID LVE Id or username
aCPU Average CPU usage
mCPU Max CPU usage
lCPU CPU Limit
aEP CPU Limit
mEP Max Entry Processes
lEP Entry Proc limit
aNPROC Average Number of Processes
mNPROC Max Number of Processes
lNPROC Number of Processes limit
aVMEM Average virtual Memory Usage
mVMEM Max virtual Memory Usage
lVMEM Virtual Memory Limit
aPMEM Average physical Memory Usage
mPMEM Max physical Memory Usage
lPMEM Physical Memory Limit
aIO Average IO usage
mIO Max IO usage
lIO IO Limit
fVMEM Out Of Virtual Memory Faults
fPMEM Out Of Physical Memory Faults
fEP Entry processes faults
fNPROC Number of processes faults
  • only enabled limits will show up

Examples

Display top 10 users, by max CPU usage, from Oct 10, 2010 to Oct 15, 2010. Display username if possible:

$ lveinfo --from='2010-10-10' --to='2010-10-15' -o cpu_max --display-username 
+ID        aCPU       mCPU     lCPU      aEP      mEP      lEP       aMem       mMem      lMem      MemF     MepF 
+777         7        9        10        0        0        25        10M        15M       1G        0        0 
+300         2        8        10        0        1        25        1M         3M        1G        0        0 
+web2        1        6        10        0        0        25        17K        18M       1G        0        0 
+web1        0        0        10        0        0        25        204K       1M        1G        0        0 
+
+Display LVE info about user web2 , from Oct 10, 2010 to Oct 15, 2010: +
$ lveinfo --from='2010-10-10' --to='2010-10-15' --user=web2 --display-username
+ID        aCPU       mCPU     lCPU      aEP      mEP      lEP       aMem       mMem       lMem      MemF     MepF 
+web2        1        6        10        0        0        25        10M        15M        1G        0        0
+

Storing statistics in MySQL

Note

LVE-STATS-0.X IS NO LONGER SUPPORTED, PLEASE USE LVE-STATS 2

You have to install MySQL-python rpm to store lve-stats on centralized server. Run:

$ yum install MySQL-python
+

If you have MySQL 5.3+ installed on CloudLinux OS Shared 5 server, and there is no libmysqlclient_r.so.15 on the server, run:

$ yum --enablerepo=cloudlinux-updates-testing install mysqlclient15
+

A typical procedure to configure the MySQL database for storing information about multiple servers for lve-stats services looks as follows:

Create database and user. You can do it by executing the following commands:

create database <database>;
+grant all on <database>.* to <user> identified by 'password';
+flush privileges;
+

Create database schema:

CREATE TABLE history (id INTEGER,
+        cpu INTEGER, cpu_limit INTEGER,
+        cpu_max INTEGER,
+        ncpu INTEGER,
+        mep INTEGER, mep_limit INTEGER,
+        mep_max INTEGER,
+        io INTEGER, io_limit INTEGER,
+        mem INTEGER, mem_limit INTEGER,
+        mem_max INTEGER,
+        mem_fault INTEGER, mep_fault INTEGER,
+        created TIMESTAMP, weight INTEGER, server_id CHAR(10),
+        lmemphy INTEGER, memphy INTEGER, memphy_max INTEGER, memphy_fault INTEGER,
+        lnproc INTEGER, nproc INTEGER, nproc_max INTEGER, nproc_fault INTEGER,
+        lcpuw INTEGER, io_max INTEGER,
+        iops INTEGER, liops INTEGER, iops_max INTEGER );
+CREATE INDEX idx_history_id ON history(id);
+CREATE INDEX idx_history_created ON history(created);
+CREATE INDEX idx_history_weight ON history(weight);
+CREATE INDEX idx_history_server_id ON history(server_id);
+CREATE TABLE last_run (hourly TIMESTAMP, daily TIMESTAMP, server_id CHAR(10), lve_version INTEGER);
+CREATE TABLE users (server_id CHAR(10), id INTEGER, username CHAR(20));
+CREATE INDEX idx_users_server_id ON users(server_id);
+CREATE INDEX idx_users_id ON users(id); 
+
+CREATE TABLE history_gov ( ts INTEGER,
+                           username CHAR(64),
+                           max_simultaneous_requests INTEGER,
+                           sum_cpu FLOAT,
+                           sum_write FLOAT,
+                           sum_read FLOAT,
+                           number_of_iterations INTEGER,
+                           max_cpu FLOAT,
+                           max_write FLOAT,
+                           max_read FLOAT,
+                           number_of_restricts INTEGER,
+                           limit_cpu_on_period_end INTEGER,
+                           limit_read_on_period_end INTEGER,
+                           limit_write_on_period_end INTEGER,
+                           cause_of_restrict INTEGER,
+                           weight INTEGER,
+                           server_id char(10)); 
+
+CREATE INDEX idx_history_gov_ts ON history_gov(ts);
+CREATE INDEX idx_history_gov_cause_of_restrict ON history_gov(cause_of_restrict);
+CREATE INDEX idx_history_gov_number_of_restricts ON history_gov(number_of_restricts); 
+CREATE INDEX idx_history_gov_max_simultaneous_requests ON history_gov(max_simultaneous_requests);
+CREATE INDEX idx_history_gov_server_id ON history_gov(server_id);
+CREATE INDEX idx_history_gov_weight ON history_gov(weight);
+
+CREATE TABLE last_run_gov (hourly TIMESTAMP, daily TIMESTAMP, server_id CHAR(10), lve_version INTEGER);
+
+
+* Execute following SQL command for each remote server for which you want to store
+statistics in this database (make sure you substitute _SERVER_NAME_ with the same
+servername as used in lvestats config file on remote server: 
+
+INSERT INTO last_run(hourly, daily, server_id, lve_version) VALUES (UTC_TIMESTAMP(), UTC_TIMESTAMP(), '_SERVER_NAME_', 4);
+

On each server edit file /etc/sysconfig/lvestats & /etc/sysconfig/lvestats.readonly as follows:

db_type = mysql
+connect_string = host:database:user:password
+server_id = _SERVER_NAME_
+db_port = _port_
+

Note

lvestats.readonly should have a user that has read only access to all tables from lvestats database.

Note

SERVER_NAME should be at most 10 characters

Note

db_port is an optional parameter. Default port would be used.

Select server responsible for compacting database on regular bases by setting COMPACT=master in /etc/sysconfig/lvestats for that server. Set COMPACT=slave on all other servers.

Make sure that /etc/sysconfig/lvestats is readable only by root (chmod 600 /etc/sysconfig/lvestats), lvestats.readonly should be readable by anyone

Restart service:

service lvestats restart
+

If you use central database to store lvestats data, on each server, execute:

$ /usr/share/lve-stats/save_users_to_database.py 
+

You just need to execute it once, as it will be later executed via cron job . That script will store usernames from each server, so that lve-stats would later be able to correctly identify each user.

Updating MySQL & PostgreSQL schema for lve-stats 0.8+

If you are using MySQL or PostgreSQL server for lve-stats older then 0.8, make sure to do the following steps to upgrade to latest version:

Stop lvestats service on all your servers.

Connect to your database server, and execute following commands:

ALTER TABLE history ADD lmemphy INTEGER;
+ALTER TABLE history ADD memphy INTEGER;
+ALTER TABLE history ADD memphy_max INTEGER;
+ALTER TABLE history ADD memphy_fault INTEGER;
+ALTER TABLE history ADD lnproc INTEGER;
+ALTER TABLE history ADD nproc INTEGER;
+ALTER TABLE history ADD nproc_max INTEGER;
+ALTER TABLE history ADD nproc_fault INTEGER;
+ALTER TABLE history ADD lcpuw INTEGER;
+ALTER TABLE history ADD io_max INTEGER;
+UPDATE history SET lmemphy = 0, memphy = 0, memphy_max = 0, memphy_fault = 0,
+       lnproc = 0, nproc = 0, nproc_max = 0, nproc_fault = 0,
+       lcpuw = 0, io_max = 0;
+
+ALTER TABLE last_run ADD lve_version INTEGER;
+UPDATE last_run SET lve_version = 4;
+CREATE TABLE last_run_gov (hourly TIMESTAMP, daily TIMESTAMP, server_id CHAR(10), lve_version INTEGER);
+
+To upgrade scheme to support MySQL Governor:
CREATE TABLE history_gov ( ts INTEGER,
+    username char(64),
+    max_simultaneous_requests INTEGER,
+    sum_cpu float,
+    sum_write float,
+    sum_read float,
+    number_of_iterations INTEGER,
+    max_cpu float,
+    max_write float,
+    max_read float,
+    number_of_restricts INTEGER,
+    limit_cpu_on_period_end INTEGER,
+    limit_read_on_period_end INTEGER,
+    limit_write_on_period_end INTEGER,
+    cause_of_restrict INTEGER,
+    server_id char(10));
+
+CREATE INDEX idx_history_gov_ts ON history_gov(ts);
+CREATE INDEX idx_history_gov_cause_of_restrict ON history_gov(cause_of_restrict);
+CREATE INDEX idx_history_gov_number_of_restricts ON history_gov(number_of_restricts);
+CREATE INDEX idx_history_gov_max_simultaneous_requests ON history_gov(max_simultaneous_requests);
+CREATE INDEX idx_history_gov_server_id ON history_gov(server_id);
+
+Upgrading from lve-stats < 0.9-20: +
ALTER TABLE history_gov ADD weight INTEGER;
+CREATE INDEX idx_history_gov_weight ON history_gov(weight);
+CREATE TABLE last_run_gov (hourly TIMESTAMP, daily TIMESTAMP, server_id CHAR(10), lve_version INTEGER);
+
+Update lve-stats RPM on all your servers. +

If you use central database to store lvestats data, execute the following commands:

CREATE TABLE users (server_id CHAR(10), id INTEGER, username CHAR(20));CREATE INDEX idx_users_server_id ON users(server_id);CREATE INDEX idx_users_id ON users(id);
+
+On each server execute: +
$ /usr/share/lve-stats/save_users_to_database.py 
+

You just need to execute it once, as it will be later executed via cron job. That script will store usernames from each server, so that lve-stats would later be able to correctly identify each user.

Storing statistics in PostgreSQL

Note

LVE-STATS-0.X IS NO LONGER SUPPORTED, PLEASE USE LVE-STATS 2

You have to install postgresql-python rpm to store lve-stats on centralized server.

Run:

$ yum install postgresql-python
+

A typical procedure to configure the PostgreSQL database for storing information about multiple servers for lve-stats services looks as follows:

Create a database and a user. You can do it by executing the following commands:

createdb <database>createuser <user>
+
+Create database schema: +
CREATE TABLE history (id INTEGER,
+        cpu INTEGER, cpu_limit INTEGER,
+        cpu_max INTEGER,
+        ncpu INTEGER,
+        mep INTEGER, mep_limit INTEGER,
+        mep_max INTEGER,
+        io INTEGER, io_limit INTEGER,
+        mem INTEGER, mem_limit INTEGER,
+        mem_max INTEGER,
+        mem_fault INTEGER, mep_fault INTEGER,
+        created TIMESTAMP, weight INTEGER, server_id CHAR(10),
+        lmemphy INTEGER, memphy INTEGER, memphy_max INTEGER, memphy_fault INTEGER,
+        lnproc INTEGER, nproc INTEGER, nproc_max INTEGER, nproc_fault INTEGER,
+        lcpuw INTEGER, io_max INTEGER,
+
+
+
+        iops_max: INTEGER, liops: INTEGER, iops: INTEGER);
+
+CREATE INDEX idx_history_id ON history(id);
+CREATE INDEX idx_history_created ON history(created);
+CREATE INDEX idx_history_weight ON history(weight);
+CREATE INDEX idx_history_server_id ON history(server_id);
+CREATE TABLE last_run (hourly TIMESTAMP, daily TIMESTAMP, server_id CHAR(10), lve_version INTEGER);
+CREATE TABLE users (server_id CHAR(10), id INTEGER, username CHAR(20));CREATE INDEX idx_users_server_id ON users(server_id);
+CREATE INDEX idx_users_id ON users(id);
+
+CREATE TABLE history_gov ( ts INTEGER,
+    username char(64),
+    max_simultaneous_requests INTEGER,
+    sum_cpu float,
+    sum_write float,
+    sum_read float,
+    number_of_iterations INTEGER,
+    max_cpu float,
+    max_write float,
+    max_read float,
+    number_of_restricts INTEGER,
+    limit_cpu_on_period_end INTEGER,
+    limit_read_on_period_end INTEGER,
+    limit_write_on_period_end INTEGER,
+    cause_of_restrict INTEGER,
+    weight INTEGER,
+    server_id char(10));
+
+CREATE INDEX idx_history_gov_ts ON history_gov(ts);
+CREATE INDEX idx_history_gov_cause_of_restrict ON history_gov(cause_of_restrict);
+CREATE INDEX idx_history_gov_number_of_restricts ON history_gov(number_of_restricts);
+CREATE INDEX idx_history_gov_max_simultaneous_requests ON history_gov(max_simultaneous_requests);
+CREATE INDEX idx_history_gov_server_id ON history_gov(server_id);
+CREATE INDEX idx_history_gov_weight ON history_gov(weight);
+
+CREATE TABLE last_run_gov (hourly TIMESTAMP, daily TIMESTAMP, server_id CHAR(10), lve_version INTEGER);
+
+     * Execute following SQL command for each remote server for which you want to store
+      statistics in this database (make sure you substitute _SERVER_NAME_ with the same
+      servername as used in lvestats config file on remote server:
+
+INSERT INTO last_run(hourly, daily, server_id, lve_version) VALUES (now() AT TIME ZONE 'UTC', now() AT TIME ZONE 'UTC', '_SERVER_NAME_', 4);
+
+On each server edit file `/etc/sysconfig/lvestats` and `/etc/sysconfig/lvestats` as follows: +
db_type = postgresql
+connect_string = host:database:user:password
+server_id = _SERVER_NAME_db_port = _port_
+

Note

lvestats.readonly should have a user that has read only access to history table.

Note

SERVER_NAME should be at most 10 characters

Note

db_port is optional, default PostgreSQL port will be used

Select server responsible for compacting database on regular bases by setting COMPACT=master in /etc/sysconfig/lvestats for that server. Set COMPACT=slave on all other servers.

Make sure that /etc/sysconfig/lvestats is readable only by root (chmod 600 /etc/sysconfig/lvestats), lvestats.readonly should be readable by anyone.

Restart service:

service lvestats restart
+
+If you use central database to store lvestats data, on each server, execute: +
$ /usr/share/lve-stats/save_users_to_database.py 
+
+You just need to execute it once, as it will be later executed via cron job . That script will store usernames from each server, so that lve-stats would later be able to correctly identify each user. +

You are done!

Compacting in multi-server settings

Note

LVE-STATS-0.X IS NO LONGER SUPPORTED, PLEASE USE LVE-STATS 2

[lve-stats 0.10+]

When you have multiple servers storing LVE statistics to a central database, then you will need to pick one server responsible for compacting data.

On that server, edit file: /etc/sysconfig/lvestats and change the option COMPACT to master.

On all other servers, change that option to slave.

Default: single – should be used when lve-stats stores data to a single database.

OptimumCache

Note

OPTIMUMCACHE IS NO LONGER SUPPORTED.

OptimumCache 0.2+

OptimumCache is a de-duplicating file cache optimized specifically for shared hosting. Typical shared hosting server runs a number of sites with WordPress and Joomla as well as other popular software. This usually means that there are hundreds of duplicate files that are constantly being read into file cache - both wasting precious disk IO operations as well as memory. OptimumCache creates a cache of such duplicated files and de-duplicates file cache. +

With OptimumCache, if a duplicate of an already loaded file is requested, the file gets loaded from filesystem cache. By doing that, system bypasses disk IO, significantly improving the speed of reading that file, while lowering load on the hard disk. As the file had been read from disk just once, it is cached by filesystem cache just once, minimizing amount of duplicates in file system cache and improving overall cache efficiency. This in turn reduces memory usage, decreases the number of disk operations - all while improving the websites response time.

Installation

NOTE

OPTIMUMCACHE IS NO LONGER SUPPORTED

Requirements

  • 64bit CloudLinux OS Shared 6.x or higher
  • ext4 filesystem
  • kernel lve1.2.55 or later.

Installation

# yum install optimumcache
+

OptimumCache must be provided with list of directories to expect duplicate files be in:

  • # occtl --recursive --mark-dir /home
  • # occtl --recursive --mark-dir /home2 (for cPanel)
  • # occtl --recursive --mark-dir /var/www (for Plesk)

OptimumCache is going to index these directories. Thus system load during this period (from hours to days) might be as twice as high. See Marking directories.

Allocating Disk Space for OptimumCache:

By default OptimumCache will attempt to setup 5GB ploop (high efficiency loopback disk) to be used for the cache in /var/share/optimumcache/optimumcache.image

That ploop will be mounted to: /var/cache/optimumcache

The ploop image will be located at /var/share/optimumcache/optimumcache.image

Allocating OptimumCache disk space for ploop on a fast drives (like SSD) will provide additional performance improvement as more duplicated files would be loaded from fast disks into memory.

Moving ploop image to another location:

# occtl --move-ploop /path/to/new/image/file [new size[KMGT]]
+

/path/to/new/image/file must be file path + file name, not a directory name.

Example:

# occtl --move-ploop /var/ssh/optimumcache.image
+

If new size is not mentioned, then value from /etc/sysconfig/optimumcache is used. If /etc/sysconfig/optimumcache does not mention anything regarding ploop image size, then default 5GB is used.

Enabling and disabling ploop:

To turn on ploop:

# occtl --init-ploop
+

To disable ploop:

# occtl --disable-ploop
+

If ploop image has been mounted in /etc/fstab for OpimumCache-0.1-21 and earlier, you may consider removing this fstab entry in OpimumCache 0.2+. That is because since 0.2+ ploop is mounted automatically at service start.

If you prefer leave that fstab mount point as is, you may see some warnings when you decide to move ploop later via occtl --move-ploop.

Resizing ploop:

To resize ploop:

# occtl --resize-ploop [new size[KMGT]]
+

A common reason for resizing ploop is reacting to OptimumCache syslog message like “OptimumCache recommends cache storage size to be at least … GB”.

Deleting ploop:

# occtl --delete-ploop
+

For the case when this action cannot be completed due to “Unable unmount ploop” issue, there is a workaround in “Troubleshooting” section.

Q. I created/resized/moved/deleted ploop. Do I need to rerun the initial mark process?

А. Not needed.

Using without ploop

Note

OPTIMUMCACHE IS NO LONGER SUPPORTED

On servers with kernel prior to lve1.2.55 ploop will not be used (due to ploop related issues in the kernel). Instead cached files will be stored in /var/cache/optimumcache.

The cache will be cleaned (shrunk) by 20% once partition on which OPTIMUMCACHE_MNT resides has only 10% of free space. You can change that by changing PURGEAHEAD param in /etc/sysconfig/optimumcache, and restarting optimumcache service.

The cache is cleaned /etc/cron.d/optimumcache_cron script optimumcache_purge, which runs every minute:

0-59 * * * * root /usr/share/optimumcache/optimumcache_purge
+

Marking directories

Note

OPTIMUMCACHE IS NO LONGER SUPPORTED

Marking directories to be cached:

# occtl --mark-dir /path/to/site/on/filesystem --recursive
+

In common scenario admin marks for caching user directories:

# occtl --mark-dir /home /home2 /home3 --recursive
+

OptimumCache is going to index these directories. Thus system load during this period (from hours to days) might be as twice as high. You can check indexing job status with at -l at any time.

Ignoring particular files & directories:

OptimumCache tracks files & directories that need to be cached. Once file is modified, it will no longer be tracked by OptimumCache (as there is very little chance that it will have a duplicate). Yet, all new files created in tracked directories are checked for duplicates.

Sometimes you might want to ignore such checks for directories where large number of temporary or new files are created, that will not have duplicates - as such checks are expensive. Directories like mail queue, and tmp directories should be ignored.

You can set a regexp mask for directories that you would like to ignore using:

$ occtl --add-skip-mask REGEX
+

To list skip masks:

$ occtl --list-skip-mask
+

To remove skip mask:

$ occtl --remove-skip-mask ID|Tag
+

At the very end, for those changes to take effect:

$ occtl --check
+

occtl --check is the same lengthy operation as marking is. Thus, it’s usage has to be sane, especially for big home (>500G).

By default, OptimumCache sets up following skip masks:

id tag regex
1 all_dot_files /\...*
2 cagefs ^/home/cagefs-skeleton$
3 cagefs ^/home/cagefs-skeleton/
4 cpanel ^/home[^/]*/cPanelInstall
5 cpanel ^/home[^/]*/cpeasyapache
6 cpanel ^/home[^/]*/aquota
7 cpanel ^/home[^/]*/jailshell
8 cpanel ^/home[^/]*/[^/]+/mail$
9 cpanel ^/home[^/]*/[^/]+/mail/.*
10 cpanel ^/home[^/]*/[^/]+/logs$
11 cpanel ^/home[^/]*/[^/]+/logs/.*
12 cpanel ^/home[^/]*/[^/]+/\.cpanel$
13 cpanel ^/home[^/]*/[^/]+/\.cpanel/.*
14 cpanel ^/home[^/]*/[^/]+/\.cagefs
15 cpanel ^/home[^/]*/[^/]+/\.cagefs/.*
16 cpanel ^/home[^/]*/virtfs
17 cpanel ^/home[^/]*/virtfs/.*
18 not_a_userdir ^/home/tmp/
19 not_a_userdir ^/home/tmp$
20 not_a_userdir ^/home/ftp/
21 not_a_userdir ^/home/ftp$
22 not_a_userdir ^/home/admin/
23 not_a_userdir ^/home/admin$
24 quota ^/home[^/]*/quota.user$
25 usermisc /quota.user$
26 users_home ^/home/[^/]+/backups$
27 users_home ^/home/[^/]+/backups/
28 users_home ^/home/[^/]+/imap$
29 users_home ^/home/[^/]+/imap/
30 users_home ^/home/[^/]+/Maildir$
31 users_home ^/home/[^/]+/Maildir/
32 users_home ^/home/[^/]+/domains/[^/]+/logs$
33 users_home ^/home/[^/]+/domains/[^/]+/logs/
34 users_home ^/home/[^/]+/domains/[^/]+/public_ftp$
35 users_home ^/home/[^/]+/domains/[^/]+/public_ftp/
36 users_home ^/home/[^/]+/domains/[^/]+/stats$
37 users_home ^/home/[^/]+/domains/[^/]+/stats/

This information is stored in /etc/container/optimumcache/ignore.d/.

Skip mask syntax

Skip masks use following regexp syntax: http://www.greenend.org.uk/rjk/tech/regexp.html

For example, to disable caching all directories that contain */cache/*, you should use skip masks like:

/cache/
+/cache$
+

This information is stored in /etc/container/optimumcache/ignore.d/

OptimumCache configuration file

Note

OPTIMUMCACHE IS NO LONGER SUPPORTED

/etc/sysconfig/optimumcache

OPTIMUMCACHE_MNT=/var/cache/optimumcache
+
+ 
+# Valency to cache
+
+COUNT=0
+
+ 
+# Minimal file size to cache, default - cache all files
+
+# MINSIZE=0
+
+ 
+# Minimal page number in file to start caching, default - 1
+
+PAGEMIN=0
+
+ 
+# Maximum file size to cache, 10485760 (10MB) by default
+
+# MAXSIZE
+
+ 
+# Interval between caching attempts, default - 5 seconds
+
+# TIMEOUT=7
+
+ 
+# Adaptive timeout upper limit (seconds)
+
+# MAXTIMEOUT=160
+
+ 
+# Adaptive timeout multiplicator and divisor
+
+# TIMEOUT_INCR_MUL=2
+
+# TIMEOUT_DECR_DIV=4
+
+ 
+# Buffer size in KB for 'optimumcache dump', default is 32MB
+
+# DUMP_BUFFER_SIZE=32000
+
+ 
+# Extra space in %% of requested to purge, default 20%
+
+# PURGEAHEAD=20
+
+ 
+# Experimental: Eliminate frequent sync to address IO performance
+
+NOIMMSYNC=1
+
+ 
+# Logging verbosity, default - 1, verbose
+
+# LOGLEVEL=1
+
+ 
+# occtl --mark-dir or --check operations IO limit, MB/s, default is 5 MB/s
+
+# OCCTL_LVE_IO_LIMIT=5
+
+ 
+# occtl --mark-dir or --check operations %cpu limit, default is 50% of one CPU core
+
+# OCCTL_LVE_SPEED_LIMIT=50
+
+ 
+# Lve ID to associate limits with
+
+# LVEID=5
+
+ 
+# Collect perf statistics in /var/log/optimumcache_perf. Default is enabled.
+
+# PERF_LOG_ENABLED=1
+

Command-line interface

Note

OPTIMUMCACHE IS NO LONGER SUPPORTED

OptimumCache is controlled using occtl command line utility.

Usage:

occtl.py    [-h] [--move-ploop param [param ...]] [--check] [--verbose]
+
+            [--init-ploop [param [param ...]]] [--resize-ploop New Size]
+
+            [--disable-ploop] [--enable-ploop] [--mount-ploop]
+
+            [--unmount-ploop] [--delete-ploop] [--unmark-all]
+
+            [--mark-dir Path [Path ...]] [--unmark-dir Path [Path ...]]
+
+            [--recursive]  [--add-skip-mask Regex]
+
+            [--remove-skip-mask Id|Tag] [--list-skip-mask] [--silent]
+
+            [--ignore-unmount-failure] [--no-lve-limits] [--foreground]
+
+            [--ploop-status] [--remount-cached-points] [--purge]
+
+            [--cancel-pending-jobs] [--report [Period]]
+
+            [--recommend-minmax-size]
+

Display numbers/percents of cached files:

optimumcache stat
+

or

optimumcache stat /home
+

To display statistic for specific mount. In depth display what is being held in cache:

optimumcache dump [--resolve-filenames] [mount]
+

The option --resolve-filenames is experimental and may not apply to all output cached entries.

Optional Arguments:

-h, --help Show this help message and exit.
--move-ploop param [param ...] Move cache from one ploop image to /path/to/new/image/location [New Size[KMGT]].
--check Check marked files for errors. This task is scheduled as background job, unless --foreground is specified.
--verbose List what is being checked.
--init-ploop [param [param ...]] Create ploop image for the cache [/path/to/ploop/image [ploop_size] | ploop_size] - if only one parameter is given, it is considered to be ploop size. Size should be a NUMBER[KMGT].
--resize-ploop New Size New Size NUMBER[KMGT].
--disable-ploop Disable ploop.
--enable-ploop Enable ploop.
--mount-ploop Mount ploop image.
--unmount-ploop Unmount ploop image.
--delete-ploop Delete ploop image. Implies disable ploop, if was enabled.
--unmark-all Unmark all marked directories.
--mark-dir Path [Path ...] Mark directory for caching.This task is scheduled as background job, unless --foreground is specified.
--unmark-dir Path [Path ...] Unmark directory for caching.
--recursive Is used with mark/unmark dir.
--add-skip-mask Regex Regexp to skip files/directories for caching.
--remove-skip-mask Id|Tag Remove regexp to skip files/directories by id or tag.
--list-skip-mask List regexp to skip files/directories.
--silent Do not echo status to stdout/syslog.
--ignore-unmount-failure Ignore cannot unmount ploop problem.
--no-lve-limits Ignore default LVE limits for --mark-dir and --check commands. Also implies --foreground.
--foreground Don't spawn --mark-dir and --check commands in background.
--ploop-status Check if ploop is mounted.
--purge Purge cache storage (takes some time).
--cancel-pending-jobs Cancel --mark-dir and --check commands if were queued or are being run in background.
--report [Period] Report statistics for Period (hourly

cloudlinux-collect: collect system load statistics

Note

OPTIMUMCACHE IS NO LONGER SUPPORTED

cloudlinux-collectl: quick start

Installing this package automatically starts system load statistics collection in background. cloudlinux-collectl package has no strict dependency on OptimumCache, thus the statistics is collected regardless of whether OptimumCache is installed or not. The aim of having this package pre-installed is to compare system performance before and after installing OptimumCache, thus to measure OptimumCache effectiveness.

Install

# yum install cloudlinux-collect --enablerepo=cloudlinux-updates-testing
+

Note

cloudlinux-collectl will be installed automatically on optimumcache upgrade to 0.2-23

Measure web site response time

cloudlinux-collectl can monitor response time for a configurable set of URLs.

Start monitoring new URL:

# cloudlinux-collect --addurl <alias> <http://url
+

Example:

# cloudlinux-collect --addurl localhost http://127.0.0.1/index.php
+

Try cloudlinux-collectl --help for more options.

To watch what is being collected

# cloudlinux-collect --test
+

Actual logs are compressed with gzip and kept in /var/log/optimumcache/collectl directory.

Statistics being collected in details

To monitor what statistics are being collected, try command:

# cloudlinux-collect --test
+

Along with common statistics blocks as CPU , disk usage, inodes cached, there are two blocks of data to watch how effectively OptimumCache is functioning.

OPTIMUMCACHE DETAIL refers to data, which is similar to output of command

# optimumcache stat
+
csums:          4964 (99.9%)
+
+             fetched        uncached            cached
+
+inodes:          4967            31               4936    (99.4%)
+
+size:          204177          131072           73104     (35.8%)
+
+RAM:                8              4                4     (50.0%)
+

Particularly, the last column percent numbers shall match.

The next goes URLSTATTRACKER DETAIL block with url response time in milliseconds. Negative values here may pop up unexpectedly. Negative numbers are not milliseconds, but signal about http error response code for that specific url. For instance, -403 will signal for Forbidden http error. As for -500 value, it signals not only for Internal Server Error, but can be displayed, when there is connection problem with the server, which is specified by the url.

Statistics manual configuration

URLSTATTRACKER DETAIL is the only statistics, which requires manual configuration. Upon clean installation, it has only url_localhost preconfigured:

# cloudlinux-collect --info
+
url shortname            url
+
+--------------------         ---
+
+localhost                 http://localhost/
+

To add another URL for monitoring:

## cloudlinux-collect --addurl alt http://192.168.0.102/
+

To display URLs being monitored list:

# cloudlinux-collect --info
+
url shortname          url
+
+--------------------          ---
+
+alt                        http://192.168.0.102/
+
+localhost                  http://localhost/
+

To skip URL from being tracked run command:

# cloudlinux-collect --skip <url short name>
+

Running statistics daemon: collectl-cloudlinux

cloudlinux-collectl has got collectl package as a dependency. Initd script /etc/init.d/cloudlinux-collectl will automatically bring up another instance of collectl named collectl-optimumcache . collectl-optimumcache daemon instance has a separate config and does not interfere with other running pre-configure collectl daemon (if any).

As it was mentioned, collectl-optimumcache daemon starts automatically on package install, then on server restart events, kicked by regular Initd script /etc/init.d/cloudlinux-collectl. Thus, checking the daemon status, stop, restart is trivial:

# service cloudlinux-collect status
+collectl-optimumcache (pid  1745) is running…
+

To start /stop:

# service cloudlinux-collect < start | stop >
+

Analyzing the results

The statistics is being collected into files named %hostname%-%datetime%.raw.gz under directory /var/log/cloudlinux-collect.

To convert those info format suitable for loading into Excel, LibreOffice Calc, another data mining tool, run the command:

# cloudlinux-collect --genplotfiles
+
Generate fresh plot files in
+
+         /var/log/cloudlinux-collect/plotfiles
+
+

Uninstall OptimumCache

Note

OPTIMUMCACHE IS NO LONGER SUPPORTED

To uninstall OptimumCache, run:

service optimumcache stop
+occtl --delete-ploop
+:>/var/share/optimumcache_store
+yum remove optimumcache
+

If available, reboot server

After the reboot pfcache= mount options will disappear by themselves.

For OptimumCache version prior 0.2-11, uninstalling via rpm package manager does not automatically removes away ploop image. That is because not always possible to unmount it properly due to kernel dependency. If there is no luck with unmounting ploop, then the server will have to be rebooted and will need to remove ploop files manually:

# rm /var/share/optimumcache/optimumcache.image
+# rm /var/share/optimumcache/DiskDescriptor.xml
+# rm /var/share/optimumcache/DiskDescriptor.xml.lck
+
+ or +
# rm /path/to/ploop/image/file
+# rm /path/to/ploop/image/DiskDescriptor.xml
+# rm /path/to/ploop/image/DiskDescriptor.xml.lck
+

For OptimumCache version 0.2-11 and later, ploop image will be removed automatically during uninstall. If ploop unmount issue prevents doing that, ploop image clean up will be scheduled after next server reboot.

If uninstall OptimumCache process lasts for too long, please find the solution in Troubleshooting section of this document.

Troubleshooting

Note

OPTIMUMCACHE IS NO LONGER SUPPORTED

Installing for FS is different from Ext4

For now Ext4 is the only supported file system type. If a host has no Ext4 filesystem mounted, OptimumCache package installation will be abandoned:

Preparing packages for installation...
+
+Cannot continue: Ext4 partition is the only supported by OptimiumCache, there is no one in fstab
+
+error: %pre(optimumcache-0.1-22.el6.cloudlinux.x86_64) scriptlet failed, exit status 1
+
+error:   install: %pre scriptlet failed (2), skipping
+

Also, an attempt to add for caching directory, which does not reside on Ext4, will fail:

# occtl --mark-dir /home --recursive
+
+mount: / not mounted already, or bad option
+
+optimumcache: Can not mount device. rc[8192]
+
+Error: mark[1]: /usr/bin/optimumcache mark --recursive /home
+

Yum fails to install Perl rpms coming with OptimumCache

If got this error with yum install optimumcache

Error: Package: cloudlinux-collect-0.1-6.el6.noarch (cloudlinux-x86_64-server-6)
+
+Requires: perl(Config::Tiny)
+
+Error: Package: cloudlinux-collect-0.1-6.el6.noarch (cloudlinux-x86_64-server-6)
+
+Requires: perl(IO::Socket::SSL)
+
+Error: Package: cloudlinux-collect-0.1-6.el6.noarch (cloudlinux-x86_64-server-6)
+
+Requires: perl(YAML::Tiny)
+
+Error: Package: cloudlinux-collect-0.1-6.el6.noarch (cloudlinux-x86_64-server-6)
+
+Requires: perl(IPC::Run)
+
+You could try using --skip-broken to work around the problem
+
+You could try running: rpm -Va --nofiles --nodigest
+

Most probably you have excluded perl* packages in /etc/yum.conf file, in this case to install OptimumCache run:

# yum install optimumcache --disableexcludes=all
+

OptimumCache prior 0.2-23: Cannot unmount old ploop image

This is well-known ploop problem, which may result in failing such actions as resizing or moving ploop in OptimumCache. To workaround this problem use --ignore-unmount-failure with --move-ploop

# occtl --move-ploop --ignore-unmount-failure
+

As for resizing ploop, use flavor of --move-ploop command instead:

# occtl --move-ploop /path/to/new/image/file [size GB] --ignore-unmount-failure
+

For your changes to take effect, the server has to be rebooted. Upon reboot, you may clean up manually old ploop image file and DiskDescriptor.xml file, which resides in the same directory along with old image.

High IO rate

High IO problem was fixed in latest version of OptimumCache (version 0.2-6). The fix is to eliminate superflows fsync() calls in OptimumCache operations. To activate this fix in existing installation, flag NOIMMSYNC=1 has to be manually set in /etc/syscoconfig/optimumcache.

To ensure that this parameter is set ON in the config, set LOGLEVEL=2 and execute service optimumcache restart. You will see something like this:

optimumcache[1770]: Hash-size: 100000000 min-size: 0 max-size: 18446744071562067968
+optimumcache[1770]: Count: 0 Timeout: 5
+optimumcache[1770]: Max Timeout: 160 Adaptive Timeout Mul/Div: 2/4
+optimumcache[1770]: Iolimit: 0 iopslimit: 0
+optimumcache[1770]: No immediate fsync: Yes
+optimumcache[1771]: Starting OptimumCache monitor
+

To update to version 0.2-6, run:

# yum update optimumcache --enablerepo=cloudlinux-updates-testing
+

High CPU utilization

Once it is detected that OptimumCache overuses CPU, it is useful to check, whether checksums reindexing process is running. When reindexing is running, high CPU usage is ok, as far it will certainly drop down after reindexing finished.

Can be checked in /var/log/messages

# grep Reindexing /var/log/messages
+
+Feb  4 17:00:55 CL-default-2 occtl[2654]: Reindexing started
+

If the last line from the output is not Reindexing finished…, than indexing is in progress.

Also, can be checked via command occtl --report, watch if PFL_REINDEX_NUM_FILES and PFL_REINDEX_THOUGHPUT_KB identifiers are present in the last series of data:

# occtl --report
+- Period starts at: 2015-02-04 17:00
+Period Stat:
+
+PFL_ATTACHED:                    170318
+PFL_CREATED:                     161583
+PFL_ERR_BAD_CSUM:                176
+PFL_ERR_INODES:                  879
+PFL_FAILED_TO_ATTACH_PEER:       791
+PFL_FAILED_TO_ATTACH_PEER_EBUSY: 791
+
+PFL_INODE_IN:                    406167
+PFL_PAGEMIN_FILTERED_OUT:        233418
+PFL_PAGEMIN_USED:                136082
+PFL_REINDEX_NUM_FILES:           192810
+PFL_REINDEX_THOUGHPUT_KB:        2904007
+PFL_RESTART:                     1
+

Uninstalling OptimumCache lasts for too long

Uninstalling OptimumCache takes time because of files unmark process, which lasts proportionally to number of files, previously marked for caching with occtl --mark-dir.... If you see, that yum remove optimumcache command is stuck and you have no time to wait for it to finish, or IO load, caused by unmarking files, is undesirable for you, open another console terminal and invoke:

# occtl --cancel-pending-jobs
+

This command will cancel unmark operation, being run by yum under the hood. So that yum uninstall package transaction will complete very soon.

‘Failed to attach peer: Invalid argument’ appears in syslog

Rather rare problem, try to forcibly update optimumcache_s with ploop status.

# occtl --remount-cached-points
+

TPE extension

TPE (Trusted Path Execution)

The kernel supports TPE feature out of the box. You can configure it using following files: +

·        /proc/sys/kernel/grsecurity/grsec_lock
+·        /proc/sys/kernel/grsecurity/tpe
+·        /proc/sys/kernel/grsecurity/tpe_gid
+·        /proc/sys/kernel/grsecurity/tpe_restrict_all
+

To enable TPE feature in a standard way just add following to the end of your /etc/sysctl.conf

#GRsecurity 
+kernel.grsecurity.tpe = 1 
+kernel.grsecurity.tpe_restrict_all = 1 
+kernel.grsecurity.grsec_lock = 1  
+

And do: +

# sysctl -p
+

Note

Once you set grsec_lock to 1, you will not be able to change TPE options without reboot.

This Trusted Path Execution feature was adopted from grsecurity.

CPU limits

Note

Deprecated

This limit is no longer used, and SPEED is used instead

CPU limits before lve-utils 1.4

CPU Limits are set by CPU and NCPU parameters. CPU specifies the % of total CPU of the server available to LVE. NCPU specifies the number of cores available to LVE. The smallest of the two is used to define how much CPU power will be accessible to the customer.

Cores Per Server CPU Limit NCPU Limit Real limit
1 25% 1 25% of 1 core
2 25% 1 50% of 1 core
2 25% 2 50% of 1 core
4 25% 1 100% of 1 core (full core)
4 25% 2 1 core
4 50% 1 1 core
4 50% 2 2 cores
8 25% 1 1 core
8 25% 2 2 cores
8 50% 2 2 cores
8 50% 3 3 cores

When user hits CPU limit, processes within that limit are slowed down. For example, if you set your CPU limit to 10%, and processes inside LVE want to use more then 10% they will be throttled (put to sleep) to make sure they don't use more then 10%. In reality, processes don't get CPU time above the limit, and it happens much more often then 1 second interval, but the end result is that processes are slowed down so that their usage is never above the CPU limit set.

Package integration

Note

Deprecated.

Note

You can use Control panel integration guide instead.

[lve-utils 1.4+]

CloudLinux OS Shared can automatically detect the most popular control panels, like cPanel - and allows to set different limits for users in different packages. It simplifies management as you don't have to choose between one limit that fits all your customers on the server, or individual limits for the customers.

If you have a custom made control panel, with your own 'package' implementation, you can still use CloudLinux OS Shared framework to manage limits for your packages.

To do that, you would need:

Implement script that would map users to packages.

Configure lvectl to use your script.

Implementing script

A script can be written in any language, and it has to be executable.

It should accept the following arguments:

--list-all prints [userid package] pairs

Output should look like a list of space separate pairs of user Linux IDs and package names.

100 package1
+101 package1
+102 package2
+103 package3
+

--userid=id prints package for a user specified

Output should contain package name, like:

package1
+

--package="package" prints users for a package specified.

Output should look like a list of user Linux IDs.

100
+101
+

--list-packages prints the list of packages

Output contains a list of names of packages, like:

package1
+package2
+package3
+

Configuring lvectl to use your custom script

Edit /etc/sysconfig/cloudlinux file.

Edit or modify parameter CUSTOM_GETPACKAGE_SCRIPT, and set it to point to your script, like: CUSTOM_GETPACKAGE_SCRIPT=/absolute/path/to/your/script

For the script example please check the following article: https://cloudlinux.zendesk.com/hc/en-us/articles/115004529105-Integrating-LVE-limits-with-packages-for-unsupported-control-panels.

Detecting and working with CloudLinux OS Shared

Detecting if system is running CloudLinux OS Shared/CloudLinux kernel:

$ uname -r|grep lve 
+

If you get an output, it means the system is running CloudLinux kernel. CloudLinux kernels have lve in its name, like: 2.6.32-458.18.1.lve1.2.44.el6.x86_64

Alternatively you can check for the presence of /proc/lve/list file.

Check if CageFS is enabled (as root ):

$ /usr/sbin/cagefsctl --cagefs-status
+

Check if CageFS is enabled for a particular user (as root ):

$ /usr/sbin/cagefsctl --user-status _USER_NAME_
+

Check if you are inside CageFS:

Check for the presence of /var/.cagefs/.cagefs.token file - if present, it means that you are inside CageFS.

Displaying CPU, memory & IO limits

Most control panels choose to display CloudLinux OS Shared usage & limits to end customers. To simplify that, we lve-stats exports a file that can be easily read and processed by a control panel to display the necessary information.

The information is located in the /var/lve/info file. This information is updated every 5 minutes, and contains default limits (first line), as well as usage and limits for all customers. If a customer is not present in the file, it means that customer is not active (no scripts were executed recently for the customer), and a customer has default limits (so you can display no usage, and default limits in the control panel for that customer.

The data is stored in a form of one line per customer, with coma separated values.

0 user id
1 entry processes
2 entry processes limit
3 CPU
4 CPU limit
5 Virtual Memory
6 Virtual Memory Limit
7 Number of virtual memory faults
8 Number of entry processes faults
9 Physical Memory Limit
10 Physical Memory
11 Number of Physical memory faults
12 Number of processes limit
13 Number of processes
14 Number of processes fault
15 Reserved
16 IO Usage
17 IO Limit

With LVE version 4 (CloudLinux OS Shared lve0.x) only the first 9 parameters are available. You can check the the version by reading the first byte of /proc/lve/list.

In the version 6 all 15 parameters should be available.

There are only 2 LVE versions currently used in production. Future versions might add more fields, but will not alter order of existing fields.

Memory is defined in 4KB pages (so, 1024 would mean 1024 4KB pages, or 4MB).

IO is defined as KB/s.

CPU is defined as % of total number of cores on a server.

Redis support for HostingLimits

Warning!

Starting from mod_hostinglimits version 1.0-30 Redis is not supported.

Redis support provides a way to query Redis database for LVE id, based on domain in the HTTP request. Given a database like:

xyz.com 10001
+bla.com  10002
+....
+

The module will retrieve corresponding LVE id from the database.

To enable Redis support, compile from source: https://repo.cloudlinux.com/cloudlinux/sources/mod_hostinglimits.tar.gz

The compilation requires hiredis library.

$ wget https://repo.cloudlinux.com/cloudlinux/sources/da/mod_hostinglimits.tar.gz
+$ yum install cmake
+$ tar -zxvf mod_hostinglimits*.tar.gz
+$ cd mod_hostinglimits*
+$ cmake -DREDIS:BOOL=TRUE .
+$ make
+$ make install
+

To enable Redis mode, specify:

LVEParseMode REDIS
+

LVERedisSocket

Description Socket to use to connect to Redis database.
Syntax LVERedisSocket path
Default /tmp/redis.sock
Context server config

Used to specify location of Redis socket.

Example:

LVERedisSocket /var/run/redis.sock
+

LVERedisAddr

Description IP/port used to connect to Redis database instead of socket.
Syntax LVERedisAddr IP PORT
Default none
Context server config

Used to specify IP and port to connect to Redis instead of using Socket

Example:

LVERedisAddr 127.0.0.1 6993
+

LVERedisTimeout

Descriptin Number of seconds to wait before attempting to re-connect to Redis.
Syntax LERetryAfter SECONDS
Default 60 seconds
Context server config

Number of seconds to wait before attempting to reconnect to Redis after the last unsuccessful attempt to connect.

Example:

LVERedisTimeout 120
+

Migration to EA4

Advices and limitations

  • Use cPanel 11.55.999.66(55.999.66) or higher version.
  • Hardened EA4 limitations: +
    • ea-php51 and ea-php52 have no PHP-FPM support. Please use mod_lsapi instead.

Follow the instructions here to install and configure mod_lsapi.

CentOS with EasyApache 4

If EasyApache 4 was installed earlier on your CentOS server and you would like to migrate to CloudLinux OS Shared:

  1. Convert server from CentOS to CloudLinux (see these instructions).

  2. Restart Apache service.

CentOS without EasyApache 4

If EasyApache 4 was not installed earlier on your CentOS server and you would like to migrate to CloudLinux OS Shared:

  1. Convert server from CentOS to CloudLinux OS Shared (see these instructions).

  2. Run:

cd ~; wget https://repo.cloudlinux.com/cloudlinux/sources/cloudlinux_ea3_to_ea4; sh cloudlinux_ea3_to_ea4 --convert
+

(Find examples of cloudlinux_ea3_to_ea4 script usage below).

CloudLinux OS Shared without EasyApache 4

Install EasyApache4 on clean CloudLinux OS Shared from ISO image or migrate to EasyApache4 on existings CloudLinux OS Shared servers:

  1. Install cPanel.
  2. Run:
cd ~; wget https://repo.cloudlinux.com/cloudlinux/sources/cloudlinux_ea3_to_ea4; sh cloudlinux_ea3_to_ea4 --convert
+

(Find examples of cloudlinux_ea3_to_ea4 script usage below).

More about cloudlinux_ea3_to_ea4 script

About cloudlinux_ea3_to_ea4 migration script parameters:

cloudlinux_ea3_to_ea4 [ADDITIONS] ACTIONS
+

Usage:

-h, --help Print this message

Actions (required parameter, shows what should script do):

-c, --convert Convert EA3 to EA4
-r, --revert Revert to EA3

Additions (optional parameter, adds to action installation of extra components):

-m, --mod_lsapi Install mod_lsapi
-p, --mod_passenger Install alt-mod-passenger
-a, --altphp Install/Update alt-php

Examples:

  • If you want to install EA4 with mod_lsapi and update/install alt-php:
sh cloudlinux_ea3_to_ea4 --convert --mod_lsapi --altphp 
+
  • If you want to install EA4 with mod_lsapi, alt_mod_passenger and update/install alt-php:
sh cloudlinux_ea3_to_ea4 --convert --mod_lsapi --altphp --mod_passenger
+
  • To restore EA3 with mod_lsapi:
sh cloudlinux_ea3_to_ea4 --revert --mod_lsapi
+

See also: FAQ

+ + + diff --git a/docs/.DS_Store b/docs/.DS_Store deleted file mode 100644 index 6da057626..000000000 Binary files a/docs/.DS_Store and /dev/null differ diff --git a/docs/.vuepress/.DS_Store b/docs/.vuepress/.DS_Store deleted file mode 100644 index bbeb3c4a5..000000000 Binary files a/docs/.vuepress/.DS_Store and /dev/null differ diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js deleted file mode 100644 index d4a8af25e..000000000 --- a/docs/.vuepress/config.js +++ /dev/null @@ -1,276 +0,0 @@ -const urls = require("./urls-mapping.js"); -const sidebarUrls = require("./sidebar-urls"); -const _slugify = require('@vuepress/shared-utils/lib/slugify'); - -const slugifyLinks = (s) => { - if (sidebarUrls[s]) { - return sidebarUrls[s]; - } - return _slugify(s); -}; - -// set your global autometa options -const autoMetaOptions = { - site: { - name : 'CloudLinux OS Documentation', - // twitter: 'cl_docs', - }, - canonical_base: 'https://docs.cloudlinux.com/', -}; - -module.exports = { - plugins: [ - ['container', { - type: 'warning', - before: info => `

${info}

`, - after: '
', - }], - ['container', { - type: 'tip', - before: info => `

${info}

`, - after: '
', - }], - ['container', { - type: 'danger', - before: info => `

${info}

`, - after: '
', - }], -// ['disqus-spa', { shortname: 'docscloudlinuxcom' }], - ['@vuepress/google-analytics', - { - 'ga': 'UA-12711721-15' - } - ], - [ 'autometa', autoMetaOptions ] -// , -// [ 'separate-pages', { alwaysVisibleBlocks: ['#disqus_thread'] } ] - ], - configureWebpack: { - resolve: { - alias: { - 'vue$': 'vue/dist/vue.esm.js' - } - } - }, - base: "/", - head: [ - [ - "link", - { - rel: "stylesheet", - href: "https://fonts.googleapis.com/icon?family=Material+Icons" - } - ], - [ - "meta", - { - "http-equiv": "Content-Security-Policy", - content: "script-src 'self' 'unsafe-inline' 'unsafe-inline' 'unsafe-eval' *.survicate.com *.googletagmanager.com *.google-analytics.com *.licdn.com *.hotjar.com *.twitter.com *.facebook.net *.kernelcare.info *.twitter.com *.ads-twitter.com;" - } - ], - [ - "meta", - { - name: "referrer", - content: "unsafe-url" - } - ], - [ - "link", - { - rel: "icon", - href: "/favicon.ico" - } - ], - [ - "script", - {}, - `(function(w) { -var s = document.createElement('script'); -s.src = 'https://survey.survicate.com/workspaces/8e05b856a98802352b97e8fd3118de1f/web_surveys.js'; -s.async = true; -var e = document.getElementsByTagName('script')[0]; -e.parentNode.insertBefore(s, e); -})(window);` - ], - [ - "script", - {}, - `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': -new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], -j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= -'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); -})(window,document,'script','dataLayer','GTM-T538N4K');` - ] - ], - locales: { - // The key is the path for the locale to be nested under. - // As a special case, the default locale can use '/' as its path. - "/": { - lang: "en-US", // this will be set as the lang attribute on - title: "Documentation", - description: "CloudLinux OS Shared Documentation" - }, -// "/ru/": { -// lang: "ru", -// title: "Документация", -// description: "Документация CloudLinux" -// } - }, - theme: "cloudlinux", - markdown: { - slugify: slugifyLinks, - toc: { - slugify: slugifyLinks, - } - }, - - themeConfig: { - repo: "cloudlinux/cloudlinux-doc", - editLinks: true, - docsBranch: "dev", - docsDir: "docs", - - translationSource: 'docs.cloudlinux.com', - defaultURL: "/introduction/", - submitRequestURL: "https://www.cloudlinux.com/support-portal/", - hideHeading: true, - redirectionMapping: urls, - sidebarDepth: 2, - logo: "/logo.svg", - try_free: "https://cloudlinux.com/trial", - - social: [ - { url: "https://www.facebook.com/cloudlinux/", logo: "/fb.png" }, - { url: "https://twitter.com/cloudlinuxos/", logo: "/tw.png" }, - { url: "https://linkedin.com/company/cloudlinux", logo: "/in.png" }, - { - url: "https://www.youtube.com/channel/UCZ3YMHWnMP7TaxlXVay5-aw", - logo: "/ytube.png" - } - ], - cloudlinuxSite: "https://cloudlinux.com", - locales: { - "/": { - stayInTouch: "Stay in touch", - bottomLinks: [ - { - text: "How to", - url: - "https://cloudlinux.zendesk.com/hc/en-us/categories/360002375940" - }, - { - text: "Getting started", - url: "https://www.cloudlinux.com/getting-started-with-cloudlinux-os" - }, - { - text: "Submit request", - url: "https://cloudlinux.zendesk.com/hc/en-us/requests/new" - }, - { text: "Blog", url: "https://blog.cloudlinux.com/" }, - { text: "CloudLinux OS Solo Documentation", url: "https://docs.solo.cloudlinux.com/" } - ], - - // text for the language dropdown title - title: "Language", - // text for the language dropdown - selectText: "En", - // label for this locale in the language dropdown - label: "English", - // text for the edit-on-github link - editLinkText: "Edit this page", - tryFree: "Try Free", - submitRequest: "Support Portal", - search: "Search", - // config for Service Worker - serviceWorker: { - updatePopup: { - message: "New content is available.", - buttonText: "Refresh" - } - }, - algolia: { - apiKey: "e6b9d79daf71aa98e2e2a51d4556f9d4", - indexName: "cloudlinuxos", - appId: "0TCNL6CGX8" - }, - - sidebar: [ - { - title: "Content", - collapsable: false, - children: [ - "/introduction/", - "/cloudlinux_installation/", - "/elevate/", - "/limits/", - "/lve_manager/", - "/cloudlinux-os-plus/", - "/cloudlinux-os-admin/", - "/cloudlinux_os_components/", - "/command-line_tools/", - "/control_panel_integration/", - "/cloudlinux_os_kernel/", - "/for_cloudlinux_partners/", - "/deprecated/" - ] - } - ] - }, -// "/ru/": { -// title: "Язык", -// selectText: "Рус", -// label: "Русский", -// editLinkText: "Редактировать", -// tryFree: "Попробовать бесплатно", -// search: "Поиск", -// serviceWorker: { -// updatePopup: { -// message: "Доступен новый контент", -// buttonText: "Обновить" -// } -// }, -// algolia: { -// apiKey: "3990019335416f9a96a6a47d07e25187", -// indexName: "cloudlinuxos-ru", -// appId: "0TCNL6CGX8" -// }, -// stayInTouch: "Будем на связи", -// bottomLinks: [ -// { -// text: "Инструкции", -// url: "https://cloudlinux.zendesk.com/hc/sections/115001344329-How-do-I" -// }, -// { -// text: "С чего начать", -// url: "https://www.cloudlinux.com/getting-started-with-cloudlinux-os" -// }, -// { -// text: "Техподдержка", -// url: "https://hubs.ly/H0pk7990" -// }, -// { text: "Блог", url: "https://www.cloudlinux.com/blog" } -// ], -// sidebar: [ -// { -// title: "Содержание", -// collapsable: false, -// children: [ -// "/ru/introduction/", - // "/ru/cloudlinux_installation/", - // "/ru/limits/", - // "/ru/lve_manager/", - // "/ru/cloudlinux-os-plus/", - // "/ru/cloudlinux_os_components/", - // "/ru/command-line_tools/", - // "/ru/control_panel_integration/", - // "/ru/cloudlinux_os_kernel/", -// "/ru/for_cloudlinux_partners/" - // "/ru/deprecated/" -// ] -// } -// ] -// } - } - } -}; diff --git a/docs/.vuepress/public/.DS_Store b/docs/.vuepress/public/.DS_Store deleted file mode 100644 index 3b8c75e3a..000000000 Binary files a/docs/.vuepress/public/.DS_Store and /dev/null differ diff --git a/docs/.vuepress/sidebar-urls.js b/docs/.vuepress/sidebar-urls.js deleted file mode 100644 index f20222912..000000000 --- a/docs/.vuepress/sidebar-urls.js +++ /dev/null @@ -1,268 +0,0 @@ -module.exports = { - "Конфигурационные параметры": "configuration-references", - "Установка Apache mod_lsapi PRO": "installation", - "Сервер без панели управления": "no-control-panel", - "Удаление": "uninstall", - "Инструмент switch_mod_lsapi": "switch-mod-lsapi-tool", - "Диагностика и устранение неполадок": "troubleshooting", - "FAQ по mod_lsapi": "faq-on-mod-lsapi", - "Поддержка CRIU": "criu-support", - "Установка CageFS": "installation", - "Удаление CageFS": "unistalling-cagefs", - "Управление пользователями": "managing-users", - "Инструменты командной строки": "command-line-tools", - "Выполнение команд внутри CageFS": "running-command-inside-cagefs", - "Утилита sanity check": "sanity-check", - "Особенности CageFS": "cagefs-quirks", - "Конфигурация": "configuration", - "Шаблоны файловой системы": "file-system-templates", - "Исключить файлы из CageFS": "excluding-files", - "Исключить пользователей из CageFS": "excluding-users", - "Точки монтирования": "mount-points", - "Виртуальные точки монтирования для пользователя": "per-user-virtual-mount-points", - "Разделение по имени пользователя": "split-by-username", - "Монтирование домашнего каталога пользователя внутри CageFS": "common-mounting-user’s-home-directory-inside-cagefs", - "Базовый домашний каталог": "base-home-directory", - "Поддержка PostgreSQL": "postgresql-support", - "Конфигурация PAM": "pam-configuration", - "Использование proxy": "executing-by-proxy", - "Пользовательские /etc файлы": "custom-etc-files-per-customer", - "Перемещение директории cagefs-skeleton": "moving-cagefs-skeleton-directory", - "Перемещение директории /var/cagefs": "moving-var-cagefs-directory", - "TMP-директории": "tmp-directories", - "Исключение точек монтирования": "excluding-mount-points", - "Интеграция с панелями управления": "control-panel-integration", - "Установка": "cloudlinux_installation", - "Конвертация существующих серверов": "converting-existing-servers", - "Дополнительные параметры для cldeploy": "advanced-options-for-cldeploy", - "Объяснение изменений": "explanation-of-changes", - "Установка на новый сервер": "installing-new-servers", - "Образы CloudLinux OS": "cloudlinux-os-images", - "Сетевая установка": "net-install", - "Установка на сервер H-Sphere": "installing-on-h-sphere-server", - "Требования": "requirements", - "Конвертация из mod_fastcgi в mod_fcgid": "converting-from-mod-fastcgi-to-mod-fcgid", - "Старые версии H-Sphere": "older-versions-of-h-sphere", - "Virtuozzo и OpenVZ": "virtuozzo-and-openvz", - "Установка для Virtuozzo и OpenVZ": "installation-2", - "Получение пробной лицензии": "getting-trial-license", - "Регистрация сервера CloudLinux": "registering-cloudlinux-server", - "CloudLinux на DigitalOcean": "cloudlinux-on-digitalocean", - "Добавление образа CloudLinux в DigitalOcean": "adding-cloudlinux-os-image-to-digitalocean", - "CloudLinux на Linode": "cloudlinux-on-linode", - "CloudLinux на Linode KVM": "cloudlinux-on-linode-kvm", - "CloudLinux на Linode Xen": "cloudlinux-on-linode-xen", - "Серверы с LILO-загрузчиком": "servers-with-lilo-boot-loader", - "Миграция на EasyApache 4": "migrating-to-easyapache-4", - "Советы и ограничения": "advices-and-limitations", - "CentOS с EeasyApache 4": "centos-with-eeasyapache-4", - "CentOS без EasyApache 4": "centos-without-easyapache-4", - "CloudLinux без EasyApache 4": "cloudlinux-without-easyapache-4", - "Переход обратно с EasyApache 4 на EasyApache 3": "revert-back-from-easyapache-4-to-easyapache-3", - "Подробнее о скрипте cloudlinux_ea3_to_ea4": "sumore-about-cloudlinux-ea3-to-ea4-scriptpport", - "Удаление CloudLinux": "uninstalling-cloudlinux", - "Жизненный цикл CloudLinux OS": "cloudlinux_life-cycle", - "Плагин WHMCS для CloudLinux": "cloudlinux_whmcs_plugin", - "Обзор": "overview", - "Установка и настройка": "installation-configuration", - "Установка и обновление": "installation-and-update", - "Конфигурация продукта": "configuration-of-product", - "Конфигурация надстройки": "configuration-of-add-on", - "Управление": "management", - "Установление зависимости через надстройку – дополнительная лицензия": "link-via-add-on-optional-license", - "Установление зависимости напрямую": "link-products-directly", - "Установление зависимости через настраиваемые параметры": "link-via-configurable-options", - "Установление зависимости между надстройками напрямую": "link-add-ons-directly", - "Заказ": "order", - "Интерфейс администратора": "admin-area", - "Интерфейс клиента": "client-area", - "Список лицензий": "licenses-list", - "Список лицензий надстроек": "add-on-licenses-list", - "Типичные проблемы": "common-problems", - "Основные положения": "general", - "Использование и интеграция": "usage-and-integration", - "Установка и настройка": "installation-and-configuration", - "Описание конфигурации": "configuration-details", - "Низкоуровневый доступ": "low-level-access", - "Инструменты командной строки": "command-line_tools", - "Автоматические уведомления о неисправностях (только cPanel)": "automatic-problems-notifications-cpanel-only", - "Устранение распространенных неисправностей": "common-problems-troubleshooting", - "Устаревшие и неподдерживаемые пакеты": "deprecated", - "Git для cPanel": "git-for-cpanel", - "Хранение статистики в MySQL": "storing-statistics-in-mysql", - "Хранение статистики в PostgreSQL": "storing-statistics-in-postgresql", - "Настройка сжатия при использовании нескольких серверов": "compacting-in-multi-server-settings", - "Установка OptimumCache": "installation", - "Использование без ploop": "using-without-ploop", - "Как пометить директории": "marking-directories", - "Конфигурационный файл OptimumCache": "optimumcache-configuration-file", - "Интерфейс командной строки": "command-line-interface", - "cloudlinux-collect: сбор статистики загрузки системы": "cloudlinux-collect-collect-system-load-statistics", - "Удаление OptimumCache": "uninstall-optimumcache", - "Поиск и устранение неисправностей по OptimumCache": "troubleshooting", - "Совместимость оборудования": "hardware_compatibility", - "Общие положения":"general-provisions", - "Установка лимитов и интеграция с панелью управления":"setting-limits-and-integration-with-panel-packages", - "Наследование лимитов":"limits-inheritance", - "Кэширование и синхронизация лимитов":"caching-and-synchronizing-the-limits", - "Файл базы данных для cl-quota":"quotas-db-file", - "Параметры интерфейса командной строки и примеры использования":"cli-options-examples", - "Руководство по интеграции":"integration-guide", - "Обнаружение и работа с CloudLinux":"detecting-and-working-with-cloudlinux", - "Отображение лимитов CPU, Memory и IO":"displaying-cpu-memory-io-limits", - "Интеграция LVE-лимитов с пакетами":"integrating-lve-limits-with-packages", - "Настройки ядра": "kernel-settings", - "Переменные конфигурации ядра": "kernel-config-variables", - "Виртуальная файловая система /proc": "virtualized-proc-filesystem", - "SecureLinks": "securelinks", - "Защита подбора символических ссылок": "symlink-owner-match-protection", - "Защита обхода ссылок": "link-traversal-protection", - "Защита от ptrace": "ptrace-block", - "Xen XVDA": "xen-xvda", - "Расширение TPE (не поддерживается)": "tpe-extension-deprecated", - "Задержка для лимита IO": "io-limits-latency", - "Гибридное ядро": "hybrid-kernel", - "Статистика использования LVE": "reading-lve-usage", - "flashcache": "flashcache", - "OOM Killer для LVE-процессов": "oom-killer-for-lve-processes", - "Квоты файловой системы": "file-system-quotas", - "Лимиты": "limits", - "Что такое LVE?": "understanding-lve", - "Как проверить, что LVE установлен": "checking-if-lve-is-installed", - "Управление LVE-лимитами": "controlling-lve-limits", - "Мониторинг использования LVE": "checking-lve-usage", - "Проверка LVE-лимитов": "lve-limits-validation", - "Список исключений (проверка не поддерживается)": "exceptions-list-validation-is-not-supported", - "Проверка существующих лимитов": "existing-limits-validation", - "Рекомендации": "best-practice", - "Лимит SPEED": "speed-limits", - "Лимит CPU": "cpu-limits", - "Лимит CPU для lve-utils версии ниже 1.4": "cpu-limits-before-lve-utils-1-4", - "Лимит Memory": "memory-limits", - "Лимит Virtual Memory": "virtual-memory-limit", - "Лимит Physical Memory": "physical-memory-limit", - "Поиск и устранение неисправностей для лимита Memory": "troubleshooting", - "Система контроля и учета пропускной способности сети": "network-traffic-bandwidth-control-and-accounting-system", - "Как ограничить исходящий сетевой трафик": "how-to-limit-outgoing-network-traffic", - "Учет трафика": "traffic-accounting", - "Матрица совместимости": "compatibility-matrix", - "Компоненты": "integration-components", - "LVE PAM модуль": "lve-pam-module", - "Модуль HostingLimits для Apache": "hostinglimits-module-for-apache", - "Как установить": "installation", - "Директивы": "directives", - "Поддержка Redis для HostingLimits": "redis-support-for-hostinglimits", - "Расширение LVE для cPanel": "cpanel-lve-extension", - "Информационная панель": "dashboard", - "Мастер установки CloudLinux": "cloudlinux-installation-wizard", - "Краткое описание": "overview", - "Настройка": "set-up", - "Компоненты CloudLinux": "cloudlinux-components", - "Установка и возможные ошибки": "installation-process-and-possible-errors", - "Параметры LVE Manager": "lve-manager-options", - "Снапшоты процессов сервера": "server-processes-snapshots", - "Брендинг LVE-плагинов": "lve-plugins-branding", - "Пользовательские сообщения для определенных версий PHP": "user-message-for-php-version", - "Установка LVE-Stats 2": "installation", - "Перейти на более низкую версию": "downgrade", - "Конфигурация": "configuration", - "Настройка совместимости LVE Stats 2 и базы данных MySQL": "lve-stats2-and-mysql-db-server-compatible-work-setup", - "Настройка совместимости LVE Stats 2 и базы данных PostgreSQL": "lve-stats-2-and-postgresql-db-server-compatible-work-setup", - "Настройка уведомлений lve-stats-2": "customize-lve-stats-2-notifications", - "Инструменты командной строки для lve-stats-2": "command-line-tools", - "Плагины": "plugins", - "Создание плагина для LVE Stats 2": "creating-a-plugin-for-lve-stats-2", - "Введение": "introduction", - "Расположение плагина на сервере": "server-plugin-arrangement", - "Конфигурация плагина": "plugin-configuration", - "Типы плагинов": "types-of-plugins", - "Примеры плагинов": "examples-of-plugins", - "Информация и формат файла /var/lve/info": "file-info-and-format-for-var-lve-info-file", - "Поиск и устранение неисправностей для LVE Stats 2": "troubleshooting", - "Как читать информацию mod_proctitle": "how-to-read-mod-proctitle-information", - "Параметры настройки": "tuning-parameters", - "Установка MySQL Governor": "installation", - "Обновление сервера базы данных": "upgrading-database-server", - "Удаление MySQL Governor": "removing-mysql-governor", - "Режимы работы": "modes-of-operation", - "Конфигурация": "configuration", - "Запуск и остановка": "starting-and-stopping", - "Определение соответствия пользователей в базе данных": "mapping-a-user-to-database", - "Log-файлы": "log-files", - "Изменение версии MySQL": "change-mysql-version", - "Инструменты командной строки для MySQL Governor": "command-line-tools", - "Резервное копирование MySQL": "backing-up-mysql", - "Плагин abrt": "abrt-plugin", - "Поиск и устранение неисправностей с MySQL Governor": "troubleshooting", - "Обзор и требования": "overview-requirements", - "Установка Node.js Selector": "installation", - "Интерфейс командной строки для Node.js Selector": "command-line-interface", - "Пользовательский интерфейс": "user-interface", - "Поиск и устранение ошибок": "debugging-errors", - "Развертывание Node.js": "node-js-deployment", - "Удаленное использование интерпретаторов Node.js": "remote-usage-of-node-js-interpreters", - "Удаленное использование утилиты cloudlinux-selector": "remote-usage-of-the-cloudlinux-selector-utility", - "Партнерский портал": "partner_portal", - "Лимиты реселлеров": "reseller_limits", - "Краткое описание": "overview", - "Типы пользователей": "types-of-users", - "Типы лимитов": "types-of-limits", - "Что происходит когда реселлер или пользователь реселлера достигает лимита?": "what-happens-when-reseller-or-reseller-s-end-user-hits-the-limit", - "Требования и установка": "installation-and-requirements", - "Требования": "requirements", - "Установка": "installation", - "Включение и отключение лимитов реселлеров": "how-to-enable-and-disable-reseller-limits", - "Как отключить лимиты реселлера": "how-to-disable-reseller-limits", - "Интерфейс хостера": "hoster-interface", - "Интерфейс реселлера": "reseller-interface", - "Вкладка Current Usage": "current-usage-tab", - "Вкладка Historical Usage": "historical-usage-tab", - "Вкладка Users": "users-tab", - "Столбец Actions": "actions-column", - "Вкладка Statistics": "statistics-tab", - "Вкладка Options": "options-tab", - "Вкладка Packages": "packages-tab", - "Python и Ruby Selector": "python_and_ruby_selector", - "Установка Python и Ruby Selector": "python-and-ruby-selector-installation", - "Доступ для пользователей": "end-user-access", - "Интерфейс командной строки": "command-line", - "Как скрыть значки Python и Ruby Selector": "hide-python-and-ruby-selector-icons", - "Развёртывание Trac с использованием Python Selector": "deploying-trac-using-python-selector", - "Trac с MySQL": "trac-with-mysql", - "Развёртывание Redmine с использованием Ruby Selector": "deploying-redmine-using-ruby-selector", - "Установка и обновление": "installation-and-update", - "Поддержка LiteSpeed": "litespeed-support", - "Поддержка ISPmanager": "ispmanager-support", - "Конфигурация": "configuration", - "Установка версии по умолчанию и модулей": "setting-default-version-and-modules", - "Пользовательские файлы PHP.ini": "individual-php-ini-files", - "Замена глобального php.ini для отдельного клиента": "substitute-global-php-ini-for-individual-customer", - "Управление версиями интерпретатора": "managing-interpreter-version", - "PHP Selector только с выбранными пакетами (cPanel)": "including-php-selector-only-with-some-packages-cpanel", - "Расширения PHP": "php-extensions", - "Инструменты командной строки для PHP Selector": "command-line-tools", - "Интеграция с панелями управления": "integrating-with-control-panels", - "Удаление": "removing", - "Использование": "using", - "Пользовательские настройки PHP.ini": "custom-php-ini-options", - "Файлы и директории конечного пользователя": "end-user-files-and-directories", - "Компиляция собственных расширений": "compiling-your-own-extensions", - "Добавление собственной версии PHP": "roll-your-own-php", - "Определение пользовательской версии PHP": "detect-user-s-php-version", - "PHP Selector без CageFS": "php-selector-without-cagefs", - "Настройка «глобальных» параметров php.ini для всех версий Alt-PHP": "configuring-global”-php-ini-options-for-all-alt-php-versions", - "Наборы PHP-расширений": "bundled-php-extensions", - "Расширения PHP 4.4": "php-4-4-extensions", - "Расширения PHP 5.1": "php-5-1-extensions", - "Расширения PHP 5.2": "php-5-2-extensions", - "Расширения PHP 5.3": "php-5-3-extensions", - "Расширения PHP 5.4": "php-5-4-extensions", - "Расширения PHP 5.5": "php-5-5-extensions", - "Расширения PHP 5.6": "php-5-6-extensions", - "Расширения PHP 7.0": "php-7-0-extensions", - "Расширения PHP 7.1": "php-7-1-extensions", - "Расширения PHP 7.2": "php-7-2-extensions", - "Расширения PHP 7.3": "php-7-3-extensions", - "Глобальное отключение PHP-расширений": "disabling-php-extension-globally", - "Интеграция с панелями управления": "control-panel-integration" -}; diff --git a/docs/.vuepress/styles/palette.styl b/docs/.vuepress/styles/palette.styl deleted file mode 100644 index 7a81e5eb6..000000000 --- a/docs/.vuepress/styles/palette.styl +++ /dev/null @@ -1,4 +0,0 @@ -// for overriding colors -$mainColor = #2b98f0 -$accentColor = $mainColor -$sidebarActiveColor = #e6f7ff diff --git a/docs/.vuepress/urls-mapping.js b/docs/.vuepress/urls-mapping.js deleted file mode 100644 index 7bcabac1e..000000000 --- a/docs/.vuepress/urls-mapping.js +++ /dev/null @@ -1,2560 +0,0 @@ -module.exports = { - "/ru/":"/ru/introduction/", - "/cloudlinux_installation.html/": "/cloudlinux_installation/", - "/cloudlinux_installation.html": "/cloudlinux_installation/", - "/index.html?cloudlinux_installation.html": "/cloudlinux_installation/", - "/converting_existing_servers.html/": "/cloudlinux_installation/#converting-existing-servers", - "/converting_existing_servers.html": "/cloudlinux_installation/#converting-existing-servers", - "/index.html?converting_existing_servers.html": "/cloudlinux_installation/#converting-existing-servers", - "/advanced_options_for_cldeploy.html/": "/command-line_tools/#cldeploy", - "/advanced_options_for_cldeploy.html": "/command-line_tools/#cldeploy", - "/index.html?advanced_options_for_cldeploy.html": "/command-line_tools/#cldeploy", - "/cloudlinux_installation/#advanced-options-for-cldeploy": "/command-line_tools/#cldeploy", - "/changes.html/": "/cloudlinux_installation/#explanation-of-changes", - "/changes.html": "/cloudlinux_installation/#explanation-of-changes", - "/index.html?changes.html": "/cloudlinux_installation/#explanation-of-changes", - "/installing_new_servers.html/": "/cloudlinux_installation/#installing-new-servers", - "/installing_new_servers.html": "/cloudlinux_installation/#installing-new-servers", - "/index.html?installing_new_servers.html": "/cloudlinux_installation/#installing-new-servers", - "/cloudlinux_os_images.html/": "/cloudlinux_installation/#cloudlinux-os-images", - "/cloudlinux_os_images.html": "/cloudlinux_installation/#cloudlinux-os-images", - "/index.html?cloudlinux_os_images.html": "/cloudlinux_installation/#cloudlinux-os-images", - "/xen_images.html/": "/cloudlinux_installation/#installing-new-servers", - "/xen_images.html": "/cloudlinux_installation/#installing-new-servers", - "/index.html?xen_images.html": "/cloudlinux_installation/#installing-new-servers", - "/net_install.html/": "/cloudlinux_installation/#net-install", - "/net_install.html": "/cloudlinux_installation/#net-install", - "/index.html?net_install.html": "/cloudlinux_installation/#net-install", - "/h-sphere_server.html/": "/cloudlinux_installation/#h-sphere", - "/h-sphere_server.html": "/cloudlinux_installation/#h-sphere", - "/index.html?h-sphere_server.html": "/cloudlinux_installation/#h-sphere", - "/cloudlinux_installation/#installing-on-h-sphere-server":"/cloudlinux_installation/#h-sphere", - "/mod_fastcgi_to_mod_fcgid.html/": "/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid", - "/mod_fastcgi_to_mod_fcgid.html": "/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid", - "/index.html?mod_fastcgi_to_mod_fcgid.html": "/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid", - "/virtuozzo_and_openvz.html/": "/cloudlinux_installation/#virtuozzo-and-openvz", - "/virtuozzo_and_openvz.html": "/cloudlinux_installation/#virtuozzo-and-openvz", - "/index.html?virtuozzo_and_openvz.html": "/cloudlinux_installation/#virtuozzo-and-openvz", - "/trial_license.html/": "/cloudlinux_installation/#getting-trial-license", - "/trial_license.html": "/cloudlinux_installation/#getting-trial-license", - "/index.html?trial_license.html": "/cloudlinux_installation/#getting-trial-license", - "/registering.html/": "/cloudlinux_installation/#license-activation", - "/registering.html": "/cloudlinux_installation/#license-activation", - "/index.html?registering.html": "/cloudlinux_installation/#registering-cloudlinux-server", - "/cloudlinux_installation/#registering-cloudlinux-server": "/cloudlinux_installation/#license-activation", - "/digitalocean.html/": "/cloudlinux_installation/#digitalocean", - "/digitalocean.html": "/cloudlinux_installation/#digitalocean", - "/index.html?digitalocean.html": "/cloudlinux_installation/#digitalocean", - "/cloudlinux_installation/#cloudlinux-on-digitalocean": "/cloudlinux_installation/#digitalocean", - "/linode_kvm.html/": "/cloudlinux_installation/#linode", - "/linode_kvm.html": "/cloudlinux_installation/#linode", - "/index.html?linode_kvm.html": "/cloudlinux_installation/#linode", - "/cloudlinux_installation/#cloudlinux-on-linode": "/cloudlinux_installation/#linode", - "/lilo_boot_loader.html/": "/cloudlinux_installation/#lilo-boot-loader", - "/lilo_boot_loader.html": "/cloudlinux_installation/#lilo-boot-loader", - "/index.html?lilo_boot_loader.html": "/cloudlinux_installation/#lilo-boot-loader", - "/cloudlinux_installation/#servers-with-lilo-boot-loader": "/cloudlinux_installation/#lilo-boot-loader", - "/cpanel_easyapache_4.html/": "/deprecated/#migration-to-easyapache-4", - "/cpanel_easyapache_4.html": "/deprecated/#migration-to-easyapache-4", - "/index.html?cpanel_easyapache_4.html": "/deprecated/#migration-to-easyapache-4", - "/cloudlinux_installation/#migrating-to-easyapache-4": "/deprecated/#migration-to-easyapache-4", - "/faq.html/": "https://cloudlinux.zendesk.com/hc/en-us/articles/360025827914-CloudLinux-OS-Installation-FAQ", - "/faq.html": "https://cloudlinux.zendesk.com/hc/en-us/articles/360025827914-CloudLinux-OS-Installation-FAQ", - "/index.html?faq.html": "https://cloudlinux.zendesk.com/hc/en-us/articles/360025827914-CloudLinux-OS-Installation-FAQ", - "/cloudlinux_installation/#faq": "https://cloudlinux.zendesk.com/hc/en-us/articles/360025827914-CloudLinux-OS-Installation-FAQ", - "/uninstall.html/": "/cloudlinux_installation/#uninstalling", - "/uninstall.html": "/cloudlinux_installation/#uninstalling", - "/index.html?uninstall.html": "/cloudlinux_installation/#uninstalling", - "/cloudlinux_installation/#uninstalling-cloudlinux": "/cloudlinux_installation/#uninstalling", - "/limits.html/": "/limits/", - "/limits.html": "/limits/", - "/index.html?limits.html": "/limits/", - "/lve.html/": "/limits/#understanding-limits", - "/lve.html": "/limits/#understanding-limits", - "/index.html?lve.html": "/limits/#understanding-limits", - "/limits/#understanding-lve": "/limits/#understanding-limits", - "/limits_command_line_tools.html/": "/limits/", - "/limits_command_line_tools.html": "/limits/", - "/index.html?limits_command_line_tools.html": "/limits/", - "/lvectl.html/": "/command-line_tools/#lvectl", - "/lvectl.html": "/command-line_tools/#lvectl", - "/index.html?lvectl.html": "/command-line_tools/#lvectl", - "/limits/#lvectl": "/command-line_tools/#lvectl", - "/lveps.html/": "/command-line_tools/#lveps", - "/lveps.html": "/command-line_tools/#lveps", - "/index.html?lveps.html": "/command-line_tools/#lveps", - "/limits/#lveps": "/command-line_tools/#lveps", - "/lvetop.html/": "/command-line_tools/#lvetop", - "/lvetop.html": "/command-line_tools/#lvetop", - "/index.html?lvetop.html": "/command-line_tools/#lvetop", - "/limits/#lvetop": "/command-line_tools/#lvetop", - "/cldetect.html/": "/command-line_tools/#cldetect", - "/cldetect.html": "/command-line_tools/#cldetect", - "/index.html?cldetect.html": "/command-line_tools/#cldetect", - "/cldetect.html/": "/command-line_tools/#cldetect", - "/speed_limits.html/": "/limits/#speed-limit", - "/speed_limits.html": "/limits/#speed-limit", - "/index.html?speed_limits.html": "/limits/#speed-limit", - "/limits/#speed-limits": "/limits/#speed-limit", - "/cpu_limits.html/": "/deprecated/#cpu-limits", - "/cpu_limits.html": "/deprecated/#cpu-limits", - "/index.html?cpu_limits.html": "/deprecated/#cpu-limits", - "/cpu_limits.html/": "/deprecated/#cpu-limits", - "/memory_limits.html/": "/limits/#memory-limit", - "/memory_limits.html": "/limits/#memory-limit", - "/index.html?memory_limits.html": "/limits/#memory-limit", - "/limits/#memory-limits": "/limits/#memory-limit", - "/io_limits.html/": "/limits/#io", - "/io_limits.html": "/limits/#io", - "/index.html?io_limits.html": "/limits/#io", - "/iops_limits.html/": "/limits/#iops", - "/iops_limits.html": "/limits/#iops", - "/index.html?iops_limits.html": "/limits/#iops", - "/entry_processes_limit.html/": "/limits/#entry-processes", - "/entry_processes_limit.html": "/limits/#entry-processes", - "/index.html?entry_processes_limit.html": "/limits/#entry-processes", - "/number_of_processes_limit.html/": "/limits/#number-of-processes", - "/number_of_processes_limit.html": "/limits/#number-of-processes", - "/index.html?number_of_processes_limit.html": "/limits/#number-of-processes", - "/network_limits.html/": "/limits/#network-traffic-bandwidth-control-and-accounting-system", - "/network_limits.html": "/limits/#network-traffic-bandwidth-control-and-accounting-system", - "/index.html?network_limits.html": "/limits/#network-traffic-bandwidth-control-and-accounting-system", - "/compatiblity_matrix.html/": "/limits/#compatibility-matrix", - "/compatiblity_matrix.html": "/limits/#compatibility-matrix", - "/index.html?compatiblity_matrix.html": "/limits/#compatibility-matrix", - "/integration_components.html/": "/cloudlinux_os_components/#additional-integration-components", - "/integration_components.html": "/cloudlinux_os_components/#additional-integration-components", - "/index.html?integration_components.html": "/cloudlinux_os_components/#additional-integration-components", - "/limits/#integration-components": "/cloudlinux_os_components/#additional-integration-components", - "/lve_pam_module.html/": "/cloudlinux_os_components/#lve-pam-module", - "/lve_pam_module.html": "/cloudlinux_os_components/#lve-pam-module", - "/index.html?lve_pam_module.html": "/cloudlinux_os_components/#lve-pam-module", - "/limits/#lve-pam-module": "/cloudlinux_os_components/#lve-pam-module", - "/lve_wrappers.html/": "/cloudlinux_os_components/#lve-pam-module", - "/lve_wrappers.html": "/cloudlinux_os_components/#lve-pam-module", - "/index.html?lve_wrappers.html": "/cloudlinux_os_components/#lve-pam-module", - "/limits/#lve-wrappers": "/cloudlinux_os_components/#lve-pam-module", - "/mpm_itk_support.html/": "/cloudlinux_os_components/#lve-wrappers", - "/mpm_itk_support.html": "/cloudlinux_os_components/#lve-wrappers", - "/index.html?mpm_itk_support.html": "/cloudlinux_os_components/#lve-wrappers", - "/limits/#mpm-itk": "/cloudlinux_os_components/#lve-wrappers", - "/hostinglimits_module_for_apache.html/": "/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/hostinglimits_module_for_apache.html": "/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/index.html?hostinglimits_module_for_apache.html": "/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/limits/#hostinglimits-module-for-apache": "/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/redis_support_for_hostinglimits.html/": "/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/redis_support_for_hostinglimits.html": "/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/limits/#redis-support-for-hostinglimits": "/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/index.html?redis_support_for_hostinglimits.html": "/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/cpanel_whm_json_api.html/": "/cloudlinux_os_components/#cpanel-whm-json-api", - "/cpanel_whm_json_api.html": "/cloudlinux_os_components/#cpanel-whm-json-api", - "/index.html?cpanel_whm_json_api.html": "/cloudlinux_os_components/#cpanel-whm-json-api", - "/limits/#cpanel-whm-json-api": "/cloudlinux_os_components/#cpanel-whm-json-api", - "/cpanel_lve_extension.html/": "/lve_manager/#cpanel-lve-extension", - "/cpanel_lve_extension.html": "/lve_manager/#cpanel-lve-extension", - "/index.html?cpanel_lve_extension.html": "/lve_manager/#cpanel-lve-extension", - "/limits/#cpanel-lve-extension":"/lve_manager/#cpanel-lve-extension", - "/lve_manager.html/": "/lve_manager/", - "/lve_manager.html": "/lve_manager/", - "/index.html?lve_manager.html": "/lve_manager/", - "/dashboard.html/": "/lve_manager/#dashboard", - "/dashboard.html": "/lve_manager/#dashboard", - "/index.html?dashboard.html": "/lve_manager/#dashboard", - "/installation-wizard.html/": "/lve_manager/#cloudlinux-installation-wizard", - "/installation-wizard.html": "/lve_manager/#cloudlinux-installation-wizard", - "/index.html?installation-wizard.html": "/lve_manager/#cloudlinux-installation-wizard", - "/cpanel_lve_manager.html/": "/lve_manager/#lve-manager", - "/cpanel_lve_manager.html": "/lve_manager/#lve-manager", - "/index.html?cpanel_lve_manager.html": "/lve_manager/#lve-manager", - "/lve_manager/#cpanel-lve-manager": "/lve_manager/#lve-manager", - "/lve_manager_options.html/": "/lve_manager/#lve-manager-options", - "/lve_manager_options.html": "/lve_manager/#lve-manager-options", - "/index.html?lve_manager_options.html": "/lve_manager/#lve-manager-options", - "/server_processes_snapshots.html/": "/lve_manager/#server-processes-snapshots", - "/server_processes_snapshots.html": "/lve_manager/#server-processes-snapshots", - "/index.html?server_processes_snapshots.html": "/lve_manager/#server-processes-snapshots", - "/lve_plugins_branding.html/": "/lve_manager/#lve-plugins-branding", - "/lve_plugins_branding.html": "/lve_manager/#lve-plugins-branding", - "/index.html?lve_plugins_branding.html": "/lve_manager/#lve-plugins-branding", - "/user_message.html/": "/lve_manager/#user-message-for-php-version", - "/user_message.html": "/lve_manager/#user-message-for-php-version", - "/index.html?user_message.html": "/lve_manager/#user-message-for-php-version", - "/cloudlinux_os_components/#reseller-limits": "/limits/#reseller-limits", - "/reseller_limits.html/": "/limits/#reseller-limits", - "/reseller_limits.html": "/limits/#reseller-limits", - "/index.html?reseller_limits.html": "/limits/#reseller-limits", - "/reseller_limits/": "/limits/#reseller-limits", - "/installation_and_requirements.html/": "/cloudlinux_os_components/", - "/installation_and_requirements.html": "/cloudlinux_os_components/", - "/index.html?installation_and_requirements.html": "/cloudlinux_os_components/", - "/reseller_limits/#requirements":"/limits/#requirements", - "/how_to_enable_reseller_limits.html/": "/limits/#enabling-reseller-limits", - "/how_to_enable_reseller_limits.html": "/limits/#enabling-reseller-limits", - "/index.html?how_to_enable_reseller_limits.html": "/limits/#enabling-reseller-limits", - "/reseller_limits/#how-to-enable-and-disable-reseller-limits": "/limits/#enabling-reseller-limits", - "/hoster_interface.html/": "/lve_manager/#lve-manager", - "/hoster_interface.html": "/lve_manager/#lve-manager", - "/index.html?hoster_interface.html": "/lve_manager/#lve-manager", - "/reseller_limits/#hoster-interface": "/lve_manager/#lve-manager", - "/current_usage_tab.html/": "/lve_manager/#current-usage-2", - "/current_usage_tab.html": "/lve_manager/#current-usage-2", - "/index.html?current_usage_tab.html": "/lve_manager/#current-usage-2", - "/reseller_limits/#current-usage": "/lve_manager/#current-usage-2", - "/users_tab.html/": "/lve_manager/#users-2", - "/users_tab.html": "/lve_manager/#users-2", - "/index.html?users_tab.html": "/lve_manager/#users-2", - "/reseller_limits/#users": "/lve_manager/#users-2", - "/statistics_tab.html/": "/lve_manager/#statistics-2", - "/statistics_tab.html": "/lve_manager/#statistics-2", - "/index.html?statistics_tab.html": "/lve_manager/#statistics-2", - "/reseller_limits/#statistics": "/lve_manager/#statistics-2", - "/options_tab.html/": "/lve_manager/#options-2", - "/options_tab.html": "/lve_manager/#options-2", - "/index.html?options_tab.html": "/lve_manager/#options-2", - "/reseller_limits/#options": "/lve_manager/#options-2", - "/packages_tab.html/": "/lve_manager/#packages-2", - "/packages_tab.html": "/lve_manager/#packages-2", - "/index.html?packages_tab.html": "/lve_manager/#packages-2", - "/reseller_limits/#packages": "/lve_manager/#packages-2", - "/selector_tab.html/": "/lve_manager/#selector", - "/selector_tab.html": "/lve_manager/#selector", - "/index.html?selector_tab.html": "/lve_manager/#selector", - "/reseller_limits/#selector": "/lve_manager/#selector", - "/reseller_interface.html/": "/lve_manager/#reseller-interface", - "/reseller_interface.html": "/lve_manager/#reseller-interface", - "/index.html?reseller_interface.html": "/lve_manager/#reseller-interface", - "/reseller_limits/#reseller-interface": "/lve_manager/#reseller-interface", - "/current_usage_tab2.html/": "/lve_manager/#current-usage-tab", - "/current_usage_tab2.html": "/lve_manager/#current-usage-tab", - "/index.html?current_usage_tab2.html": "/lve_manager/#current-usage-tab", - "/reseller_limits/#current-usage": "/lve_manager/#current-usage-tab", - "/historical_usage_tab.html/": "/lve_manager/#historical-usage-tab", - "/historical_usage_tab.html": "/lve_manager/#historical-usage-tab", - "/index.html?historical_usage_tab.html": "/lve_manager/#historical-usage-tab", - "/reseller_limits/#historical-usage": "/lve_manager/#historical-usage-tab", - "/users_tab2.html/": "/lve_manager/#users-tab", - "/users_tab2.html": "/lve_manager/#users-tab", - "/index.html?users_tab2.html": "/lve_manager/#users-tab", - "/reseller_limits/#users": "/lve_manager/#users-tab", - "/statistics_tab2.html/": "/lve_manager/#statistics-tab", - "/statistics_tab2.html": "/lve_manager/#statistics-tab", - "/index.html?statistics_tab2.html": "/lve_manager/#statistics-tab", - "/reseller_limits/#statistics": "/lve_manager/#statistics-tab", - "/options_tab2.html/": "/lve_manager/#options-tab", - "/options_tab2.html": "/lve_manager/#options-tab", - "/index.html?options_tab2.html": "/lve_manager/#options-tab", - "/reseller_limits/#options": "/lve_manager/#options-tab", - "/?substitute_global_php_ini_for_.html": "/cloudlinux_os_components/#substitute-global-php-ini-for-individual-customer", - "/packages_tab2.html/": "/lve_manager/#packages-tab", - "/packages_tab2.html": "/lve_manager/#packages-tab", - "/index.html?packages_tab2.html": "/lve_manager/#packages-tab", - "/reseller_limits/#packages": "/lve_manager/#packages-tab", - "/lve-stats_2.html/": "/cloudlinux_os_components/#lve-stats-2", - "/lve-stats_2.html": "/cloudlinux_os_components/#lve-stats-2", - "/index.html?lve-stats_2.html": "/cloudlinux_os_components/#lve-stats-2", - "/lve-stats_2/": "/cloudlinux_os_components/#lve-stats-2", - "/lve-stats_2_installation.html/": "/cloudlinux_os_components/#installation-and-update", - "/lve-stats_2_installation.html": "/cloudlinux_os_components/#installation-and-update", - "/index.html?lve-stats_2_installation.html": "/cloudlinux_os_components/#installation-and-update", - "/lve-stats_2/#installation": "/cloudlinux_os_components/#installation-and-update", - "/lve-stats_2_configuration.html/": "/cloudlinux_os_components/#configuration", - "/lve-stats_2_configuration.html": "/cloudlinux_os_components/#configuration", - "/index.html?lve-stats_2_configuration.html": "/cloudlinux_os_components/#configuration", - "/lve-stats_2/#configuration": "/cloudlinux_os_components/#configuration", - "/lve_stats2_and_mysql.html/": "/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup", - "/lve_stats2_and_mysql.html": "/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup", - "/index.html?lve_stats2_and_mysql.html": "/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup", - "/lve-stats_2/#lve-stats2-and-mysql-db-server-compatible-work-setup": "/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup", - "/lve_stats_2_and_postgresql.html/": "/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup", - "/lve_stats_2_and_postgresql.html": "/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup", - "/index.html?lve_stats_2_and_postgresql.html": "/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup", - "/lve-stats_2/#lve-stats-2-and-postgresql-db-server-compatible-work-setup": "/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup", - "/customize_lve-stats-2_notifica.html/": "/cloudlinux_os_components/#customize-lve-stats2-notifications", - "/customize_lve-stats-2_notifica.html": "/cloudlinux_os_components/#customize-lve-stats2-notifications", - "/index.html?customize_lve-stats-2_notifica.html": "/cloudlinux_os_components/#customize-lve-stats2-notifications", - "/lve-stats_2/#customize-lve-stats-2-notifications": "/cloudlinux_os_components/#customize-lve-stats2-notifications", - "/lve-stats_2_command_line_tools.html/": "/command-line_tools/#lve-stats-2", - "/lve-stats_2_command_line_tools.html": "/command-line_tools/#lve-stats-2", - "/index.html?lve-stats_2_command_line_tools.html": "/command-line_tools/#lve-stats-2", - "/lve-stats_2/#command-line-tools": "/command-line_tools/#lve-stats-2", - "/lveinfo.html/": "/command-line_tools/#lveinfo", - "/lveinfo.html": "/command-line_tools/#lveinfo", - "/index.html?lveinfo.html": "/command-line_tools/#lveinfo", - "/lve-stats_2/#lveinfo": "/command-line_tools/#lveinfo", - "/lvechart.html/": "/command-line_tools/#lvechart", - "/lvechart.html": "/command-line_tools/#lvechart", - "/index.html?lvechart.html": "/command-line_tools/#lvechart", - "/lve-stats_2/#lvechart": "/command-line_tools/#lvechart", - "/dbgovchart.html/": "/command-line_tools/#dbgovchart", - "/dbgovchart.html": "/command-line_tools/#dbgovchart", - "/index.html?dbgovchart.html": "/command-line_tools/#dbgovchart", - "/lve-stats_2/#dbgovchart": "/command-line_tools/#dbgovchart", - "/lve-read-snapshot.html/": "/command-line_tools/#lve-read-snapshot", - "/lve-read-snapshot.html": "/command-line_tools/#lve-read-snapshot", - "/index.html?lve-read-snapshot.html": "/command-line_tools/#lve-read-snapshot", - "/lve-stats_2/#lve-read-snapshot": "/command-line_tools/#lve-read-snapshot", - "/lve-create-db.html/": "/command-line_tools/#lve-create-db", - "/lve-create-db.html": "/command-line_tools/#lve-create-db", - "/index.html?lve-create-db.html": "/command-line_tools/#lve-create-db", - "/lve-stats_2/#lve-create-db": "/command-line_tools/#lve-create-db", - "/cloudlinux_top.html/": "/command-line_tools/#cloudlinux-top", - "/cloudlinux_top.html": "/command-line_tools/#cloudlinux-top", - "/index.html?cloudlinux_top.html": "/command-line_tools/#cloudlinux-top", - "/lve-stats_2/#cloudlinux-top": "/command-line_tools/#cloudlinux-top", - "/cloudlinux-statistics.html/": "/command-line_tools/#cloudlinux-statistics", - "/cloudlinux-statistics.html": "/command-line_tools/#cloudlinux-statistics", - "/index.html?cloudlinux-statistics.html": "/command-line_tools/#cloudlinux-statistics", - "/lve-stats_2/#cloudlinux-statistics": "/command-line_tools/#cloudlinux-statistics", - "/lve-stats_2_plugins.html/": "/cloudlinux_os_components/#plugins", - "/lve-stats_2_plugins.html": "/cloudlinux_os_components/#plugins", - "/index.html?lve-stats_2_plugins.html": "/cloudlinux_os_components/#plugins", - "/lve-stats_2/#plugins": "/cloudlinux_os_components/#plugins", - "/creating_a_plugin.html/": "/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2", - "/creating_a_plugin.html": "/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2", - "/index.html?creating_a_plugin.html": "/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2", - "/lve-stats_2/#creating-a-plugin-for-lve-stats-2": "/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2", - "/lve-stats_2_plugin_introduction.html/": "/cloudlinux_os_components/#introduction", - "/lve-stats_2_plugin_introduction.html": "/cloudlinux_os_components/#introduction", - "/index.html?lve-stats_2_plugin_introduction.html": "/cloudlinux_os_components/#introduction", - "/lve-stats_2/#introduction": "/cloudlinux_os_components/#introduction", - "/server_plugin_arrangement.html/": "/cloudlinux_os_components/#server-plugin-arrangement", - "/server_plugin_arrangement.html": "/cloudlinux_os_components/#server-plugin-arrangement", - "/index.html?server_plugin_arrangement.html": "/cloudlinux_os_components/#server-plugin-arrangement", - "/lve-stats_2/#server-plugin-arrangement": "/cloudlinux_os_components/#server-plugin-arrangement", - "/plugin_configuration.html/": "/cloudlinux_os_components/#plugin-configuration", - "/plugin_configuration.html": "/cloudlinux_os_components/#plugin-configuration", - "/index.html?plugin_configuration.html": "/cloudlinux_os_components/#plugin-configuration", - "/lve-stats_2/#plugin-configuration": "/cloudlinux_os_components/#plugin-configuration", - "/types_of_plugins.html/": "/cloudlinux_os_components/#types-of-plugins", - "/types_of_plugins.html": "/cloudlinux_os_components/#types-of-plugins", - "/index.html?types_of_plugins.html": "/cloudlinux_os_components/#types-of-plugins", - "/lve-stats_2/#types-of-plugins": "/cloudlinux_os_components/#types-of-plugins", - "/plugins_examples.html/": "/cloudlinux_os_components/#examples-of-plugins", - "/plugins_examples.html": "/cloudlinux_os_components/#examples-of-plugins", - "/index.html?plugins_examples.html": "/cloudlinux_os_components/#examples-of-plugins", - "/lve-stats_2/#examples-of-plugins": "/cloudlinux_os_components/#examples-of-plugins", - "/collector.html/": "/cloudlinux_os_components/#collector", - "/collector.html": "/cloudlinux_os_components/#collector", - "/index.html?collector.html": "/cloudlinux_os_components/#collector", - "/lve-stats_2/#collector": "/cloudlinux_os_components/#collector", - "/analizer.html/": "/cloudlinux_os_components/#analyzer", - "/analizer.html": "/cloudlinux_os_components/#analyzer", - "/index.html?analizer.html": "/cloudlinux_os_components/#analyzer", - "/lve-stats_2/#analizer": "/cloudlinux_os_components/#analyzer", - "/persistor.html/": "/cloudlinux_os_components/#persistor", - "/persistor.html": "/cloudlinux_os_components/#persistor", - "/index.html?persistor.html": "/cloudlinux_os_components/#persistor", - "/lve-stats_2/#persistor": "/cloudlinux_os_components/#persistor", - "/notifier.html/": "/cloudlinux_os_components/#notifier", - "/notifier.html": "/cloudlinux_os_components/#notifier", - "/index.html?notifier.html": "/cloudlinux_os_components/#notifier", - "/lve-stats_2/#notifier": "/cloudlinux_os_components/#notifier", - "/var_lve_info_file.html/": "/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file", - "/var_lve_info_file.html": "/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file", - "/index.html?var_lve_info_file.html": "/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file", - "/lve-stats_2/#file-info-and-format-for-var-lve-info-file": "/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file", - "/lve-stats_2_troubleshooting.html/": "/cloudlinux_os_components/#troubleshooting", - "/lve-stats_2_troubleshooting.html": "/cloudlinux_os_components/#troubleshooting", - "/index.html?lve-stats_2_troubleshooting.html": "/cloudlinux_os_components/#troubleshooting", - "/lve-stats_2/#troubleshooting": "/cloudlinux_os_components/#troubleshooting", - "/cagefs.html/": "/cloudlinux_os_components/#cagefs/", - "/cagefs.html": "/cloudlinux_os_components/#cagefs/", - "/index.html?cagefs.html": "/cloudlinux_os_components/#cagefs/", - "/cagefs/": "/cloudlinux_os_components/#cagefs/", - "/cagefs_installation.html/": "/cloudlinux_os_components/#installation-and-update-2", - "/cagefs_installation.html": "/cloudlinux_os_components/#installation-and-update-2", - "/index.html?cagefs_installation.html": "/cloudlinux_os_components/#installation-and-update-2", - "/cagefs/#installation": "/cloudlinux_os_components/#installation-and-update-2", - "/unistalling_cagefs.html/": "/cloudlinux_os_components/#unistalling", - "/unistalling_cagefs.html": "/cloudlinux_os_components/#unistalling", - "/index.html?unistalling_cagefs.html": "/cloudlinux_os_components/#unistalling", - "/cagefs/#unistalling-cagefs": "/cloudlinux_os_components/#unistalling", - "/managing_users.html/": "/cloudlinux_os_components/#managing-users", - "/managing_users.html": "/cloudlinux_os_components/#managing-users", - "/index.html?managing_users.html": "/cloudlinux_os_components/#managing-users", - "/cagefs/#managing-users": "/cloudlinux_os_components/#managing-users", - "/cagefs_command_line_tools.html/": "/command-line_tools/#cagefs", - "/cagefs_command_line_tools.html": "/command-line_tools/#cagefs", - "/index.html?cagefs_command_line_tools.html": "/command-line_tools/#cagefs", - "/cagefs/#command-line-tools": "/command-line_tools/#cagefs", - "/running_command_inside_cagefs.html/": "/command-line_tools/#running-command-inside-cagefs", - "/running_command_inside_cagefs.html": "/command-line_tools/#running-command-inside-cagefs", - "/index.html?running_command_inside_cagefs.html": "/command-line_tools/#running-command-inside-cagefs", - "/cagefs/#running-command-inside-cagefs": "/command-line_tools/#running-command-inside-cagefs", - "/sanity_check.html/": "/command-line_tools/#sanity-check", - "/sanity_check.html": "/command-line_tools/#sanity-check", - "/index.html?sanity_check.html": "/command-line_tools/#sanity-check", - "/cagefs/#sanity-check": "/command-line_tools/#sanity-check", - "/cagefs_quirks.html/": "/command-line_tools/#cagefs-quirks", - "/cagefs_quirks.html": "/command-line_tools/#cagefs-quirks", - "/index.html?cagefs_quirks.html": "/command-line_tools/#cagefs-quirks", - "/cagefs/#cagefs-quirks": "/command-line_tools/#cagefs-quirks", - "/cagefs_configuration.html/": "/cloudlinux_os_components/#configuration-2", - "/cagefs_configuration.html": "/cloudlinux_os_components/#configuration-2", - "/index.html?cagefs_configuration.html": "/cloudlinux_os_components/#configuration-2", - "/cagefs/#configuration": "/cloudlinux_os_components/#configuration-2", - "/file_system_templates.html/": "/cloudlinux_os_components/#file-system-templates", - "/file_system_templates.html": "/cloudlinux_os_components/#file-system-templates", - "/index.html?file_system_templates.html": "/cloudlinux_os_components/#file-system-templates", - "/cagefs/#file-system-templates": "/cloudlinux_os_components/#file-system-templates", - "/excluding_files.html/": "/cloudlinux_os_components/#excluding-files", - "/excluding_files.html": "/cloudlinux_os_components/#excluding-files", - "/index.html?excluding_files.html": "/cloudlinux_os_components/#excluding-files", - "/cagefs/#excluding-files": "/cloudlinux_os_components/#excluding-files", - "/excluding_users.html/": "/cloudlinux_os_components/#excluding-users", - "/excluding_users.html": "/cloudlinux_os_components/#excluding-users", - "/index.html?excluding_users.html": "/cloudlinux_os_components/#excluding-users", - "/cagefs/#excluding-users": "/cloudlinux_os_components/#excluding-users", - "/mount_points.html/": "/cloudlinux_os_components/#mount-points", - "/mount_points.html": "/cloudlinux_os_components/#mount-points", - "/index.html?mount_points.html": "/cloudlinux_os_components/#mount-points", - "/cagefs/#mount-points": "/cloudlinux_os_components/#mount-points", - "/per_user_virtual_mount_points.html/": "/cloudlinux_os_components/#per-user-virtual-mount-points", - "/per_user_virtual_mount_points.html": "/cloudlinux_os_components/#per-user-virtual-mount-points", - "/index.html?per_user_virtual_mount_points.html": "/cloudlinux_os_components/#per-user-virtual-mount-points", - "/cagefs/#per-user-virtual-mount-points": "/cloudlinux_os_components/#per-user-virtual-mount-points", - "/split_by_username.html/": "/cloudlinux_os_components/#split-by-username", - "/split_by_username.html": "/cloudlinux_os_components/#split-by-username", - "/index.html?split_by_username.html": "/cloudlinux_os_components/#split-by-username", - "/cagefs/#split-by-username": "/cloudlinux_os_components/#split-by-username", - "/mounting_users_home_directory_.html/": "/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs", - "/mounting_users_home_directory_.html": "/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs", - "/index.html?mounting_users_home_directory_.html": "/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs", - "/cagefs/#mounting-users-home-directory-inside-cagefs": "/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs", - "/base_home_directory.html/": "/cloudlinux_os_components/#base-home-directory", - "/base_home_directory.html": "/cloudlinux_os_components/#base-home-directory", - "/index.html?base_home_directory.html": "/cloudlinux_os_components/#base-home-directory", - "/cagefs/#base-home-directory": "/cloudlinux_os_components/#base-home-directory", - "/postgresql_support.html/": "/cloudlinux_os_components/#postgresql-support", - "/postgresql_support.html": "/cloudlinux_os_components/#postgresql-support", - "/index.html?postgresql_support.html": "/cloudlinux_os_components/#postgresql-support", - "/cagefs/#postgresql-support": "/cloudlinux_os_components/#postgresql-support", - "/pam_configuration.html/": "/cloudlinux_os_components/#pam-configuration", - "/pam_configuration.html": "/cloudlinux_os_components/#pam-configuration", - "/index.html?pam_configuration.html": "/cloudlinux_os_components/#pam-configuration", - "/cagefs/#pam-configuration": "/cloudlinux_os_components/#pam-configuration", - "/executing_by_proxy.html/": "/cloudlinux_os_components/#executing-by-proxy", - "/executing_by_proxy.html": "/cloudlinux_os_components/#executing-by-proxy", - "/index.html?executing_by_proxy.html": "/cloudlinux_os_components/#executing-by-proxy", - "/cagefs/#executing-by-proxy": "/cloudlinux_os_components/#executing-by-proxy", - "/custom__etc_directory.html/": "/cloudlinux_os_components/#custom-etc-files-per-customer", - "/custom__etc_directory.html": "/cloudlinux_os_components/#custom-etc-files-per-customer", - "/index.html?custom__etc_directory.html": "/cloudlinux_os_components/#custom-etc-files-per-customer", - "/cagefs/#custom-etc-files-per-customer": "/cloudlinux_os_components/#custom-etc-files-per-customer", - "/moving_cagefs-skeleton_directory.html/": "/cloudlinux_os_components/#moving-cagefs-skeleton-directory", - "/moving_cagefs-skeleton_directory.html": "/cloudlinux_os_components/#moving-cagefs-skeleton-directory", - "/index.html?moving_cagefs-skeleton_directory.html": "/cloudlinux_os_components/#moving-cagefs-skeleton-directory", - "/cagefs/#moving-cagefs-skeleton-directory": "/cloudlinux_os_components/#moving-cagefs-skeleton-directory", - "/moving__var_cagefs_directory.html/": "/cloudlinux_os_components/#moving-var-cagefs-directory", - "/moving__var_cagefs_directory.html": "/cloudlinux_os_components/#moving-var-cagefs-directory", - "/index.html?moving__var_cagefs_directory.html": "/cloudlinux_os_components/#moving-var-cagefs-directory", - "/cagefs/#moving-var-cagefs-directory": "/cloudlinux_os_components/#moving-var-cagefs-directory", - "/tmp_directories.html/": "/cloudlinux_os_components/#tmp-directories", - "/tmp_directories.html": "/cloudlinux_os_components/#tmp-directories", - "/index.html?tmp_directories.html": "/cloudlinux_os_components/#tmp-directories", - "/cagefs/#tmp-directories": "/cloudlinux_os_components/#tmp-directories", - "/syslog.html/": "/cloudlinux_os_components/#syslog", - "/syslog.html": "/cloudlinux_os_components/#syslog", - "/index.html?syslog.html": "/cloudlinux_os_components/#syslog", - "/cagefs/#syslog": "/cloudlinux_os_components/#syslog", - "/excluding_mount_points.html/": "/cloudlinux_os_components/#excluding-mount-points", - "/excluding_mount_points.html": "/cloudlinux_os_components/#excluding-mount-points", - "/index.html?excluding_mount_points.html": "/cloudlinux_os_components/#excluding-mount-points", - "/cagefs/#excluding-mount-points": "/cloudlinux_os_components/#excluding-mount-points", - "/control_panel_integration.html/": "/cloudlinux_os_components/#integration-with-control-panels", - "/control_panel_integration.html": "/cloudlinux_os_components/#integration-with-control-panels", - "/index.html?control_panel_integration.html": "/cloudlinux_os_components/#integration-with-control-panels", - "/cagefs/#control-panel-integration": "/cloudlinux_os_components/#integration-with-control-panels", - "/cpanel.html/": "/cloudlinux_os_components/#cpanel", - "/cpanel.html": "/cloudlinux_os_components/#cpanel", - "/index.html?cpanel.html": "/cloudlinux_os_components/#cpanel", - "/cagefs/#cpanel": "/cloudlinux_os_components/#cpanel", - "/plesk.html/": "/cloudlinux_os_components/#plesk", - "/plesk.html": "/cloudlinux_os_components/#plesk", - "/index.html?plesk.html": "/cloudlinux_os_components/#plesk", - "/cagefs/#plesk": "/cloudlinux_os_components/#plesk", - "/ispmanager.html/": "/cloudlinux_os_components/#ispmanager", - "/ispmanager.html": "/cloudlinux_os_components/#ispmanager", - "/index.html?ispmanager.html": "/cloudlinux_os_components/#ispmanager", - "/cagefs/#ispmanager": "/cloudlinux_os_components/#ispmanager", - "/mysql_governor.html/": "/cloudlinux_os_components/#mysql-governor", - "/mysql_governor.html": "/cloudlinux_os_components/#mysql-governor", - "/index.html?mysql_governor.html": "/cloudlinux_os_components/#mysql-governor", - "/mysql_governor/": "/cloudlinux_os_components/#mysql-governor", - "/mysql_governor_installation.html/": "/cloudlinux_os_components/#installation-and-update-3", - "/mysql_governor_installation.html": "/cloudlinux_os_components/#installation-and-update-3", - "/index.html?mysql_governor_installation.html": "/cloudlinux_os_components/#installation-and-update-3", - "/mysql_governor/#installation": "/cloudlinux_os_components/#installation-and-update-3", - "/removing_mysql_governor.html/": "/cloudlinux_os_components/#uninstalling-2", - "/removing_mysql_governor.html": "/cloudlinux_os_components/#uninstalling-2", - "/index.html?removing_mysql_governor.html": "/cloudlinux_os_components/#uninstalling-2", - "/mysql_governor/#removing": "/cloudlinux_os_components/#uninstalling-2", - "/modes_of_operation.html/": "/cloudlinux_os_components/#modes-of-operation", - "/modes_of_operation.html": "/cloudlinux_os_components/#modes-of-operation", - "/index.html?modes_of_operation.html": "/cloudlinux_os_components/#modes-of-operation", - "/mysql_governor/#modes-of-operation": "/cloudlinux_os_components/#modes-of-operation", - "/mysql_governor_configuration.html/": "/cloudlinux_os_components/#configuration-3", - "/mysql_governor_configuration.html": "/cloudlinux_os_components/#configuration-3", - "/index.html?mysql_governor_configuration.html": "/cloudlinux_os_components/#configuration-3", - "/mysql_governor/#configuration": "/cloudlinux_os_components/#configuration-3", - "/start_stop.html/": "/cloudlinux_os_components/#starting-and-stopping", - "/start_stop.html": "/cloudlinux_os_components/#starting-and-stopping", - "/index.html?start_stop.html": "/cloudlinux_os_components/#starting-and-stopping", - "/mysql_governor/#starting-and-stopping": "/cloudlinux_os_components/#starting-and-stopping", - "/mapping_a_user_to_database.html/": "/cloudlinux_os_components/#mapping-a-user-to-database", - "/mapping_a_user_to_database.html": "/cloudlinux_os_components/#mapping-a-user-to-database", - "/index.html?mapping_a_user_to_database.html": "/cloudlinux_os_components/#mapping-a-user-to-database", - "/mysql_governor/#mapping-a-user-to-database": "/cloudlinux_os_components/#mapping-a-user-to-database", - "/log_files.html/": "/cloudlinux_os_components/#log-files", - "/log_files.html": "/cloudlinux_os_components/#log-files", - "/index.html?log_files.html": "/cloudlinux_os_components/#log-files", - "/mysql_governor/#log-files": "/cloudlinux_os_components/#log-files", - "/change_mysql_version.html/": "/cloudlinux_os_components/#change-mysql-version", - "/change_mysql_version.html": "/cloudlinux_os_components/#change-mysql-version", - "/index.html?change_mysql_version.html": "/cloudlinux_os_components/#change-mysql-version", - "/mysql_governor/#change-mysql-version": "/cloudlinux_os_components/#change-mysql-version", - "/mysql_governor_command_line_tools.html/": "/command-line_tools/#mysql-governor", - "/mysql_governor_command_line_tools.html": "/command-line_tools/#mysql-governor", - "/index.html?mysql_governor_command_line_tools.html": "/command-line_tools/#mysql-governor", - "/mysql_governor/#command-line-tools": "/command-line_tools/#mysql-governor", - "/dbtop.html/": "/command-line_tools/#dbtop", - "/dbtop.html": "/command-line_tools/#dbtop", - "/index.html?dbtop.html": "/command-line_tools/#dbtop", - "/mysql_governor/#dbtop": "/command-line_tools/#dbtop", - "/dbctl.html/": "/command-line_tools/#dbctl", - "/dbctl.html": "/command-line_tools/#dbctl", - "/index.html?dbctl.html": "/command-line_tools/#dbctl", - "/mysql_governor/#dbctl": "/command-line_tools/#dbctl", - "/dbgov_lveinfo.html/": "/command-line_tools/#lveinfo-dbgov", - "/dbgov_lveinfo.html": "/command-line_tools/#lveinfo-dbgov", - "/index.html?dbgov_lveinfo.html": "/command-line_tools/#lveinfo-dbgov", - "/mysql_governor/#lveinfo-dbgov": "/command-line_tools/#lveinfo-dbgov", - "/mysql_governor_dbgovchart.html/": "/command-line_tools/#dbgovchart", - "/mysql_governor_dbgovchart.html": "/command-line_tools/#dbgovchart", - "/index.html?mysql_governor_dbgovchart.html": "/command-line_tools/#dbgovchart", - "/mysql_governor/#dbgovchart": "/command-line_tools/#dbgovchart", - "/backing_up_mysql.html/": "/cloudlinux_os_components/#backing-up-mysql", - "/backing_up_mysql.html": "/cloudlinux_os_components/#backing-up-mysql", - "/index.html?backing_up_mysql.html": "/cloudlinux_os_components/#backing-up-mysql", - "/mysql_governor/#backing-up-mysql": "/cloudlinux_os_components/#backing-up-mysql", - "/abrt_plugin.html/": "/cloudlinux_os_components/#abrt-plugin", - "/abrt_plugin.html": "/cloudlinux_os_components/#abrt-plugin", - "/index.html?abrt_plugin.html": "/cloudlinux_os_components/#abrt-plugin", - "/mysql_governor/#abrt": "/cloudlinux_os_components/#abrt-plugin", - "/troubleshooting.html/": "/cloudlinux_os_components/#troubleshooting-2", - "/troubleshooting.html": "/cloudlinux_os_components/#troubleshooting-2", - "/index.html?troubleshooting.html": "/cloudlinux_os_components/#troubleshooting-2", - "/mysql_governor/#troubleshooting": "/cloudlinux_os_components/#troubleshooting-2", - "/php_selector.html/": "/cloudlinux_os_components/#php_selector/", - "/php_selector.html": "/cloudlinux_os_components/#php_selector/", - "/index.html?php_selector.html": "/cloudlinux_os_components/#php_selector/", - "/php_selector/": "/cloudlinux_os_components/#php_selector/", - "/php_selector_installation.html/": "/cloudlinux_os_components/#installation-and-update-4", - "/php_selector_installation.html": "/cloudlinux_os_components/#installation-and-update-4", - "/index.html?php_selector_installation.html": "/cloudlinux_os_components/#installation-and-update-4", - "/php_selector/#installation-and-update": "/cloudlinux_os_components/#installation-and-update-4", - "/litespeed_support.html/": "/cloudlinux_os_components/#litespeed-support", - "/litespeed_support.html": "/cloudlinux_os_components/#litespeed-support", - "/index.html?litespeed_support.html": "/cloudlinux_os_components/#litespeed-support", - "/php_selector/#litespeed-support": "/cloudlinux_os_components/#litespeed-support", - "/ispmanager_support.html/": "/cloudlinux_os_components/#ispmanager-support", - "/ispmanager_support.html": "/cloudlinux_os_components/#ispmanager-support", - "/index.html?ispmanager_support.html": "/cloudlinux_os_components/#ispmanager-support", - "/php_selector/#ispmanager": "/cloudlinux_os_components/#ispmanager-support", - "/php_configuration.html/": "/cloudlinux_os_components/#configuration-and-using", - "/php_configuration.html": "/cloudlinux_os_components/#configuration-and-using", - "/index.html?php_configuration.html": "/cloudlinux_os_components/#configuration-and-using", - "/php_selector/#configuration": "/cloudlinux_os_components/#configuration-and-using", - "/default_version_and_modules.html/": "/cloudlinux_os_components/#setting-default-version-and-modules", - "/default_version_and_modules.html": "/cloudlinux_os_components/#setting-default-version-and-modules", - "/index.html?default_version_and_modules.html": "/cloudlinux_os_components/#setting-default-version-and-modules", - "/php_selector/#setting-default-version-and-modules": "/cloudlinux_os_components/#setting-default-version-and-modules", - "/individual_php_ini_files.html/": "/cloudlinux_os_components/#individual-php-ini-files", - "/individual_php_ini_files.html": "/cloudlinux_os_components/#individual-php-ini-files", - "/index.html?individual_php_ini_files.html": "/cloudlinux_os_components/#individual-php-ini-files", - "/php_selector/#individual-php-ini-files": "/cloudlinux_os_components/#individual-php-ini-files", - "/substitute_global_php_ini.html/": "/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4", - "/substitute_global_php_ini.html": "/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4", - "/index.html?substitute_global_php_ini.html": "/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4", - "/php_selector/#substitute-global-php-ini-for-individual-customer": "/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4", - "/managing_interpretor_version.html/": "/cloudlinux_os_components/#managing-interpreter-version", - "/managing_interpretor_version.html": "/cloudlinux_os_components/#managing-interpreter-version", - "/index.html?managing_interpretor_version.html": "/cloudlinux_os_components/#managing-interpreter-version", - "/php_selector/#managing-interpreter-version": "/cloudlinux_os_components/#managing-interpreter-version", - "/php_selector_only_with_some_packages.html/": "/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel", - "/php_selector_only_with_some_packages.html": "/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel", - "/index.html?php_selector_only_with_some_packages.html": "/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel", - "/php_selector/#including": "/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel", - "/php_extensions.html/": "/cloudlinux_os_components/#php-extensions", - "/php_extensions.html": "/cloudlinux_os_components/#php-extensions", - "/index.html?php_extensions.html": "/cloudlinux_os_components/#php-extensions", - "/php_selector/#php-extensions": "/cloudlinux_os_components/#php-extensions", - "/ffmpeg.html/": "/cloudlinux_os_components/#ffmpeg", - "/ffmpeg.html": "/cloudlinux_os_components/#ffmpeg", - "/index.html?ffmpeg.html": "/cloudlinux_os_components/#ffmpeg", - "/php_selector/#ffmpeg": "/cloudlinux_os_components/#ffmpeg", - "/native_php_configuration.html/": "/cloudlinux_os_components/#native-php-configuration", - "/native_php_configuration.html": "/cloudlinux_os_components/#native-php-configuration", - "/index.html?native_php_configuration.html": "/cloudlinux_os_components/#native-php-configuration", - "/php_selector/#native-php": "/cloudlinux_os_components/#native-php-configuration", - "/php_selector_command_line_tools.html/": "/command-line_tools/#php-selector", - "/php_selector_command_line_tools.html": "/command-line_tools/#php-selector", - "/index.html?php_selector_command_line_tools.html": "/command-line_tools/#php-selector", - "/php_selector/#command-line-tools": "/command-line_tools/#php-selector", - "/selectorctl.html/": "/command-line_tools/#selectorctl", - "/selectorctl.html": "/command-line_tools/#selectorctl", - "/index.html?selectorctl.html": "/command-line_tools/#selectorctl", - "/php_selector/#selectorctl": "/command-line_tools/#selectorctl", - "/integrating_with_control_panel.html/": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/integrating_with_control_panel.html": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/index.html?integrating_with_control_panel.html": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/php_selector/#integrating-with-control-panels": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/removing_php_selector.html/": "/cloudlinux_os_components/#uninstalling-3", - "/removing_php_selector.html": "/cloudlinux_os_components/#uninstalling-3", - "/index.html?removing_php_selector.html": "/cloudlinux_os_components/#uninstalling-3", - "/php_selector/#removing": "/cloudlinux_os_components/#uninstalling-3", - "/using_php_selector.html/": "/cloudlinux_os_components/#using", - "/using_php_selector.html": "/cloudlinux_os_components/#using", - "/index.html?using_php_selector.html": "/cloudlinux_os_components/#using", - "/php_selector/#using": "/cloudlinux_os_components/#using", - "/custom_php_ini_options.html/": "/cloudlinux_os_components/#custom-php-ini-options", - "/custom_php_ini_options.html": "/cloudlinux_os_components/#custom-php-ini-options", - "/index.html?custom_php_ini_options.html": "/cloudlinux_os_components/#custom-php-ini-options", - "/php_selector/#custom-php-ini-options": "/cloudlinux_os_components/#custom-php-ini-options", - "/end_user_directories.html/": "/cloudlinux_os_components/#end-user-files-and-directories", - "/end_user_directories.html": "/cloudlinux_os_components/#end-user-files-and-directories", - "/index.html?end_user_directories.html": "/cloudlinux_os_components/#end-user-files-and-directories", - "/php_selector/#end-user-files-and-directories": "/cloudlinux_os_components/#end-user-files-and-directories", - "/compiling_your_own_extensions.html/": "/cloudlinux_os_components/#compiling-your-own-extensions", - "/compiling_your_own_extensions.html": "/cloudlinux_os_components/#compiling-your-own-extensions", - "/index.html?compiling_your_own_extensions.html": "/cloudlinux_os_components/#compiling-your-own-extensions", - "/php_selector/#compiling-your-own-extensions": "/cloudlinux_os_components/#compiling-your-own-extensions", - "/roll_your_own_php.html/": "/cloudlinux_os_components/#roll-your-own-php", - "/roll_your_own_php.html": "/cloudlinux_os_components/#roll-your-own-php", - "/index.html?roll_your_own_php.html": "/cloudlinux_os_components/#roll-your-own-php", - "/php_selector/#roll-your-own-php": "/cloudlinux_os_components/#roll-your-own-php", - "/detect_users_php_version.html/": "/cloudlinux_os_components/#detect-user-s-php-version", - "/detect_users_php_version.html": "/cloudlinux_os_components/#detect-user-s-php-version", - "/index.html?detect_users_php_version.html": "/cloudlinux_os_components/#detect-user-s-php-version", - "/php_selector/#detect-user-s-php-version": "/cloudlinux_os_components/#detect-user-s-php-version", - "/php_selector_without_cagefs.html/": "/cloudlinux_os_components/#php-selector-without-cagefs", - "/php_selector_without_cagefs.html": "/cloudlinux_os_components/#php-selector-without-cagefs", - "/index.html?php_selector_without_cagefs.html": "/cloudlinux_os_components/#php-selector-without-cagefs", - "/php_selector/#php-selector": "/cloudlinux_os_components/#php-selector-without-cagefs", - "/configuring_global_php_ini_opt.html/": "/cloudlinux_os_components/#configuring-global-php-ini-options-for-all-alt-php-versions", - "/configuring_global_php_ini_opt.html": "/cloudlinux_os_components/#configuring-global-php-ini-options-for-all-alt-php-versions", - "/index.html?configuring_global_php_ini_opt.html": "/cloudlinux_os_components/#configuring-global-php-ini-options-for-all-alt-php-versions", - "/php_selector/#configuring": "/cloudlinux_os_components/#configuring-global-php-ini-options-for-all-alt-php-versions", - "/bundled_php_extensions.html/": "/cloudlinux_os_components/#bundled-php-extensions", - "/bundled_php_extensions.html": "/cloudlinux_os_components/#bundled-php-extensions", - "/index.html?bundled_php_extensions.html": "/cloudlinux_os_components/#bundled-php-extensions", - "/php_selector/#bundled-php-extensions": "/cloudlinux_os_components/#bundled-php-extensions", - "/php_4_4_extensions.html/": "/cloudlinux_os_components/#php-4-4-extensions", - "/php_4_4_extensions.html": "/cloudlinux_os_components/#php-4-4-extensions", - "/index.html?php_4_4_extensions.html": "/cloudlinux_os_components/#php-4-4-extensions", - "/php_selector/#php-4-4-extensions": "/cloudlinux_os_components/#php-4-4-extensions", - "/php_5_1_extensions.html/": "/cloudlinux_os_components/#php-5-1-extensions", - "/php_5_1_extensions.html": "/cloudlinux_os_components/#php-5-1-extensions", - "/index.html?php_5_1_extensions.html": "/cloudlinux_os_components/#php-5-1-extensions", - "/php_selector/#php-5-1-extensions": "/cloudlinux_os_components/#php-5-1-extensions", - "/php_5_2_extensions.html/": "/cloudlinux_os_components/#php-5-2-extensions", - "/php_5_2_extensions.html": "/cloudlinux_os_components/#php-5-2-extensions", - "/index.html?php_5_2_extensions.html": "/cloudlinux_os_components/#php-5-2-extensions", - "/php_selector/#php-5-2-extensions": "/cloudlinux_os_components/#php-5-2-extensions", - "/php_5_3_extensions.html/": "/cloudlinux_os_components/#php-5-3-extensions", - "/php_5_3_extensions.html": "/cloudlinux_os_components/#php-5-3-extensions", - "/index.html?php_5_3_extensions.html": "/cloudlinux_os_components/#php-5-3-extensions", - "/php_selector/#php-5-3-extensions": "/cloudlinux_os_components/#php-5-3-extensions", - "/php_5_4_extensions.html/": "/cloudlinux_os_components/#php-5-4-extensions", - "/php_5_4_extensions.html": "/cloudlinux_os_components/#php-5-4-extensions", - "/index.html?php_5_4_extensions.html": "/cloudlinux_os_components/#php-5-4-extensions", - "/php_selector/#php-5-4-extensions": "/cloudlinux_os_components/#php-5-4-extensions", - "/php_5_5_extensions.html/": "/cloudlinux_os_components/#php-5-5-extensions", - "/php_5_5_extensions.html": "/cloudlinux_os_components/#php-5-5-extensions", - "/index.html?php_5_5_extensions.html": "/cloudlinux_os_components/#php-5-5-extensions", - "/php_selector/#php-5-5-extensions": "/cloudlinux_os_components/#php-5-5-extensions", - "/php_5_6_extensions.html/": "/cloudlinux_os_components/#php-5-6-extensions", - "/php_5_6_extensions.html": "/cloudlinux_os_components/#php-5-6-extensions", - "/index.html?php_5_6_extensions.html": "/cloudlinux_os_components/#php-5-6-extensions", - "/php_selector/#php-5-6-extensions": "/cloudlinux_os_components/#php-5-6-extensions", - "/php_7_0_extensions.html/": "/cloudlinux_os_components/#php-7-0-extensions", - "/php_7_0_extensions.html": "/cloudlinux_os_components/#php-7-0-extensions", - "/index.html?php_7_0_extensions.html": "/cloudlinux_os_components/#php-7-0-extensions", - "/php_selector/#php-7-0-extensions": "/cloudlinux_os_components/#php-7-0-extensions", - "/php_7_1_extensions.html/": "/cloudlinux_os_components/#php-7-1-extensions", - "/php_7_1_extensions.html": "/cloudlinux_os_components/#php-7-1-extensions", - "/index.html?php_7_1_extensions.html": "/cloudlinux_os_components/#php-7-1-extensions", - "/php_selector/#php-7-1-extensions": "/cloudlinux_os_components/#php-7-1-extensions", - "/php_7_2_extensions.html/": "/cloudlinux_os_components/#php-7-2-extensions", - "/php_7_2_extensions.html": "/cloudlinux_os_components/#php-7-2-extensions", - "/index.html?php_7_2_extensions.html": "/cloudlinux_os_components/#php-7-2-extensions", - "/php_selector/#php-7-2-extensions": "/cloudlinux_os_components/#php-7-2-extensions", - "/php-7_3-extensions.html/": "/cloudlinux_os_components/#php-7-3-extensions", - "/php-7_3-extensions.html": "/cloudlinux_os_components/#php-7-3-extensions", - "/index.html?php-7_3-extensions.html": "/cloudlinux_os_components/#php-7-3-extensions", - "/php_selector/#php-7-3-extensions": "/cloudlinux_os_components/#php-7-3-extensions", - "/disable_php_extensions.html/": "/cloudlinux_os_components/#disabling-php-extension-globally", - "/disable_php_extensions.html": "/cloudlinux_os_components/#disabling-php-extension-globally", - "/index.html?disable_php_extensions.html": "/cloudlinux_os_components/#disabling-php-extension-globally", - "/php_selector/#disabling-php-extension-globally": "/cloudlinux_os_components/#disabling-php-extension-globally", - "/php_selector_control_panel_integration.html/": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/php_selector_control_panel_integration.html": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/index.html?php_selector_control_panel_integration.html": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/php_selector/#control-panel-integration": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/php_selector_cpanel.html/": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/php_selector_cpanel.html": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/index.html?php_selector_cpanel.html": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/php_selector/#php-selector": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/python_and_ruby_selector/": "/cloudlinux_os_components/#python-selector", - "/python_and_ruby_selector.html/": "/cloudlinux_os_components/#python-selector", - "/python_and_ruby_selector.html": "/cloudlinux_os_components/#python-selector", - "/index.html?python_and_ruby_selector.html": "/cloudlinux_os_components/#python-selector", - "/python_selector/": "/cloudlinux_os_components/#python_selector/", - "/python_ruby_installation.html/": "/cloudlinux_os_components/#installation-2", - "/python_ruby_installation.html": "/cloudlinux_os_components/#installation-2", - "/index.html?python_ruby_installation.html": "/cloudlinux_os_components/#installation-2", - "/python_selector/#installation": "/cloudlinux_os_components/#installation-2", - "/end_user_access.html/": "/cloudlinux_os_components/#end-user-access", - "/end_user_access.html": "/cloudlinux_os_components/#end-user-access", - "/index.html?end_user_access.html": "/cloudlinux_os_components/#end-user-access", - "/python_selector/#user-interface": "/cloudlinux_os_components/#end-user-access", - "/python_ruby_command_line.html/": "/command-line_tools/#python-selector", - "/python_ruby_command_line.html": "/command-line_tools/#python-selector", - "/index.html?python_ruby_command_line.html": "/command-line_tools/#python-selector", - "/python_selector/#command-line-interface": "/command-line_tools/#python-selector", - "/hide_python_ruby_selector.html/": "/cloudlinux_os_components/#hide-ruby-selector-icon", - "/hide_python_ruby_selector.html": "/cloudlinux_os_components/#hide-ruby-selector-icon", - "/index.html?hide_python_ruby_selector.html": "/cloudlinux_os_components/#hide-ruby-selector-icon", - "/ruby_selector/#hide-ruby-selector-icons": "/cloudlinux_os_components/#hide-ruby-selector-icon", - "/trac.html/": "/cloudlinux_os_components/#deploying-trac-using-python-selector", - "/trac.html": "/cloudlinux_os_components/#deploying-trac-using-python-selector", - "/index.html?trac.html": "/cloudlinux_os_components/#deploying-trac-using-python-selector", - "/python_selector/#deploying-trac-using-python-selector": "/cloudlinux_os_components/#deploying-trac-using-python-selector", - "/trac_with_mysql.html/": "/cloudlinux_os_components/#trac-with-mysql", - "/trac_with_mysql.html": "/cloudlinux_os_components/#trac-with-mysql", - "/index.html?trac_with_mysql.html": "/cloudlinux_os_components/#trac-with-mysql", - "/python_selector/#trac-with-mysql": "/cloudlinux_os_components/#trac-with-mysql", - "/redmine.html/": "/cloudlinux_os_components/#deploying-redmine-using-ruby-selector", - "/redmine.html": "/cloudlinux_os_components/#deploying-redmine-using-ruby-selector", - "/index.html?redmine.html": "/cloudlinux_os_components/#deploying-redmine-using-ruby-selector", - "/ruby_selector/#deploying-redmine-using-ruby-selector": "/cloudlinux_os_components/#deploying-redmine-using-ruby-selector", - "/easy_apache_4.html/": "/cloudlinux_os_components/#easyapache-4", - "/easy_apache_4.html": "/cloudlinux_os_components/#easyapache-4", - "/index.html?easy_apache_4.html": "/cloudlinux_os_components/#easyapache-4", - "/python_selector/#easyapache-4": "/cloudlinux_os_components/#easyapache-4", - "/node_js_selector.html/": "/cloudlinux_os_components/#node-js-selector", - "/node_js_selector.html": "/cloudlinux_os_components/#node-js-selector", - "/index.html?node_js_selector.html": "/cloudlinux_os_components/#node-js-selector", - "/node_js_selector/": "/cloudlinux_os_components/#node-js-selector", - "/overview__requirements.html/": "/cloudlinux_os_components/#general-information-and-requirements-8", - "/overview__requirements.html": "/cloudlinux_os_components/#general-information-and-requirements-8", - "/index.html?overview__requirements.html": "/cloudlinux_os_components/#general-information-and-requirements-8", - "/node_js_selector/#overview-requirements": "/cloudlinux_os_components/#general-information-and-requirements-8", - "/installation.html/": "/cloudlinux_os_components/#installation-and-update-7", - "/installation.html": "/cloudlinux_os_components/#installation-and-update-7", - "/index.html?installation.html": "/cloudlinux_os_components/#installation-and-update-7", - "/node_js_selector/#installation": "/cloudlinux_os_components/#installation-and-update-7", - "/command_line_interface2.html/": "/command-line_tools/#node-js-selector", - "/command_line_interface2.html": "/command-line_tools/#node-js-selector", - "/index.html?command_line_interface2.html": "/command-line_tools/#node-js-selector", - "/node_js_selector/#command-line-interface": "/command-line_tools/#node-js-selector", - "/user_interface.html/": "/lve_manager/#end-user-2", - "/user_interface.html": "/lve_manager/#end-user-2", - "/index.html?user_interface.html": "/lve_manager/#end-user-2", - "/node_js_selector/#user-interface": "/lve_manager/#end-user-2", - "/node_js_deployment.html/": "/cloudlinux_os_components/#node-js-deployment", - "/node_js_deployment.html": "/cloudlinux_os_components/#node-js-deployment", - "/index.html?node_js_deployment.html": "/cloudlinux_os_components/#node-js-deployment", - "/node_js_selector/#node-js-deployment": "/cloudlinux_os_components/#node-js-deployment", - "/remote_usage_of_node_js_interp.html/": "/cloudlinux_os_components/#remote-usage-of-node-js-interpreters", - "/remote_usage_of_node_js_interp.html": "/cloudlinux_os_components/#remote-usage-of-node-js-interpreters", - "/index.html?remote_usage_of_node_js_interp.html": "/cloudlinux_os_components/#remote-usage-of-node-js-interpreters", - "/node_js_selector/#remote-usage-of-node-js-interpreters": "/cloudlinux_os_components/#remote-usage-of-node-js-interpreters", - "/remote_usage_of_the_cloudlinux.html/": "/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility", - "/remote_usage_of_the_cloudlinux.html": "/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility", - "/index.html?remote_usage_of_the_cloudlinux.html": "/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility", - "/node_js_selector/#remote-usage-of-the-cloudlinux-selector-utility": "/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility", - "/lve_manager/#inodes/": "/limits/#inodes/", - "/inodes_limits.html/": "/limits/#inodes/", - "/inodes_limits.html": "/limits/#inodes/", - "/index.html?inodes_limits.html": "/limits/#inodes/", - "/inodes_limits/": "/limits/#inodes/", - "/cl_quota.html/": "/lve_manager/#cl-quota", - "/cl_quota.html": "/lve_manager/#cl-quota", - "/index.html?cl_quota.html": "/command-line_tools/#cl-quota", - "/inodes_limits/#cl-quota": "/command-line_tools/#cl-quota", - "/cl-quota_general.html/": "/command-line_tools/#cl-quota", - "/cl-quota_general.html": "/command-line_tools/#cl-quota", - "/index.html?cl-quota_general.html": "/command-line_tools/#cl-quota", - "/inodes_limits/#general-provisions": "/limits/#inodes", - "/set_limits_and_integration.html/": "/lve_manager/#setting-limits-and-integration-with-panel-packages", - "/set_limits_and_integration.html": "/lve_manager/#setting-limits-and-integration-with-panel-packages", - "/index.html?set_limits_and_integration.html": "/lve_manager/#setting-limits-and-integration-with-panel-packages", - "/inodes_limits/#setting-limits-and-integration-with-panel-packages": "/lve_manager/#setting-limits-and-integration-with-panel-packages", - "/inheritance.html/": "/lve_manager/#limits-inheritance", - "/inheritance.html": "/lve_manager/#limits-inheritance", - "/index.html?inheritance.html": "/lve_manager/#limits-inheritance", - "/inodes_limits/#limits-inheritance": "/command-line_tools/#limits-inheritance", - "/cache_synchronize.html/": "/lve_manager/#caching-and-synchronizing-the-limits", - "/cache_synchronize.html": "/lve_manager/#caching-and-synchronizing-the-limits", - "/index.html?cache_synchronize.html": "/lve_manager/#caching-and-synchronizing-the-limits", - "/inodes_limits/#caching-and-synchronizing-the-limits": "/command-line_tools/#caching-and-synchronizing-the-limits", - "/db_file.html/": "/command-line_tools/#quotas-db-file", - "/db_file.html": "/command-line_tools/#quotas-db-file", - "/index.html?db_file.html": "/command-line_tools/#quotas-db-file", - "/inodes_limits/#quotas-db-file": "/command-line_tools/#quotas-db-file", - "/cli_examples.html/": "/lve_manager/#cli-options-examples", - "/cli_examples.html": "/lve_manager/#cli-options-examples", - "/index.html?cli_examples.html": "/lve_manager/#cli-options-examples", - "/inodes_limits/#cli-options-examples": "/command-line_tools/#cli-options-examples", - "/kernel_settings.html/": "/cloudlinux_os_kernel/", - "/kernel_settings.html": "/cloudlinux_os_kernel/", - "/index.html?kernel_settings.html": "/cloudlinux_os_kernel/", - "/kernel_settings/": "/cloudlinux_os_kernel/", - "/kernel_config_variables.html/": "/cloudlinux_os_kernel/#kernel-config-variables", - "/kernel_config_variables.html": "/cloudlinux_os_kernel/#kernel-config-variables", - "/index.html?kernel_config_variables.html": "/cloudlinux_os_kernel/#kernel-config-variables", - "/kernel_settings/#kernel-config-variables": "/cloudlinux_os_kernel/#kernel-config-variables", - "/virtualized_proc_filesystem.html/": "/cloudlinux_os_kernel/#virtualized-proc-filesystem", - "/virtualized_proc_filesystem.html": "/cloudlinux_os_kernel/#virtualized-proc-filesystem", - "/index.html?virtualized_proc_filesystem.html": "/cloudlinux_os_kernel/#virtualized-proc-filesystem", - "/kernel_settings/#virtualized-proc-filesystem": "/cloudlinux_os_kernel/#virtualized-proc-filesystem", - "/securelinks.html/": "/cloudlinux_os_kernel/#securelinks", - "/securelinks.html": "/cloudlinux_os_kernel/#securelinks", - "/index.html?securelinks.html": "/cloudlinux_os_kernel/#securelinks", - "/kernel_settings/#securelinks": "/cloudlinux_os_kernel/#securelinks", - "/symlink_owner_match_protection.html/": "/cloudlinux_os_kernel/#symlink-owner-match-protection", - "/symlink_owner_match_protection.html": "/cloudlinux_os_kernel/#symlink-owner-match-protection", - "/index.html?symlink_owner_match_protection.html": "/cloudlinux_os_kernel/#symlink-owner-match-protection", - "/kernel_settings/#symlink-owner-match-protection": "/cloudlinux_os_kernel/#symlink-owner-match-protection", - "/link_traversal_protection.html/": "/cloudlinux_os_kernel/#link-traversal-protection", - "/link_traversal_protection.html": "/cloudlinux_os_kernel/#link-traversal-protection", - "/index.html?link_traversal_protection.html": "/cloudlinux_os_kernel/#link-traversal-protection", - "/kernel_settings/#link-traversal-protection": "/cloudlinux_os_kernel/#link-traversal-protection", - "/ptrace_block.html/": "/cloudlinux_os_kernel/#ptrace-block", - "/ptrace_block.html": "/cloudlinux_os_kernel/#ptrace-block", - "/index.html?ptrace_block.html": "/cloudlinux_os_kernel/#ptrace-block", - "/kernel_settings/#ptrace-block": "/cloudlinux_os_kernel/#ptrace-block", - "/xen_xvda_detection.html/": "/cloudlinux_os_kernel/#xen-xvda", - "/xen_xvda_detection.html": "/cloudlinux_os_kernel/#xen-xvda", - "/index.html?xen_xvda_detection.html": "/cloudlinux_os_kernel/#xen-xvda", - "/kernel_settings/#xen-xvda": "/cloudlinux_os_kernel/#xen-xvda", - "/tpe_extension.html/": "/deprecated/#tpe-extension", - "/tpe_extension.html": "/deprecated/#tpe-extension", - "/index.html?tpe_extension.html": "/deprecated/#tpe-extension", - "/kernel_settings/#tpe-extension-deprecated": "/deprecated/#tpe-extension", - "/iolimits_latency.html/": "/cloudlinux_os_kernel/#io-limits-latency", - "/iolimits_latency.html": "/cloudlinux_os_kernel/#io-limits-latency", - "/index.html?iolimits_latency.html": "/cloudlinux_os_kernel/#io-limits-latency", - "/kernel_settings/#io": "/cloudlinux_os_kernel/#io-limits-latency", - "/hybrid_kernel.html/": "/cloudlinux_os_kernel/#hybrid-kernels", - "/hybrid_kernel.html": "/cloudlinux_os_kernel/#hybrid-kernels", - "/index.html?hybrid_kernel.html": "/cloudlinux_os_kernel/#hybrid-kernels", - "/kernel_settings/#hybrid-kernel": "/cloudlinux_os_kernel/#hybrid-kernels", - "/reading_lve_usage.html/": "/cloudlinux_os_kernel/#reading-lve-usage", - "/reading_lve_usage.html": "/cloudlinux_os_kernel/#reading-lve-usage", - "/index.html?reading_lve_usage.html": "/cloudlinux_os_kernel/#reading-lve-usage", - "/kernel_settings/#reading": "/cloudlinux_os_kernel/#reading-lve-usage", - "/flashcache.html/": "/cloudlinux_os_kernel/#flashcache", - "/flashcache.html": "/cloudlinux_os_kernel/#flashcache", - "/index.html?flashcache.html": "/cloudlinux_os_kernel/#flashcache", - "/kernel_settings/#flashcache": "/cloudlinux_os_kernel/#flashcache", - "/oom_killer_for_lve_processes.html/": "/cloudlinux_os_kernel/#oom-killer-for-lve-processes", - "/oom_killer_for_lve_processes.html": "/cloudlinux_os_kernel/#oom-killer-for-lve-processes", - "/index.html?oom_killer_for_lve_processes.html": "/cloudlinux_os_kernel/#oom-killer-for-lve-processes", - "/kernel_settings/#oom-killer": "/cloudlinux_os_kernel/#oom-killer-for-lve-processes", - "/file_system_quotas.html/": "/cloudlinux_os_kernel/#file-system-quotas", - "/file_system_quotas.html": "/cloudlinux_os_kernel/#file-system-quotas", - "/index.html?file_system_quotas.html": "/cloudlinux_os_kernel/#file-system-quotas", - "/kernel_settings/#file-system-quotas": "/cloudlinux_os_kernel/#file-system-quotas", - "/apache_mod_lsapi.html/": "/cloudlinux_os_components/#apache-mod-lsapi-pro", - "/apache_mod_lsapi.html": "/cloudlinux_os_components/#apache-mod-lsapi-pro", - "/index.html?apache_mod_lsapi.html": "/cloudlinux_os_components/#apache-mod-lsapi-pro", - "/apache_mod_lsapi/": "/cloudlinux_os_components/#apache-mod-lsapi-pro/", - "/configuration-references.html/": "/cloudlinux_os_components/#configuration-5", - "/configuration-references.html": "/cloudlinux_os_components/#configuration-5", - "/index.html?configuration-references.html": "/cloudlinux_os_components/#configuration-5", - "/apache_mod_lsapi/#configuration-references": "/cloudlinux_os_components/#configuration-5", - "/mod_lsapi_installation.html/": "/cloudlinux_os_components/#installation-3", - "/mod_lsapi_installation.html": "/cloudlinux_os_components/#installation-3", - "/index.html?mod_lsapi_installation.html": "/cloudlinux_os_components/#installation-3", - "/apache_mod_lsapi/#installation": "/cloudlinux_os_components/#installation-3", - "/cpanel2.html/": "/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4", - "/cpanel2.html": "/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4", - "/index.html?cpanel2.html": "/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4", - "/apache_mod_lsapi/#cpanel": "/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4", - "/plesk2.html/": "/cloudlinux_os_components/#installing-on-plesk-servers", - "/plesk2.html": "/cloudlinux_os_components/#installing-on-plesk-servers", - "/index.html?plesk2.html": "/cloudlinux_os_components/#installing-on-plesk-servers", - "/apache_mod_lsapi/#plesk": "/cloudlinux_os_components/#installing-on-plesk-servers", - "/directadmin.html/": "/cloudlinux_os_components/#installing-on-directadmin-servers", - "/directadmin.html": "/cloudlinux_os_components/#installing-on-directadmin-servers", - "/index.html?directadmin.html": "/cloudlinux_os_components/#installing-on-directadmin-servers", - "/apache_mod_lsapi/#directadmin": "/cloudlinux_os_components/#installing-on-directadmin-servers", - "/no-control-panel.html/": "/cloudlinux_os_components/#installing-on-servers-with-no-control-panel", - "/no-control-panel.html": "/cloudlinux_os_components/#installing-on-servers-with-no-control-panel", - "/index.html?no-control-panel.html": "/cloudlinux_os_components/#installing-on-servers-with-no-control-panel", - "/apache_mod_lsapi/#no-control-panel": "/cloudlinux_os_components/#installing-on-servers-with-no-control-panel", - "/uninstall_mod_lsapi.html/": "/cloudlinux_os_components/#uninstalling-4", - "/uninstall_mod_lsapi.html": "/cloudlinux_os_components/#uninstalling-4", - "/index.html?uninstall_mod_lsapi.html": "/cloudlinux_os_components/#uninstalling-4", - "/apache_mod_lsapi/#uninstall": "/cloudlinux_os_components/#uninstalling-4", - "/cpanel3.html/": "/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4", - "/cpanel3.html": "/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4", - "/index.html?cpanel3.html": "/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4", - "/apache_mod_lsapi/#cpanel": "/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4", - "/plesk3.html/": "/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers", - "/plesk3.html": "/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers", - "/index.html?plesk3.html": "/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers", - "/apache_mod_lsapi/#plesk": "/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers", - "/directadmin2.html/": "/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers", - "/directadmin2.html": "/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers", - "/index.html?directadmin2.html": "/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers", - "/apache_mod_lsapi/#directadmin": "/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers", - "/no-control-panel2.html/": "/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel", - "/no-control-panel2.html": "/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel", - "/index.html?no-control-panel2.html": "/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel", - "/apache_mod_lsapi/#no-control-panel": "/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel", - "/switch_mod_lsapi-tool.html/": "/command-line_tools/#apache-mod-lsapi-pro", - "/switch_mod_lsapi-tool.html": "/command-line_tools/#apache-mod-lsapi-pro", - "/index.html?switch_mod_lsapi-tool.html": "/command-line_tools/#apache-mod-lsapi-pro", - "/apache_mod_lsapi/#switch-mod-lsapi-tool": "/command-line_tools/#apache-mod-lsapi-pro", - "/mod_lsapi_troubleshooting.html/": "/cloudlinux_os_components/#troubleshooting-4", - "/mod_lsapi_troubleshooting.html": "/cloudlinux_os_components/#troubleshooting-4", - "/index.html?mod_lsapi_troubleshooting.html": "/cloudlinux_os_components/#troubleshooting-4", - "/apache_mod_lsapi/#troubleshooting": "/cloudlinux_os_components/#troubleshooting-4", - "/mod_lsapi_faq.html/": "https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ", - "/mod_lsapi_faq.html": "https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ", - "/index.html?mod_lsapi_faq.html": "https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ", - "/apache_mod_lsapi/#faq-on-mod-lsapi": "https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ", - "/criu_support.html/": "/cloudlinux_os_components/#criu-support", - "/criu_support.html": "/cloudlinux_os_components/#criu-support", - "/index.html?criu_support.html": "/cloudlinux_os_components/#criu-support", - "/apache_mod_lsapi/#criu-support": "/cloudlinux_os_components/#criu-support", - "/cloudlinux-fchange.html/": "/cloudlinux_os_kernel/#file-change-api/", - "/cloudlinux-fchange.html": "/cloudlinux_os_kernel/#file-change-api/", - "/index.html?cloudlinux-fchange.html": "/cloudlinux_os_kernel/#file-change-api/", - "/cloudlinux-fchange/": "/cloudlinux_os_kernel/#file-change-api/", - "/general.html/": "/cloudlinux_os_kernel/#general", - "/general.html": "/cloudlinux_os_kernel/#general", - "/index.html?general.html": "/cloudlinux_os_kernel/#general", - "/cloudlinux-fchange/#general": "/cloudlinux_os_kernel/#general", - "/usage_and_integration.html/": "/cloudlinux_os_kernel/#usage-and-integration", - "/usage_and_integration.html": "/cloudlinux_os_kernel/#usage-and-integration", - "/index.html?usage_and_integration.html": "/cloudlinux_os_kernel/#usage-and-integration", - "/cloudlinux-fchange/#usage-and-integration": "/cloudlinux_os_kernel/#usage-and-integration", - "/installation_and_configuration.html/": "/cloudlinux_os_kernel/#installation-and-configuration", - "/installation_and_configuration.html": "/cloudlinux_os_kernel/#installation-and-configuration", - "/index.html?installation_and_configuration.html": "/cloudlinux_os_kernel/#installation-and-configuration", - "/cloudlinux-fchange/#installation-and-configuration": "/cloudlinux_os_kernel/#installation-and-configuration", - "/configuration_details.html/": "/cloudlinux_os_kernel/#configuration-details", - "/configuration_details.html": "/cloudlinux_os_kernel/#configuration-details", - "/index.html?configuration_details.html": "/cloudlinux_os_kernel/#configuration-details", - "/cloudlinux-fchange/#configuration-details": "/cloudlinux_os_kernel/#configuration-details", - "/low-level_access.html/": "/cloudlinux_os_kernel/#low-level-access", - "/low-level_access.html": "/cloudlinux_os_kernel/#low-level-access", - "/index.html?low-level_access.html": "/cloudlinux_os_kernel/#low-level-access", - "/cloudlinux-fchange/#low-level-access": "/cloudlinux_os_kernel/#low-level-access", - "/mod_proctitle.html/": "/cloudlinux_os_components/#mod-proctitle", - "/mod_proctitle.html": "/cloudlinux_os_components/#mod-proctitle", - "/index.html?mod_proctitle.html": "/cloudlinux_os_components/#mod-proctitle", - "/mod_proctitle/": "/cloudlinux_os_components/#mod-proctitle", - "/mod_proctitle_info.html/": "/cloudlinux_os_components/#how-to-read-mod-proctitle-information", - "/mod_proctitle_info.html": "/cloudlinux_os_components/#how-to-read-mod-proctitle-information", - "/index.html?mod_proctitle_info.html": "/cloudlinux_os_components/#how-to-read-mod-proctitle-information", - "/mod_proctitle/#how-to-read": "/cloudlinux_os_components/#how-to-read-mod-proctitle-information", - "/tuning_parameters.html/": "/cloudlinux_os_components/#tuning-parameters", - "/tuning_parameters.html": "/cloudlinux_os_components/#tuning-parameters", - "/index.html?tuning_parameters.html": "/cloudlinux_os_components/#tuning-parameters", - "/mod_proctitle/#tuning-parameters": "/cloudlinux_os_components/#tuning-parameters", - "/additional_packages.html/": "/cloudlinux_os_components/#additional-integration-components", - "/additional_packages.html": "/cloudlinux_os_components/#additional-integration-components", - "/index.html?additional_packages.html": "/cloudlinux_os_components/#additional-integration-components", - "/additional_packages/": "/cloudlinux_os_components/#additional-integration-components", - "/alt-suexec.html/": "/cloudlinux_os_components/#alt-suexec", - "/alt-suexec.html": "/cloudlinux_os_components/#alt-suexec", - "/index.html?alt-suexec.html": "/cloudlinux_os_components/#alt-suexec", - "/additional_packages/#alt-suexec": "/cloudlinux_os_components/#alt-suexec", - "/tuned-profiles-cloudlinux.html/": "/cloudlinux_os_kernel/#tuned-profiles-cloudlinux", - "/tuned-profiles-cloudlinux.html": "/cloudlinux_os_kernel/#tuned-profiles-cloudlinux", - "/index.html?tuned-profiles-cloudlinux.html": "/cloudlinux_os_kernel/#tuned-profiles-cloudlinux", - "/additional_packages/#tuned-profiles-cloudlinux": "/cloudlinux_os_kernel/#tuned-profiles-cloudlinux", - "/integration_guide.html/": "/lve_manager/#control-panel-integration-guide/", - "/integration_guide.html": "/lve_manager/#control-panel-integration-guide/", - "/index.html?integration_guide.html": "/lve_manager/#control-panel-integration-guide/", - "/integration_guide/": "/lve_manager/#control-panel-integration-guide/", - "/detecting.html/": "/lve_manager/#detecting-and-working-with-cloudlinux", - "/detecting.html": "/lve_manager/#detecting-and-working-with-cloudlinux", - "/index.html?detecting.html": "/lve_manager/#detecting-and-working-with-cloudlinux", - "/integration_guide/#detecting-and-working-with-cloudlinux": "/lve_manager/#detecting-and-working-with-cloudlinux", - "/cpu_memory_iolimits.html/": "/lve_manager/#displaying-cpu-memory-io-limits", - "/cpu_memory_iolimits.html": "/lve_manager/#displaying-cpu-memory-io-limits", - "/index.html?cpu_memory_iolimits.html": "/lve_manager/#displaying-cpu-memory-io-limits", - "/integration_guide/#displaying-cpu-memory-io-limits": "/lve_manager/#displaying-cpu-memory-io-limits", - "/lve_limits_with_packages.html/": "/lve_manager/#package-integration", - "/lve_limits_with_packages.html": "/lve_manager/#package-integration", - "/index.html?lve_limits_with_packages.html": "/lve_manager/#package-integration", - "/integration_guide/#integrating-lve-limits-with-packages": "/lve_manager/#package-integration", - "/partner_portal.html/": "/for_cloudlinux_partners/", - "/partner_portal.html": "/for_cloudlinux_partners/", - "/index.html?partner_portal.html": "/for_cloudlinux_partners/", - "/partner_portal/": "/for_cloudlinux_partners/", - "/cloudlinux_network.html/": "/for_cloudlinux_partners/#license-portal-cln", - "/cloudlinux_network.html": "/for_cloudlinux_partners/#license-portal-cln", - "/index.html?cloudlinux_network.html": "/for_cloudlinux_partners/#license-portal-cln", - "/cloudlinux_network/": "/for_cloudlinux_partners/#license-portal-cln", - "/cloudlinux_whmcs_plugin.html/": "/for_cloudlinux_partners/#cloudlinux-whmcs-plugin/", - "/cloudlinux_whmcs_plugin.html": "/for_cloudlinux_partners/#cloudlinux-whmcs-plugin/", - "/index.html?cloudlinux_whmcs_plugin.html": "/for_cloudlinux_partners/#cloudlinux-whmcs-plugin/", - "/cloudlinux_whmcs_plugin/": "/for_cloudlinux_partners/#cloudlinux-whmcs-plugin/", - "/overview.html/": "/for_cloudlinux_partners/#overview", - "/overview.html": "/for_cloudlinux_partners/#overview", - "/index.html?overview.html": "/for_cloudlinux_partners/#overview", - "/cloudlinux_whmcs_plugin/#overview": "/for_cloudlinux_partners/#overview", - "/installation_configuration.html/": "/for_cloudlinux_partners/#installation-configuration", - "/installation_configuration.html": "/for_cloudlinux_partners/#installation-configuration", - "/index.html?installation_configuration.html": "/for_cloudlinux_partners/#installation-configuration", - "/cloudlinux_whmcs_plugin/#installation-configuration": "/for_cloudlinux_partners/#installation-configuration", - "/installation_and_update.html/": "/for_cloudlinux_partners/#installation-and-update", - "/installation_and_update.html": "/for_cloudlinux_partners/#installation-and-update", - "/index.html?installation_and_update.html": "/for_cloudlinux_partners/#installation-and-update", - "/cloudlinux_whmcs_plugin/#installation-and-update": "/for_cloudlinux_partners/#installation-and-update", - "/configuration_of_product.html/": "/for_cloudlinux_partners/#configuration-of-product", - "/configuration_of_product.html": "/for_cloudlinux_partners/#configuration-of-product", - "/index.html?configuration_of_product.html": "/for_cloudlinux_partners/#configuration-of-product", - "/cloudlinux_whmcs_plugin/#configuration-of-product": "/for_cloudlinux_partners/#configuration-of-product", - "/configuration_of_addon.html/": "/for_cloudlinux_partners/#configuration-of-add-on", - "/configuration_of_addon.html": "/for_cloudlinux_partners/#configuration-of-add-on", - "/index.html?configuration_of_addon.html": "/for_cloudlinux_partners/#configuration-of-add-on", - "/cloudlinux_whmcs_plugin/#configuration-of-add-on": "/for_cloudlinux_partners/#configuration-of-add-on", - "/management.html/": "/for_cloudlinux_partners/#management", - "/management.html": "/for_cloudlinux_partners/#management", - "/index.html?management.html": "/for_cloudlinux_partners/#management", - "/cloudlinux_whmcs_plugin/#management": "/for_cloudlinux_partners/#management", - "/link_via_add-on_optional_lice.html/": "/for_cloudlinux_partners/#link-via-add-on-optional-license", - "/link_via_add-on_optional_lice.html": "/for_cloudlinux_partners/#link-via-add-on-optional-license", - "/index.html?link_via_add-on_optional_lice.html": "/for_cloudlinux_partners/#link-via-add-on-optional-license", - "/cloudlinux_whmcs_plugin/#link-via-add-on-optional-license": "/for_cloudlinux_partners/#link-via-add-on-optional-license", - "/link_products_directly.html/": "/for_cloudlinux_partners/#link-products-directly", - "/link_products_directly.html": "/for_cloudlinux_partners/#link-products-directly", - "/index.html?link_products_directly.html": "/for_cloudlinux_partners/#link-products-directly", - "/cloudlinux_whmcs_plugin/#link-products-directly": "/for_cloudlinux_partners/#link-products-directly", - "/link_via_configurable_options.html/": "/for_cloudlinux_partners/#link-via-configurable-options", - "/link_via_configurable_options.html": "/for_cloudlinux_partners/#link-via-configurable-options", - "/index.html?link_via_configurable_options.html": "/for_cloudlinux_partners/#link-via-configurable-options", - "/cloudlinux_whmcs_plugin/#link-via-configurable-options": "/for_cloudlinux_partners/#link-via-configurable-options", - "/link_add-ons_directly.html/": "/for_cloudlinux_partners/#link-add-ons-directly", - "/link_add-ons_directly.html": "/for_cloudlinux_partners/#link-add-ons-directly", - "/index.html?link_add-ons_directly.html": "/for_cloudlinux_partners/#link-add-ons-directly", - "/cloudlinux_whmcs_plugin/#link-add-ons-directly": "/for_cloudlinux_partners/#link-add-ons-directly", - "/order.html/": "/for_cloudlinux_partners/#order", - "/order.html": "/for_cloudlinux_partners/#order", - "/index.html?order.html": "/for_cloudlinux_partners/#order", - "/cloudlinux_whmcs_plugin/#order": "/for_cloudlinux_partners/#order", - "/admin_area.html/": "/for_cloudlinux_partners/#admin-area", - "/admin_area.html": "/for_cloudlinux_partners/#admin-area", - "/index.html?admin_area.html": "/for_cloudlinux_partners/#admin-area", - "/cloudlinux_whmcs_plugin/#admin-area": "/for_cloudlinux_partners/#admin-area", - "/client_area.html/": "/for_cloudlinux_partners/#client-area", - "/client_area.html": "/for_cloudlinux_partners/#client-area", - "/index.html?client_area.html": "/for_cloudlinux_partners/#client-area", - "/cloudlinux_whmcs_plugin/#client-area": "/for_cloudlinux_partners/#client-area", - "/licenses_list.html/": "/for_cloudlinux_partners/#licenses-list", - "/licenses_list.html": "/for_cloudlinux_partners/#licenses-list", - "/index.html?licenses_list.html": "/for_cloudlinux_partners/#licenses-list", - "/cloudlinux_whmcs_plugin/#licenses-list": "/for_cloudlinux_partners/#licenses-list", - "/addon_licenses_list.html/": "/for_cloudlinux_partners/#add-on-licenses-list", - "/addon_licenses_list.html": "/for_cloudlinux_partners/#add-on-licenses-list", - "/index.html?addon_licenses_list.html": "/for_cloudlinux_partners/#add-on-licenses-list", - "/cloudlinux_whmcs_plugin/#add-on-licenses-list": "/for_cloudlinux_partners/#add-on-licenses-list", - "/common_problems.html/": "/for_cloudlinux_partners/#common-problems", - "/common_problems.html": "/for_cloudlinux_partners/#common-problems", - "/index.html?common_problems.html": "/for_cloudlinux_partners/#common-problems", - "/cloudlinux_whmcs_plugin/#common-problems": "/for_cloudlinux_partners/#common-problems", - "/deprecated.html/": "/deprecated/", - "/deprecated.html": "/deprecated/", - "/index.html?deprecated.html": "/deprecated/", - "/deprecated/": "/deprecated/", - "/git_for_cpanel.html/": "/deprecated/#git-for-cpanel", - "/git_for_cpanel.html": "/deprecated/#git-for-cpanel", - "/index.html?git_for_cpanel.html": "/deprecated/#git-for-cpanel", - "/deprecated/#git-for-cpanel": "/deprecated/#git-for-cpanel", - "/lve_stats_old.html/": "/deprecated/#lve-stats-0-x", - "/lve_stats_old.html": "/deprecated/#lve-stats-0-x", - "/index.html?lve_stats_old.html": "/deprecated/#lve-stats-0-x", - "/deprecated/#lve-stats-0-x": "/deprecated/#lve-stats-0-x", - "/storing_statistics_in_mysql.html/": "/deprecated/#storing-statistics-in-mysql", - "/storing_statistics_in_mysql.html": "/deprecated/#storing-statistics-in-mysql", - "/index.html?storing_statistics_in_mysql.html": "/deprecated/#storing-statistics-in-mysql", - "/deprecated/#storing-statistics-in-mysql": "/deprecated/#storing-statistics-in-mysql", - "/storing_statistics_in_postgres.html/": "/deprecated/#storing-statistics-in-postgresql", - "/storing_statistics_in_postgres.html": "/deprecated/#storing-statistics-in-postgresql", - "/index.html?storing_statistics_in_postgres.html": "/deprecated/#storing-statistics-in-postgresql", - "/deprecated/#storing-statistics-in-postgresql": "/deprecated/#storing-statistics-in-postgresql", - "/compacting_in_multi-server.html/": "/deprecated/#compacting-in-multi-server-settings", - "/compacting_in_multi-server.html": "/deprecated/#compacting-in-multi-server-settings", - "/index.html?compacting_in_multi-server.html": "/deprecated/#compacting-in-multi-server-settings", - "/deprecated/#compacting-in-multi-server-settings": "/deprecated/#compacting-in-multi-server-settings", - "/optimumcache.html/": "/deprecated/#optimumcache", - "/optimumcache.html": "/deprecated/#optimumcache", - "/index.html?optimumcache.html": "/deprecated/#optimumcache", - "/deprecated/#optimumcache": "/deprecated/#optimumcache", - "/optimumcache_installation.html/": "/deprecated/#installation", - "/optimumcache_installation.html": "/deprecated/#installation", - "/index.html?optimumcache_installation.html": "/deprecated/#installation", - "/deprecated/#installation": "/deprecated/#installation", - "/optimumcache_without_ploop.html/": "/deprecated/#using-without-ploop", - "/optimumcache_without_ploop.html": "/deprecated/#using-without-ploop", - "/index.html?optimumcache_without_ploop.html": "/deprecated/#using-without-ploop", - "/deprecated/#using-without-ploop": "/deprecated/#using-without-ploop", - "/marking_directories.html/": "/deprecated/#marking-directories", - "/marking_directories.html": "/deprecated/#marking-directories", - "/index.html?marking_directories.html": "/deprecated/#marking-directories", - "/deprecated/#marking-directories": "/deprecated/#marking-directories", - "/configuration_file.html/": "/deprecated/#optimumcache-configuration-file", - "/configuration_file.html": "/deprecated/#optimumcache-configuration-file", - "/index.html?configuration_file.html": "/deprecated/#optimumcache-configuration-file", - "/deprecated/#optimumcache-configuration-file": "/deprecated/#optimumcache-configuration-file", - "/command_line_interface.html/": "/deprecated/#command-line-interface", - "/command_line_interface.html": "/deprecated/#command-line-interface", - "/index.html?command_line_interface.html": "/deprecated/#command-line-interface", - "/deprecated/#": "/deprecated/#command-line-interface", - "/cloudlinux_collect.html/": "/deprecated/#cloudlinux-collect-collect-system-load-statistics", - "/cloudlinux_collect.html": "/deprecated/#cloudlinux-collect-collect-system-load-statistics", - "/index.html?cloudlinux_collect.html": "/deprecated/#cloudlinux-collect-collect-system-load-statistics", - "/deprecated/#cloudlinux-collect-collect-system-load-statistics": "/deprecated/#cloudlinux-collect-collect-system-load-statistics", - "/uninstall_optimumcache.html/": "/deprecated/#uninstall-optimumcache", - "/uninstall_optimumcache.html": "/deprecated/#uninstall-optimumcache", - "/index.html?uninstall_optimumcache.html": "/deprecated/#uninstall-optimumcache", - "/deprecated/#uninstall-optimumcache": "/deprecated/#uninstall-optimumcache", - "/optimumcache_troubleshooting.html/": "/deprecated/#troubleshooting", - "/optimumcache_troubleshooting.html": "/deprecated/#troubleshooting", - "/index.html?optimumcache_troubleshooting.html": "/deprecated/#troubleshooting", - "/deprecated/#troubleshooting": "/deprecated/#troubleshooting", - "/hardware_compatibility.html/": "/cloudlinux_installation/#hardware-compatibility", - "/hardware_compatibility.html": "/cloudlinux_installation/#hardware-compatibility", - "/index.html?hardware_compatibility.html": "/cloudlinux_installation/#hardware-compatibility", - "/hardware_compatibility/": "/cloudlinux_installation/#hardware-compatibility", - "/cloudlinux_life-cycle.html/": "/introduction/#cloudlinux-os-lifecycle", - "/cloudlinux_life-cycle.html": "/introduction/#cloudlinux-os-lifecycle", - "/index.html?cloudlinux_life-cycle.html": "/introduction/#cloudlinux-os-lifecycle", - "/cloudlinux_life-cycle/": "/introduction/#cloudlinux-os-lifecycle", - "/downloading_documentation.html/": "/introduction/", - "/downloading_documentation.html": "/introduction/", - "/index.html?downloading_documentation.html": "/introduction/", - "/downloading_documentation/": "/introduction/", - "/lve-limits-validation.html/": "/limits/#limits-validation", - "/lve-limits-validation.html": "/limits/#limits-validation", - "/index.html?lve-limits-validation.html": "/limits/#limits-validation", - "/limits/#lve-limits-validation": "/limits/#limits-validation", - "/cldiag.html/": "/command-line_tools/#cldiag", - "/cldiag.html": "/command-line_tools/#cldiag", - "/index.html?cldiag.html": "/command-line_tools/#cldiag", - "/command-line_tools/#cldiag": "/command-line_tools/#cldiag", - "/cldiag.html#diag-cp": "/command-line_tools/#cldiag", - "/cldiag.html#diag-cp": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#diag-cp": "/command-line_tools/#cldiag", - "/command-line_tools/#diag-cp": "/command-line_tools/#cldiag", - "/cldiag.html#check-symlinkowngid": "/command-line_tools/#cldiag", - "/cldiag.html#check-symlinkowngid": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#check-symlinkowngid": "/command-line_tools/#cldiag", - "/command-line_tools/#check-symlinkowngid": "/command-line_tools/#cldiag", - "/cldiag.html#symlinksifowner": "/command-line_tools/#cldiag", - "/cldiag.html#symlinksifowner": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#symlinksifowner": "/command-line_tools/#cldiag", - "/command-line_tools/#symlinksifowner": "/command-line_tools/#cldiag", - "/cldiag.html#check-suexec": "/command-line_tools/#cldiag", - "/cldiag.html#check-suexec": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#check-suexec": "/command-line_tools/#cldiag", - "/command-line_tools/#check-suexec": "/command-line_tools/#cldiag", - "/cldiag.html#check-suphp": "/command-line_tools/#cldiag", - "/cldiag.html#check-suphp": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#check-suphp": "/command-line_tools/#cldiag", - "/command-line_tools/#check-suphp": "/command-line_tools/#cldiag", - "/cldiag.html#check-usepam": "/command-line_tools/#cldiag", - "/cldiag.html#check-usepam": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#check-usepam": "/command-line_tools/#cldiag", - "/command-line_tools/#check-usepam": "/command-line_tools/#cldiag", - "/cldiag.html#check-defaults-cfg": "/command-line_tools/#cldiag", - "/cldiag.html#check-defaults-cfg": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#check-defaults-cfg": "/command-line_tools/#cldiag", - "/command-line_tools/#check-defaults-cfg": "/command-line_tools/#cldiag", - "/cldiag.html#check-cagefs": "/command-line_tools/#cldiag", - "/cldiag.html#check-cagefs": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#check-cagefs": "/command-line_tools/#cldiag", - "/command-line_tools/#check-cagefs": "/command-line_tools/#cldiag", - "/cldiag.html#check-phpselector": "/command-line_tools/#cldiag", - "/cldiag.html#check-phpselector": "/command-line_tools/#cldiag", - "/index.html?cldiag.html#check-phpselector": "/command-line_tools/#cldiag", - "/command-line_tools/#check-phpselector": "/command-line_tools/#cldiag", - "/lvectl.html": "/command-line_tools/#lvectl", - "/lvectl.html/": "/command-line_tools/#lvectl", - "/index.html?lvectl.html": "/command-line_tools/#lvectl", - "/command-line_tools/#lvectl": "/command-line_tools/#lvectl", - "/lveps.html": "/command-line_tools/#lveps", - "/lveps.html/": "/command-line_tools/#lveps", - "/index.html?lveps.html": "/command-line_tools/#lveps", - "/command-line_tools/#lveps": "/command-line_tools/#lveps", - "/lvetop.html": "/command-line_tools/#lvetop", - "/lvetop.html/": "/command-line_tools/#lvetop", - "/index.html?lvetop.html": "/command-line_tools/#lvetop", - "/command-line_tools/#lvetop": "/command-line_tools/#lvetop", - "/cldetect.html": "/command-line_tools/#cldetect", - "/cldetect.html/": "/command-line_tools/#cldetect", - "/index.html?cldetect.html": "/command-line_tools/#cldetect", - "/command-line_tools/#cldetect": "/command-line_tools/#cldetect", - "/python_and_ruby_selector/#python-and-ruby-selector": "/cloudlinux_os_components/#python-selector", - "/python_selector/#python-selector": "/cloudlinux_os_components/#python-selector", - "/ru/selectorctl.html": "/ru/command-line_tools/#selectorctl", - "/ru/file_system_quotas.html": "/ru/cloudlinux_os_kernel/#file-system-quotas", - "/kernel_settings/#remounting-procfs-with-hidepid-option": "/cloudlinux_os_kernel/#remounting-procfs-with-hidepid-option", - "/python_selector/#overview-and-requirements": "/cloudlinux_os_components/#general-information-and-requirements-6", - "/php_selector/#php-selector-integration-with-cpanel’s-multiphp-manager": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/php_selector/#php-selector-integration-with-cpanel%E2%80%99s-multiphp-manager": "/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/cloudlinux_installation.html/": "/ru/cloudlinux_installation/", - "/ru/cloudlinux_installation.html": "/ru/cloudlinux_installation/", - "/ru/index.html?cloudlinux_installation.html": "/ru/cloudlinux_installation/", - "/ru/converting_existing_servers.html/": "/ru/cloudlinux_installation/#converting-existing-servers", - "/ru/converting_existing_servers.html": "/ru/cloudlinux_installation/#converting-existing-servers", - "/ru/index.html?converting_existing_servers.html": "/ru/cloudlinux_installation/#converting-existing-servers", - "/ru/advanced_options_for_cldeploy.html/": "/ru/command-line_tools/#cldeploy", - "/ru/advanced_options_for_cldeploy.html": "/ru/command-line_tools/#cldeploy", - "/ru/index.html?advanced_options_for_cldeploy.html": "/ru/command-line_tools/#cldeploy", - "/cloudlinux_installation/#advanced-options-for-cldeploy": "/ru/command-line_tools/#cldeploy", - "/ru/changes.html/": "/cloudlinux_installation/#explanation-of-changes", - "/ru/changes.html": "/ru/cloudlinux_installation/#explanation-of-changes", - "/ru/index.html?changes.html": "/ru/cloudlinux_installation/#explanation-of-changes", - "/ru/installing_new_servers.html/": "/ru/cloudlinux_installation/#installing-new-servers", - "/ru/installing_new_servers.html": "/ru/cloudlinux_installation/#installing-new-servers", - "/ru/index.html?installing_new_servers.html": "/ru/cloudlinux_installation/#installing-new-servers", - "/ru/cloudlinux_os_images.html/": "/ru/cloudlinux_installation/#cloudlinux-os-images", - "/ru/cloudlinux_os_images.html": "/ru/cloudlinux_installation/#cloudlinux-os-images", - "/ru/index.html?cloudlinux_os_images.html": "/ru/cloudlinux_installation/#cloudlinux-os-images", - "/ru/xen_images.html/": "/ru/cloudlinux_installation/#installing-new-servers", - "/ru/xen_images.html": "/ru/cloudlinux_installation/#installing-new-servers", - "/ru/index.html?xen_images.html": "/ru/cloudlinux_installation/#installing-new-servers", - "/ru/net_install.html/": "/ru/cloudlinux_installation/#net-install", - "/ru/net_install.html": "/ru/cloudlinux_installation/#net-install", - "/ru/index.html?net_install.html": "/ru/cloudlinux_installation/#net-install", - "/ru/h-sphere_server.html/": "/ru/cloudlinux_installation/#h-sphere", - "/ru/h-sphere_server.html": "/ru/cloudlinux_installation/#h-sphere", - "/ru/index.html?h-sphere_server.html": "/ru/cloudlinux_installation/#h-sphere", - "/ru/cloudlinux_installation/#installing-on-h-sphere-server":"/ru/cloudlinux_installation/#h-sphere", - "/ru/mod_fastcgi_to_mod_fcgid.html/": "/ru/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid", - "/ru/mod_fastcgi_to_mod_fcgid.html": "/ru/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid", - "/ru/index.html?mod_fastcgi_to_mod_fcgid.html": "/ru/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid", - "/ru/virtuozzo_and_openvz.html/": "/ru/cloudlinux_installation/#virtuozzo-and-openvz", - "/ru/virtuozzo_and_openvz.html": "/ru/cloudlinux_installation/#virtuozzo-and-openvz", - "/ru/index.html?virtuozzo_and_openvz.html": "/ru/cloudlinux_installation/#virtuozzo-and-openvz", - "/ru/trial_license.html/": "/ru/cloudlinux_installation/#getting-trial-license", - "/ru/trial_license.html": "/ru/cloudlinux_installation/#getting-trial-license", - "/ru/index.html?trial_license.html": "/ru/cloudlinux_installation/#getting-trial-license", - "/ru/registering.html/": "/ru/cloudlinux_installation/#license-activation", - "/ru/registering.html": "/ru/cloudlinux_installation/#license-activation", - "/ru/index.html?registering.html": "/ru/cloudlinux_installation/#registering-cloudlinux-server", - "/ru/cloudlinux_installation/#registering-cloudlinux-server": "/ru/cloudlinux_installation/#license-activation", - "/ru/digitalocean.html/": "/ru/cloudlinux_installation/#digitalocean", - "/ru/digitalocean.html": "/ru/cloudlinux_installation/#digitalocean", - "/ru/index.html?digitalocean.html": "/ru/cloudlinux_installation/#digitalocean", - "/ru/cloudlinux_installation/#cloudlinux-on-digitalocean": "/ru/cloudlinux_installation/#digitalocean", - "/ru/linode_kvm.html/": "/ru/cloudlinux_installation/#linode", - "/ru/linode_kvm.html": "/ru/cloudlinux_installation/#linode", - "/ru/index.html?linode_kvm.html": "/ru/cloudlinux_installation/#linode", - "/ru/cloudlinux_installation/#cloudlinux-on-linode": "/ru/cloudlinux_installation/#linode", - "/ru/lilo_boot_loader.html/": "/ru/cloudlinux_installation/#lilo-boot-loader", - "/ru/lilo_boot_loader.html": "/ru/cloudlinux_installation/#lilo-boot-loader", - "/ru/index.html?lilo_boot_loader.html": "/ru/cloudlinux_installation/#lilo-boot-loader", - "/ru/cloudlinux_installation/#servers-with-lilo-boot-loader": "/ru/cloudlinux_installation/#lilo-boot-loader", - "/ru/cpanel_easyapache_4.html/": "/ru/cloudlinux_installation/#migration-to-easyapache-4", - "/ru/cpanel_easyapache_4.html": "/ru/cloudlinux_installation/#migration-to-easyapache-4", - "/ru/index.html?cpanel_easyapache_4.html": "/ru/cloudlinux_installation/#migration-to-easyapache-4", - "/ru/cloudlinux_installation/#migrating-to-easyapache-4": "/ru/cloudlinux_installation/#migration-to-easyapache-4", - "/ru/faq.html/": "https://cloudlinux.zendesk.com/hc/en-us/articles/360025827914-CloudLinux-OS-Installation-FAQ", - "/ru/faq.html": "https://cloudlinux.zendesk.com/hc/en-us/articles/360025827914-CloudLinux-OS-Installation-FAQ", - "/ru/index.html?faq.html": "https://cloudlinux.zendesk.com/hc/en-us/articles/360025827914-CloudLinux-OS-Installation-FAQ", - "/ru/cloudlinux_installation/#faq": "https://cloudlinux.zendesk.com/hc/en-us/articles/360025827914-CloudLinux-OS-Installation-FAQ", - "/ru/uninstall.html/": "/ru/cloudlinux_installation/#uninstalling", - "/ru/uninstall.html": "/ru/cloudlinux_installation/#uninstalling", - "/ru/index.html?uninstall.html": "/ru/cloudlinux_installation/#uninstalling", - "/ru/cloudlinux_installation/#uninstalling-cloudlinux": "/ru/cloudlinux_installation/#uninstalling", - "/ru/limits.html/": "/ru/limits/", - "/ru/limits.html": "/ru/limits/", - "/ru/index.html?limits.html": "/ru/limits/", - "/ru/lve.html/": "/ru/limits/#understanding-limits", - "/ru/lve.html": "/ru/limits/#understanding-limits", - "/ru/index.html?lve.html": "/ru/limits/#understanding-limits", - "/ru/limits/#understanding-lve": "/ru/limits/#understanding-limits", - "/ru/limits_command_line_tools.html/": "/ru/limits/", - "/ru/limits_command_line_tools.html": "/ru/limits/", - "/ru/index.html?limits_command_line_tools.html": "/ru/limits/", - "/ru/lvectl.html/": "/ru/command-line_tools/#lvectl", - "/ru/lvectl.html": "/ru/command-line_tools/#lvectl", - "/ru/index.html?lvectl.html": "/ru/command-line_tools/#lvectl", - "/ru/limits/#lvectl": "/ru/command-line_tools/#lvectl", - "/ru/lveps.html/": "/ru/command-line_tools/#lveps", - "/ru/lveps.html": "/ru/command-line_tools/#lveps", - "/ru/index.html?lveps.html": "/ru/command-line_tools/#lveps", - "/ru/limits/#lveps": "/ru/command-line_tools/#lveps", - "/ru/lvetop.html/": "/ru/command-line_tools/#lvetop", - "/ru/lvetop.html": "/ru/command-line_tools/#lvetop", - "/ru/index.html?lvetop.html": "/ru/command-line_tools/#lvetop", - "/ru/limits/#lvetop": "/ru/command-line_tools/#lvetop", - "/ru/cldetect.html/": "/ru/command-line_tools/#cldetect", - "/ru/cldetect.html": "/ru/command-line_tools/#cldetect", - "/ru/index.html?cldetect.html": "/ru/command-line_tools/#cldetect", - "/ru/cldetect.html/": "/ru/command-line_tools/#cldetect", - "/ru/speed_limits.html/": "/ru/limits/#speed-limit", - "/ru/speed_limits.html": "/ru/limits/#speed-limit", - "/ru/index.html?speed_limits.html": "/ru/limits/#speed-limit", - "/ru/limits/#speed-limits": "/ru/limits/#speed-limit", - "/ru/cpu_limits.html/": "/ru/deprecated/#cpu-limits", - "/ru/cpu_limits.html": "/ru/deprecated/#cpu-limits", - "/ru/index.html?cpu_limits.html": "/ru/deprecated/#cpu-limits", - "/ru/cpu_limits.html/": "/ru/deprecated/#cpu-limits", - "/ru/memory_limits.html/": "/ru/limits/#memory-limit", - "/ru/memory_limits.html": "/ru/limits/#memory-limit", - "/ru/index.html?memory_limits.html": "/ru/limits/#memory-limit", - "/ru/limits/#memory-limits": "/ru/limits/#memory-limit", - "/ru/io_limits.html/": "/ru/limits/#io", - "/ru/io_limits.html": "/ru/limits/#io", - "/ru/index.html?io_limits.html": "/ru/limits/#io", - "/ru/iops_limits.html/": "/ru/limits/#iops", - "/ru/iops_limits.html": "/ru/limits/#iops", - "/ru/index.html?iops_limits.html": "/ru/limits/#iops", - "/ru/entry_processes_limit.html/": "/ru/limits/#entry-processes", - "/ru/entry_processes_limit.html": "/ru/limits/#entry-processes", - "/ru/index.html?entry_processes_limit.html": "/ru/limits/#entry-processes", - "/ru/number_of_processes_limit.html/": "/ru/limits/#number-of-processes", - "/ru/number_of_processes_limit.html": "/ru/limits/#number-of-processes", - "/ru/index.html?number_of_processes_limit.html": "/ru/limits/#number-of-processes", - "/ru/network_limits.html/": "/ru/limits/#network-traffic-bandwidth-control-and-accounting-system", - "/ru/network_limits.html": "/ru/limits/#network-traffic-bandwidth-control-and-accounting-system", - "/ru/index.html?network_limits.html": "/ru/limits/#network-traffic-bandwidth-control-and-accounting-system", - "/ru/compatiblity_matrix.html/": "/ru/limits/#compatibility-matrix", - "/ru/compatiblity_matrix.html": "/ru/limits/#compatibility-matrix", - "/ru/index.html?compatiblity_matrix.html": "/ru/limits/#compatibility-matrix", - "/ru/integration_components.html/": "/ru/cloudlinux_os_components/#additional-integration-components", - "/ru/integration_components.html": "/ru/cloudlinux_os_components/#additional-integration-components", - "/ru/index.html?integration_components.html": "/ru/cloudlinux_os_components/#additional-integration-components", - "/ru/limits/#integration-components": "/ru/cloudlinux_os_components/#additional-integration-components", - "/ru/lve_pam_module.html/": "/ru/cloudlinux_os_components/#lve-pam-module", - "/ru/lve_pam_module.html": "/ru/cloudlinux_os_components/#lve-pam-module", - "/ru/index.html?lve_pam_module.html": "/ru/cloudlinux_os_components/#lve-pam-module", - "/ru/limits/#lve-pam-module": "/ru/cloudlinux_os_components/#lve-pam-module", - "/ru/lve_wrappers.html/": "/ru/cloudlinux_os_components/#lve-pam-module", - "/ru/lve_wrappers.html": "/ru/cloudlinux_os_components/#lve-pam-module", - "/ru/index.html?lve_wrappers.html": "/ru/cloudlinux_os_components/#lve-pam-module", - "/ru/limits/#lve-wrappers": "/ru/cloudlinux_os_components/#lve-pam-module", - "/ru/mpm_itk_support.html/": "/ru/cloudlinux_os_components/#lve-wrappers", - "/ru/mpm_itk_support.html": "/ru/cloudlinux_os_components/#lve-wrappers", - "/ru/index.html?mpm_itk_support.html": "/ru/cloudlinux_os_components/#lve-wrappers", - "/ru/limits/#mpm-itk": "/ru/cloudlinux_os_components/#lve-wrappers", - "/ru/hostinglimits_module_for_apache.html/": "/ru/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/ru/hostinglimits_module_for_apache.html": "/ru/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/ru/index.html?hostinglimits_module_for_apache.html": "/ru/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/ru/limits/#hostinglimits-module-for-apache": "/ru/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/ru/redis_support_for_hostinglimits.html/": "/ru/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/ru/redis_support_for_hostinglimits.html": "/ru/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/ru/limits/#redis-support-for-hostinglimits": "/ru/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/ru/index.html?redis_support_for_hostinglimits.html": "/ru/cloudlinux_os_components/#hostinglimits-module-for-apache", - "/ru/cpanel_whm_json_api.html/": "/ru/cloudlinux_os_components/#cpanel-whm-json-api", - "/ru/cpanel_whm_json_api.html": "/ru/cloudlinux_os_components/#cpanel-whm-json-api", - "/ru/index.html?cpanel_whm_json_api.html": "/ru/cloudlinux_os_components/#cpanel-whm-json-api", - "/ru/limits/#cpanel-whm-json-api": "/ru/cloudlinux_os_components/#cpanel-whm-json-api", - "/ru/cpanel_lve_extension.html/": "/ru/lve_manager/#cpanel-lve-extension", - "/ru/cpanel_lve_extension.html": "/ru/lve_manager/#cpanel-lve-extension", - "/ru/index.html?cpanel_lve_extension.html": "/ru/lve_manager/#cpanel-lve-extension", - "/ru/limits/#cpanel-lve-extension":"/ru/lve_manager/#cpanel-lve-extension", - "/ru/lve_manager.html/": "/ru/lve_manager/", - "/ru/lve_manager.html": "/ru/lve_manager/", - "/ru/index.html?lve_manager.html": "/ru/lve_manager/", - "/ru/dashboard.html/": "/ru/lve_manager/#dashboard", - "/ru/dashboard.html": "/ru/lve_manager/#dashboard", - "/ru/index.html?dashboard.html": "/ru/lve_manager/#dashboard", - "/ru/installation-wizard.html/": "/ru/lve_manager/#cloudlinux-installation-wizard", - "/ru/installation-wizard.html": "/ru/lve_manager/#cloudlinux-installation-wizard", - "/ru/index.html?installation-wizard.html": "/ru/lve_manager/#cloudlinux-installation-wizard", - "/ru/cpanel_lve_manager.html/": "/ru/lve_manager/#lve-manager", - "/ru/cpanel_lve_manager.html": "/ru/lve_manager/#lve-manager", - "/ru/index.html?cpanel_lve_manager.html": "/ru/lve_manager/#lve-manager", - "/ru/lve_manager/#cpanel-lve-manager": "/ru/lve_manager/#lve-manager", - "/ru/lve_manager_options.html/": "/ru/lve_manager/#lve-manager-options", - "/ru/lve_manager_options.html": "/ru/lve_manager/#lve-manager-options", - "/ru/index.html?lve_manager_options.html": "/ru/lve_manager/#lve-manager-options", - "/ru/server_processes_snapshots.html/": "/ru/lve_manager/#server-processes-snapshots", - "/ru/server_processes_snapshots.html": "/ru/lve_manager/#server-processes-snapshots", - "/ru/index.html?server_processes_snapshots.html": "/ru/lve_manager/#server-processes-snapshots", - "/ru/lve_plugins_branding.html/": "/ru/lve_manager/#lve-plugins-branding", - "/ru/lve_plugins_branding.html": "/ru/lve_manager/#lve-plugins-branding", - "/ru/index.html?lve_plugins_branding.html": "/ru/lve_manager/#lve-plugins-branding", - "/ru/user_message.html/": "/ru/lve_manager/#user-message-for-php-version", - "/ru/user_message.html": "/ru/lve_manager/#user-message-for-php-version", - "/ru/index.html?user_message.html": "/ru/lve_manager/#user-message-for-php-version", - "/ru/reseller_limits.html/": "/ru/cloudlinux_os_components/#reseller-limits", - "/ru/reseller_limits.html": "/ru/cloudlinux_os_components/#reseller-limits", - "/ru/index.html?reseller_limits.html": "/ru/cloudlinux_os_components/#reseller-limits", - "/ru/reseller_limits/": "/ru/cloudlinux_os_components/#reseller-limits", - "/ru/installation_and_requirements.html/": "/ru/cloudlinux_os_components/#requirements", - "/ru/installation_and_requirements.html": "/ru/cloudlinux_os_components/#requirements", - "/ru/index.html?installation_and_requirements.html": "/ru/cloudlinux_os_components/#requirements", - "/ru/reseller_limits/#requirements":"/ru/cloudlinux_os_components/#requirements", - "/ru/how_to_enable_reseller_limits.html/": "/ru/cloudlinux_os_components/#installation-enabling-and-disabling", - "/ru/how_to_enable_reseller_limits.html": "/ru/cloudlinux_os_components/#installation-enabling-and-disabling", - "/ru/index.html?how_to_enable_reseller_limits.html": "/ru/cloudlinux_os_components/#installation-enabling-and-disabling", - "/ru/reseller_limits/#how-to-enable-and-disable-reseller-limits": "/ru/cloudlinux_os_components/#installation-enabling-and-disabling", - "/ru/hoster_interface.html/": "/ru/lve_manager/#lve-manager", - "/ru/hoster_interface.html": "/ru/lve_manager/#lve-manager", - "/ru/index.html?hoster_interface.html": "/ru/lve_manager/#lve-manager", - "/ru/reseller_limits/#hoster-interface": "/ru/lve_manager/#lve-manager", - "/ru/current_usage_tab.html/": "/ru/lve_manager/#current-usage-2", - "/ru/current_usage_tab.html": "/ru/lve_manager/#current-usage-2", - "/ru/index.html?current_usage_tab.html": "/ru/lve_manager/#current-usage-2", - "/ru/reseller_limits/#current-usage": "/ru/lve_manager/#current-usage-2", - "/ru/users_tab.html/": "/ru/lve_manager/#users-2", - "/ru/users_tab.html": "/ru/lve_manager/#users-2", - "/ru/index.html?users_tab.html": "/ru/lve_manager/#users-2", - "/ru/reseller_limits/#users": "/ru/lve_manager/#users-2", - "/ru/statistics_tab.html/": "/ru/lve_manager/#statistics-2", - "/ru/statistics_tab.html": "/ru/lve_manager/#statistics-2", - "/ru/index.html?statistics_tab.html": "/ru/lve_manager/#statistics-2", - "/ru/reseller_limits/#statistics": "/ru/lve_manager/#statistics-2", - "/ru/options_tab.html/": "/ru/lve_manager/#options-2", - "/ru/options_tab.html": "/ru/lve_manager/#options-2", - "/ru/index.html?options_tab.html": "/ru/lve_manager/#options-2", - "/ru/reseller_limits/#options": "/ru/lve_manager/#options-2", - "/ru/packages_tab.html/": "/ru/lve_manager/#packages-2", - "/ru/packages_tab.html": "/ru/lve_manager/#packages-2", - "/ru/index.html?packages_tab.html": "/ru/lve_manager/#packages-2", - "/ru/reseller_limits/#packages": "/ru/lve_manager/#packages-2", - "/ru/selector_tab.html/": "/ru/lve_manager/#selector", - "/ru/selector_tab.html": "/ru/lve_manager/#selector", - "/ru/index.html?selector_tab.html": "/ru/lve_manager/#selector", - "/ru/reseller_limits/#selector": "/ru/lve_manager/#selector", - "/ru/reseller_interface.html/": "/ru/lve_manager/#reseller-interface", - "/ru/reseller_interface.html": "/ru/lve_manager/#reseller-interface", - "/ru/index.html?reseller_interface.html": "/ru/lve_manager/#reseller-interface", - "/ru/reseller_limits/#reseller-interface": "/ru/lve_manager/#reseller-interface", - "/ru/current_usage_tab2.html/": "/ru/lve_manager/#current-usage-tab", - "/ru/current_usage_tab2.html": "/ru/lve_manager/#current-usage-tab", - "/ru/index.html?current_usage_tab2.html": "/ru/lve_manager/#current-usage-tab", - "/ru/reseller_limits/#current-usage": "/ru/lve_manager/#current-usage-tab", - "/ru/historical_usage_tab.html/": "/ru/lve_manager/#historical-usage-tab", - "/ru/historical_usage_tab.html": "/ru/lve_manager/#historical-usage-tab", - "/ru/index.html?historical_usage_tab.html": "/ru/lve_manager/#historical-usage-tab", - "/ru/reseller_limits/#historical-usage": "/ru/lve_manager/#historical-usage-tab", - "/ru/users_tab2.html/": "/ru/lve_manager/#users-tab", - "/ru/users_tab2.html": "/ru/lve_manager/#users-tab", - "/ru/index.html?users_tab2.html": "/ru/lve_manager/#users-tab", - "/ru/reseller_limits/#users": "/ru/lve_manager/#users-tab", - "/ru/statistics_tab2.html/": "/ru/lve_manager/#statistics-tab", - "/ru/statistics_tab2.html": "/ru/lve_manager/#statistics-tab", - "/ru/index.html?statistics_tab2.html": "/ru/lve_manager/#statistics-tab", - "/ru/reseller_limits/#statistics": "/ru/lve_manager/#statistics-tab", - "/ru/options_tab2.html/": "/ru/lve_manager/#options-tab", - "/ru/options_tab2.html": "/ru/lve_manager/#options-tab", - "/ru/index.html?options_tab2.html": "/ru/lve_manager/#options-tab", - "/ru/reseller_limits/#options": "/ru/lve_manager/#options-tab", - "/ru/packages_tab2.html/": "/ru/lve_manager/#packages-tab", - "/ru/packages_tab2.html": "/ru/lve_manager/#packages-tab", - "/ru/index.html?packages_tab2.html": "/ru/lve_manager/#packages-tab", - "/ru/reseller_limits/#packages": "/ru/lve_manager/#packages-tab", - "/ru/lve-stats_2.html/": "/ru/cloudlinux_os_components/#lve-stats-2", - "/ru/lve-stats_2.html": "/ru/cloudlinux_os_components/#lve-stats-2", - "/ru/index.html?lve-stats_2.html": "/ru/cloudlinux_os_components/#lve-stats-2", - "/ru/lve-stats_2/": "/ru/cloudlinux_os_components/#lve-stats-2", - "/ru/lve-stats_2_installation.html/": "/ru/cloudlinux_os_components/#installation-and-update", - "/ru/lve-stats_2_installation.html": "/ru/cloudlinux_os_components/#installation-and-update", - "/ru/index.html?lve-stats_2_installation.html": "/ru/cloudlinux_os_components/#installation-and-update", - "/ru/lve-stats_2/#installation": "/ru/cloudlinux_os_components/#installation-and-update", - "/ru/lve-stats_2_configuration.html/": "/ru/cloudlinux_os_components/#configuration", - "/ru/lve-stats_2_configuration.html": "/ru/cloudlinux_os_components/#configuration", - "/ru/index.html?lve-stats_2_configuration.html": "/ru/cloudlinux_os_components/#configuration", - "/ru/lve-stats_2/#configuration": "/ru/cloudlinux_os_components/#configuration", - "/ru/lve_stats2_and_mysql.html/": "/ru/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup", - "/ru/lve_stats2_and_mysql.html": "/ru/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup", - "/ru/index.html?lve_stats2_and_mysql.html": "/ru/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup", - "/ru/lve-stats_2/#lve-stats2-and-mysql-db-server-compatible-work-setup": "/ru/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup", - "/ru/lve_stats_2_and_postgresql.html/": "/ru/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup", - "/ru/lve_stats_2_and_postgresql.html": "/ru/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup", - "/ru/index.html?lve_stats_2_and_postgresql.html": "/ru/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup", - "/ru/lve-stats_2/#lve-stats-2-and-postgresql-db-server-compatible-work-setup": "/ru/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup", - "/ru/customize_lve-stats-2_notifica.html/": "/ru/cloudlinux_os_components/#customize-lve-stats2-notifications", - "/ru/customize_lve-stats-2_notifica.html": "/ru/cloudlinux_os_components/#customize-lve-stats2-notifications", - "/ru/index.html?customize_lve-stats-2_notifica.html": "/ru/cloudlinux_os_components/#customize-lve-stats2-notifications", - "/ru/lve-stats_2/#customize-lve-stats-2-notifications": "/ru/cloudlinux_os_components/#customize-lve-stats2-notifications", - "/ru/lve-stats_2_command_line_tools.html/": "/ru/command-line_tools/#lve-stats-2", - "/ru/lve-stats_2_command_line_tools.html": "/ru/command-line_tools/#lve-stats-2", - "/ru/index.html?lve-stats_2_command_line_tools.html": "/ru/command-line_tools/#lve-stats-2", - "/ru/lve-stats_2/#command-line-tools": "/ru/command-line_tools/#lve-stats-2", - "/ru/lveinfo.html/": "/ru/command-line_tools/#lveinfo", - "/ru/lveinfo.html": "/ru/command-line_tools/#lveinfo", - "/ru/index.html?lveinfo.html": "/ru/command-line_tools/#lveinfo", - "/ru/lve-stats_2/#lveinfo": "/ru/command-line_tools/#lveinfo", - "/ru/lvechart.html/": "/ru/command-line_tools/#lvechart", - "/ru/lvechart.html": "/ru/command-line_tools/#lvechart", - "/ru/index.html?lvechart.html": "/ru/command-line_tools/#lvechart", - "/ru/lve-stats_2/#lvechart": "/ru/command-line_tools/#lvechart", - "/ru/dbgovchart.html/": "/ru/command-line_tools/#dbgovchart", - "/ru/dbgovchart.html": "/ru/command-line_tools/#dbgovchart", - "/ru/index.html?dbgovchart.html": "/ru/command-line_tools/#dbgovchart", - "/ru/lve-stats_2/#dbgovchart": "/ru/command-line_tools/#dbgovchart", - "/ru/lve-read-snapshot.html/": "/ru/command-line_tools/#lve-read-snapshot", - "/ru/lve-read-snapshot.html": "/ru/command-line_tools/#lve-read-snapshot", - "/ru/index.html?lve-read-snapshot.html": "/ru/command-line_tools/#lve-read-snapshot", - "/ru/lve-stats_2/#lve-read-snapshot": "/ru/command-line_tools/#lve-read-snapshot", - "/ru/lve-create-db.html/": "/ru/command-line_tools/#lve-create-db", - "/ru/lve-create-db.html": "/ru/command-line_tools/#lve-create-db", - "/ru/index.html?lve-create-db.html": "/ru/command-line_tools/#lve-create-db", - "/ru/lve-stats_2/#lve-create-db": "/ru/command-line_tools/#lve-create-db", - "/ru/cloudlinux_top.html/": "/ru/command-line_tools/#cloudlinux-top", - "/ru/cloudlinux_top.html": "/ru/command-line_tools/#cloudlinux-top", - "/ru/index.html?cloudlinux_top.html": "/ru/command-line_tools/#cloudlinux-top", - "/ru/lve-stats_2/#cloudlinux-top": "/ru/command-line_tools/#cloudlinux-top", - "/ru/cloudlinux-statistics.html/": "/ru/command-line_tools/#cloudlinux-statistics", - "/ru/cloudlinux-statistics.html": "/ru/command-line_tools/#cloudlinux-statistics", - "/ru/index.html?cloudlinux-statistics.html": "/ru/command-line_tools/#cloudlinux-statistics", - "/ru/lve-stats_2/#cloudlinux-statistics": "/ru/command-line_tools/#cloudlinux-statistics", - "/ru/lve-stats_2_plugins.html/": "/ru/cloudlinux_os_components/#plugins", - "/ru/lve-stats_2_plugins.html": "/ru/cloudlinux_os_components/#plugins", - "/ru/index.html?lve-stats_2_plugins.html": "/ru/cloudlinux_os_components/#plugins", - "/ru/lve-stats_2/#plugins": "/ru/cloudlinux_os_components/#plugins", - "/ru/creating_a_plugin.html/": "/ru/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2", - "/ru/creating_a_plugin.html": "/ru/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2", - "/ru/index.html?creating_a_plugin.html": "/ru/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2", - "/ru/lve-stats_2/#creating-a-plugin-for-lve-stats-2": "/ru/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2", - "/ru/lve-stats_2_plugin_introduction.html/": "/ru/cloudlinux_os_components/#introduction", - "/ru/lve-stats_2_plugin_introduction.html": "/ru/cloudlinux_os_components/#introduction", - "/ru/index.html?lve-stats_2_plugin_introduction.html": "/ru/cloudlinux_os_components/#introduction", - "/ru/lve-stats_2/#introduction": "/ru/cloudlinux_os_components/#introduction", - "/ru/server_plugin_arrangement.html/": "/ru/cloudlinux_os_components/#server-plugin-arrangement", - "/ru/server_plugin_arrangement.html": "/ru/cloudlinux_os_components/#server-plugin-arrangement", - "/ru/index.html?server_plugin_arrangement.html": "/ru/cloudlinux_os_components/#server-plugin-arrangement", - "/ru/lve-stats_2/#server-plugin-arrangement": "/ru/cloudlinux_os_components/#server-plugin-arrangement", - "/ru/plugin_configuration.html/": "/ru/cloudlinux_os_components/#plugin-configuration", - "/ru/plugin_configuration.html": "/ru/cloudlinux_os_components/#plugin-configuration", - "/ru/index.html?plugin_configuration.html": "/ru/cloudlinux_os_components/#plugin-configuration", - "/ru/lve-stats_2/#plugin-configuration": "/ru/cloudlinux_os_components/#plugin-configuration", - "/ru/types_of_plugins.html/": "/ru/cloudlinux_os_components/#types-of-plugins", - "/ru/types_of_plugins.html": "/ru/cloudlinux_os_components/#types-of-plugins", - "/ru/index.html?types_of_plugins.html": "/ru/cloudlinux_os_components/#types-of-plugins", - "/ru/lve-stats_2/#types-of-plugins": "/ru/cloudlinux_os_components/#types-of-plugins", - "/ru/plugins_examples.html/": "/ru/cloudlinux_os_components/#examples-of-plugins", - "/ru/plugins_examples.html": "/ru/cloudlinux_os_components/#examples-of-plugins", - "/ru/index.html?plugins_examples.html": "/ru/cloudlinux_os_components/#examples-of-plugins", - "/ru/lve-stats_2/#examples-of-plugins": "/ru/cloudlinux_os_components/#examples-of-plugins", - "/ru/collector.html/": "/ru/cloudlinux_os_components/#collector", - "/ru/collector.html": "/ru/cloudlinux_os_components/#collector", - "/ru/index.html?collector.html": "/ru/cloudlinux_os_components/#collector", - "/ru/lve-stats_2/#collector": "/ru/cloudlinux_os_components/#collector", - "/ru/analizer.html/": "/ru/cloudlinux_os_components/#analyzer", - "/ru/analizer.html": "/ru/cloudlinux_os_components/#analyzer", - "/ru/index.html?analizer.html": "/ru/cloudlinux_os_components/#analyzer", - "/ru/lve-stats_2/#analizer": "/ru/cloudlinux_os_components/#analyzer", - "/ru/persistor.html/": "/ru/cloudlinux_os_components/#persistor", - "/ru/persistor.html": "/ru/cloudlinux_os_components/#persistor", - "/ru/index.html?persistor.html": "/ru/cloudlinux_os_components/#persistor", - "/ru/lve-stats_2/#persistor": "/ru/cloudlinux_os_components/#persistor", - "/ru/notifier.html/": "/ru/cloudlinux_os_components/#notifier", - "/ru/notifier.html": "/ru/cloudlinux_os_components/#notifier", - "/ru/index.html?notifier.html": "/ru/cloudlinux_os_components/#notifier", - "/ru/lve-stats_2/#notifier": "/ru/cloudlinux_os_components/#notifier", - "/ru/var_lve_info_file.html/": "/ru/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file", - "/ru/var_lve_info_file.html": "/ru/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file", - "/ru/index.html?var_lve_info_file.html": "/ru/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file", - "/ru/lve-stats_2/#file-info-and-format-for-var-lve-info-file": "/ru/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file", - "/ru/lve-stats_2_troubleshooting.html/": "/ru/cloudlinux_os_components/#troubleshooting", - "/ru/lve-stats_2_troubleshooting.html": "/ru/cloudlinux_os_components/#troubleshooting", - "/ru/index.html?lve-stats_2_troubleshooting.html": "/ru/cloudlinux_os_components/#troubleshooting", - "/ru/lve-stats_2/#troubleshooting": "/ru/cloudlinux_os_components/#troubleshooting", - "/ru/cagefs.html/": "/ru/cloudlinux_os_components/#cagefs/", - "/ru/cagefs.html": "/ru/cloudlinux_os_components/#cagefs/", - "/ru/index.html?cagefs.html": "/ru/cloudlinux_os_components/#cagefs/", - "/ru/cagefs/": "/ru/cloudlinux_os_components/#cagefs/", - "/ru/cagefs_installation.html/": "/ru/cloudlinux_os_components/#installation-and-update-2", - "/ru/cagefs_installation.html": "/ru/cloudlinux_os_components/#installation-and-update-2", - "/ru/index.html?cagefs_installation.html": "/ru/cloudlinux_os_components/#installation-and-update-2", - "/ru/cagefs/#installation": "/ru/cloudlinux_os_components/#installation-and-update-2", - "/ru/unistalling_cagefs.html/": "/ru/cloudlinux_os_components/#unistalling", - "/ru/unistalling_cagefs.html": "/ru/cloudlinux_os_components/#unistalling", - "/ru/index.html?unistalling_cagefs.html": "/ru/cloudlinux_os_components/#unistalling", - "/ru/cagefs/#unistalling-cagefs": "/ru/cloudlinux_os_components/#unistalling", - "/ru/managing_users.html/": "/ru/cloudlinux_os_components/#managing-users", - "/ru/managing_users.html": "/ru/cloudlinux_os_components/#managing-users", - "/ru/index.html?managing_users.html": "/ru/cloudlinux_os_components/#managing-users", - "/ru/cagefs/#managing-users": "/ru/cloudlinux_os_components/#managing-users", - "/ru/cagefs_command_line_tools.html/": "/ru/command-line_tools/#cagefs", - "/ru/cagefs_command_line_tools.html": "/ru/command-line_tools/#cagefs", - "/ru/index.html?cagefs_command_line_tools.html": "/ru/command-line_tools/#cagefs", - "/ru/cagefs/#command-line-tools": "/ru/command-line_tools/#cagefs", - "/ru/running_command_inside_cagefs.html/": "/ru/command-line_tools/#running-command-inside-cagefs", - "/ru/running_command_inside_cagefs.html": "/ru/command-line_tools/#running-command-inside-cagefs", - "/ru/index.html?running_command_inside_cagefs.html": "/ru/command-line_tools/#running-command-inside-cagefs", - "/ru/cagefs/#running-command-inside-cagefs": "/ru/command-line_tools/#running-command-inside-cagefs", - "/ru/sanity_check.html/": "/ru/command-line_tools/#sanity-check", - "/ru/sanity_check.html": "/ru/command-line_tools/#sanity-check", - "/ru/index.html?sanity_check.html": "/ru/command-line_tools/#sanity-check", - "/ru/cagefs/#sanity-check": "/ru/command-line_tools/#sanity-check", - "/ru/cagefs_quirks.html/": "/ru/command-line_tools/#cagefs-quirks", - "/ru/cagefs_quirks.html": "/ru/command-line_tools/#cagefs-quirks", - "/ru/index.html?cagefs_quirks.html": "/ru/command-line_tools/#cagefs-quirks", - "/ru/cagefs/#cagefs-quirks": "/ru/command-line_tools/#cagefs-quirks", - "/ru/cagefs_configuration.html/": "/ru/cloudlinux_os_components/#configuration-2", - "/ru/cagefs_configuration.html": "/ru/cloudlinux_os_components/#configuration-2", - "/ru/index.html?cagefs_configuration.html": "/ru/cloudlinux_os_components/#configuration-2", - "/ru/cagefs/#configuration": "/ru/cloudlinux_os_components/#configuration-2", - "/ru/file_system_templates.html/": "/ru/cloudlinux_os_components/#file-system-templates", - "/ru/file_system_templates.html": "/ru/cloudlinux_os_components/#file-system-templates", - "/ru/index.html?file_system_templates.html": "/ru/cloudlinux_os_components/#file-system-templates", - "/ru/cagefs/#file-system-templates": "/ru/cloudlinux_os_components/#file-system-templates", - "/ru/excluding_files.html/": "/ru/cloudlinux_os_components/#excluding-files", - "/ru/excluding_files.html": "/ru/cloudlinux_os_components/#excluding-files", - "/ru/index.html?excluding_files.html": "/ru/cloudlinux_os_components/#excluding-files", - "/ru/cagefs/#excluding-files": "/ru/cloudlinux_os_components/#excluding-files", - "/ru/excluding_users.html/": "/ru/cloudlinux_os_components/#excluding-users", - "/ru/excluding_users.html": "/ru/cloudlinux_os_components/#excluding-users", - "/ru/index.html?excluding_users.html": "/ru/cloudlinux_os_components/#excluding-users", - "/ru/cagefs/#excluding-users": "/ru/cloudlinux_os_components/#excluding-users", - "/ru/mount_points.html/": "/ru/cloudlinux_os_components/#mount-points", - "/ru/mount_points.html": "/ru/cloudlinux_os_components/#mount-points", - "/ru/index.html?mount_points.html": "/ru/cloudlinux_os_components/#mount-points", - "/ru/cagefs/#mount-points": "/ru/cloudlinux_os_components/#mount-points", - "/ru/per_user_virtual_mount_points.html/": "/ru/cloudlinux_os_components/#per-user-virtual-mount-points", - "/ru/per_user_virtual_mount_points.html": "/ru/cloudlinux_os_components/#per-user-virtual-mount-points", - "/ru/index.html?per_user_virtual_mount_points.html": "/ru/cloudlinux_os_components/#per-user-virtual-mount-points", - "/ru/cagefs/#per-user-virtual-mount-points": "/ru/cloudlinux_os_components/#per-user-virtual-mount-points", - "/ru/split_by_username.html/": "/ru/cloudlinux_os_components/#split-by-username", - "/ru/split_by_username.html": "/ru/cloudlinux_os_components/#split-by-username", - "/ru/index.html?split_by_username.html": "/ru/cloudlinux_os_components/#split-by-username", - "/ru/cagefs/#split-by-username": "/ru/cloudlinux_os_components/#split-by-username", - "/ru/mounting_users_home_directory_.html/": "/ru/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs", - "/ru/mounting_users_home_directory_.html": "/ru/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs", - "/ru/index.html?mounting_users_home_directory_.html": "/ru/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs", - "/ru/cagefs/#mounting-users-home-directory-inside-cagefs": "/ru/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs", - "/ru/base_home_directory.html/": "/ru/cloudlinux_os_components/#base-home-directory", - "/ru/base_home_directory.html": "/ru/cloudlinux_os_components/#base-home-directory", - "/ru/index.html?base_home_directory.html": "/ru/cloudlinux_os_components/#base-home-directory", - "/ru/cagefs/#base-home-directory": "/ru/cloudlinux_os_components/#base-home-directory", - "/ru/postgresql_support.html/": "/ru/cloudlinux_os_components/#postgresql-support", - "/ru/postgresql_support.html": "/ru/cloudlinux_os_components/#postgresql-support", - "/ru/index.html?postgresql_support.html": "/ru/cloudlinux_os_components/#postgresql-support", - "/ru/cagefs/#postgresql-support": "/ru/cloudlinux_os_components/#postgresql-support", - "/ru/pam_configuration.html/": "/ru/cloudlinux_os_components/#pam-configuration", - "/ru/pam_configuration.html": "/ru/cloudlinux_os_components/#pam-configuration", - "/ru/index.html?pam_configuration.html": "/ru/cloudlinux_os_components/#pam-configuration", - "/ru/cagefs/#pam-configuration": "/ru/cloudlinux_os_components/#pam-configuration", - "/ru/executing_by_proxy.html/": "/ru/cloudlinux_os_components/#executing-by-proxy", - "/ru/executing_by_proxy.html": "/ru/cloudlinux_os_components/#executing-by-proxy", - "/ru/index.html?executing_by_proxy.html": "/ru/cloudlinux_os_components/#executing-by-proxy", - "/ru/cagefs/#executing-by-proxy": "/ru/cloudlinux_os_components/#executing-by-proxy", - "/ru/custom__etc_directory.html/": "/ru/cloudlinux_os_components/#custom-etc-files-per-customer", - "/ru/custom__etc_directory.html": "/ru/cloudlinux_os_components/#custom-etc-files-per-customer", - "/ru/index.html?custom__etc_directory.html": "/ru/cloudlinux_os_components/#custom-etc-files-per-customer", - "/ru/cagefs/#custom-etc-files-per-customer": "/ru/cloudlinux_os_components/#custom-etc-files-per-customer", - "/ru/moving_cagefs-skeleton_directory.html/": "/ru/cloudlinux_os_components/#moving-cagefs-skeleton-directory", - "/ru/moving_cagefs-skeleton_directory.html": "/ru/cloudlinux_os_components/#moving-cagefs-skeleton-directory", - "/ru/index.html?moving_cagefs-skeleton_directory.html": "/ru/cloudlinux_os_components/#moving-cagefs-skeleton-directory", - "/ru/cagefs/#moving-cagefs-skeleton-directory": "/ru/cloudlinux_os_components/#moving-cagefs-skeleton-directory", - "/ru/moving__var_cagefs_directory.html/": "/ru/cloudlinux_os_components/#moving-var-cagefs-directory", - "/ru/moving__var_cagefs_directory.html": "/ru/cloudlinux_os_components/#moving-var-cagefs-directory", - "/ru/index.html?moving__var_cagefs_directory.html": "/ru/cloudlinux_os_components/#moving-var-cagefs-directory", - "/ru/cagefs/#moving-var-cagefs-directory": "/ru/cloudlinux_os_components/#moving-var-cagefs-directory", - "/ru/tmp_directories.html/": "/ru/cloudlinux_os_components/#tmp-directories", - "/ru/tmp_directories.html": "/ru/cloudlinux_os_components/#tmp-directories", - "/ru/index.html?tmp_directories.html": "/ru/cloudlinux_os_components/#tmp-directories", - "/ru/cagefs/#tmp-directories": "/ru/cloudlinux_os_components/#tmp-directories", - "/ru/syslog.html/": "/ru/cloudlinux_os_components/#syslog", - "/ru/syslog.html": "/ru/cloudlinux_os_components/#syslog", - "/ru/index.html?syslog.html": "/ru/cloudlinux_os_components/#syslog", - "/ru/cagefs/#syslog": "/ru/cloudlinux_os_components/#syslog", - "/ru/excluding_mount_points.html/": "/ru/cloudlinux_os_components/#excluding-mount-points", - "/ru/excluding_mount_points.html": "/ru/cloudlinux_os_components/#excluding-mount-points", - "/ru/index.html?excluding_mount_points.html": "/ru/cloudlinux_os_components/#excluding-mount-points", - "/ru/cagefs/#excluding-mount-points": "/ru/cloudlinux_os_components/#excluding-mount-points", - "/ru/control_panel_integration.html/": "/ru/cloudlinux_os_components/#integration-with-control-panels", - "/ru/control_panel_integration.html": "/ru/cloudlinux_os_components/#integration-with-control-panels", - "/ru/index.html?control_panel_integration.html": "/ru/cloudlinux_os_components/#integration-with-control-panels", - "/ru/cagefs/#control-panel-integration": "/ru/cloudlinux_os_components/#integration-with-control-panels", - "/ru/cpanel.html/": "/ru/cloudlinux_os_components/#cpanel", - "/ru/cpanel.html": "/ru/cloudlinux_os_components/#cpanel", - "/ru/index.html?cpanel.html": "/ru/cloudlinux_os_components/#cpanel", - "/ru/cagefs/#cpanel": "/ru/cloudlinux_os_components/#cpanel", - "/ru/plesk.html/": "/ru/cloudlinux_os_components/#plesk", - "/ru/plesk.html": "/ru/cloudlinux_os_components/#plesk", - "/ru/index.html?plesk.html": "/ru/cloudlinux_os_components/#plesk", - "/ru/cagefs/#plesk": "/ru/cloudlinux_os_components/#plesk", - "/ru/ispmanager.html/": "/ru/cloudlinux_os_components/#ispmanager", - "/ru/ispmanager.html": "/ru/cloudlinux_os_components/#ispmanager", - "/ru/index.html?ispmanager.html": "/ru/cloudlinux_os_components/#ispmanager", - "/ru/cagefs/#ispmanager": "/ru/cloudlinux_os_components/#ispmanager", - "/ru/mysql_governor.html/": "/ru/cloudlinux_os_components/#mysql-governor", - "/ru/mysql_governor.html": "/ru/cloudlinux_os_components/#mysql-governor", - "/ru/index.html?mysql_governor.html": "/ru/cloudlinux_os_components/#mysql-governor", - "/ru/mysql_governor/": "/ru/cloudlinux_os_components/#mysql-governor", - "/ru/mysql_governor_installation.html/": "/ru/cloudlinux_os_components/#installation-and-update-3", - "/ru/mysql_governor_installation.html": "/ru/cloudlinux_os_components/#installation-and-update-3", - "/ru/index.html?mysql_governor_installation.html": "/ru/cloudlinux_os_components/#installation-and-update-3", - "/ru/mysql_governor/#installation": "/ru/cloudlinux_os_components/#installation-and-update-3", - "/ru/removing_mysql_governor.html/": "/ru/cloudlinux_os_components/#uninstalling-2", - "/ru/removing_mysql_governor.html": "/ru/cloudlinux_os_components/#uninstalling-2", - "/ru/index.html?removing_mysql_governor.html": "/ru/cloudlinux_os_components/#uninstalling-2", - "/ru/mysql_governor/#removing": "/ru/cloudlinux_os_components/#uninstalling-2", - "/ru/modes_of_operation.html/": "/ru/cloudlinux_os_components/#modes-of-operation", - "/ru/modes_of_operation.html": "/ru/cloudlinux_os_components/#modes-of-operation", - "/ru/index.html?modes_of_operation.html": "/ru/cloudlinux_os_components/#modes-of-operation", - "/ru/mysql_governor/#modes-of-operation": "/ru/cloudlinux_os_components/#modes-of-operation", - "/ru/mysql_governor_configuration.html/": "/ru/cloudlinux_os_components/#configuration-3", - "/ru/mysql_governor_configuration.html": "/ru/cloudlinux_os_components/#configuration-3", - "/ru/index.html?mysql_governor_configuration.html": "/ru/cloudlinux_os_components/#configuration-3", - "/ru/mysql_governor/#configuration": "/ru/cloudlinux_os_components/#configuration-3", - "/ru/start_stop.html/": "/ru/cloudlinux_os_components/#starting-and-stopping", - "/ru/start_stop.html": "/ru/cloudlinux_os_components/#starting-and-stopping", - "/ru/index.html?start_stop.html": "/ru/cloudlinux_os_components/#starting-and-stopping", - "/ru/mysql_governor/#starting-and-stopping": "/ru/cloudlinux_os_components/#starting-and-stopping", - "/ru/mapping_a_user_to_database.html/": "/ru/cloudlinux_os_components/#mapping-a-user-to-database", - "/ru/mapping_a_user_to_database.html": "/ru/cloudlinux_os_components/#mapping-a-user-to-database", - "/ru/index.html?mapping_a_user_to_database.html": "/ru/cloudlinux_os_components/#mapping-a-user-to-database", - "/ru/mysql_governor/#mapping-a-user-to-database": "/ru/cloudlinux_os_components/#mapping-a-user-to-database", - "/ru/log_files.html/": "/ru/cloudlinux_os_components/#log-files", - "/ru/log_files.html": "/ru/cloudlinux_os_components/#log-files", - "/ru/index.html?log_files.html": "/ru/cloudlinux_os_components/#log-files", - "/ru/mysql_governor/#log-files": "/ru/cloudlinux_os_components/#log-files", - "/ru/change_mysql_version.html/": "/ru/cloudlinux_os_components/#change-mysql-version", - "/ru/change_mysql_version.html": "/ru/cloudlinux_os_components/#change-mysql-version", - "/ru/index.html?change_mysql_version.html": "/ru/cloudlinux_os_components/#change-mysql-version", - "/ru/mysql_governor/#change-mysql-version": "/ru/cloudlinux_os_components/#change-mysql-version", - "/ru/mysql_governor_command_line_tools.html/": "/ru/command-line_tools/#mysql-governor", - "/ru/mysql_governor_command_line_tools.html": "/ru/command-line_tools/#mysql-governor", - "/ru/index.html?mysql_governor_command_line_tools.html": "/ru/command-line_tools/#mysql-governor", - "/ru/mysql_governor/#command-line-tools": "/ru/command-line_tools/#mysql-governor", - "/ru/dbtop.html/": "/ru/command-line_tools/#dbtop", - "/ru/dbtop.html": "/ru/command-line_tools/#dbtop", - "/ru/index.html?dbtop.html": "/ru/command-line_tools/#dbtop", - "/ru/mysql_governor/#dbtop": "/ru/command-line_tools/#dbtop", - "/ru/dbctl.html/": "/ru/command-line_tools/#dbctl", - "/ru/dbctl.html": "/ru/command-line_tools/#dbctl", - "/ru/index.html?dbctl.html": "/ru/command-line_tools/#dbctl", - "/ru/mysql_governor/#dbctl": "/ru/command-line_tools/#dbctl", - "/ru/dbgov_lveinfo.html/": "/ru/command-line_tools/#lveinfo-dbgov", - "/ru/dbgov_lveinfo.html": "/ru/command-line_tools/#lveinfo-dbgov", - "/ru/index.html?dbgov_lveinfo.html": "/ru/command-line_tools/#lveinfo-dbgov", - "/ru/mysql_governor/#lveinfo-dbgov": "/ru/command-line_tools/#lveinfo-dbgov", - "/ru/mysql_governor_dbgovchart.html/": "/ru/command-line_tools/#dbgovchart", - "/ru/mysql_governor_dbgovchart.html": "/ru/command-line_tools/#dbgovchart", - "/ru/index.html?mysql_governor_dbgovchart.html": "/ru/command-line_tools/#dbgovchart", - "/ru/mysql_governor/#dbgovchart": "/ru/command-line_tools/#dbgovchart", - "/ru/backing_up_mysql.html/": "/ru/cloudlinux_os_components/#backing-up-mysql", - "/ru/backing_up_mysql.html": "/ru/cloudlinux_os_components/#backing-up-mysql", - "/ru/index.html?backing_up_mysql.html": "/ru/cloudlinux_os_components/#backing-up-mysql", - "/ru/mysql_governor/#backing-up-mysql": "/ru/cloudlinux_os_components/#backing-up-mysql", - "/ru/abrt_plugin.html/": "/ru/cloudlinux_os_components/#abrt-plugin", - "/ru/abrt_plugin.html": "/ru/cloudlinux_os_components/#abrt-plugin", - "/ru/index.html?abrt_plugin.html": "/ru/cloudlinux_os_components/#abrt-plugin", - "/ru/mysql_governor/#abrt": "/ru/cloudlinux_os_components/#abrt-plugin", - "/ru/troubleshooting.html/": "/ru/cloudlinux_os_components/#troubleshooting-2", - "/ru/troubleshooting.html": "/ru/cloudlinux_os_components/#troubleshooting-2", - "/ru/index.html?troubleshooting.html": "/ru/cloudlinux_os_components/#troubleshooting-2", - "/ru/mysql_governor/#troubleshooting": "/ru/cloudlinux_os_components/#troubleshooting-2", - "/ru/php_selector.html/": "/ru/cloudlinux_os_components/#php_selector/", - "/ru/php_selector.html": "/ru/cloudlinux_os_components/#php_selector/", - "/ru/index.html?php_selector.html": "/ru/cloudlinux_os_components/#php_selector/", - "/ru/php_selector/": "/ru/cloudlinux_os_components/#php_selector/", - "/ru/php_selector_installation.html/": "/ru/cloudlinux_os_components/#installation-and-update-4", - "/ru/php_selector_installation.html": "/ru/cloudlinux_os_components/#installation-and-update-4", - "/ru/index.html?php_selector_installation.html": "/ru/cloudlinux_os_components/#installation-and-update-4", - "/ru/php_selector/#installation-and-update": "/ru/cloudlinux_os_components/#installation-and-update-4", - "/ru/litespeed_support.html/": "/ru/cloudlinux_os_components/#litespeed-support", - "/ru/litespeed_support.html": "/ru/cloudlinux_os_components/#litespeed-support", - "/ru/index.html?litespeed_support.html": "/ru/cloudlinux_os_components/#litespeed-support", - "/ru/php_selector/#litespeed-support": "/ru/cloudlinux_os_components/#litespeed-support", - "/ru/ispmanager_support.html/": "/ru/cloudlinux_os_components/#ispmanager-support", - "/ru/ispmanager_support.html": "/ru/cloudlinux_os_components/#ispmanager-support", - "/ru/index.html?ispmanager_support.html": "/ru/cloudlinux_os_components/#ispmanager-support", - "/ru/php_selector/#ispmanager": "/ru/cloudlinux_os_components/#ispmanager-support", - "/ru/php_configuration.html/": "/ru/cloudlinux_os_components/#configuration-and-using", - "/ru/php_configuration.html": "/ru/cloudlinux_os_components/#configuration-and-using", - "/ru/index.html?php_configuration.html": "/ru/cloudlinux_os_components/#configuration-and-using", - "/ru/php_selector/#configuration": "/ru/cloudlinux_os_components/#configuration-and-using", - "/ru/default_version_and_modules.html/": "/ru/cloudlinux_os_components/#setting-default-version-and-modules", - "/ru/default_version_and_modules.html": "/ru/cloudlinux_os_components/#setting-default-version-and-modules", - "/ru/index.html?default_version_and_modules.html": "/ru/cloudlinux_os_components/#setting-default-version-and-modules", - "/ru/php_selector/#setting-default-version-and-modules": "/ru/cloudlinux_os_components/#setting-default-version-and-modules", - "/ru/individual_php_ini_files.html/": "/ru/cloudlinux_os_components/#individual-php-ini-files", - "/ru/individual_php_ini_files.html": "/ru/cloudlinux_os_components/#individual-php-ini-files", - "/ru/index.html?individual_php_ini_files.html": "/ru/cloudlinux_os_components/#individual-php-ini-files", - "/ru/php_selector/#individual-php-ini-files": "/ru/cloudlinux_os_components/#individual-php-ini-files", - "/ru/substitute_global_php_ini.html/": "/ru/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4", - "/ru/substitute_global_php_ini.html": "/ru/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4", - "/ru/index.html?substitute_global_php_ini.html": "/ru/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4", - "/ru/php_selector/#substitute-global-php-ini-for-individual-customer": "/ru/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4", - "/ru/managing_interpretor_version.html/": "/ru/cloudlinux_os_components/#managing-interpreter-version", - "/ru/managing_interpretor_version.html": "/ru/cloudlinux_os_components/#managing-interpreter-version", - "/ru/index.html?managing_interpretor_version.html": "/ru/cloudlinux_os_components/#managing-interpreter-version", - "/ru/php_selector/#managing-interpreter-version": "/ru/cloudlinux_os_components/#managing-interpreter-version", - "/ru/php_selector_only_with_some_packages.html/": "/ru/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel", - "/ru/php_selector_only_with_some_packages.html": "/ru/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel", - "/ru/index.html?php_selector_only_with_some_packages.html": "/ru/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel", - "/ru/php_selector/#including": "/ru/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel", - "/ru/php_extensions.html/": "/ru/cloudlinux_os_components/#php-extensions", - "/ru/php_extensions.html": "/ru/cloudlinux_os_components/#php-extensions", - "/ru/index.html?php_extensions.html": "/ru/cloudlinux_os_components/#php-extensions", - "/ru/php_selector/#php-extensions": "/ru/cloudlinux_os_components/#php-extensions", - "/ru/ffmpeg.html/": "/ru/cloudlinux_os_components/#ffmpeg", - "/ru/ffmpeg.html": "/ru/cloudlinux_os_components/#ffmpeg", - "/ru/index.html?ffmpeg.html": "/ru/cloudlinux_os_components/#ffmpeg", - "/ru/php_selector/#ffmpeg": "/ru/cloudlinux_os_components/#ffmpeg", - "/ru/native_php_configuration.html/": "/ru/cloudlinux_os_components/#native-php-configuration", - "/ru/native_php_configuration.html": "/ru/cloudlinux_os_components/#native-php-configuration", - "/ru/index.html?native_php_configuration.html": "/ru/cloudlinux_os_components/#native-php-configuration", - "/ru/php_selector/#native-php": "/ru/cloudlinux_os_components/#native-php-configuration", - "/ru/php_selector_command_line_tools.html/": "/ru/command-line_tools/#php-selector", - "/ru/php_selector_command_line_tools.html": "/ru/command-line_tools/#php-selector", - "/ru/index.html?php_selector_command_line_tools.html": "/ru/command-line_tools/#php-selector", - "/ru/php_selector/#command-line-tools": "/ru/command-line_tools/#php-selector", - "/ru/selectorctl.html/": "/ru/command-line_tools/#selectorctl", - "/ru/selectorctl.html": "/ru/command-line_tools/#selectorctl", - "/ru/index.html?selectorctl.html": "/ru/command-line_tools/#selectorctl", - "/ru/php_selector/#selectorctl": "/ru/command-line_tools/#selectorctl", - "/ru/integrating_with_control_panel.html/": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/integrating_with_control_panel.html": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/index.html?integrating_with_control_panel.html": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/php_selector/#integrating-with-control-panels": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/removing_php_selector.html/": "/ru/cloudlinux_os_components/#uninstalling-3", - "/ru/removing_php_selector.html": "/ru/cloudlinux_os_components/#uninstalling-3", - "/ru/index.html?removing_php_selector.html": "/ru/cloudlinux_os_components/#uninstalling-3", - "/ru/php_selector/#removing": "/ru/cloudlinux_os_components/#uninstalling-3", - "/ru/using_php_selector.html/": "/ru/cloudlinux_os_components/#using", - "/ru/using_php_selector.html": "/ru/cloudlinux_os_components/#using", - "/ru/index.html?using_php_selector.html": "/ru/cloudlinux_os_components/#using", - "/ru/php_selector/#using": "/ru/cloudlinux_os_components/#using", - "/ru/custom_php_ini_options.html/": "/ru/cloudlinux_os_components/#custom-php-ini-options", - "/ru/custom_php_ini_options.html": "/ru/cloudlinux_os_components/#custom-php-ini-options", - "/ru/index.html?custom_php_ini_options.html": "/ru/cloudlinux_os_components/#custom-php-ini-options", - "/ru/php_selector/#custom-php-ini-options": "/ru/cloudlinux_os_components/#custom-php-ini-options", - "/ru/end_user_directories.html/": "/ru/cloudlinux_os_components/#end-user-files-and-directories", - "/ru/end_user_directories.html": "/ru/cloudlinux_os_components/#end-user-files-and-directories", - "/ru/index.html?end_user_directories.html": "/ru/cloudlinux_os_components/#end-user-files-and-directories", - "/ru/php_selector/#end-user-files-and-directories": "/ru/cloudlinux_os_components/#end-user-files-and-directories", - "/ru/compiling_your_own_extensions.html/": "/ru/cloudlinux_os_components/#compiling-your-own-extensions", - "/ru/compiling_your_own_extensions.html": "/ru/cloudlinux_os_components/#compiling-your-own-extensions", - "/ru/index.html?compiling_your_own_extensions.html": "/ru/cloudlinux_os_components/#compiling-your-own-extensions", - "/ru/php_selector/#compiling-your-own-extensions": "/ru/cloudlinux_os_components/#compiling-your-own-extensions", - "/ru/roll_your_own_php.html/": "/ru/cloudlinux_os_components/#roll-your-own-php", - "/ru/roll_your_own_php.html": "/ru/cloudlinux_os_components/#roll-your-own-php", - "/ru/index.html?roll_your_own_php.html": "/ru/cloudlinux_os_components/#roll-your-own-php", - "/ru/php_selector/#roll-your-own-php": "/ru/cloudlinux_os_components/#roll-your-own-php", - "/ru/detect_users_php_version.html/": "/ru/cloudlinux_os_components/#detect-user-s-php-version", - "/ru/detect_users_php_version.html": "/ru/cloudlinux_os_components/#detect-user-s-php-version", - "/ru/index.html?detect_users_php_version.html": "/ru/cloudlinux_os_components/#detect-user-s-php-version", - "/ru/php_selector/#detect-user-s-php-version": "/ru/cloudlinux_os_components/#detect-user-s-php-version", - "/ru/php_selector_without_cagefs.html/": "/ru/cloudlinux_os_components/#php-selector-without-cagefs", - "/ru/php_selector_without_cagefs.html": "/ru/cloudlinux_os_components/#php-selector-without-cagefs", - "/ru/index.html?php_selector_without_cagefs.html": "/ru/cloudlinux_os_components/#php-selector-without-cagefs", - "/ru/php_selector/#php-selector": "/ru/cloudlinux_os_components/#php-selector-without-cagefs", - "/ru/configuring_global_php_ini_opt.html/": "/ru/cloudlinux_os_components/#configuring-global-php-ini-options-for-all-alt-php-versions", - "/ru/configuring_global_php_ini_opt.html": "/ru/cloudlinux_os_components/#configuring-global-php-ini-options-for-all-alt-php-versions", - "/ru/index.html?configuring_global_php_ini_opt.html": "/ru/cloudlinux_os_components/#configuring-global-php-ini-options-for-all-alt-php-versions", - "/ru/php_selector/#configuring": "/ru/cloudlinux_os_components/#configuring-global-php-ini-options-for-all-alt-php-versions", - "/ru/bundled_php_extensions.html/": "/ru/cloudlinux_os_components/#bundled-php-extensions", - "/ru/bundled_php_extensions.html": "/ru/cloudlinux_os_components/#bundled-php-extensions", - "/ru/index.html?bundled_php_extensions.html": "/ru/cloudlinux_os_components/#bundled-php-extensions", - "/ru/php_selector/#bundled-php-extensions": "/ru/cloudlinux_os_components/#bundled-php-extensions", - "/ru/php_4_4_extensions.html/": "/ru/cloudlinux_os_components/#php-4-4-extensions", - "/ru/php_4_4_extensions.html": "/ru/cloudlinux_os_components/#php-4-4-extensions", - "/ru/index.html?php_4_4_extensions.html": "/ru/cloudlinux_os_components/#php-4-4-extensions", - "/ru/php_selector/#php-4-4-extensions": "/ru/cloudlinux_os_components/#php-4-4-extensions", - "/ru/php_5_1_extensions.html/": "/ru/cloudlinux_os_components/#php-5-1-extensions", - "/ru/php_5_1_extensions.html": "/ru/cloudlinux_os_components/#php-5-1-extensions", - "/ru/index.html?php_5_1_extensions.html": "/ru/cloudlinux_os_components/#php-5-1-extensions", - "/ru/php_selector/#php-5-1-extensions": "/ru/cloudlinux_os_components/#php-5-1-extensions", - "/ru/php_5_2_extensions.html/": "/ru/cloudlinux_os_components/#php-5-2-extensions", - "/ru/php_5_2_extensions.html": "/ru/cloudlinux_os_components/#php-5-2-extensions", - "/ru/index.html?php_5_2_extensions.html": "/ru/cloudlinux_os_components/#php-5-2-extensions", - "/ru/php_selector/#php-5-2-extensions": "/ru/cloudlinux_os_components/#php-5-2-extensions", - "/ru/php_5_3_extensions.html/": "/ru/cloudlinux_os_components/#php-5-3-extensions", - "/ru/php_5_3_extensions.html": "/ru/cloudlinux_os_components/#php-5-3-extensions", - "/ru/index.html?php_5_3_extensions.html": "/ru/cloudlinux_os_components/#php-5-3-extensions", - "/ru/php_selector/#php-5-3-extensions": "/ru/cloudlinux_os_components/#php-5-3-extensions", - "/ru/php_5_4_extensions.html/": "/ru/cloudlinux_os_components/#php-5-4-extensions", - "/ru/php_5_4_extensions.html": "/ru/cloudlinux_os_components/#php-5-4-extensions", - "/ru/index.html?php_5_4_extensions.html": "/ru/cloudlinux_os_components/#php-5-4-extensions", - "/ru/php_selector/#php-5-4-extensions": "/ru/cloudlinux_os_components/#php-5-4-extensions", - "/ru/php_5_5_extensions.html/": "/ru/cloudlinux_os_components/#php-5-5-extensions", - "/ru/php_5_5_extensions.html": "/ru/cloudlinux_os_components/#php-5-5-extensions", - "/ru/index.html?php_5_5_extensions.html": "/ru/cloudlinux_os_components/#php-5-5-extensions", - "/ru/php_selector/#php-5-5-extensions": "/ru/cloudlinux_os_components/#php-5-5-extensions", - "/ru/php_5_6_extensions.html/": "/ru/cloudlinux_os_components/#php-5-6-extensions", - "/ru/php_5_6_extensions.html": "/ru/cloudlinux_os_components/#php-5-6-extensions", - "/ru/index.html?php_5_6_extensions.html": "/ru/cloudlinux_os_components/#php-5-6-extensions", - "/ru/php_selector/#php-5-6-extensions": "/ru/cloudlinux_os_components/#php-5-6-extensions", - "/ru/php_7_0_extensions.html/": "/ru/cloudlinux_os_components/#php-7-0-extensions", - "/ru/php_7_0_extensions.html": "/ru/cloudlinux_os_components/#php-7-0-extensions", - "/ru/index.html?php_7_0_extensions.html": "/ru/cloudlinux_os_components/#php-7-0-extensions", - "/ru/php_selector/#php-7-0-extensions": "/ru/cloudlinux_os_components/#php-7-0-extensions", - "/ru/php_7_1_extensions.html/": "/ru/cloudlinux_os_components/#php-7-1-extensions", - "/ru/php_7_1_extensions.html": "/ru/cloudlinux_os_components/#php-7-1-extensions", - "/ru/index.html?php_7_1_extensions.html": "/ru/cloudlinux_os_components/#php-7-1-extensions", - "/ru/php_selector/#php-7-1-extensions": "/ru/cloudlinux_os_components/#php-7-1-extensions", - "/ru/php_7_2_extensions.html/": "/ru/cloudlinux_os_components/#php-7-2-extensions", - "/ru/php_7_2_extensions.html": "/ru/cloudlinux_os_components/#php-7-2-extensions", - "/ru/index.html?php_7_2_extensions.html": "/ru/cloudlinux_os_components/#php-7-2-extensions", - "/ru/php_selector/#php-7-2-extensions": "/ru/cloudlinux_os_components/#php-7-2-extensions", - "/ru/php-7_3-extensions.html/": "/ru/cloudlinux_os_components/#php-7-3-extensions", - "/ru/php-7_3-extensions.html": "/ru/cloudlinux_os_components/#php-7-3-extensions", - "/ru/index.html?php-7_3-extensions.html": "/ru/cloudlinux_os_components/#php-7-3-extensions", - "/ru/php_selector/#php-7-3-extensions": "/ru/cloudlinux_os_components/#php-7-3-extensions", - "/ru/disable_php_extensions.html/": "/ru/cloudlinux_os_components/#disabling-php-extension-globally", - "/ru/disable_php_extensions.html": "/ru/cloudlinux_os_components/#disabling-php-extension-globally", - "/ru/index.html?disable_php_extensions.html": "/ru/cloudlinux_os_components/#disabling-php-extension-globally", - "/ru/php_selector/#disabling-php-extension-globally": "/ru/cloudlinux_os_components/#disabling-php-extension-globally", - "/ru/php_selector_control_panel_integration.html/": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/php_selector_control_panel_integration.html": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/index.html?php_selector_control_panel_integration.html": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/php_selector/#control-panel-integration": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/php_selector_cpanel.html/": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/php_selector_cpanel.html": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/index.html?php_selector_cpanel.html": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/php_selector/#php-selector": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/python_and_ruby_selector/": "/ru/cloudlinux_os_components/#python-selector", - "/ru/python_and_ruby_selector.html/": "/ru/cloudlinux_os_components/#python-selector", - "/ru/python_and_ruby_selector.html": "/ru/cloudlinux_os_components/#python-selector", - "/ru/index.html?python_and_ruby_selector.html": "/ru/cloudlinux_os_components/#python-selector", - "/ru/python_selector/": "/ru/cloudlinux_os_components/#python_selector/", - "/ru/python_ruby_installation.html/": "/ru/cloudlinux_os_components/#installation-2", - "/ru/python_ruby_installation.html": "/ru/cloudlinux_os_components/#installation-2", - "/ru/index.html?python_ruby_installation.html": "/ru/cloudlinux_os_components/#installation-2", - "/ru/python_selector/#installation": "/ru/cloudlinux_os_components/#installation-2", - "/ru/end_user_access.html/": "/ru/cloudlinux_os_components/#end-user-access", - "/ru/end_user_access.html": "/ru/cloudlinux_os_components/#end-user-access", - "/ru/index.html?end_user_access.html": "/ru/cloudlinux_os_components/#end-user-access", - "/ru/python_selector/#user-interface": "/ru/cloudlinux_os_components/#end-user-access", - "/ru/python_ruby_command_line.html/": "/ru/command-line_tools/#python-selector", - "/ru/python_ruby_command_line.html": "/ru/command-line_tools/#python-selector", - "/ru/index.html?python_ruby_command_line.html": "/ru/command-line_tools/#python-selector", - "/ru/python_selector/#command-line-interface": "/ru/command-line_tools/#python-selector", - "/ru/hide_python_ruby_selector.html/": "/ru/cloudlinux_os_components/#hide-ruby-selector-icon", - "/ru/hide_python_ruby_selector.html": "/ru/cloudlinux_os_components/#hide-ruby-selector-icon", - "/ru/index.html?hide_python_ruby_selector.html": "/ru/cloudlinux_os_components/#hide-ruby-selector-icon", - "/ru/ruby_selector/#hide-ruby-selector-icons": "/ru/cloudlinux_os_components/#hide-ruby-selector-icon", - "/ru/trac.html/": "/ru/cloudlinux_os_components/#deploying-trac-using-python-selector", - "/ru/trac.html": "/ru/cloudlinux_os_components/#deploying-trac-using-python-selector", - "/ru/index.html?trac.html": "/ru/cloudlinux_os_components/#deploying-trac-using-python-selector", - "/ru/python_selector/#deploying-trac-using-python-selector": "/ru/cloudlinux_os_components/#deploying-trac-using-python-selector", - "/ru/trac_with_mysql.html/": "/ru/cloudlinux_os_components/#trac-with-mysql", - "/ru/trac_with_mysql.html": "/ru/cloudlinux_os_components/#trac-with-mysql", - "/ru/index.html?trac_with_mysql.html": "/ru/cloudlinux_os_components/#trac-with-mysql", - "/ru/python_selector/#trac-with-mysql": "/ru/cloudlinux_os_components/#trac-with-mysql", - "/ru/redmine.html/": "/ru/cloudlinux_os_components/#deploying-redmine-using-ruby-selector", - "/ru/redmine.html": "/ru/cloudlinux_os_components/#deploying-redmine-using-ruby-selector", - "/ru/index.html?redmine.html": "/ru/cloudlinux_os_components/#deploying-redmine-using-ruby-selector", - "/ru/ruby_selector/#deploying-redmine-using-ruby-selector": "/ru/cloudlinux_os_components/#deploying-redmine-using-ruby-selector", - "/ru/easy_apache_4.html/": "/ru/cloudlinux_os_components/#easyapache-4", - "/ru/easy_apache_4.html": "/ru/cloudlinux_os_components/#easyapache-4", - "/ru/index.html?easy_apache_4.html": "/ru/cloudlinux_os_components/#easyapache-4", - "/ru/python_selector/#easyapache-4": "/ru/cloudlinux_os_components/#easyapache-4", - "/ru/node_js_selector.html/": "/ru/cloudlinux_os_components/#node-js-selector", - "/ru/node_js_selector.html": "/ru/cloudlinux_os_components/#node-js-selector", - "/ru/index.html?node_js_selector.html": "/ru/cloudlinux_os_components/#node-js-selector", - "/ru/node_js_selector/": "/ru/cloudlinux_os_components/#node-js-selector", - "/ru/overview__requirements.html/": "/ru/cloudlinux_os_components/#general-information-and-requirements-8", - "/ru/overview__requirements.html": "/ru/cloudlinux_os_components/#general-information-and-requirements-8", - "/ru/index.html?overview__requirements.html": "/ru/cloudlinux_os_components/#general-information-and-requirements-8", - "/ru/node_js_selector/#overview-requirements": "/ru/cloudlinux_os_components/#general-information-and-requirements-8", - "/ru/installation.html/": "/ru/cloudlinux_os_components/#installation-and-update-7", - "/ru/installation.html": "/ru/cloudlinux_os_components/#installation-and-update-7", - "/ru/index.html?installation.html": "/ru/cloudlinux_os_components/#installation-and-update-7", - "/ru/node_js_selector/#installation": "/ru/cloudlinux_os_components/#installation-and-update-7", - "/ru/command_line_interface2.html/": "/ru/command-line_tools/#node-js-selector", - "/ru/command_line_interface2.html": "/ru/command-line_tools/#node-js-selector", - "/ru/index.html?command_line_interface2.html": "/ru/command-line_tools/#node-js-selector", - "/ru/node_js_selector/#command-line-interface": "/ru/command-line_tools/#node-js-selector", - "/ru/user_interface.html/": "/ru/lve_manager/#end-user-2", - "/ru/user_interface.html": "/ru/lve_manager/#end-user-2", - "/ru/index.html?user_interface.html": "/ru/lve_manager/#end-user-2", - "/ru/node_js_selector/#user-interface": "/ru/lve_manager/#end-user-2", - "/ru/node_js_deployment.html/": "/ru/cloudlinux_os_components/#node-js-deployment", - "/ru/node_js_deployment.html": "/ru/cloudlinux_os_components/#node-js-deployment", - "/ru/index.html?node_js_deployment.html": "/ru/cloudlinux_os_components/#node-js-deployment", - "/ru/node_js_selector/#node-js-deployment": "/ru/cloudlinux_os_components/#node-js-deployment", - "/ru/remote_usage_of_node_js_interp.html/": "/ru/cloudlinux_os_components/#remote-usage-of-node-js-interpreters", - "/ru/remote_usage_of_node_js_interp.html": "/ru/cloudlinux_os_components/#remote-usage-of-node-js-interpreters", - "/ru/index.html?remote_usage_of_node_js_interp.html": "/ru/cloudlinux_os_components/#remote-usage-of-node-js-interpreters", - "/ru/node_js_selector/#remote-usage-of-node-js-interpreters": "/ru/cloudlinux_os_components/#remote-usage-of-node-js-interpreters", - "/ru/remote_usage_of_the_cloudlinux.html/": "/ru/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility", - "/ru/remote_usage_of_the_cloudlinux.html": "/ru/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility", - "/ru/index.html?remote_usage_of_the_cloudlinux.html": "/ru/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility", - "/ru/node_js_selector/#remote-usage-of-the-cloudlinux-selector-utility": "/ru/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility", - "/ru/lve_manager/#inodes/": "/ru/limits/#inodes/", - "/ru/inodes_limits.html/": "/ru/limits/#inodes/", - "/ru/inodes_limits.html": "/ru/limits/#inodes/", - "/ru/index.html?inodes_limits.html": "/ru/limits/#inodes/", - "/ru/inodes_limits/": "/ru/limits/#inodes/", - "/ru/cl_quota.html/": "/ru/command-line_tools/#cl-quota", - "/ru/cl_quota.html": "/ru/command-line_tools/#cl-quota", - "/ru/index.html?cl_quota.html": "/ru/command-line_tools/#cl-quota", - "/ru/inodes_limits/#cl-quota": "/ru/command-line_tools/#cl-quota", - "/ru/cl-quota_general.html/": "/ru/command-line_tools/#general-provisions", - "/ru/cl-quota_general.html": "/ru/command-line_tools/#general-provisions", - "/ru/index.html?cl-quota_general.html": "/ru/command-line_tools/#general-provisions", - "/ru/inodes_limits/#general-provisions": "/ru/command-line_tools/#general-provisions", - "/ru/set_limits_and_integration.html/": "/ru/lve_manager/#setting-limits-and-integration-with-panel-packages", - "/ru/set_limits_and_integration.html": "/ru/lve_manager/#setting-limits-and-integration-with-panel-packages", - "/ru/index.html?set_limits_and_integration.html": "/ru/lve_manager/#setting-limits-and-integration-with-panel-packages", - "/ru/inodes_limits/#setting-limits-and-integration-with-panel-packages": "/ru/lve_manager/#setting-limits-and-integration-with-panel-packages", - "/ru/inheritance.html/": "/ru/command-line_tools/#limits-inheritance", - "/ru/inheritance.html": "/ru/command-line_tools/#limits-inheritance", - "/ru/index.html?inheritance.html": "/ru/command-line_tools/#limits-inheritance", - "/ru/inodes_limits/#limits-inheritance": "/ru/command-line_tools/#limits-inheritance", - "/ru/cache_synchronize.html/": "/ru/command-line_tools/#caching-and-synchronizing-the-limits", - "/ru/cache_synchronize.html": "/ru/command-line_tools/#caching-and-synchronizing-the-limits", - "/ru/index.html?cache_synchronize.html": "/ru/command-line_tools/#caching-and-synchronizing-the-limits", - "/ru/inodes_limits/#caching-and-synchronizing-the-limits": "/ru/command-line_tools/#caching-and-synchronizing-the-limits", - "/ru/db_file.html/": "/ru/command-line_tools/#quotas-db-file", - "/ru/db_file.html": "/ru/command-line_tools/#quotas-db-file", - "/ru/index.html?db_file.html": "/ru/command-line_tools/#quotas-db-file", - "/ru/inodes_limits/#quotas-db-file": "/ru/command-line_tools/#quotas-db-file", - "/ru/cli_examples.html/": "/ru/command-line_tools/#cli-options-examples", - "/ru/cli_examples.html": "/ru/command-line_tools/#cli-options-examples", - "/ru/index.html?cli_examples.html": "/ru/command-line_tools/#cli-options-examples", - "/ru/inodes_limits/#cli-options-examples": "/ru/command-line_tools/#cli-options-examples", - "/ru/kernel_settings.html/": "/ru/cloudlinux_os_kernel/", - "/ru/kernel_settings.html": "/ru/cloudlinux_os_kernel/", - "/ru/index.html?kernel_settings.html": "/ru/cloudlinux_os_kernel/", - "/ru/kernel_settings/": "/ru/cloudlinux_os_kernel/", - "/ru/kernel_config_variables.html/": "/ru/cloudlinux_os_kernel/#kernel-config-variables", - "/ru/kernel_config_variables.html": "/ru/cloudlinux_os_kernel/#kernel-config-variables", - "/ru/index.html?kernel_config_variables.html": "/ru/cloudlinux_os_kernel/#kernel-config-variables", - "/ru/kernel_settings/#kernel-config-variables": "/ru/cloudlinux_os_kernel/#kernel-config-variables", - "/ru/virtualized_proc_filesystem.html/": "/ru/cloudlinux_os_kernel/#virtualized-proc-filesystem", - "/ru/virtualized_proc_filesystem.html": "/ru/cloudlinux_os_kernel/#virtualized-proc-filesystem", - "/ru/index.html?virtualized_proc_filesystem.html": "/ru/cloudlinux_os_kernel/#virtualized-proc-filesystem", - "/ru/kernel_settings/#virtualized-proc-filesystem": "/ru/cloudlinux_os_kernel/#virtualized-proc-filesystem", - "/ru/securelinks.html/": "/ru/cloudlinux_os_kernel/#securelinks", - "/ru/securelinks.html": "/ru/cloudlinux_os_kernel/#securelinks", - "/ru/index.html?securelinks.html": "/ru/cloudlinux_os_kernel/#securelinks", - "/ru/kernel_settings/#securelinks": "/ru/cloudlinux_os_kernel/#securelinks", - "/ru/symlink_owner_match_protection.html/": "/ru/cloudlinux_os_kernel/#symlink-owner-match-protection", - "/ru/symlink_owner_match_protection.html": "/ru/cloudlinux_os_kernel/#symlink-owner-match-protection", - "/ru/index.html?symlink_owner_match_protection.html": "/ru/cloudlinux_os_kernel/#symlink-owner-match-protection", - "/ru/kernel_settings/#symlink-owner-match-protection": "/ru/cloudlinux_os_kernel/#symlink-owner-match-protection", - "/ru/link_traversal_protection.html/": "/ru/cloudlinux_os_kernel/#link-traversal-protection", - "/ru/link_traversal_protection.html": "/ru/cloudlinux_os_kernel/#link-traversal-protection", - "/ru/index.html?link_traversal_protection.html": "/ru/cloudlinux_os_kernel/#link-traversal-protection", - "/ru/kernel_settings/#link-traversal-protection": "/ru/cloudlinux_os_kernel/#link-traversal-protection", - "/ru/ptrace_block.html/": "/ru/cloudlinux_os_kernel/#ptrace-block", - "/ru/ptrace_block.html": "/ru/cloudlinux_os_kernel/#ptrace-block", - "/ru/index.html?ptrace_block.html": "/ru/cloudlinux_os_kernel/#ptrace-block", - "/ru/kernel_settings/#ptrace-block": "/ru/cloudlinux_os_kernel/#ptrace-block", - "/ru/xen_xvda_detection.html/": "/ru/cloudlinux_os_kernel/#xen-xvda", - "/ru/xen_xvda_detection.html": "/ru/cloudlinux_os_kernel/#xen-xvda", - "/ru/index.html?xen_xvda_detection.html": "/ru/cloudlinux_os_kernel/#xen-xvda", - "/ru/kernel_settings/#xen-xvda": "/ru/cloudlinux_os_kernel/#xen-xvda", - "/ru/tpe_extension.html/": "/ru/deprecated/#tpe-extension", - "/ru/tpe_extension.html": "/ru/deprecated/#tpe-extension", - "/ru/index.html?tpe_extension.html": "/ru/deprecated/#tpe-extension", - "/ru/kernel_settings/#tpe-extension-deprecated": "/ru/deprecated/#tpe-extension", - "/ru/iolimits_latency.html/": "/ru/cloudlinux_os_kernel/#io-limits-latency", - "/ru/iolimits_latency.html": "/ru/cloudlinux_os_kernel/#io-limits-latency", - "/ru/index.html?iolimits_latency.html": "/ru/cloudlinux_os_kernel/#io-limits-latency", - "/ru/kernel_settings/#io": "/ru/cloudlinux_os_kernel/#io-limits-latency", - "/ru/hybrid_kernel.html/": "/ru/cloudlinux_os_kernel/#hybrid-kernels", - "/ru/hybrid_kernel.html": "/ru/cloudlinux_os_kernel/#hybrid-kernels", - "/ru/index.html?hybrid_kernel.html": "/ru/cloudlinux_os_kernel/#hybrid-kernels", - "/ru/kernel_settings/#hybrid-kernel": "/ru/cloudlinux_os_kernel/#hybrid-kernels", - "/ru/reading_lve_usage.html/": "/ru/cloudlinux_os_kernel/#reading-lve-usage", - "/ru/reading_lve_usage.html": "/ru/cloudlinux_os_kernel/#reading-lve-usage", - "/ru/index.html?reading_lve_usage.html": "/ru/cloudlinux_os_kernel/#reading-lve-usage", - "/ru/kernel_settings/#reading": "/ru/cloudlinux_os_kernel/#reading-lve-usage", - "/ru/flashcache.html/": "/ru/cloudlinux_os_kernel/#flashcache", - "/ru/flashcache.html": "/ru/cloudlinux_os_kernel/#flashcache", - "/ru/index.html?flashcache.html": "/ru/cloudlinux_os_kernel/#flashcache", - "/ru/kernel_settings/#flashcache": "/ru/cloudlinux_os_kernel/#flashcache", - "/ru/oom_killer_for_lve_processes.html/": "/ru/cloudlinux_os_kernel/#oom-killer-for-lve-processes", - "/ru/oom_killer_for_lve_processes.html": "/ru/cloudlinux_os_kernel/#oom-killer-for-lve-processes", - "/ru/index.html?oom_killer_for_lve_processes.html": "/ru/cloudlinux_os_kernel/#oom-killer-for-lve-processes", - "/ru/kernel_settings/#oom-killer": "/ru/cloudlinux_os_kernel/#oom-killer-for-lve-processes", - "/ru/file_system_quotas.html/": "/ru/cloudlinux_os_kernel/#file-system-quotas", - "/ru/file_system_quotas.html": "/ru/cloudlinux_os_kernel/#file-system-quotas", - "/ru/index.html?file_system_quotas.html": "/ru/cloudlinux_os_kernel/#file-system-quotas", - "/ru/kernel_settings/#file-system-quotas": "/ru/cloudlinux_os_kernel/#file-system-quotas", - "/ru/apache_mod_lsapi.html/": "/ru/cloudlinux_os_components/#apache-mod-lsapi-pro/", - "/ru/apache_mod_lsapi.html": "/ru/cloudlinux_os_components/#apache-mod-lsapi-pro/", - "/ru/index.html?apache_mod_lsapi.html": "/ru/cloudlinux_os_components/#apache-mod-lsapi-pro/", - "/ru/apache_mod_lsapi/": "/ru/cloudlinux_os_components/#apache-mod-lsapi-pro/", - "/ru/configuration-references.html/": "/ru/cloudlinux_os_components/#configuration-5", - "/ru/configuration-references.html": "/ru/cloudlinux_os_components/#configuration-5", - "/ru/index.html?configuration-references.html": "/ru/cloudlinux_os_components/#configuration-5", - "/ru/apache_mod_lsapi/#configuration-references": "/ru/cloudlinux_os_components/#configuration-5", - "/ru/mod_lsapi_installation.html/": "/ru/cloudlinux_os_components/#installation-3", - "/ru/mod_lsapi_installation.html": "/ru/cloudlinux_os_components/#installation-3", - "/ru/index.html?mod_lsapi_installation.html": "/ru/cloudlinux_os_components/#installation-3", - "/ru/apache_mod_lsapi/#installation": "/ru/cloudlinux_os_components/#installation-3", - "/ru/cpanel2.html/": "/ru/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4", - "/ru/cpanel2.html": "/ru/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4", - "/ru/index.html?cpanel2.html": "/ru/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4", - "/ru/apache_mod_lsapi/#cpanel": "/ru/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4", - "/ru/plesk2.html/": "/ru/cloudlinux_os_components/#installing-on-plesk-servers", - "/ru/plesk2.html": "/ru/cloudlinux_os_components/#installing-on-plesk-servers", - "/ru/index.html?plesk2.html": "/ru/cloudlinux_os_components/#installing-on-plesk-servers", - "/ru/apache_mod_lsapi/#plesk": "/ru/cloudlinux_os_components/#installing-on-plesk-servers", - "/ru/directadmin.html/": "/ru/cloudlinux_os_components/#installing-on-directadmin-servers", - "/ru/directadmin.html": "/ru/cloudlinux_os_components/#installing-on-directadmin-servers", - "/ru/index.html?directadmin.html": "/ru/cloudlinux_os_components/#installing-on-directadmin-servers", - "/ru/apache_mod_lsapi/#directadmin": "/ru/cloudlinux_os_components/#installing-on-directadmin-servers", - "/ru/no-control-panel.html/": "/ru/cloudlinux_os_components/#installing-on-servers-with-no-control-panel", - "/ru/no-control-panel.html": "/ru/cloudlinux_os_components/#installing-on-servers-with-no-control-panel", - "/ru/index.html?no-control-panel.html": "/ru/cloudlinux_os_components/#installing-on-servers-with-no-control-panel", - "/ru/apache_mod_lsapi/#no-control-panel": "/ru/cloudlinux_os_components/#installing-on-servers-with-no-control-panel", - "/ru/uninstall_mod_lsapi.html/": "/ru/cloudlinux_os_components/#uninstalling-4", - "/ru/uninstall_mod_lsapi.html": "/ru/cloudlinux_os_components/#uninstalling-4", - "/ru/index.html?uninstall_mod_lsapi.html": "/ru/cloudlinux_os_components/#uninstalling-4", - "/ru/apache_mod_lsapi/#uninstall": "/ru/cloudlinux_os_components/#uninstalling-4", - "/ru/cpanel3.html/": "/ru/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4", - "/ru/cpanel3.html": "/ru/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4", - "/ru/index.html?cpanel3.html": "/ru/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4", - "/ru/apache_mod_lsapi/#cpanel": "/ru/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4", - "/ru/plesk3.html/": "/ru/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers", - "/ru/plesk3.html": "/ru/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers", - "/ru/index.html?plesk3.html": "/ru/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers", - "/ru/apache_mod_lsapi/#plesk": "/ru/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers", - "/ru/directadmin2.html/": "/ru/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers", - "/ru/directadmin2.html": "/ru/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers", - "/ru/index.html?directadmin2.html": "/ru/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers", - "/ru/apache_mod_lsapi/#directadmin": "/ru/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers", - "/ru/no-control-panel2.html/": "/ru/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel", - "/ru/no-control-panel2.html": "/ru/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel", - "/ru/index.html?no-control-panel2.html": "/ru/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel", - "/ru/apache_mod_lsapi/#no-control-panel": "/ru/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel", - "/ru/switch_mod_lsapi-tool.html/": "/ru/command-line_tools/#apache-mod-lsapi-pro", - "/ru/switch_mod_lsapi-tool.html": "/ru/command-line_tools/#apache-mod-lsapi-pro", - "/ru/index.html?switch_mod_lsapi-tool.html": "/ru/command-line_tools/#apache-mod-lsapi-pro", - "/ru/apache_mod_lsapi/#switch-mod-lsapi-tool": "/ru/command-line_tools/#apache-mod-lsapi-pro", - "/ru/mod_lsapi_troubleshooting.html/": "/ru/cloudlinux_os_components/#troubleshooting-4", - "/ru/mod_lsapi_troubleshooting.html": "/ru/cloudlinux_os_components/#troubleshooting-4", - "/ru/index.html?mod_lsapi_troubleshooting.html": "/ru/cloudlinux_os_components/#troubleshooting-4", - "/ru/apache_mod_lsapi/#troubleshooting": "/ru/cloudlinux_os_components/#troubleshooting-4", - "/ru/mod_lsapi_faq.html/": "https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ", - "/ru/mod_lsapi_faq.html": "https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ", - "/ru/index.html?mod_lsapi_faq.html": "https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ", - "/ru/apache_mod_lsapi/#faq-on-mod-lsapi": "https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ", - "/ru/criu_support.html/": "/ru/cloudlinux_os_components/#criu-support", - "/ru/criu_support.html": "/ru/cloudlinux_os_components/#criu-support", - "/ru/index.html?criu_support.html": "/ru/cloudlinux_os_components/#criu-support", - "/ru/apache_mod_lsapi/#criu-support": "/ru/cloudlinux_os_components/#criu-support", - "/ru/cloudlinux-fchange.html/": "/ru/cloudlinux_os_kernel/#file-change-api", - "/ru/cloudlinux-fchange.html": "/ru/cloudlinux_os_kernel/#file-change-api", - "/ru/index.html?cloudlinux-fchange.html": "/ru/cloudlinux_os_kernel/#file-change-api", - "/ru/cloudlinux-fchange/": "/ru/cloudlinux_os_kernel/#file-change-api", - "/ru/general.html/": "/ru/cloudlinux_os_kernel/#general", - "/ru/general.html": "/ru/cloudlinux_os_kernel/#general", - "/ru/index.html?general.html": "/ru/cloudlinux_os_kernel/#general", - "/ru/cloudlinux-fchange/#general": "/ru/cloudlinux_os_kernel/#general", - "/ru/usage_and_integration.html/": "/ru/cloudlinux_os_kernel/#usage-and-integration", - "/ru/usage_and_integration.html": "/ru/cloudlinux_os_kernel/#usage-and-integration", - "/ru/index.html?usage_and_integration.html": "/ru/cloudlinux_os_kernel/#usage-and-integration", - "/ru/cloudlinux-fchange/#usage-and-integration": "/ru/cloudlinux_os_kernel/#usage-and-integration", - "/ru/installation_and_configuration.html/": "/ru/cloudlinux_os_kernel/#installation-and-configuration", - "/ru/installation_and_configuration.html": "/ru/cloudlinux_os_kernel/#installation-and-configuration", - "/ru/index.html?installation_and_configuration.html": "/ru/cloudlinux_os_kernel/#installation-and-configuration", - "/ru/cloudlinux-fchange/#installation-and-configuration": "/ru/cloudlinux_os_kernel/#installation-and-configuration", - "/ru/configuration_details.html/": "/ru/cloudlinux_os_kernel/#configuration-details", - "/ru/configuration_details.html": "/ru/cloudlinux_os_kernel/#configuration-details", - "/ru/index.html?configuration_details.html": "/ru/cloudlinux_os_kernel/#configuration-details", - "/ru/cloudlinux-fchange/#configuration-details": "/ru/cloudlinux_os_kernel/#configuration-details", - "/ru/low-level_access.html/": "/ru/cloudlinux_os_kernel/#low-level-access", - "/ru/low-level_access.html": "/ru/cloudlinux_os_kernel/#low-level-access", - "/ru/index.html?low-level_access.html": "/ru/cloudlinux_os_kernel/#low-level-access", - "/ru/cloudlinux-fchange/#low-level-access": "/ru/cloudlinux_os_kernel/#low-level-access", - "/ru/mod_proctitle.html/": "/ru/cloudlinux_os_components/#mod-proctitle", - "/ru/mod_proctitle.html": "/ru/cloudlinux_os_components/#mod-proctitle", - "/ru/index.html?mod_proctitle.html": "/ru/cloudlinux_os_components/#mod-proctitle", - "/ru/mod_proctitle/": "/ru/cloudlinux_os_components/#mod-proctitle", - "/ru/mod_proctitle_info.html/": "/ru/cloudlinux_os_components/#how-to-read-mod-proctitle-information", - "/ru/mod_proctitle_info.html": "/ru/cloudlinux_os_components/#how-to-read-mod-proctitle-information", - "/ru/index.html?mod_proctitle_info.html": "/ru/cloudlinux_os_components/#how-to-read-mod-proctitle-information", - "/ru/mod_proctitle/#how-to-read": "/ru/cloudlinux_os_components/#how-to-read-mod-proctitle-information", - "/ru/tuning_parameters.html/": "/ru/cloudlinux_os_components/#tuning-parameters", - "/ru/tuning_parameters.html": "/ru/cloudlinux_os_components/#tuning-parameters", - "/ru/index.html?tuning_parameters.html": "/ru/cloudlinux_os_components/#tuning-parameters", - "/ru/mod_proctitle/#tuning-parameters": "/ru/cloudlinux_os_components/#tuning-parameters", - "/ru/additional_packages.html/": "/ru/cloudlinux_os_components/#additional-integration-components", - "/ru/additional_packages.html": "/ru/cloudlinux_os_components/#additional-integration-components", - "/ru/index.html?additional_packages.html": "/ru/cloudlinux_os_components/#additional-integration-components", - "/ru/additional_packages/": "/ru/cloudlinux_os_components/#additional-integration-components", - "/ru/alt-suexec.html/": "/ru/cloudlinux_os_components/#alt-suexec", - "/ru/alt-suexec.html": "/ru/cloudlinux_os_components/#alt-suexec", - "/ru/index.html?alt-suexec.html": "/ru/cloudlinux_os_components/#alt-suexec", - "/ru/additional_packages/#alt-suexec": "/ru/cloudlinux_os_components/#alt-suexec", - "/ru/tuned-profiles-cloudlinux.html/": "/ru/cloudlinux_os_kernel/#tuned-profiles-cloudlinux", - "/ru/tuned-profiles-cloudlinux.html": "/ru/cloudlinux_os_kernel/#tuned-profiles-cloudlinux", - "/ru/index.html?tuned-profiles-cloudlinux.html": "/ru/cloudlinux_os_kernel/#tuned-profiles-cloudlinux", - "/ru/additional_packages/#tuned-profiles-cloudlinux": "/ru/cloudlinux_os_kernel/#tuned-profiles-cloudlinux", - "/ru/integration_guide.html/": "/ru/lve_manager/#control-panel-integration-guide/", - "/ru/integration_guide.html": "/ru/lve_manager/#control-panel-integration-guide/", - "/ru/index.html?integration_guide.html": "/ru/lve_manager/#control-panel-integration-guide/", - "/ru/integration_guide/": "/ru/lve_manager/#control-panel-integration-guide/", - "/ru/detecting.html/": "/ru/lve_manager/#detecting-and-working-with-cloudlinux", - "/ru/detecting.html": "/ru/lve_manager/#detecting-and-working-with-cloudlinux", - "/ru/index.html?detecting.html": "/ru/lve_manager/#detecting-and-working-with-cloudlinux", - "/ru/integration_guide/#detecting-and-working-with-cloudlinux": "/ru/lve_manager/#detecting-and-working-with-cloudlinux", - "/ru/cpu_memory_iolimits.html/": "/ru/lve_manager/#displaying-cpu-memory-io-limits", - "/ru/cpu_memory_iolimits.html": "/ru/lve_manager/#displaying-cpu-memory-io-limits", - "/ru/index.html?cpu_memory_iolimits.html": "/ru/lve_manager/#displaying-cpu-memory-io-limits", - "/ru/integration_guide/#displaying-cpu-memory-io-limits": "/ru/lve_manager/#displaying-cpu-memory-io-limits", - "/ru/lve_limits_with_packages.html/": "/ru/lve_manager/#package-integration", - "/ru/lve_limits_with_packages.html": "/ru/lve_manager/#package-integration", - "/ru/index.html?lve_limits_with_packages.html": "/ru/lve_manager/#package-integration", - "/ru/integration_guide/#integrating-lve-limits-with-packages": "/ru/lve_manager/#package-integration", - "/ru/partner_portal.html/": "/ru/for_cloudlinux_partners/", - "/ru/partner_portal.html": "/ru/for_cloudlinux_partners/", - "/ru/index.html?partner_portal.html": "/ru/for_cloudlinux_partners/", - "/ru/partner_portal/": "/ru/for_cloudlinux_partners/", - "/ru/cloudlinux_network.html/": "/ru/for_cloudlinux_partners/#license-portal-cln", - "/ru/cloudlinux_network.html": "/ru/for_cloudlinux_partners/#license-portal-cln", - "/ru/index.html?cloudlinux_network.html": "/ru/for_cloudlinux_partners/#license-portal-cln", - "/ru/cloudlinux_network/": "/ru/for_cloudlinux_partners/#license-portal-cln", - "/ru/cloudlinux_whmcs_plugin.html/": "/ru/for_cloudlinux_partners/#cloudlinux-whmcs-plugin", - "/ru/cloudlinux_whmcs_plugin.html": "/ru/for_cloudlinux_partners/#cloudlinux-whmcs-plugin", - "/ru/index.html?cloudlinux_whmcs_plugin.html": "/ru/for_cloudlinux_partners/#cloudlinux-whmcs-plugin", - "/ru/cloudlinux_whmcs_plugin/": "/ru/for_cloudlinux_partners/#cloudlinux-whmcs-plugin", - "/ru/overview.html/": "/ru/for_cloudlinux_partners/#overview", - "/ru/overview.html": "/ru/for_cloudlinux_partners/#overview", - "/ru/index.html?overview.html": "/ru/for_cloudlinux_partners/#overview", - "/ru/cloudlinux_whmcs_plugin/#overview": "/ru/for_cloudlinux_partners/#overview", - "/ru/installation_configuration.html/": "/ru/for_cloudlinux_partners/#installation-configuration", - "/ru/installation_configuration.html": "/ru/for_cloudlinux_partners/#installation-configuration", - "/ru/index.html?installation_configuration.html": "/ru/for_cloudlinux_partners/#installation-configuration", - "/ru/cloudlinux_whmcs_plugin/#installation-configuration": "/ru/for_cloudlinux_partners/#installation-configuration", - "/ru/installation_and_update.html/": "/ru/for_cloudlinux_partners/#installation-and-update", - "/ru/installation_and_update.html": "/ru/for_cloudlinux_partners/#installation-and-update", - "/ru/index.html?installation_and_update.html": "/ru/for_cloudlinux_partners/#installation-and-update", - "/ru/cloudlinux_whmcs_plugin/#installation-and-update": "/ru/for_cloudlinux_partners/#installation-and-update", - "/ru/configuration_of_product.html/": "/ru/for_cloudlinux_partners/#configuration-of-product", - "/ru/configuration_of_product.html": "/ru/for_cloudlinux_partners/#configuration-of-product", - "/ru/index.html?configuration_of_product.html": "/ru/for_cloudlinux_partners/#configuration-of-product", - "/ru/cloudlinux_whmcs_plugin/#configuration-of-product": "/ru/for_cloudlinux_partners/#configuration-of-product", - "/ru/configuration_of_addon.html/": "/ru/for_cloudlinux_partners/#configuration-of-add-on", - "/ru/configuration_of_addon.html": "/ru/for_cloudlinux_partners/#configuration-of-add-on", - "/ru/index.html?configuration_of_addon.html": "/ru/for_cloudlinux_partners/#configuration-of-add-on", - "/ru/cloudlinux_whmcs_plugin/#configuration-of-add-on": "/ru/for_cloudlinux_partners/#configuration-of-add-on", - "/ru/management.html/": "/ru/for_cloudlinux_partners/#management", - "/ru/management.html": "/ru/for_cloudlinux_partners/#management", - "/ru/index.html?management.html": "/ru/for_cloudlinux_partners/#management", - "/ru/cloudlinux_whmcs_plugin/#management": "/ru/for_cloudlinux_partners/#management", - "/ru/link_via_add-on_optional_lice.html/": "/ru/for_cloudlinux_partners/#link-via-add-on-optional-license", - "/ru/link_via_add-on_optional_lice.html": "/ru/for_cloudlinux_partners/#link-via-add-on-optional-license", - "/ru/index.html?link_via_add-on_optional_lice.html": "/ru/for_cloudlinux_partners/#link-via-add-on-optional-license", - "/ru/cloudlinux_whmcs_plugin/#link-via-add-on-optional-license": "/ru/for_cloudlinux_partners/#link-via-add-on-optional-license", - "/ru/link_products_directly.html/": "/ru/for_cloudlinux_partners/#link-products-directly", - "/ru/link_products_directly.html": "/ru/for_cloudlinux_partners/#link-products-directly", - "/ru/index.html?link_products_directly.html": "/ru/for_cloudlinux_partners/#link-products-directly", - "/ru/cloudlinux_whmcs_plugin/#link-products-directly": "/ru/for_cloudlinux_partners/#link-products-directly", - "/ru/link_via_configurable_options.html/": "/ru/for_cloudlinux_partners/#link-via-configurable-options", - "/ru/link_via_configurable_options.html": "/ru/for_cloudlinux_partners/#link-via-configurable-options", - "/ru/index.html?link_via_configurable_options.html": "/ru/for_cloudlinux_partners/#link-via-configurable-options", - "/ru/cloudlinux_whmcs_plugin/#link-via-configurable-options": "/ru/for_cloudlinux_partners/#link-via-configurable-options", - "/ru/link_add-ons_directly.html/": "/ru/for_cloudlinux_partners/#link-add-ons-directly", - "/ru/link_add-ons_directly.html": "/ru/for_cloudlinux_partners/#link-add-ons-directly", - "/ru/index.html?link_add-ons_directly.html": "/ru/for_cloudlinux_partners/#link-add-ons-directly", - "/ru/cloudlinux_whmcs_plugin/#link-add-ons-directly": "/ru/for_cloudlinux_partners/#link-add-ons-directly", - "/ru/order.html/": "/ru/for_cloudlinux_partners/#order", - "/ru/order.html": "/ru/for_cloudlinux_partners/#order", - "/ru/index.html?order.html": "/ru/for_cloudlinux_partners/#order", - "/ru/cloudlinux_whmcs_plugin/#order": "/ru/for_cloudlinux_partners/#order", - "/ru/admin_area.html/": "/ru/for_cloudlinux_partners/#admin-area", - "/ru/admin_area.html": "/ru/for_cloudlinux_partners/#admin-area", - "/ru/index.html?admin_area.html": "/ru/for_cloudlinux_partners/#admin-area", - "/ru/cloudlinux_whmcs_plugin/#admin-area": "/ru/for_cloudlinux_partners/#admin-area", - "/ru/client_area.html/": "/ru/for_cloudlinux_partners/#client-area", - "/ru/client_area.html": "/ru/for_cloudlinux_partners/#client-area", - "/ru/index.html?client_area.html": "/ru/for_cloudlinux_partners/#client-area", - "/ru/cloudlinux_whmcs_plugin/#client-area": "/ru/for_cloudlinux_partners/#client-area", - "/ru/licenses_list.html/": "/ru/for_cloudlinux_partners/#licenses-list", - "/ru/licenses_list.html": "/ru/for_cloudlinux_partners/#licenses-list", - "/ru/index.html?licenses_list.html": "/ru/for_cloudlinux_partners/#licenses-list", - "/ru/cloudlinux_whmcs_plugin/#licenses-list": "/ru/for_cloudlinux_partners/#licenses-list", - "/ru/addon_licenses_list.html/": "/ru/for_cloudlinux_partners/#add-on-licenses-list", - "/ru/addon_licenses_list.html": "/ru/for_cloudlinux_partners/#add-on-licenses-list", - "/ru/index.html?addon_licenses_list.html": "/ru/for_cloudlinux_partners/#add-on-licenses-list", - "/ru/cloudlinux_whmcs_plugin/#add-on-licenses-list": "/ru/for_cloudlinux_partners/#add-on-licenses-list", - "/ru/common_problems.html/": "/ru/for_cloudlinux_partners/#common-problems", - "/ru/common_problems.html": "/ru/for_cloudlinux_partners/#common-problems", - "/ru/index.html?common_problems.html": "/ru/for_cloudlinux_partners/#common-problems", - "/ru/cloudlinux_whmcs_plugin/#common-problems": "/ru/for_cloudlinux_partners/#common-problems", - "/ru/deprecated.html/": "/ru/deprecated", - "/ru/deprecated.html": "/ru/deprecated", - "/ru/index.html?deprecated.html": "/ru/deprecated", - "/ru/deprecated/": "/ru/deprecated", - "/ru/git_for_cpanel.html/": "/ru/deprecated/#git-for-cpanel", - "/ru/git_for_cpanel.html": "/ru/deprecated/#git-for-cpanel", - "/ru/index.html?git_for_cpanel.html": "/ru/deprecated/#git-for-cpanel", - "/ru/deprecated/#git-for-cpanel": "/ru/deprecated/#git-for-cpanel", - "/ru/lve_stats_old.html/": "/ru/deprecated/#lve-stats-0-x", - "/ru/lve_stats_old.html": "/ru/deprecated/#lve-stats-0-x", - "/ru/index.html?lve_stats_old.html": "/ru/deprecated/#lve-stats-0-x", - "/ru/deprecated/#lve-stats-0-x": "/ru/deprecated/#lve-stats-0-x", - "/ru/storing_statistics_in_mysql.html/": "/ru/deprecated/#storing-statistics-in-mysql", - "/ru/storing_statistics_in_mysql.html": "/ru/deprecated/#storing-statistics-in-mysql", - "/ru/index.html?storing_statistics_in_mysql.html": "/ru/deprecated/#storing-statistics-in-mysql", - "/ru/deprecated/#storing-statistics-in-mysql": "/ru/deprecated/#storing-statistics-in-mysql", - "/ru/storing_statistics_in_postgres.html/": "/ru/deprecated/#storing-statistics-in-postgresql", - "/ru/storing_statistics_in_postgres.html": "/ru/deprecated/#storing-statistics-in-postgresql", - "/ru/index.html?storing_statistics_in_postgres.html": "/ru/deprecated/#storing-statistics-in-postgresql", - "/ru/deprecated/#storing-statistics-in-postgresql": "/ru/deprecated/#storing-statistics-in-postgresql", - "/ru/compacting_in_multi-server.html/": "/ru/deprecated/#compacting-in-multi-server-settings", - "/ru/compacting_in_multi-server.html": "/ru/deprecated/#compacting-in-multi-server-settings", - "/ru/index.html?compacting_in_multi-server.html": "/ru/deprecated/#compacting-in-multi-server-settings", - "/ru/deprecated/#compacting-in-multi-server-settings": "/ru/deprecated/#compacting-in-multi-server-settings", - "/ru/optimumcache.html/": "/ru/deprecated/#optimumcache", - "/ru/optimumcache.html": "/ru/deprecated/#optimumcache", - "/ru/index.html?optimumcache.html": "/ru/deprecated/#optimumcache", - "/ru/deprecated/#optimumcache": "/ru/deprecated/#optimumcache", - "/ru/optimumcache_installation.html/": "/ru/deprecated/#installation", - "/ru/optimumcache_installation.html": "/ru/deprecated/#installation", - "/ru/index.html?optimumcache_installation.html": "/ru/deprecated/#installation", - "/ru/deprecated/#installation": "/ru/deprecated/#installation", - "/ru/optimumcache_without_ploop.html/": "/ru/deprecated/#using-without-ploop", - "/ru/optimumcache_without_ploop.html": "/ru/deprecated/#using-without-ploop", - "/ru/index.html?optimumcache_without_ploop.html": "/ru/deprecated/#using-without-ploop", - "/ru/deprecated/#using-without-ploop": "/ru/deprecated/#using-without-ploop", - "/ru/marking_directories.html/": "/ru/deprecated/#marking-directories", - "/ru/marking_directories.html": "/ru/deprecated/#marking-directories", - "/ru/index.html?marking_directories.html": "/ru/deprecated/#marking-directories", - "/ru/deprecated/#marking-directories": "/ru/deprecated/#marking-directories", - "/ru/configuration_file.html/": "/ru/deprecated/#optimumcache-configuration-file", - "/ru/configuration_file.html": "/ru/deprecated/#optimumcache-configuration-file", - "/ru/index.html?configuration_file.html": "/ru/deprecated/#optimumcache-configuration-file", - "/ru/deprecated/#optimumcache-configuration-file": "/ru/deprecated/#optimumcache-configuration-file", - "/ru/command_line_interface.html/": "/ru/deprecated/#command-line-interface", - "/ru/command_line_interface.html": "/ru/deprecated/#command-line-interface", - "/ru/index.html?command_line_interface.html": "/ru/deprecated/#command-line-interface", - "/ru/deprecated/#": "/ru/deprecated/#command-line-interface", - "/ru/cloudlinux_collect.html/": "/ru/deprecated/#cloudlinux-collect-collect-system-load-statistics", - "/ru/cloudlinux_collect.html": "/ru/deprecated/#cloudlinux-collect-collect-system-load-statistics", - "/ru/index.html?cloudlinux_collect.html": "/ru/deprecated/#cloudlinux-collect-collect-system-load-statistics", - "/ru/deprecated/#cloudlinux-collect-collect-system-load-statistics": "/ru/deprecated/#cloudlinux-collect-collect-system-load-statistics", - "/ru/uninstall_optimumcache.html/": "/ru/deprecated/#uninstall-optimumcache", - "/ru/uninstall_optimumcache.html": "/ru/deprecated/#uninstall-optimumcache", - "/ru/index.html?uninstall_optimumcache.html": "/ru/deprecated/#uninstall-optimumcache", - "/ru/deprecated/#uninstall-optimumcache": "/ru/deprecated/#uninstall-optimumcache", - "/ru/optimumcache_troubleshooting.html/": "/ru/deprecated/#troubleshooting", - "/ru/optimumcache_troubleshooting.html": "/ru/deprecated/#troubleshooting", - "/ru/index.html?optimumcache_troubleshooting.html": "/ru/deprecated/#troubleshooting", - "/ru/deprecated/#troubleshooting": "/ru/deprecated/#troubleshooting", - "/ru/hardware_compatibility.html/": "/ru/cloudlinux_installation/#hardware-compatibility", - "/ru/hardware_compatibility.html": "/ru/cloudlinux_installation/#hardware-compatibility", - "/ru/index.html?hardware_compatibility.html": "/ru/cloudlinux_installation/#hardware-compatibility", - "/ru/hardware_compatibility/": "/ru/cloudlinux_installation/#hardware-compatibility", - "/ru/cloudlinux_life-cycle.html/": "/ru/introduction/#cloudlinux-os-lifecycle", - "/ru/cloudlinux_life-cycle.html": "/ru/introduction/#cloudlinux-os-lifecycle", - "/ru/index.html?cloudlinux_life-cycle.html": "/ru/introduction/#cloudlinux-os-lifecycle", - "/ru/cloudlinux_life-cycle/": "/ru/introduction/#cloudlinux-os-lifecycle", - "/ru/downloading_documentation.html/": "/ru/introduction/", - "/ru/downloading_documentation.html": "/ru/introduction/", - "/ru/index.html?downloading_documentation.html": "/ru/introduction/", - "/ru/downloading_documentation/": "/ru/introduction/", - "/ru/lve-limits-validation.html/": "/ru/limits/#limits-validation", - "/ru/lve-limits-validation.html": "/ru/limits/#limits-validation", - "/ru/index.html?lve-limits-validation.html": "/ru/limits/#limits-validation", - "/ru/limits/#lve-limits-validation": "/ru/limits/#limits-validation", - "/ru/cldiag.html/": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#cldiag": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#diag-cp": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#diag-cp": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#diag-cp": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#diag-cp": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-symlinkowngid": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-symlinkowngid": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#check-symlinkowngid": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#check-symlinkowngid": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#symlinksifowner": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#symlinksifowner": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#symlinksifowner": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#symlinksifowner": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-suexec": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-suexec": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#check-suexec": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#check-suexec": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-suphp": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-suphp": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#check-suphp": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#check-suphp": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-usepam": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-usepam": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#check-usepam": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#check-usepam": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-defaults-cfg": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-defaults-cfg": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#check-defaults-cfg": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#check-defaults-cfg": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-cagefs": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-cagefs": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#check-cagefs": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#check-cagefs": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-phpselector": "/ru/command-line_tools/#cldiag", - "/ru/cldiag.html#check-phpselector": "/ru/command-line_tools/#cldiag", - "/ru/index.html?cldiag.html#check-phpselector": "/ru/command-line_tools/#cldiag", - "/ru/command-line_tools/#check-phpselector": "/ru/command-line_tools/#cldiag", - "/ru/lvectl.html": "/ru/command-line_tools/#lvectl", - "/ru/lvectl.html/": "/ru/command-line_tools/#lvectl", - "/ru/index.html?lvectl.html": "/ru/command-line_tools/#lvectl", - "/ru/command-line_tools/#lvectl": "/ru/command-line_tools/#lvectl", - "/ru/lveps.html": "/ru/command-line_tools/#lveps", - "/ru/lveps.html/": "/ru/command-line_tools/#lveps", - "/ru/index.html?lveps.html": "/ru/command-line_tools/#lveps", - "/ru/command-line_tools/#lveps": "/ru/command-line_tools/#lveps", - "/ru/lvetop.html": "/ru/command-line_tools/#lvetop", - "/ru/lvetop.html/": "/ru/command-line_tools/#lvetop", - "/ru/index.html?lvetop.html": "/ru/command-line_tools/#lvetop", - "/ru/command-line_tools/#lvetop": "/ru/command-line_tools/#lvetop", - "/ru/cldetect.html": "/ru/command-line_tools/#cldetect", - "/ru/cldetect.html/": "/ru/command-line_tools/#cldetect", - "/ru/index.html?cldetect.html": "/ru/command-line_tools/#cldetect", - "/ru/command-line_tools/#cldetect": "/ru/command-line_tools/#cldetect", - "/ru/python_and_ruby_selector/#python-and-ruby-selector": "/ru/cloudlinux_os_components/#python-selector", - "/ru/python_selector/#python-selector": "/ru/cloudlinux_os_components/#python-selector", - "/lve_manager/#server-processes-snapshots": "/lve_manager/#resource-usage-client-plugin", - "/ru/lve_manager/#server-processes-snapshots": "/ru/lve_manager/#resource-usage-client-plugin", - "/ru/kernel_settings/#remounting-procfs-with-hidepid-option": "/ru/cloudlinux_os_kernel/#remounting-procfs-with-hidepid-option", - "/ru/python_selector/#overview-and-requirements": "/ru/cloudlinux_os_components/#general-information-and-requirements-6", - "/ru/php_selector/#php-selector-integration-with-cpanel’s-multiphp-manager": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/ru/php_selector/#php-selector-integration-with-cpanel%E2%80%99s-multiphp-manager": "/ru/cloudlinux_os_components/#integration-with-control-panels-2", - "/lve_manager/#end-user": "/lve_manager/#python-selector-client-plugin", - "/ru/lve_manager/#end-user": "/ru/lve_manager/#python-selector-client-plugin", - "/lve_manager/#end-user-2": "/lve_manager/#node-js-selector-client-plugin", - "/ru/lve_manager/#end-user-2": "/ru/lve_manager/#node-js-selector-client-plugin", - "/cldiag.html#check_phpselector": "/command-line_tools/#cldiag", - "/control_panel_integration/#expected-structure-of-replies": "/control_panel_integration/#expected-scripts-responses", - "/ru/cldiag.html#check_phpselector": "/ru/command-line_tools/#cldiag", - "/ru/control_panel_integration/#expected-structure-of-replies": "/ru/control_panel_integration/#expected-scripts-responses", - "/cldiag.html#check_suexec": "/cloudlinux_os_components/#apache-suexec-module", - "/ru/cloudlinux_installation/#xen-images": "/ru/cloudlinux_installation/#installing-new-servers", - "/cloudlinux_installation/#xen-images": "/cloudlinux_installation/#installing-new-servers", - "/cldiag.html#check_symlinkowngid": "/command-line_tools/#_6-check-symlinkowngid", - "/cloudlinux_installation/#installing-cloudlinux-os-8-beta-from-iso-image": "/cloudlinux_installation/#installing-cloudlinux-os-8-from-iso-image", - "/lve_manager/#admin-interface": "/lve_manager/#selector-tab-additional-features", - "/ru/lve_manager/#admin-interface": "/ru/lve_manager/#selector-tab-additional-features", - "/lve_manager/#errors-in-the-ui": "/lve_manager/#php-selector-troubleshooting", - "/ru/lve_manager/#errors-in-the-ui": "/ru/lve_manager/#php-selector-troubleshooting", - "/lve_manager/#diagnostic-tool": "/lve_manager/#php-selector-diagnostic-tool-and-notifications", - "/ru/lve_manager/#diagnostic-tool": "/ru/lve_manager/#php-selector-diagnostic-tool-and-notifications", - "/lve_manager/#errors": "/lve_manager/#php-selector-diagnostic-tool-and-notifications", - "/ru/lve_manager/#errors": "/ru/lve_manager/#php-selector-diagnostic-tool-and-notifications", - "/lve_manager/#php-selector-user-interface": "/lve_manager/#php-selector-my-domains-tab", - "/ru/lve_manager/#php-selector-user-interface": "/ru/lve_manager/#php-selector-my-domains-tab", - "/cloudlinux_os_components/#abrt-plugin": "/cloudlinux_os_components/#backing-up-mysql", - "/ru/cloudlinux_os_components/#abrt-plugin": "/ru/cloudlinux_os_components/#backing-up-mysql", - "/cloudlinux_os_components/#redis-support-for-hostinglimits": "/deprecated/#redis-support-for-hostinglimits", - "/ru/cloudlinux_os_components/#redis-support-for-hostinglimits": "/ru/deprecated/#redis-support-for-hostinglimits", - "/cloudlinux_os_components/#lveredissocket": "/deprecated/#lveredissocket", - "/ru/cloudlinux_os_components/#lveredissocket": "/ru/deprecated/#lveredissocket", - "/cloudlinux_os_components/#lveredisaddr": "/deprecated/#lveredisaddr", - "/ru/cloudlinux_os_components/#lveredisaddr": "/ru/deprecated/#lveredisaddr", - "/cloudlinux_os_components/#lveredistimeout": "/deprecated/#lveredistimeout", - "/ru/cloudlinux_os_components/#lveredistimeout": "/ru/deprecated/#lveredistimeout", - "/cloudlinux_installation/#centos-with-eeasyapache-4": "/cloudlinux_installation/#centos-with-easyapache-4", - "/ru/cloudlinux_installation/#centos-with-eeasyapache-4": "/ru/cloudlinux_installation/#centos-with-easyapache-4", - "/x-ray/":"/cloudlinux-os-plus/#x-ray", - "/x-ray/#description":"/cloudlinux-os-plus/#description", - "/x-ray/#installation":"/cloudlinux-os-plus/#installation", - "/x-ray/#how-to-manage-x-ray":"/cloudlinux-os-plus/#how-to-manage-x-ray", - "/x-ray/#create-a-new-tracing-task":"/cloudlinux-os-plus/#create-a-new-tracing-task", - "/x-ray/#advanced-settings":"/cloudlinux-os-plus/#advanced-settings", - "/x-ray/#view-tracing-tasks-list":"/cloudlinux-os-plus/#view-tracing-tasks-list", - "/x-ray/#tracing-status":"/cloudlinux-os-plus/#tracing-status", - "/x-ray/#stop-tracing-task":"/cloudlinux-os-plus/#stop-tracing-task", - "/x-ray/#delete-tracing-task":"/cloudlinux-os-plus/#delete-tracing-task", - "/x-ray/#view-collected-requests-for-tracing-task":"/cloudlinux-os-plus/#view-collected-requests-for-tracing-task", - "/x-ray/#tracing-tasks":"/cloudlinux-os-plus/#tracing-tasks", - "/x-ray/#software-modules-plugins":"/cloudlinux-os-plus/#software-modules-plugins", - "/x-ray/#database-queries":"/cloudlinux-os-plus/#database-queries", - "/x-ray/#external-requests":"/cloudlinux-os-plus/#external-requests", - "/x-ray/#system-functions":"/cloudlinux-os-plus/#system-functions", - "/x-ray/#x-ray-client":"/cloudlinux-os-plus/#x-ray-client", - "/x-ray/#list-of-supported-php-versions":"/cloudlinux-os-plus/#list-of-supported-php-versions", - "/x-ray/#functions-that-x-ray-client-can-hook":"/cloudlinux-os-plus/#functions-that-x-ray-client-can-hook", - "/x-ray/#database-queries-2":"/cloudlinux-os-plus/#database-queries-2", - "/x-ray/#external-requests-2":"/cloudlinux-os-plus/#external-requests-2", - "/x-ray/#system-php-functions":"/cloudlinux-os-plus/#system-php-functions", - "/x-ray/#configuration-options":"/cloudlinux-os-plus/#configuration-options", - "/x-ray/#xray-enabled":"/cloudlinux-os-plus/#xray-enabled", - "/x-ray/#xray-database-queries":"/cloudlinux-os-plus/#xray-database-queries", - "/x-ray/#xray-external-requests":"/cloudlinux-os-plus/#xray-external-requests", - "/x-ray/#xray-system-functions":"/cloudlinux-os-plus/#xray-system-functions", - "/x-ray/#xray-backtrace-depth":"/cloudlinux-os-plus/#xray-backtrace-depth", - "/x-ray/#xray-processor":"/cloudlinux-os-plus/#xray-processor", - "/x-ray/#xray-tasks":"/cloudlinux-os-plus/#xray-tasks", - "/x-ray/#xray-to-file":"/cloudlinux-os-plus/#xray-to-file", - "/x-ray/#xray-debug":"/cloudlinux-os-plus/#xray-debug", - "/x-ray/#xray-debug-file":"/cloudlinux-os-plus/#xray-debug-file", - "/x-ray/#x-ray-agent":"/cloudlinux-os-plus/#x-ray-agent", - "/x-ray/#managing-x-ray-service":"/cloudlinux-os-plus/#managing-x-ray-service", - "/x-ray/#faq":"/cloudlinux-os-plus/#faq", - "/x-ray/#does-x-ray-affect-website-performance":"/cloudlinux-os-plus/#does-x-ray-affect-website-performance", - "/x-ray/#what-should-i-do-if-i-see-the-warning-task-is-duplicated-by-url":"/cloudlinux-os-plus/#what-should-i-do-if-i-see-the-warning-task-is-duplicated-by-url", - "/x-ray/#i-started-a-tracing-task-and-made-requests-to-url-but-did-not-see-any-results-in-the-ui-what-should-i-do":"/cloudlinux-os-plus/#i-started-a-tracing-task-and-made-requests-to-url-but-did-not-see-any-results-in-the-ui-what-should-i-do", - "/x-ray/#what-to-do-if-x-ray-is-not-found-in-the-phpinfo-page":"/cloudlinux-os-plus/#what-to-do-if-x-ray-is-not-found-in-the-phpinfo-page", - "/x-ray/#i-use-litespeed-x-ray-is-enabled-and-it-is-shown-in-the-phpinfo-page-but-does-not-collect-data-when-sending-requests-to-a-site-what-to-do":"/cloudlinux-os-plus/#i-use-litespeed-x-ray-is-enabled-and-it-is-shown-in-the-phpinfo-page-but-does-not-collect-data-when-sending-requests-to-a-site-what-to-do", - "/x-ray/#what-is-the-proper-format-for-the-url":"/cloudlinux-os-plus/#what-is-the-proper-format-for-the-url", - "/ru/x-ray/":"/ru/cloudlinux-os-plus/#x-ray", - "/ru/x-ray/#description":"/ru/cloudlinux-os-plus/#description", - "/ru/x-ray/#installation":"/ru/cloudlinux-os-plus/#installation", - "/ru/x-ray/#how-to-manage-x-ray":"/ru/cloudlinux-os-plus/#how-to-manage-x-ray", - "/ru/x-ray/#create-a-new-tracing-task":"/ru/cloudlinux-os-plus/#create-a-new-tracing-task", - "/ru/x-ray/#advanced-settings":"/ru/cloudlinux-os-plus/#advanced-settings", - "/ru/x-ray/#view-tracing-tasks-list":"/ru/cloudlinux-os-plus/#view-tracing-tasks-list", - "/ru/x-ray/#tracing-status":"/ru/cloudlinux-os-plus/#tracing-status", - "/ru/x-ray/#stop-tracing-task":"/ru/cloudlinux-os-plus/#stop-tracing-task", - "/ru/x-ray/#delete-tracing-task":"/ru/cloudlinux-os-plus/#delete-tracing-task", - "/ru/x-ray/#view-collected-requests-for-tracing-task":"/ru/cloudlinux-os-plus/#view-collected-requests-for-tracing-task", - "/ru/x-ray/#tracing-tasks":"/ru/cloudlinux-os-plus/#tracing-tasks", - "/ru/x-ray/#software-modules-plugins":"/ru/cloudlinux-os-plus/#software-modules-plugins", - "/ru/x-ray/#database-queries":"/ru/cloudlinux-os-plus/#database-queries", - "/ru/x-ray/#external-requests":"/ru/cloudlinux-os-plus/#external-requests", - "/ru/x-ray/#system-functions":"/ru/cloudlinux-os-plus/#system-functions", - "/ru/x-ray/#x-ray-client":"/ru/cloudlinux-os-plus/#x-ray-client", - "/ru/x-ray/#list-of-supported-php-versions":"/ru/cloudlinux-os-plus/#list-of-supported-php-versions", - "/ru/x-ray/#functions-that-x-ray-client-can-hook":"/ru/cloudlinux-os-plus/#functions-that-x-ray-client-can-hook", - "/ru/x-ray/#database-queries-2":"/ru/cloudlinux-os-plus/#database-queries-2", - "/ru/x-ray/#external-requests-2":"/ru/cloudlinux-os-plus/#external-requests-2", - "/ru/x-ray/#system-php-functions":"/ru/cloudlinux-os-plus/#system-php-functions", - "/ru/x-ray/#configuration-options":"/ru/cloudlinux-os-plus/#configuration-options", - "/ru/x-ray/#xray-enabled":"/ru/cloudlinux-os-plus/#xray-enabled", - "/ru/x-ray/#xray-database-queries":"/ru/cloudlinux-os-plus/#xray-database-queries", - "/ru/x-ray/#xray-external-requests":"/ru/cloudlinux-os-plus/#xray-external-requests", - "/ru/x-ray/#xray-system-functions":"/ru/cloudlinux-os-plus/#xray-system-functions", - "/ru/x-ray/#xray-backtrace-depth":"/ru/cloudlinux-os-plus/#xray-backtrace-depth", - "/ru/x-ray/#xray-processor":"/ru/cloudlinux-os-plus/#xray-processor", - "/ru/x-ray/#xray-tasks":"/ru/cloudlinux-os-plus/#xray-tasks", - "/ru/x-ray/#xray-to-file":"/ru/cloudlinux-os-plus/#xray-to-file", - "/ru/x-ray/#xray-debug":"/ru/cloudlinux-os-plus/#xray-debug", - "/ru/x-ray/#xray-debug-file":"/ru/cloudlinux-os-plus/#xray-debug-file", - "/ru/x-ray/#x-ray-agent":"/ru/cloudlinux-os-plus/#x-ray-agent", - "/ru/x-ray/#managing-x-ray-service":"/ru/cloudlinux-os-plus/#managing-x-ray-service", - "/ru/x-ray/#faq":"/ru/cloudlinux-os-plus/#faq", - "/ru/x-ray/#does-x-ray-affect-website-performance":"/ru/cloudlinux-os-plus/#does-x-ray-affect-website-performance", - "/ru/x-ray/#what-should-i-do-if-i-see-the-warning-task-is-duplicated-by-url":"/ru/cloudlinux-os-plus/#what-should-i-do-if-i-see-the-warning-task-is-duplicated-by-url", - "/ru/x-ray/#i-started-a-tracing-task-and-made-requests-to-url-but-did-not-see-any-results-in-the-ui-what-should-i-do":"/ru/cloudlinux-os-plus/#i-started-a-tracing-task-and-made-requests-to-url-but-did-not-see-any-results-in-the-ui-what-should-i-do", - "/ru/x-ray/#what-to-do-if-x-ray-is-not-found-in-the-phpinfo-page":"/ru/cloudlinux-os-plus/#what-to-do-if-x-ray-is-not-found-in-the-phpinfo-page", - "/ru/x-ray/#i-use-litespeed-x-ray-is-enabled-and-it-is-shown-in-the-phpinfo-page-but-does-not-collect-data-when-sending-requests-to-a-site-what-to-do":"/ru/cloudlinux-os-plus/#i-use-litespeed-x-ray-is-enabled-and-it-is-shown-in-the-phpinfo-page-but-does-not-collect-data-when-sending-requests-to-a-site-what-to-do", - "/ru/x-ray/#what-is-the-proper-format-for-the-url":"/ru/cloudlinux-os-plus/#what-is-the-proper-format-for-the-url", - "/introduction/#what-is-cloudlinux": "/introduction/#what-is-cloudlinux-os-shared", - "introduction/#cloudlinux-life-cycle": "/introduction/#cloudlinux-os-shared-life-cycle", - "/introduction/#description-of-cloudlinux-components": "/introduction/#description-of-cloudlinux-os-shared-components", - "lve_manager/#cloudlinux-installation-wizard": "/lve_manager/#cloudlinux-os-shared-installation-wizard", - "/cloudlinux-os-plus/#wp-optimization-suite": "/cloudlinux-os-plus/#acceleratewp", - "/cloudlinux-os-plus/#how-to-enable-wp-optimization-suite": "/cloudlinux-os-plus/#how-to-enable-acceleratewp", - "/cloudlinux-os-plus/#how-to-install-wp-optimization-suite": "/cloudlinux-os-plus/#how-to-install-acceleratewp", - "/disabling_php.html": "/cloudlinux_os_components/#disabling-php-extension-globally", - "/getting_trial_license.html": "/cloudlinux_installation/#getting-trial-license", - "/installation4.html": "/cloudlinux_installation/#installation", - "/installation_mod_lsapi.html": "/cloudlinux_os_components/#installation-2", - "/cloudlinux-os-plus/cloudlinux-os-plus/": "/cloudlinux-os-plus/", - "/cloudlinux_os_components/cloudlinux_os_components/": "/cloudlinux_os_components/", - "/control_panel_integration/cloudlinux_os_components/": "/control_panel_integration/#control-panel-integration", - "/php_selector": "/cloudlinux_os_components/#php-selector", - "https://www.cloudlinux.com/docs/load_averages.php": "https://docs.cloudlinux.com/introduction/", - "https://www.cloudlinux.com/docs/hsphere35.php": "https://docs.cloudlinux.com/introduction/", - "/cloudlinux_installation/#upgrade-between-major-distributions-elevation-beta":"/elevate/" -}; diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/cloudlinux-os-admin/README.md b/docs/cloudlinux-os-admin/README.md deleted file mode 100644 index 51951b330..000000000 --- a/docs/cloudlinux-os-admin/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# CloudLinux OS Admin - -[[toc]] - -## Description - -CloudLinux OS Admin is designed for shared hosting providers who want to flawlessly migrate their -big shared hosting customer to individual VPS with same CloudLinux features as on Shared hosting. -At the same time you will be able to separate such a user's websites if necessary and isolate them -with CageFS for efficient and extra security. - -Also it may be suitable for a little server with less than 5 customers on it, but be careful, -there is no migration to Shared edition available. - -Most of the features of CloudLinux OS Shared are available in this edition, with a small differences: - -- lve limits are set to unlimited by default (can be changed in CloudLinux Manager at any time) -- MySQL Governor is not available in this edition -- the license itself does not allow more than 5 users to be hosted on server. - -:::tip Note -The CloudLinux OS Admin plan does not include the NodeJS, Python and Ruby selectors as well as the MySQL Governor. -::: - - -## Installation - -CloudLinux OS Admin installation process is the same as for CloudLinux Shared, -please forward to [installation guide](/cloudlinux_installation) for the detailed instructions. - -:::tip Note -The CloudLinux OS Admin can be installed and compatible only with AlmaLinux OS 8 -::: - -## Components - -CloudLinux OS Admin is very close to the regular CloudLinux Shared edition, which means that -99% of components described in this documentations are available for CloudLinux OS Admin. - -The exclusions are: - - - [MySQL Governor](/control_panel_integration/#mysql-governor) is not available - - NodeJS, Python and Ruby selectors aren't available, however, [PHP Selector](/cloudlinux_os_components/#php-selector) is available - - [X-Ray](./cloudlinux-os-plus/#x-ray) is available like with CloudLinux Shared Pro - - [Accelerate WP](./cloudlinux-os-plus/#acceleratewp) is available like with CloudLinux Shared Pro - -The rest of the components are similar with CloudLinux OS Shared. - - -## FAQ - -Q: Is it possible to convert my existing CloudLinux OS Shared server into CloudLinux OS Admin?
-A: No, only fresh installation is possible. - -Q: Is Centralized Monitoring supported on CloudLinux OS Admin?
-A: No, Centralized Monitoring only works with CloudLinux OS Shared Pro license. diff --git a/docs/cloudlinux-os-plus/README.md b/docs/cloudlinux-os-plus/README.md deleted file mode 100644 index 2e4d34ab9..000000000 --- a/docs/cloudlinux-os-plus/README.md +++ /dev/null @@ -1,2215 +0,0 @@ -# CloudLinux OS Shared Pro - -[[toc]] - -## X-Ray - -* [Description](/cloudlinux-os-plus/#description) -* [Installation](/cloudlinux-os-plus/#installation) -* [How to manage X-Ray](/cloudlinux-os-plus/#how-to-manage-x-ray) -* [X-Ray client](/cloudlinux-os-plus/#x-ray-client) -* [X-Ray service](/cloudlinux-os-plus/#x-ray-agent) -* [FAQ](/cloudlinux-os-plus/#faq) - -### Description - -:::warning Warning! -X-Ray is available out of the box for cPanel, Plesk, and DirectAdmin. For other control panels you should implement integration as described [here](/control_panel_integration/#how-to-integrate-x-ray-with-a-control-panel) -::: - -X-Ray is a tool developed for website performance monitoring and performance issues detection. - -X-Ray can gather and visualize information about top N slowest system functions, external requests, software modules and database queries of the client’s website. - -### Known limitations -X-Ray is not compatible with Opcahce JIT optimization. -Once X-Ray tracing task is running for the site the Opcache JIT optimization will be disabled until tracing task completed. - -### Installation - -1. Make sure you have CloudLinux OS Shared Pro subscription (only non-reseller accounts apply) - -2. Make sure you have installed **LVE Manager version 6.2 or later**. You can install or update it with the following commands: - * installation - -
- - ``` - # yum install lvemanager - ``` -
- - * update - -
- - ``` - # yum update lvemanager - ``` -
-3. X-Ray will be activated on all your servers during 4 hours. You will see the X-Ray tab in the LVE Manager UI. - -4. For instant activation, run the following command: - -
- - ``` - # rhn_check - ``` -
- - If the `rhn_check` command is not found, run the following command: - -
- - ``` - # yum install rhn-check rhn-setup - ``` -
- -5. Then install the `alt-php-xray` package - - * Via user interface - * Go to the _X-Ray_ tab. - * Click _Install_ to start installation. - - ![](/images/XRayUI.png) - - * Via SSH by running the following command: - -
- - ``` - # yum install lvemanager alt-php-xray - ``` -
- -6. After installation, use the _Start tracing_ button to create your first tracing task for a slow site. - -![](/images/XRayStartTracing.png) - -### How to manage X-Ray - -X-Ray provides several options for monitoring domain requests speed: Manual Tracing task, X-Ray Autotracing and Continuous tracing. - -* **Manual Tracing task** is a task that you can create for a specific URL to collect server requests. The task will end either after a specified number of requests to the URL or after a specified time (maximum after two days). It is not possible here to automatically email a report but it is possible to export the report in PDF and send to a user. - -* **Autotracing task** is a task that will be created automatically at the end of each day for slow URLs that were found during that day by the [PHP Slow Site Analyzer](/lve_manager/#website-monitoring-tool-and-slow-site-analyzer) (SSA). -Need to be enabled separately, see [How to enable X-Ray Autotracing](/cloudlinux-os-plus/#how-to-enable-x-ray-autotracing). - -* **Continuous tracing** is a task that initiates daily hourly tracing requests for a specified domain and email a monitoring report. Continuous task can't stop automatically, you need to stop it manually. In fact, continuous task allows to automatically create a tracing task for each new day, with the ability to get a report for the past day. - -#### Tracing tasks tab - -The *Tracing tasks* tab contains a list of all tracing tasks created both manually and automatically via continuous tasks. - -![](/images/XRayTracingTaskCreated.png) - -The *Created* column shows how a task was created – automatically (by continuous task) or manually. - -#### Continuous tracing tab - -:::warning Warning -To use Continuous task, update your LVE Manager and alt-PHP-X-Ray packages to versions lvemanager-6.2.9-1 and alt-php-xray-0.2-1 by running the following command: -``` -yum update lvemanager alt-php-xray -``` -::: - -The *Continuous tracing* tab contains a list of continuous tasks for which tracing tasks will be created automatically for a new day for a specific domain. - -![](/images/XRayContinuousTasksList.png) - -### Managing tracing task - -#### Creating a new tracing task - -1. Go to the _X-Ray_ tab -2. Click the _Start tracing_ button to create a new task -3. In the opened popup specify a website URL to trace -4. Click the _Run_ button -5. Tracing will run in the default mode. In the default mode X-Ray traces the first 20 requests for a specified URL - -![](/images/XRayTracingTask.png) - -* **URL** should be a valid URL of the domain which exists on the current hosting server. The URL field supports wildcard matching. To learn more about wildcard matching, click _How to use special characters_. -* **Advanced settings** allow you to set an IP address and tracing options: by time or by number of queries. - - ![](/images/XRayAdvanced.png) - -**Advanced settings** - -* **Client’s IP**: it is an IPv4 address of a machine to trace. For example, if you have a production website that processes requests from different IP addresses and you do not want to add these requests to the tracing task. So, you can set a specific IP address and X-Ray will analyze requests only from this specific IP address. -Record for -* **Time period**: how much time X-Ray collect the requests (2 days max) -* **Requests**: the amount of requests that X-Ray will collect - -After creating, the task appears in the list of tracing tasks. - -![](/images/XRayTrcingTaskList.png) - -#### Viewing tracing tasks list - -![](/images/XRayTrcingTaskList1.png) - -Tasks created *Manually* are simply tracing tasks. - -#### Tracing status - -A tracing task can have the following statuses: - -* **Running** – tracing is in progress -* **Stopped** – tracing was stopped by administrator -* **On hold** – the same URL already exists in the lists. Task processing will not start automatically. Administrator should start it manually. -* **Completed** – period of time is finished or number of requests is reached. - -#### Collected requests for tracing task - -:::warning Warning! -Collected requests are available in the UI for two weeks. -::: - -Click ![](/images/XRayView.png) to open a list of collected requests. - -#### Tracing tasks - -![](/images/XRayCollectedRequests.png) - -The slowest request is highlighted. - -![](/images/XRaySlowestRequest.png) - -* **Total** displays how many requests were collected according to tasks requirements. -* **Pending** displays how many of collected requests are not visible in the table yet. -* **Throttled** displays the number of requests during the execution of which the LVE limits were exceeded. -* **Slow** displays the number of requests lasting more than one second. - -There are filters for the request types and the indicator of a filter used now. - -![](/images/FilterIndicator.png) - -If slow requests were not detected during the tracing task, the following is displayed. Here, you can also view all requests. - -![](/images/RecordedSession.png) - - -X-Ray collects the following data for each request: - -* **Top issues** – the slowest items of a request -* **Software modules/plugins** by execution time (only for WordPress plugins) -* **Database queries** by execution time -* **External requests** by execution time -* **Other system functions** by execution time - -#### Software modules/plugins - -![](/images/XRaySoftwareModulesPlugins.png) - -The _Software modules/plugins_ section displays the following data: - -* **Software type** – a type a module/plugin. For now, X-Ray can analyze only WordPress software -* **Software module** – a name of the WordPress plugin -* **Duration** – plugin execution time -* **Duration (%)** – plugin execution time as a percentage of the total duration of the request - -#### Database queries - -![](/images/XRayDatabaseQueries.png) - -The _Database queries_ section displays the following data: - -* **Query** – the executed SQL-query -* **File** – the file and the line of the executed query and backtrace -* **Software module** – a WordPress plugin name from which the request was completed. If the request does not belong to any of the WordPress plugin, the name of the function that executed the given request is displayed -* **Calls** – the number of identical SQL queries -* **Duration** – execution time as a percentage of the total duration of a request and the function processing time (in brackets) - -#### External requests - -![](/images/XRayExternalRequests.png) - -The _External requests_ section displays the following data: - -* **URL** – the URL of the executed request -* **File** – the file and the line of the executed request and backtrace -* **Duration** – execution time as a percentage of the total duration of a request and the function processing time (in brackets) - -#### System functions - -![](/images/XRaySystemFunctions.png) - -The _System functions_ section displays the following data: - -* **Function** – the executed function -* **File** – the file and the line of the executed request -* **Duration** – execution time as a percentage of the total duration of a request and the function processing time (in brackets) - -#### Stopping tracing task - -Click ![](/images/XRayStop.png) to stop the tracing task. - -![](/images/XRayStopped.png) - -The tracing task status will be changed to **Stopped**. Data will not be collected anymore but you can see already collected information or continue tracing later by clicking ![](/images/XRayStart.png). - -#### Deleting tracing task - -Click ![](/images/XRayDelete.png) to delete the tracing task. - -:::warning Warning! -When you have deleted a tracing task, all collected data will be unavailable. -::: - -### Managing continuous tasks - -#### Creating a new continuous task - -1. Click the *Create continuous tracing* button - -![](/images/XRayCreateContinuousTaskBtn.png) - -2. Specify URL in the *Domain* field and email in the *Email for reports* field and click the *Create* button. - -![](/images/XRayCreateContinuousTaskForm.png) - -3. You can see a new task in the *Continuous tracing* tab in the X-Ray UI. - -![](/images/XRayContinuousTracingTab.png) - -4. If you stop a continuous tracing task, a new task for the next 24 hours will not be created. The task for the current day will be finished at midnight and the report will be emailed. - -5. If you delete a continuous tracing task, the task for the current day will be finished at midnight and the report will be emailed. - -#### Viewing continuous tasks list - -You can find a list of continuous tracing tasks in the _Continuous tracing_ tab. - -![](/images/XRayContinuousTracingTasksList.png) - -You can find automatically created tasks in the _Tracing tasks_ tab marked as _Automatically_ in the _Created_ column. - -![](/images/XRayContinuousTracingTasksListCreated.png) - -The [statuses for automatically created tasks](/cloudlinux-os-plus/#tracing-status) are the same as for tracing task. - -To view detailed info about an automatically created task, click ![](/images/XRayView1.png). You will get requests grouped by hour. - -![](/images/XRayContinuousTracingTasksListGrouped.png) - -Click to a group to open a list of the requests. - -![](/images/XRayContinuousTracingTasksRequestsList.png) - -The following data is collected for each request: - -* Software modules/plugins by execution time (only for WordPress plugins) -* Database queries by execution time -* External requests by execution time -* Other system functions by execution time - -#### Stopping automatic tracing task - -Stopping automatic tracing task (a part of continuous tracing task) affects only the automatic tracing task for the current day. A new task for the next day will be created at the end of the day. - -To stop the continuous tracing task completely, see [Creating a new continuous task, paragraph 4](/cloudlinux-os-plus/#creating-a-new-continuous-task). - - -#### Deleting automatic tracing task - -Deleting automatic tracing task (a part of continuous tracing task) affects only the automatic tracing task for the current day. A new task for the next day will be created at the end of the day. - -To delete the continuous tracing task completely, see [Creating a new continuous task, paragraph 5](/cloudlinux-os-plus/#creating-a-new-continuous-task). - - -#### Continuous task daily report - -1. Users get daily reports on their emails. An example of a report is shown below: - - ![](/images/XRayContinuousTaskDaylyReportExample.png) - -2. Click the link in the email to show the detailed report: - - ![](/images/XRayContinuousTaskDaylyReportCollectedRequests.png) - -3. You can view requests grouped by hour: - - ![](/images/XRayContinuousTaskDaylyReportByHourRequests.png) - -4. You can also view the detailed information about request: - - ![](/images/XRayContinuousTaskDaylyReportRequestDetails.png) - - -### X-Ray Autotracing - -X-Ray Autotracing automatically creates tracing tasks for slow URLs that were found during a day by the [PHP Slow Site Analyzer](/lve_manager/#website-monitoring-tool-and-slow-site-analyzer) (SSA). - -:::warning Warning -To use X-Ray Autotracing, update your alt-php-ssa and alt-php-xray packages to versions alt-php-ssa-0.2-1 and alt-php-xray-0.4-1 or higher by running the following command: -``` -# yum update alt-php-ssa alt-php-xray --enablerepo=cloudlinux-updates-testing -``` -::: - -#### How to enable X-Ray Autotracing - -To enable X-Ray Autotracing, run the following commands via SSH: - -``` -# /usr/sbin/cloudlinux-ssa-manager enable-ssa -# /usr/sbin/cloudlinux-autotracing enable --all -``` - -Check [CLI documentation](/command-line_tools/#x-ray-autotracing) for a description of the `/usr/sbin/cloudlinux-autotracing` CLI utility. - -#### Requirements - -* CloudLinux OS Shared Pro or CloudLinux OS Solo or CloudLinux OS Admin -* alt-php-ssa > 0.2-1 version -* alt-php-xray > 0.4-1 version -* Enabled PHP SSA on the server - -#### Autotracing Interface - -A new tab for Autotracing tasks was added to the X-Ray UI: - - -![](/images/XRayAutotracingtaskstab.png) - - -#### Autotracing FAQ - -Q: Why are the slow URLs in the Slow Site Analyzer report different from those on which the autotracing tasks were created? - -A: Because the autotracing decision module uses rules and thresholds different from Slow Site Analyzer, which are configured by the CloudLinux team. - -Q: How often autotracing tasks will be generated? - -A: Once a day at the same time as a Slow Site Analyzer report. - -### X-Ray Smart Advice - -Smart advice is a new feature of X-Ray that is designed to find and propose solutions to fix performance issues and speed up the performance of a sites. - -:::tip Note -Smart Advice will work only for CloudLinux OS Shared Pro servers with cPanel Control Panel for now. - -At the moment, Smart Advise is focused only on WordPress sites. -::: - -:::warning Warning -To use X-Ray Smart Advice, update your alt-php-ssa and alt-php-xray packages to versions alt-php-ssa-0.2-3 and alt-php-xray-0.5-1 or higher by running the following command: -``` -# yum update alt-php-ssa alt-php-xray lve-utils lvemanager --enablerepo=cloudlinux-updates-testing -``` -::: - -#### How to enable X-Ray Smart Advice - -:::warning Attention! -If you'd like to try Smart Advice and AccelerateWP you should participate in the Beta tester program. To become a beta tester, please send your request at our Beta program page with the signup form [here](https://www.cloudlinux.com/wp-performance/). Once you submit the request, we will send you a confirmation email with program details and terms of use. -::: - -#### Requirements - -* CloudLinux OS Shared Pro or CloudLinux OS Solo -* alt-php-xray > 0.5-1 version -* lve-utils > 6.3.2-1 version -* lvemanager > 7.6.1-1 version -* cloudlinux-site-optimization-module > 0.1-1 version - -We Recommend: - -* Enable [X-Ray Autotracing](cloudlinux-os-plus/#x-ray-autotracing) on the server -* Use alt-php-ssa > 0.2-3 version - -#### How X-Ray Smart Advice works - -The main process of looking for advice is X-Ray tracing tasks. The best way for doing this is to enable X-Ray Autotracing. -This will allow you to most effectively find Smart Advice for sites that have performance issues without your manual participation. -You can find information on how to enable X-Ray Autotracing [here](/cloudlinux-os-plus/#how-to-enable-x-ray-autotracing). -On the other hand, you can create tracing tasks manually or use continuous X-Ray but we suggest you use X-Ray Autotracing for this purpose. - -:::tip Note -Advice will not be generated by old tracing tasks. -::: - -While the tracing task is running, X-Ray will look for places where advice can be applied. New advice will be displayed on the *Smart Advice* tab. - -![](/images/XRaySmartAdviceMainTab.png) - -After the X-Ray finds advice you will see new advice in the *Review* status on the *Smart Advice* tab. -Then you may use the *Details* button to see which URLs were found by X-Ray that will be speed up by that advice and use *Quick Action* to enable advice for a site. - -Example of details: - -![](/images/XRaySmartAdviceDetails.png) - -After you apply the advice by using *Quick Action*, the status will change to the *Applied*. - -If a long time has passed since the last time the advice was updated for a site, it will be moved to the *Outdated* status. - -:::tip Note -New X-Ray task may update *Outdated* advice if X-Ray finds performance issues that may be fixed by that advice. Then the status of advice becomes *Review*. -::: - -If the process of applying advice fails you will see an error log with a detailed error, you may try to fix it manually and try again or [contact our support team for help](https://cloudlinux.zendesk.com/hc/en-us). - -Example when an error appears during advice applying: - -![](/images/XRaySmartAdviceError.png) - -#### Smart Advice FAQ - -Q: Why I can't see new advice on the *Smart Advice* tab? - -A: For the generating of advice, it is necessary to run X-Ray tracing tasks, the best way to do it without manual interaction is to use X-Ray Autoracing. You can find more information on how to enable X-Ray Autotracing [here](/cloudlinux-os-plus/#how-to-enable-x-ray-autotracing). - -#### Useful Smart Advice CLI commands - -:::warning Warning! -This is an experimental feature. The backwards compatibility is not guaranteed. -::: - -To obtain the full list of advice generated for your server use the following CLI command: - -``` -cl-smart-advice list -``` - -For each advice in the list the CLI command returns the following information: -* `metadata`, which includes information about `username`, `domain` and `website` for which the advice is issued -* `advice` information: - * its identifier `id` - * its `type` - * its `status` -- `review` or `applied` - * if advice is Premium `is_premium` - * other internal informational fields - -The example output is given below: - -``` -{ - "data": [ - { - "created_at": "2023-04-11T07:33:48.191870+00:00", - "updated_at": "2023-04-11T07:33:48.191870+00:00", - "metadata": { - "username": "user16", - "domain": "user16.com", - "website": "/wordpress" - }, - "advice": { - "id": 23484, - "type": "OBJECT_CACHE", - "status": "review", - "description": "Turn on Object Caching", - "is_premium": true, - "module_name": "object_cache", - "subscription": { - "status": "no", - "upgrade_url": null - }, - "total_stages": 0, - "completed_stages": 0, - "detailed_description": "To improve site performance, enable the Object Caching We recommend applying the advice if you see it frequen -tly for the most valuable URLs of your site." - } - }, - { - "created_at": "2023-04-11T07:33:48.297784+00:00", - "updated_at": "2023-04-11T08:51:42.362117+00:00", - "metadata": { - "username": "user16", - "domain": "user16.com", - "website": "/wordpress" - }, - "advice": { - "id": 23485, - "type": "SITE_OPTIMIZATION", - "status": "applied", - "description": "Turn on AccelerateWP feature", - "is_premium": false, - "module_name": "accelerate_wp", - "total_stages": 0, - "completed_stages": 0, - "detailed_description": "To improve site performance, enable the AccelerateWP optimization feature. We recommend applying the advice if you see it frequently for the most valuable URLs of your site." - } - } - ], - "result": "success", - "timestamp": 1681203110 -} -``` - -### End-user X-Ray plugin - -:::warning Warning -To use the end-user X-Ray plugin, update your LVE Manager and X-Ray packages to the `lvemanager-6.3.9-1` (or later) and `alt-php-xray-0.3-1` (or later) by running the following command: -``` -# yum update lvemanager alt-php-xray -``` -::: - -#### How to enable/disable the end-user X-Ray plugin - -You can hide or show the end-user X-Ray plugin icon by ticking or unticking the proper checkbox in the LVE Manager. - -Go to _LVE Manager → Options Tab → User interface settings_. - -![](/images/HideXRayAppCheckbox.png) - -:::tip Note -The X-Ray plugin icon in the end-user interface is hidden when the checkbox is ticked. -::: - -![](/images/XRayAppUIIcon.png) - -#### How to manage the end-user X-Ray plugin - -The web interface of the end-user X-Ray plugin is almost the same as the X-Ray administrator interface. - -![](/images/XRayEndUserUI.png) - -But there are some differences and they are described further. - -* End-users can create tasks only for their domains from the drop-down list: - ![](/images/XRayEndUserUIStart.png) -* To specify URL or wildcard, end-users should use the input field next to the domain: - ![](/images/XRayEndUserUiSpecifyURL.png) - -You can read about all other basic interface elements and managing tracing tasks in the [Managing tracing task section](/cloudlinux-os-plus/#managing-tracing-task). - -:::tip Note -Tracing tasks created by an end-user will also be displayed in the administrator interface and administrators can manage the end-user's tasks the same way as they manage their own. At the same time, tasks created by the administrator or other end-users will not be displayed in the UI of the current user. -::: - -#### End-user X-Ray plugin limitations - -* The end-user X-Ray plugin does not support creating continuous tasks. -* The end-user has a limit of tracing tasks running at a time. Before starting the next task, the end-user should wait for the completion of the previous ones or forcefully stop the running ones. Otherwise, the user will get the next error: - - ![](/images/XRayEndUserUIError.png) - :::tip Note - The current limit is one tracing task per user. - ::: -* The administrator and the end-user can’t run the tracing task for the same Domain/URL at the same time. Once, the administrator started a specific tracing task, the end-user will not be able to duplicate it. And the same is true for the administrators – they will just see the running task for the specific domain and see the notification that they're trying to create a tracing task with a duplicated URL. -* If continuous tracing is enabled for the domain, the end-user will not be able to create a new task for this domain because the same rule works - it will be a duplicate of the existing tracing tasks. The next warning will appear: - - ![](/images/XRayEndUserUIWarning.png) - - To solve this, the existing running tasks for the same Domain/URL should be stopped or completed. You can find more details about this in the [FAQ](/cloudlinux-os-plus/#what-should-i-do-if-i-see-the-warning-task-is-duplicated-by-url). - -* If a user's tracing task was created for a domain which is using the FPM handler there's an additional limitation. To avoid frequent reloads of the particular FPM service, **Start tracing** , **Stop tracing** or **Continue tracing** action would be blocked in case if the latest reload of a corresponding FPM service was done less than 1 minute ago. -If a user gets such an error message - it means that 1 reload in 1 minute for a particular FPM service has been already done. Just try performing the same operation once again in a while. - -![](/images/XRayEndUserFPMerror.png) - -### X-Ray automated throttling detection - -:::tip Note -**CPU throttling detection** is available since `alt-php-xray-0.3-2` and `lvemanager-xray-0.5-2`. - -**IO/IOPS throttling detection** is available since `alt-php-xray-0.3-7` and `lvemanager-xray-0.7-1`. - -- `kmod-lve-2.0-23` (and later) for CloudLinux OS Shared 8 or CloudLinux OS Shared 7 hybrid -- `kernel-1.5-58` (and later) for CloudLinux OS Shared 7 or CloudLinux OS Shared 6 hybrid - -are also required to utilize the feature of **IO/IOPS throttling detection**. -::: - -:::warning Warning -X-Ray automated throttling detection feature is not supported for CloudLinux OS Shared 6 -::: - -The X-Ray automated throttling detection system checks if the account exceeds LVE limits by CPU or by IO/IOPS during the HTTP request execution. Requests with exceeded LVE limits are indicated in both X-Ray Administrator and X-Ray User plugins. - -If CPU limiting was detected for a particular request, it is indicated in the X-Ray UI that the system itself has slowed down the request processing due to CPU throttling and this is apparently not a performance issue in the PHP code. - -If limiting by IO and IOPS in total was detected for a particular request, it is indicated in the X-Ray UI in the same manner, except for the cause of slowing down the request -- IO throttling. - -The case of both limiting for the request is also possible. - -![](/images/CPUIOLimiting.png) - -Requests with exceeded LVE limits are also marked in the request detailed view. - -![](/images/RequestDetails.png) - -Requests with exceeded LVE limits are marked in the PDF report as well. - -![](/images/PDFReport.png) - - -### X-Ray client - -X-Ray client is a PHP extension named `xray.so`. It analyzes the processing time of the entire request and its parts and then sends the data to the X-Ray agent. - -#### List of supported PHP versions - -The list of currently supported PHP versions: - -| | | | | | -|-|-|-|-|-| -|**ALT PHP**:|**EA PHP**:|**Plesk PHP**|**DirectAdmin PHP**|**Other panels PHP**| -|
  • alt-php54
  • alt-php55
  • alt-php56
  • alt-php70
  • alt-php71
  • alt-php72
  • alt-php73
  • alt-php74
  • alt-php80
  • alt-php81
|
  • ea-php54
  • ea-php55
  • ea-php56
  • ea-php70
  • ea-php71
  • ea-php72
  • ea-php73
  • ea-php74
|
  • php54
  • php55
  • php56
  • php70
  • php71
  • php72
  • php73
  • php74
|
  • php54
  • php55
  • php56
  • php70
  • php71
  • php72
  • php73
  • php74
|
  • 54
  • 55
  • 56
  • 70
  • 71
  • 72
  • 73
  • 74
| - -:::warning Warning! -[php-zts](/cloudlinux_os_components/#how-to-configure-alt-php72-zts-to-use-with-php-selector) and [custom PHPs, rolled in selector](/cloudlinux_os_components/#roll-your-own-php), are not supported -::: - -#### Functions that X-Ray client can hook - -#### Database queries - -* Functions from the [MySQL](https://www.php.net/manual/ru/book.mysql.php) extension: - * `mysql_query` - * `mysql_db_query` - * `mysql_unbuffered_query` -* Functions from the [MySQLi](https://www.php.net/manual/ru/book.mysqli.php) extension: - * `mysqli_query` - * `mysqli::query` - * `mysqli_multi_query` - * `mysqli::multi_query` - * `mysqli_real_query` - * `mysqli::real_query` -* Functions from the [PDO](https://www.php.net/manual/ru/book.pdo.php) extension: - * `PDO::exec` - * `PDO::query` - * `PDOStatement::execute` - -#### External requests - -* Function [curl_exec](https://www.php.net/manual/ru/function.exec) - -#### System PHP functions - -It may be any PHP system function which can be related to a PHP engine or other PHP extension, for example `fopen()` or `json_encode()`. A list of these functions can be found [here](https://www.php.net/manual/en/indexes.functions.php). - -#### Configuration Options - -
- -#### xray.enabled - -
- -**Syntax**: `xray.enabled=On/Off` - -**Default**: On - -**Changeable**: PHP_INI_SYSTEM - -**Description**: Enable or disable X-Ray extension from php.ini - ------ - -
- -#### xray.database_queries - -
- -**Syntax**: `xray.database_queries=[number]` - -**Default**: 20 - -**Changeable**: PHP_INI_SYSTEM - -**Description**: The number of the slowest SQL queries which will be sent to the X-Ray agent. The min value is 0 and the max value is 100. If the variable value is more, the default value will be used. - ------ - -
- -#### xray.external_requests - -
- -**Syntax**: `xray.external_requests=[number]` - -**Default**: 20 - -**Changeable**: PHP_INI_SYSTEM - -**Description**: The number of the slowest external requests (the curl_exec function) which will be sent to the X-Ray agent. The min value is 0 and the max value is 100. If the variable value is more, the default value will be used. - ------ - -
- -#### xray.system_functions - -
- -**Syntax**: `xray.system_functions=[number]` - -**Default**: 20 - -**Changeable**: PHP_INI_SYSTEM - -**Description**: The number of the slowest system functions which will be sent to the X-Ray agent. -The min value is 0 and the max value is 100. If the variable value is more, the default value will be used. - ------ - -
- -#### xray.backtrace_depth - -
- -**Syntax**: `xray.backtrace_depth=[number]` - -**Default**: 10 - -**Changeable**: PHP_INI_SYSTEM - -**Description**: The backtrace depth to the main() function which will be sent to the X-Ray agent. The min value is 0 and the max value is 20. If the variable value is more, the default value will be used. - ------ - -
- -#### xray.processor - -
- - -**Syntax**: `xray.processor=[processor_name]` - -**Default**: xray - -**Changeable**: PHP_INI_SYSTEM - -**Description**: Tells the X-Ray client which processor to use. The new processors may be added in the future. The default processor is xray which means to send data to the X-Ray agent. - ------ - -
- -#### xray.tasks - -
- -**Syntax**: `xray.tasks=host:uri:ip:id` - -**Default**: no value - -**Changeable**: PHP_INI_SYSTEM - -**Description**: The current tracing tasks for the given PHP request. This directive is added automatically by the X-Ray manager when creating a task. It is not allowed to edit manually, as X-Ray may stop working. - ------ - -
- -#### xray.to_file - -
- -**Syntax**: `xray.to_file=On/Off` - -**Default**: Off - -**Changeable**: PHP_INI_SYSTEM - -**Description**: Only for debug purposes. Writes to a file data which is sent to the processor. - ------ - -
- -#### xray.debug - -
- -**Syntax**: `xray.debug=On/Off` - -**Default**: Off - -**Changeable**: PHP_INI_SYSTEM - -**Description**: Only for debug purposes. Enables debug output during request processing. In the On mode can slow down the domain. - ------ - -
- -#### xray.debug_file - -
- -**Syntax**: `xray.debug_file=[path_to_file]` - -**Default**: `/tmp/xray-debug.log` - -**Changeable**: PHP_INI_SYSTEM - -**Description**: Only for debug purposes. Specifies a file for logging debug information. - - -### X-Ray agent - - -This is a service that receives data from the X-Ray client and sends it to the remote storage. - -#### Managing X-Ray service - -The X-Ray agent is managed by the `service` utility. - -* To start the X-Ray agent, run the following command: - -
- - ``` - # service xray-agent start - ``` -
- -* To stop the X-Ray agent, run the following command: - -
- - ``` - # service xray-agent stop - ``` -
- -* To restart the X-Ray agent, run the following command: - -
- - ``` - # service xray-agent restart - ``` -
- -### FAQ - -#### Does X-Ray affect website performance? - -X-Ray affects website performance. Our tests show 5-10 % overhead from a website loading time with X-Ray tracing enabled. -X-Ray allows you to find website performance issues and should not be enabled permanently. If your website is very slow, you can enable X-Ray to find the cause and then disable it. - -#### What should I do if I see the warning "Task is duplicated by URL"? - -This warning means that you already have a task to trace this URL in the list of your tracing tasks. If you see this warning, a new task can be created only with the _On hold_ status and you will be able to run it only when the previous task with the same URL will be completed. - -Note that the URL field supports wildcard matching and you can have a case when X-Ray is tracing the `URL=domain.com/*` and you are trying to create a new task with `URL=domain.com/xray.php`. In this case, you will see that warning because the `*` URLs array includes `xray.php`. - -#### I started a tracing task and made requests to URL but did not see any results in the UI. What should I do? - -1. X-Ray may not send data if a site uses a caching plugin, as the caching plugin is outputting HTML, thus there are no PHP scripts to examine. We encountered such issues with sites that use LSCache and WP Super Cache plugins. Check that your site does not use caching plugins. If so, disable it while tracing a site to get information from X-Ray. Moreover, it can also be because of caching on server side, for example NGINX Cache. Or when using CDN because requests are processed from another host. In such cases, during tracing, caching must also be disabled. -2. If you set a client’s IP when creating the tracing task, check that your requests come to the server with this IP via phpinfo (since there may be NAT between your local machine and the server). - - ![](/images/XRayPHPInfoRemoteAddr.png) - -3. Check that **xray** extension is enabled for the domain. To do so, go to the `phpinfo()` page and make a request. In the phpinfo output try to find the following section: - - ![](/images/XRayPHPInfo.png) - -If you cannot see that section, try to restart PHP processes for that user (the simplest way is to restart Apache) and check that you can see the **xray** extension. - -4. If you can see the **xray** extension in the phpinfo, check that X-Ray agent service is running with the service xray-agent status command. If it is not running, start it with the `service xray-agent start` command. - -5. If, after checking the previous items, the issue persists, [contact our support team](https://cloudlinux.zendesk.com/hc/en-us/requests/new). - -#### What to do if X-Ray is not found in the phpinfo() page? - -If you managed to create a tracing task, this means that the `xray.ini` file was created in a system. Therefore, there may be two reasons why it did not appear in the phpinfo page of the domain. - -1. PHP process wasn't reloaded after adding the xray.ini. To solve this, you should restart the Apache or fpm service for the domain on which the tracing was started. At the moment, this is done automatically by the X-Ray manager after creating the task. -2. Your domain uses a PHP version different from the one which was detected by the X-Ray manager. To solve this, check the scan dir for additional ini files for your domain. - - ![](/images/XRayScanDir.png) - - Then check the `ini_location` that was passed to the X-Ray manager by running the following command: - -
- - ``` - # cat /usr/share/alt-php-xray/manager.log | grep ini_location - ``` -
- - Find your tracing task in the output and check that the `xray.ini` exists in this directory, also check that the `ini` path is the same in the phpinfo page output and in the `ini_location` directive for your tracing task. If they are the same, you should reload your PHP. If they are different that means that the X-Ray manager could not correctly determine the PHP version your domain uses. In this case, contact our support team at [https://cloudlinux.zendesk.com/hc/requests/new](https://cloudlinux.zendesk.com/hc/requests/new). - - -#### I use LiteSpeed, X-Ray is enabled and it is shown in the phpinfo() page but does not collect data when sending requests to a site. What to do? - -Check for the `CacheLookup on` option in the `htaccess` file for your domain. -If the option is there, LiteSpeed processes requests bypassing the PHP X-Ray extension. -In this case, to get tracing information, you should remove the `CacheLookup on` option. - -#### What is the proper format for the URL? - -All of the examples below are correct: - -* `http://domain.com` -* `http://domain.com/` -* `https://domain.com` -* `https://domain.com/` - -You can use any of them with a prefix `www.` and it is also correct. - -#### What packages are required for X-Ray? - -Required packages: - -* `lvemanager` >= 6.2.10-1 -* `alt-php-xray` >= 0.2-1 - - - -## Centralized Monitoring - - -* [Description](/cloudlinux-os-plus/#description-2) -* [Installation](/cloudlinux-os-plus/#installation-2) -* [Centralized Monitoring: mode without session expired](/cloudlinux-os-plus/#centralized-monitoring-mode-without-session-expired) -* [Centralized Monitoring user interface](/cloudlinux-os-plus/#centralized-monitoring-user-interface) -* [Alert Manager](/cloudlinux-os-plus/#alert-manager) -* [FAQ](/cloudlinux-os-plus/#faq-2) -* [Troubleshooting](/cloudlinux-os-plus/#troubleshooting) - -### Description - -Centralized Monitoring is a tool that allows hosting administrators to monitor load for all their servers and users. - -Centralized Monitoring allows you to: - -* View system metrics for all clients’ end servers -* View the LVE statistics per user for all clients’ end servers - -### Installation - -:::tip Note -Make sure that `cm.cloudlinux.com` is available on your end server. -::: - -1. Make sure you have a CloudLinux OS Shared Pro subscription. -2. Make sure you have installed the **lve-utils** package version 4.2.21-2 or later. You can install or update it with the following commands: - * installation - ``` - yum install lve-utils - ``` - * update - ``` - yum update lve-utils - ``` -3. Log in to the [https://cm.cloudlinux.com/](https://cm.cloudlinux.com/) using CLN credentials (if you are already logged in via CLN, authorization via CM is not necessary, it uses SSO). -4. Activate statistics collection on all your servers via the Centralized Monitoring UI ([https://cm.cloudlinux.com](https://cm.cloudlinux.com)) or via the CLN UI [https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring](https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring). - ![](/images/CMInstallationProd.png) -5. Within 5 hours from the activation, statistics collection and sending to the central server will be set up automatically: all required packages and components will be installed. For new, just registered servers, statistics collection and sending will be set up automatically within 5 hours. -6. Make sure you have activated statistics collection (see paragraph 4) otherwise you will not be able to set up your servers. For instant set up of a registered server after statistics collection was enabled, run the following commands for all servers: - ``` - # rhn_check - # /usr/share/cloudlinux/cl_plus/manage_clplus enable - ``` - **Note**: If the `rhn_check` command is not found, run the following command: - ``` - # yum install/update rhn-check rhn-setup - ``` -7. After 5 hours (or after the manual setup), check that statistics for all registered servers is collected via [https://cm.cloudlinux.com/#/servers](https://cm.cloudlinux.com/#/servers). And check that user statistics on the servers is collected via [https://cm.cloudlinux.com/#/users](https://cm.cloudlinux.com/#/users). - :::tip Note - User statistics will be available only for users that were loaded starting from connecting the server to the Centralized Monitoring. - ::: - - -### Centralized Monitoring: mode without session expired - -Users can monitor server’s or user’s load for a long time using the mode without session expired. - -To turn on the mode without session expired, follow the next steps: - -1. Log in to the [cln.cloudlinux.com](https://cln.cloudlinux.com/console/) via your account -2. Open the [cm.cloudlinux.com](https://cm.cloudlinux.com/#/servers) in a new browser tab/window (please, use the same browser as in step 1) -3. Use the toggle to turn on/off 10 min auto logout - - ![](/images/AutoLogout.png) - -Your session in the [cln.cloudlinux.com](https://cln.cloudlinux.com/console/) will expire in 10 min. But your session in the [cm.cloudlinux.com](https://cm.cloudlinux.com/#/servers) will not expire while your browser tab remains open. - - -### Centralized Monitoring user interface - - -You can access Centralized Monitoring in your [CLN account](https://cln.cloudlinux.com/). -Click C-Monitoring in the left menu. - -![](/images/CMCLNAccount.png) - -#### Servers - - -This page contains the list of all clients’ end servers. The server appears in the list after finishing [Installation](/cloudlinux-os-plus/#installation-2). By default, there is a descending sort by CPU usage. - -![](/images/CMAllServers.png) - -The following values are available for each server: - -* **Load Avg 15m** – average system load for the last 15 min -* **CPU Usage** – CPU usage for the last 15 min (the number of cores can be found in the hint) -* **Memory Usage** – free available memory, the second value is the total memory for the last 15 min -* **IO read/write** – disk read bytes/disk written bytes for the last 15 min - -:::tip Note -The values are calculated using a 15 min time period but the metric state is updated automatically every minute by default or you can choose from one of the predefined periods. -::: - -* **Idle state** – there were no statistics for the server for the last minute. -* **N/A state** – there were no statistics for the server for the last 30 days. This can happen if a new server was added but statistics sending was not configured. - -There is no pagination on the _All servers_ page and all columns can be sorted by absolute value. -Use the search tool to operate with the data. - -#### Servers details - -To get the detailed statistics for the server via charts, click a desired server line in the table. -All charts are auto-refreshed and there is an ability to select the period for metrics data to be updated for the chart. - -![](/images/CMUPdates.png) - -:::warning Note -We store the metrics data for one month only. -::: - -#### Charts for server metrics - -#### Visualization of the most popular server states - -![](/images/CMMostPopularStates.png) - -#### Disk space usage - -![](/images/CMDiskSpaceUsage.png) - -#### Open file descriptor/Context switches - -![](/images/CMOpenFileDescriptorContextSwitches.png) - -#### System load 1m , 5m, 15m - -![](/images/CMSystemLoad.png) - -#### CPU usage (total, system, user, iowait, steal) - -![](/images/CMSCPUUsag.png) - -#### Network traffic usage - -![](/images/CMNetworkTrafficUsage.png) - -#### Disk space usage - -![](/images/CMDiskSpaceUsageBasics.png) - -#### Memory usage (total, used, available) - -![](/images/CMMemoryUsage.png) - -#### Time spent doing I/Os - -![](/images/CMTimeSpentDoingIO.png) - -#### Disk IOps Completed - -![](/images/CMDiskIOpsCompleted.png) - -#### Disk read/write data - -![](/images/CMDiskReadWriteData.png) - -#### Disk read/write time - -![](/images/CMDiskReadWriteTime.png) - -#### Apache connections (number)/Number of requests per minute/Max connections - - -:::warning Note -In the current version, we collect these metrics for the cPanel end servers only. We are planning to add other panels support soon. -::: - -:::warning Note -In the current version, we collect these metrics only for Apache (NOT for LiteSpeed, Nginx, etc.). The charts will be empty for LiteSpeed, Nginx, etc.. -::: - -#### MySQL queries - -![](/images/CMMySQLQueries.png) - -MySQL queries collector gets number of queries executed on the server per minute. It takes data from the MySQL server variable "Questions". You may manually check variable value by executing query `SHOW GLOBAL STATUS LIKE 'Questions';`. For more information about MySQL server variables - please, see MySQL documentation. - -#### The most loaded server users for the last minute - -![](/images/CMMostLoadedUsers.png) - -We calculate the user’s load by LVE statistics that we collect on the end server. -The idle state for the user means that the LVE statistics were not collected for the last minute for some reason. - -In each cell there are current usage/limit values for the basic LVE limits: - -* CPU Usage -* Entry Processes -* Physical Memory Usage -* IOPS -* IO Usage -* Number of Processes -* MySQL CPU -* MySQL IO - -In the hint, there is a number of faults for each limit. The values in the columns are underlined (it is red if load-to-limit ratio >=90% and it is yellow if load-to-limit ratio >= 50%). For the current implementation, the only sort by the load-to-limit ratio is available. -By default, there is a descending sort by the CPU usage column. - -When sorting by a column, the lines with the load-to-limit ratio >=90% for this column will have the red background color, and lines with the load-to-limit ratio >=50% for this column will have the yellow background color. - -:::tip Note -The users with unlimited resources (∞) will be at the bottom of the table. -::: - -#### Users - -This page contains all users for the all server of the client and their LVE statistics for the last minute. You can select the number of users on this page and search by user’s data. - -The description of this page is the same as [*The most loaded server users for the last minute*](/cloudlinux-os-plus/#the-most-loaded-server-users-for-the-last-minute) of the top 5 loaded users. - - -![](/images/CMUsers.png) - -User’s metrics data can be sorted by the load-to-limit ratio and by the absolute value. - -The absolute value is used to analyse the load produced by unlimited users. - -The value of the load-to-limit ratio is convenient to use in the analysis of how many resources the users consume and whether they need to change the limits. - -The values like this ![](/images/CMvalue.png) means that the resource is unlimited and 500.2 MB is the current usage of it. - -Metrics data of _Idle users_ is not used in the sorting, so such users always will be at the end of the list. The sorting can be done for only one metric. - -#### Charts for Users metrics - -:::warning Note -We store the metrics data for one month only. -::: - -On the user details page, the admin can find the charts for all LVE limits. - -![](/images/CMUsersCharts.png) - - -### Alert Manager - -Alert Manager allows you to create a server or user alert for selected metrics and email the triggered events. - -#### Alert Manager page - -![](/images/CMAlertManager1.png) - -The Alert Manager page contains a table with the following: - -* **Alert name** - a unique alert name -* **Tracking metric** - a name of a server/user metric which will trigger the alert notification -* **# of servers** - number of servers on which the metric will be tracked - * click ![](/images/CMAlertManager2.png) to view a list of servers host names -* **# of users** - number of users for which the metric will be tracked - * click ![](/images/CMAlertManager2.png) to view a list of users names -* **Value** - a condition for the alert rule which will be applied to the tracking metrics -* **Email** - email to send the triggered events notifications -* **Type** - a type of the alert rule -* **# of triggered events** - the number of events from the time, when alert rule was created - * ![](/images/CMAlertManager3.png) the event is still firing -* **Time of the last trigger** - the time of last triggered event, it is the time in your browser time zone -* **Actions** - click ![](/images/CMAlertManager4.png) to edit and ![](/images/CMAlertManager5.png) to delete the alert rule - -**Color Codes** - -* **Red** color means that the event with the condition "more than" is still firing. -* **Green** color means that the event with the condition "less than" is still firing. - -#### Creating an alert - -To create a new alert, click the _Create alert_ button. - -![](/images/CMAlertManager7.png) - -Next, fill out the opened popup. - -![](/images/CMAlertManager6.png) - -* **Name of alert** - a unique alert name -* **Alert type** - an admin can create a **user** or a **server** alert. [What is the difference between them?](/cloudlinux-os-plus/#difference-between-the-server-alert-and-the-user-alert) -* **Select user/server** - admin will see such dropdown depending on a [case of alert creating](/cloudlinux-os-plus/#cases-of-alert-creating) -* **Notify me** - the condition of the alert trigger -* **Duration** - how much time the condition should be actual to trigger the notification -* **Notify me on email** - the email to send notifications - -#### Editing an alert - -An admin can edit any field in the Alert except the Alert type. - -#### Difference between the server alert and the user alert - -The **server alert** is used to track the state of the whole server, it does not track user state on the server. -The **server alert** tracks the next list of metrics: - -1. Context switches -2. System load (1m) -3. System load (5m) -4. System load (15m) -5. CPU Basic (total) -6. CPU Basic (system) -7. CPU Basic (user) -8. CPU Basic (iowait) -9. CPU Basic (steal) -10. Network Traffic Basic (`eht0_receive`) -11. Network Traffic Basic (`eht0_transmit`) -12. Network Traffic Basic (`ehtN_receive`) -13. Network Traffic Basic (`ehtN_transmit`) -14. Disk Space Used Basic (`mountpoint: <0>`) -15. Disk Space Used Basic (`mountpoint: <1>`) -16. Disk Space Used Basic (`mountpoint: `) -17. Memory Basic (available) -18. Memory Basic (used) -19. Time spent Doing I/Os -20. Disk IOps Writes Completed -21. Disk IOps Reads Completed -22. Disk Read Data -23. Disk Write Data -24. Disk Read Time -25. Disk Write Time -26. Apache connections -27. Number of requests per minute -28. MySQL queries -29. Hardware Temperature (`chip<0>`) -30. Hardware Temperature (`sensor<0>`) -31. Hardware Temperature (`chip`) -32. Hardware Temperature (`sensor`) -33. Open File Description - -During creating a server alert an admin should select the type of metrics as the first step. The list of servers will be collected according to the availability of these metrics on the server. - -For example, for now, we do not collect Apache metrics for non-cPanel servers, so you will get only cPanel servers as a list of servers for these metrics. - -We're planning to implement support for other panels/web servers in the next releases. - -:::tip Small limitation -We collect the server list according to having their statistics in our database (this behavior will be changed in the next releases). -::: - -For example, if server state is N/A or idle more than 24 hours, it will not be visible in the list for the alert. - -The **user alert** tracks the next list of LVE metrics: - -1. CPU Usage (current usage) -2. CPU Usage (faults) -3. Entry Processes (current usage) -4. Entry Processes (faults) -5. Physical Memory Usage (current usage) -6. Physical Memory Usage (faults) -7. IOPS (current usage) -8. IOPS (faults) -9. IO Usage (current usage) -10. IO Usage (faults) -11. Number of Processes (current usage) -12. Number of Processes (faults) -13. MySQL CPU (current usage) -14. MySQL CPU (faults) -15. MySQL IO (current usage) - -:::tip Small limitation -We collect the server list according to having their statistics in our database (this behavior will be changed in the next releases). -::: - -For example, if the user state is N/A or idle more than 24 hours, it will not be visible in the list for the alert. - -#### Cases of alert creating - -* Creating a server alert for the selected metrics for one server -* Creating a server alert for the selected metrics for all servers (the default value) - -In this two cases, you will not see the dropdown for selecting users because the metrics will track the server state. - -* Creating a user alert for one user, so admin can select a server and a user. -* Creating a user alert for all users on several servers/all servers (in this case admin can't select users - all users will be selected automatically) - -#### What is the Firing state of the alert? - -This is the state of an alert that has been active for longer than the configured threshold duration. - - -#### Alert notifications - -![](/images/CMAlertManager8.png) - -* **Alert name** - the link to the alert page -* **Firing target** - the link to the server details page - - - -### FAQ - -#### How can I disable collecting and sending statistics on a client’s server? - -Run this command: - -
- -``` -/usr/share/cloudlinux/cl_plus/manage_clplus disable -``` -
- - -#### Where can I view all my servers load? - -You can find all your servers load in your CM personal account here: [https://cm.cloudlinux.com/#/servers](https://cm.cloudlinux.com/#/servers) or in your CLN personal account here: [https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring](https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring). - - -#### Where can I view all my users load? - -You can find all your users load in your CM personal account here: [https://cm.cloudlinux.com/#/users](https://cm.cloudlinux.com/#/users) or in your CLN personal account here: [https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring](https://cln.cloudlinux.com/console/cloudlinux/centralized-monitoring) - - -#### Where can I view a server load details for a period? - -Click the desired server in the server list in the UI. - -#### Where can I view a user load details for the period? - -Click the desired user in the user list in the UI. - -#### How long are statistics stored in the central database? - -30 days. - -#### How can I change the charts period on the details page? - -Choose the desired period in the upper right corner or select it directly on the chart. - -#### I don’t understand how to read the user load chart. - -The user load chart contains three lines: - -* limit -* current load -* count of faults - -Limit and current load are drawing regarding the left vertical axis, the count of faults is drawing regarding the right vertical axis. You can focus on a particular line by clicking a required legend. - - -### Troubleshooting - -#### I can't see a server statistics - -1. Check that your server is registered by key or by IP license of the CloudLinux+ account, i.e., it should be seen in the list of servers in your CLN account here: [https://cln.cloudlinux.com/console/auth/login](https://cln.cloudlinux.com/console/auth/login) -2. Check that the following required packages are installed on the end server: -* `cl-end-server-tools` >= 1.0.7-1 -* `cl-node-exporter` >= 1.1.0-2 -* `rhn-client-tools` - * CloudLinux OS Shared 6 >= 1.1.15-3.el6.cloudlinux.26 - * CloudLinux OS Shared 7 >= 2.0.2-31.el7.clouldinux - * CloudLinux OS Shared 8 >= 2.8.16-14.module_el8.1.0+6074+9dc6073e.cloudlinux.2 -* `lve-stats` >= 3.0.7-2 -* `lve-utils` >= 4.2.21-2 -* `alt-python27-cllib` >= 2.1.13-1 -* `lvemanager` >= 6.2.10-1 -3. Check that service collecting and sending statistics is running: - -
- -``` -service cl_plus_sender status -``` -
- -4. Check that log of the _cl_plus_sender_ service doesn't contain errors: - -
- -``` -/var/log/clplus_sender.log -``` -
- -#### Where can I view the events log on the client's server? - -You can view the events log on the client's server here: - -
- -``` -/var/log/clplus_sender.log -``` -
- -#### Can I get monitoring metrics from LiteSpeed, Nginx or other (Not Apache) web server? - -Starting from end-server-tools-1.0.7, it supports collecting and sending statistics from the Apache and LiteSpeed web servers. - -LiteSpeed is supported on cPanel and DirectAdmin control panels. - -Each minute the statistics collection daemon checks which web server is started. If LiteSpeed is started, the daemon will collect data from it, otherwise, it checks if Apache is started. - -When the daemon detects that the server is changed, it writes the following line into the statistics collection daemon log `/var/log/clplus_sender.log`: - -``` -2020-10-09 17:25:31,462: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Using Apache -``` -or - -``` -2020-10-09 18:13:03,897: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Using Litespeed -``` - -If the daemon can't detect either Apache or LiteSpeed, it writes to the log the following: - -``` -2020-10-09 17:33:38,399: (CL+_sender_daemon) [INFO] Apache/Litespeed collector: Apache or Litespeed stopped or absent, collector will not work -``` - -The statistics collection daemon reacts to the server changing automatically, no need to restart it. - -:::warning Warning -Please note that the daemon checks the server type once in a minute, so the data sent on a minute of switching can be unreliable. -::: - -#### Logging data sent to pushgateway to the statistics collection daemon log - -Starting from `cl-end-server-tools` v.1.0.6-1, the statistics collection daemon allows to log data sent to pushgateway to its log `/var/log/clplus_sender.log`. - -To start logging, run the following command: - -``` -touch /var/lve/cmt_debug_logging -``` - -To stop logging, run the following command: - -``` -rm -f /var/lve/cmt_debug_logging -``` - -You don't need to restart the daemon after starting/stopping logging. The presence of a control file is evaluated "on the fly". - -:::warning Warning -Use this logging with caution because when it is enabled, the size of the daemon log `/var/log/clplus_sender.log` will increase each minute minimum on 3-4 KB. The actual increase size depends on the number of active users' processes on a server. -::: - -### Known issues - -* MySQL Governor statistics in some cases is collected incorrectly -* Sorting by MySQL Governor statistics ignores idle users -* Sorting from the search result set does not work -* Sorting by ratio for unlimited users works incorrectly - - -## AccelerateWP - -### Get started - -AccelerateWP carries a suite of optimization features that can be enabled and automatically configured for the end-user's site. - -There are AccelerateWP, AccelerateWP Premium and AccelerateWP CDN features suites. - -AccelerateWP suite is always enabled when AccelerateWP is turned on. Choose whether you want to offer AccelerateWP Premium - or CDN (Content Delivery Network) for your users (by opting in) and click "Turn on" to start exploring AccelerateWP. - -![](./images/awp/AWPGettingStarted.png) - -Once the AccelerateWP suite is enabled by administrator, -end-users will see an AccelerateWP tab in their control panel interface and be able to activate the optimization feature. - -When AccelerateWP CDN suite enabled by administrator, end-users will get 1 GB of CDN traffic and be able to activate -feature to use until limit is reached. Once 1GB limit is reached - end-user will be suggested to extend CDN limit by -purchasing CDN plan using [WHMCS or 3'd party billing](#billing-integration) - -When AccelerateWP Premium suite enabled by administrator, -end-users will see the Object Caching, Image Optimization and Critical CSS features in their interface, -but cannot activate the feature unless they purchase the feature using [WHMCS or 3'd party billing](#billing-integration). - - -#### AccelerateWP suite -This is a basic suite which includes [AccelerateWP base feature](https://user-docs.cloudlinux.com/wpos-plugin/#acceleratewp-feature-wordpress-optimization-plugin): -a WordPress optimization plugin that provides full page caching, GZIP compression and some other useful optimizations. - -**AccelerateWP suite limitations** -* the website must be served with Apache web server; -* the website must use PHP version 7.2 or higher. -* the WordPress version must be 5.6 and higher. -* the other WordPress Caching plugins must not be installed. -* the WordPress should not run in Multisite mode. - -#### AccelerateWP Premium suite - -This is a premium suite which includes [Object Caching feature](https://user-docs.cloudlinux.com/wpos-plugin/#acceleratewp-premium-object-caching-feature). - -The Object Caching mechanism stores database query results in additional storage for quick access. -This mechanism is really helpful in case if website needs to process multiple pages per second as -requests come in and may be helpful in case when full page caching cannot be used, e.g. on personalized pages. - -[Image Optimization feature](https://user-docs.cloudlinux.com/wpos-plugin/#image-optimization) - -[Critical CSS feature](https://user-docs.cloudlinux.com/wpos-plugin/#css-files) - -**Premium suite limitations** - -* the website must be served with Apache web server; -* the website must use one of the following PHP handlers: - * [php-fpm](https://blog.cpanel.com/how-to-use-php-fpm-with-cpanel/) - * [lsapi](/cloudlinux_os_components/#apache-mod-lsapi-pro) -* the website must use ea-PHP version 7.4 or 8.0. -* the WordPress version must be 3.7 and higher. -* the other WordPress Caching plugins must not be installed. -* the [Snuffleupagus](https://snuffleupagus.readthedocs.io/) must be turned off. -* the WordPress should not run in Multisite mode. - - -#### AccelerateWP Premium CDN suite - -This suite includes [CDN feature](https://user-docs.cloudlinux.com/wpos-plugin/#cdn) - -CDN (Content Delivery Network) is the feature which speeds up resource loading for WordPress site customers. -[CDN suite limitations](#acceleratewp-suite) are the same as for AccelerateWP feature. - - -### Limitations -There are the following requirements to use AccelerateWP: -* the server must have CloudLinux Shared PRO license; -* the server must be powered with cPanel or Plesk. - - -### Administrator interface - -#### Overview -In the _CloudLinux Manager → AccelerateWP_ tab an administrator has the opportunity to provide end-users with a suite of features, which on its turn could be activated by end-users. - -![](./images/awp/AWPAdmin.png) - -Once the feature suite is enabled by administrator, end-users will see an AccelerateWP tab in their control panel interface and be able to activate the optimization feature. - -#### Suites usage statistics -When AccelerateWP is enabled, the AccelerateWP usage statistics is shown. - -![](./images/awp/AWPStats.png) - -It includes: -* `Active Users` block with total number of users and number of users who has activated the optimization feature/total users -* `Wordpress sites on server` block with total number of WordPress sites and WordPress sites optimized by the feature -* statistics table - -Each row in the statistics table represents a particular user. - -The first column `#of Wordpress sites` shows total number of user's WordPress sites. - -The second column `AccelerateWP` shows number of user's WordPress sites, optimized by the feature. - -To enable premium features, click on the "Activate premium features" link and select the options you want. To integrate functions with billing, you must specify the base URL for the purchase of the function by end users. - -![](./images/awp/AWPPremiumManage.png) - -In case if both AccelerateWP and AccelerateWP Premium feature suites are enabled, -the statistics is extended with AccelerateWP Premium metrics. - -![](./images/awp/AWPStatsPremium.png) - -Please notice the `AccelerateWP Premium` rows in the `Active Users` and the `Wordpress sites on server` -blocks, and also the `AccelerateWP Premium` column in statistics table. - -:::tip Note -Newly created users will be accounted for 10 min after adding. -If you want to get updated statistics immediately, use the "Rescan users websites" button. -::: - -#### Filters -You may use the following filters to browse AccelerateWP statistics slices. - -![](./images/awp/AWPFilters.png) - -* `Users with WordPress sites only` filter will show statistics for users which already have WordPress sites; users without WordPress installations will be hidden -* `Users with AccelerateWP only` filter will show statistics for users who utilizes the AccelerateWP optimization feature; users who did not activated AccelerateWP feature will be hidden -* `Users with AccelerateWP Premium only` filter will show statistics for users who utilizes AccelerateWP Premium (Object Caching) feature; users who did not activated AccelerateWP Premium feature will be hidden -* `Users with CDN Free only` filter will show statistics for users who utilizes AccelerateWP CDN feature -* `Users with CDN Pro only` filter will show statistics for users who utilize AccelerateWP CDN Pro feature - - -### Activate free AccelerateWP for all WordPress sites on the server -Use the `cloudlinux-awp-admin enable-feature` CLI command to -ensure the best performance for every end-user. CLI command -scans a server for all WordPress sites and activates the AccelerateWP -feature suite. It can take up to 2 minutes for a single site. CLI command skips activation for WordPress sites with -page caching or feature incompatibilities. - -:::tip Note -Please make sure your AccelerateWP version is >= 1.2-2 before proceed. -::: - -Scan the server in background mode and activate AccelerateWP -on those WordPress sites where it is possible: -``` -cloudlinux-awp-admin enable-feature --all -``` -The output will state the number of users for the scan and the -progress state of the process. - -Check activation status: -``` -cloudlinux-awp-admin enable-feature --status -``` -The output will be either: -* Activation is still in progress, -* Activation is done. The message will state how many users -were initially for the scan, a number of WordPress sites with -successfully activated suite, and the total number of WordPress sites -scanned. - -### Enable AccelerateWP CDN Pro - -To enable CDN Pro for all users: -``` -cloudlinux-awp-admin set-suite --suites accelerate_wp_cdn_pro --users all --allowed-for-all -``` - -To enable CDN Pro for a particular user: -``` -cloudlinux-awp-admin set-suite --suites accelerate_wp_cdn_pro --allowed --users= -``` - -### Disable AccelerateWP for a particular user -Use CLI commands to disable undesired optimization suites for a single user. - -To disable AccelerateWP suite: -``` -cloudlinux-awp-admin set-suite --suites=accelerate_wp --disallowed --users= -``` - -To disable AccelerateWP Premium suite: -``` -cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --disallowed --users= -``` - -To disable AccelerateWP CDN suite: -``` -cloudlinux-awp-admin set-suite --suite=accelerate_wp_cdn --disallowed --users= -``` - -To disable AccelerateWP CDN Pro suite: -``` -cloudlinux-awp-admin set-suite --suite=accelerate_wp_cdn_pro --disallowed --users= -``` - -To disable all suites: -``` -cloudlinux-awp-admin set-suite --suites=accelerate_wp,accelerate_wp_premium,accelerate_wp_cdn,accelerate_wp_cdn_pro --disallowed --users= -``` - -### Useful AccelerateWP CLI commands -Use CLI commands to check AccelerateWP features status. - -If you are also interested in Smart Advice CLI command, they could be found [here](/cloudlinux-os-plus/#useful-smart-advice-cli-commands). - -:::warning Warning! -This is an experimental feature. The backwards compatibility is not guaranteed. -::: - - -#### AccelerateWP suites statistics - -Get suites statistics for all users: -``` -cloudlinux-awp-admin get-report --all -``` - -or for a particular user: -``` -cloudlinux-awp-admin get-report --users= -``` - -This CLI command returns the following information: -* total number of users in the report -- `total_users_count` -* total number of websites in the report -- `total_wordpress_count` -* total number of users with particular suite enabled -- `total_users_count_active` -* total number of websites with particular suite enabled -- `total_sites_count_active` -* number of websites with particular suite enabled per each user in the report -- `*_sites_count` in the `users` list -* suites visibility status per each user in the report -- `suites` in the `users` list - * possible values for visibility status are: `visible`, `allowed`, `disabled` - -The example output for a single user is given below: - -``` -{ - "last_scan_time": 1681198804, - "result": "success", - "timestamp": 1681203383.3503218, - "total_sites_count_active": { - "accelerate_wp": 1, - "accelerate_wp_premium": 0 - }, - "total_users_count": 1, - "total_users_count_active": { - "accelerate_wp": 1, - "accelerate_wp_premium": 0 - }, - "total_wordpress_count": 2, - "users": [ - { - "accelerate_wp_active_sites_count": 1, - "accelerate_wp_premium_sites_count": 0, - "suites": { - "accelerate_wp": { - "source": "manual", - "status": "allowed" - }, - "accelerate_wp_premium": { - "source": "default", - "status": "visible" - } - }, - "username": "user16", - "wp_sites_count": 2 - } - ] -} -``` - -#### AccelerateWP features statistics - -Get overall AccelerateWP features usage statistics for a server with: - -``` -cloudlinux-awp-admin get-stat -``` - -This CLI command returns the following information: -* number of `allowed_users` in `total` and per feature -* number of sites with enabled features in `total` and per feature -- `enabled_sites` -* number of users with visible features in `total` and per feature -- `visible_users` -* features which are currently allowed -- `features_allowed_by_default` -* features which are currently visible -- `features_visible_by_default` - -The example output is given below: - -``` -{ - "allowed_users": { - "object_cache": 0, - "site_optimization": 1, - "total": 1 - }, - "enabled_sites": { - "object_cache": 0, - "site_optimization": 1, - "total": 1 - }, - "features_allowed_by_default": [ - "site_optimization" - ], - "features_visible_by_default": [ - "object_cache", - "site_optimization" - ], - "is_accelerate_wp_flag_enabled": false, - "is_accelerate_wp_icon_enabled": true, - "result": "success", - "timestamp": 1681208259.19426, - "visible_users": { - "object_cache": 22, - "site_optimization": 22, - "total": 23 - } -} -``` - -#### AccelerateWP features detailed statistics - -AccelerateWP features detailed statistics is available in user's environment only. - -Use the following CLI command **_on behalf of a user_**: - -``` -cloudlinux-awp-user get -``` - -The command reports: -* features allowed for a user -- `allowed_features` -* all user's websites `docroots` with features information per each `wps`, which includes: - * status of each feature -- if the feature is `enabled`, if the feature is `visible` - * issues detected (if any) for each feature -* subscription status (for premium features) -- `subscription` -* features visible for a user -- `visible_features` - -The example output is given below: - -``` -{ - "allowed_features": { - "accelerate_wp": [], - "accelerate_wp_premium": [] - }, - "docroots": [ - { - "domains": [ - "user0.com" - ], - "php_handler": "fastcgi", - "php_version": "plesk-php73-fastcgi", - "wps": [ - { - "features": { - "accelerate_wp": { - "enabled": false, - "issues": [ - { - "context": { - "plugins": "WP Rocket" - }, - "description": "Found conflicting plugins: %(plugins)s.", - "fix_tip": "Deactivate and uninstall the conflicting plugin using the WordPress administration interface.", - "header": "Conflicting plugins are enabled", - "type": "incompatibility" - } - ], - "visible": true - }, - "object_cache": { - "enabled": false, - "issues": [ - { - "context": { - "blog_url": "https://blog.cloudlinux.com/", - "supported_handlers": "php-fpm, lsapi" - }, - "description": "Website uses unsupported PHP handler. Currently supported handler(s): %(supported_handlers)s.", - "fix_tip": "Please, set or ask your system administrator to set one of the supported PHP handlers for the domain: %(supported_handlers)s. Or keep watching our blog: %(blog_url)s for supported handlers list updates.", - "header": "Unsupported PHP handler", - "type": "incompatibility" - } - ], - "visible": true - } - }, - "path": "wordpress", - "version": "6.2" - } - ] - }, - { - "domains": [ - "sub.user0.com" - ], - "php_handler": "fastcgi", - "php_version": "plesk-php73-fastcgi", - "wps": [] - } - ], - "max_cache_memory": "64mb", - "result": "success", - "subscription": { - "object_cache": "no" - }, - "timestamp": 1681200081.765476, - "upgrade_url": null, - "used_memory": null, - "visible_features": { - "accelerate_wp": [ - "accelerate_wp" - ], - "accelerate_wp_premium": [ - "object_cache" - ] - } -} -``` - -### WHMCS billing - -CloudLinux developed it's own WHMCS plugin -which provides you AccelerateWP billing integration out of the box. -Check out [the documentation](https://docs.cln.cloudlinux.com/whmcs_awp_plugin/) to find how to install and use the plugin. - -### Other billing integration - -As AccelerateWP Premium is the feature that works on subscription basis, -we made it possible for hosters to integrate their existing billing systems with our plugin and sell the -feature for their users. - -When AccelerateWP Premium is enabled in admin interface, users get proposal to upgrade their subscription. - -![](./images/awp/AWPUpgradeNoLink.png) - -When user upgrades the subscription to the plan with AccelerateWP support, -billing must execute the following command on the server: -``` -cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --allowed --source=BILLING_OVERRIDE --users= -``` - -This command makes two things: -- allow user to install plugin, bypassing the upgrade window; -- reports premium as being used to CLN, starting the billing cycle for hoster. - - -When user terminates or downgrades plan, the following command must be executed by the billing system: -``` -cloudlinux-awp-admin set-suite --suites=accelerate_wp_premium --default --source=BILLING_OVERRIDE --users= -``` - -### Setup upgrade URL for AccelerateWP Premium - -The upgrade window can be customized with link to the plan upgrade page, which can be set using CLI command: - -``` -cloudlinux-awp-admin set-options --upgrade-url https://plan.upgrade/splash -``` - -![](./images/awp/AWPUpgradeLink.png) - -AccelerateWP automatically appends GET parameters when the link is displayed. - -``` -https://plan.upgrade/splash/?m=acceleratewp&action=provisioning&username=democom&domain=demo.com&server_ip=10.51.0.10 -``` - -| Parameter | Value | Description | -|-----------|--------------|----------------------------------------------------------| -| m | acceleratewp | Constant. | -| action | provisioning | Constant. | -| username | democom | Customer's account name. | -| domain | demo.com | Customer's account primary domain. | -| server_ip | 10.51.0.10 | Primary IP of the server where AccelerateWP is installed | - -Parameters can be used to determine the billing account of the user in order to display proper page. -WHMCS plugin already has automatic redirect to upgrade page, there is only needed to set upgrade-url -to the root of your WHMCS instance. - -``` -cloudlinux-awp-admin set-options --upgrade-url https://whmcs.mydomain.zone/ -``` - -Upgrade URL is opened in modal browser window and will be automatically closed -when AccelerateWP receives callback about successful upgrade. - -Callback is already implemented in WHMCS plugin, but if you are using some other billing, -you should add the following code on the page which appears when user successfully upgrades subscription. - - - - -In order to remove the link, just set upgrade url to the empty one. - -``` -cloudlinux-awp-admin set-options --upgrade-url '' -``` - -### Disable AccelerateWP Premium - -If you would like to stop using AccelerateWP Premium, -click on the `manage` link and remove `Premium Features` checkbox. -AccelerateWP will be still available for your users. - -![](./images/awp/AWPDisablePremiumOnly.png) - -### Disable AccelerateWP - -If you would like to stop using AccelerateWP completely, toggle the `AccelerateWP` back. -Both AccelerateWP and AccelerateWP Premium will be turned off. - -![](./images/awp/AWPDisable.png) - -This operation will: -* disable AccelerateWP tab in users' control panel interface -* disable all AccelerateWP optimization suites -* deactivate all optimization features for all users - -This operation will NOT: -* cancel the subscription made by user in WHMCS or other billing. User's subscription stays - alive and user will still be charged in billing system unless hoster manually makes a refund - - -### Logs -The main AccelerateWP log is located at -* `/var/log/clwpos/main.log` - - -In case if AccelerateWP Premium is active, the auxiliary monitoring daemon `clwpos_monitoring` is also activated. Its log is located at -* `/var/log/clwpos/daemon.log` - - -### FAQ - -#### With which panel can I use AccelerateWP? - -Currently AccelerateWP is compatible with cPanel and Plesk only. - -If you are interested in supporting DirectAdmin control panel, please record your demand on our feature portal respectively: -* [AccelerateWP for DirectAdmin](https://features.cloudlinux.com/c/15-acceleratewp-for-directadmin?utm_medium=social&utm_source=portal_share) - - -#### Is it possible to use AccelerateWP on a non-control panel server? - -No, AccelerateWP is compatible with cPanel and Plesk only. - -#### Do you plan to enable support of Nginx server? - -This is a part of our very long term plans, thus not expected in the nearest future. - -#### How will it help my customers? - -AccelerateWP is a complex solution to help your customers increase their WordPress site performance. AccelerateWP brings number of optimization features, like object caching, css and js preprocessing and website preloading. - -#### How could I monitor Redis instances while using AccelerateWP Premium suite? - -Redis process is started for a user after activating AccelerateWP Premium Object Caching feature for at least one Wordpress site. -It is killed after AccelerateWP Premium Object Caching has been deactivated for all user's websites. - -Look through the processes list to check Redis status for a particular user: -``` - $ ps aux | grep redis - awpuser 2662517 0.0 0.5 101096 8512 ? Sl 15:33 0:00 /opt/alt/redis/bin/redis-server unixsocket:/home/awpuser/.clwpos/redis.sock -``` -In case if AccelerateWP Premium is active, the auxiliary monitoring daemon `clwpos_monitoring` is also activated. It checks Redis instances each 5 minutes, starts new instances, restart failed ones and kills the “garbage” instances if needed. -Check daemon status using `service clwpos_monitoring status` and its main log: `/var/log/clwpos/daemon.log`. - -### My users are complaining that their feature are not installed automatically after subscription upgrade -This can be caused by several reasons. Either your customer's website was detected to have malfunctions -or there was an issue with environment when feature was installed -(e.g. bad internet connectivity with wordpress market). - -First, try to enable feature manually using AccelerateWP interface. -Most likely you will find human-readable error message there. - -Next, you can try to dive into `/var/log/clwpos/daemon.log` and find the reason why the `enable` command failed. -Here is an example of successful feature installation for reference: - - - 2023-02-14 11:01:14,696: (clwpos.daemon_base) [INFO] Running cloudlinux-awp-user enable --feature object_cache --domain wpujj.com --wp-path - 2023-02-14 11:01:15,081: (clwpos.daemon_base) [INFO] Command succeded with output: - `CompletedProcess(args=['/bin/cagefs_enter.proxied', 'cloudlinux-awp-user', 'enable', '--feature', 'object_cache', '--domain', 'wpujj.com', '--wp-path', ''], returncode=0, stdout='{\n "context": {\n "domain": "wpujj.com",\n "feature": "object_cache"\n },\n "result": "success",\n "timestamp": 1676372475.044419,\n \n}\n', stderr='')` - 2023-02-14 11:01:15,086: (clwpos.daemon_base) [INFO] background process finished: pid=415368 - -Also, some useful notes may be present in user's log located at `/home//.clwpos/main.log`. - -If the issue persists, or you cannot resolve it yourself, -contact CloudLinux support and attach `/var/log/clwpos/daemon.log` and `/home//.clwpos/main.log` -for further investigation. - - -### Troubleshooting - -#### End-users of AccelerateWP Premium feature encounter Redis extension is not installed for selected php version -In order to make use of AccelerateWP Premium Object Caching feature, the loaded Redis extension is required for the end-user's website. -End-users will not be able to activate the Object Caching feature until Redis extension configuration is incomplete. - -Corresponding incompatibility warning will be displayed in control panel's User interface: - -![](./images/awp/AWPNoRedis.png) - -The Redis extensions are configured for all installed and supported PHP versions automatically: -* right after the AccelerateWP Premium suite is enabled -* by cron once a day - -or you can trigger the utility manually: -``` -/usr/sbin/enable_redis_for_panel_php -``` - -All errors will be displayed in standard output and logged into `/var/log/clwpos/main.log`. - - -**Ensuring the EA-PHP Redis extension is configured correctly** - -1. Check Redis extension package is installed by running the following command - - ``` - rpm -q ea-phpXY-php-redis - ``` - Install the corresponding extension if it is not present: - ``` - yum install ea-phpXY-php-redis - ``` - Consider the example for checking out and installing Redis extension for `ea-php74`: - ``` - rpm -q ea-php74-php-redis - yum install ea-php74-php-redis - ``` -2. Check Redis `ini` file is present by running the following command: - ``` - ls /opt/cpanel/ea-phpXY/root/etc/php.d/ | grep 50-redis - ``` - Consider the example for checking out Redis extension for `ea-php74`: - ``` - ls /opt/cpanel/ea-php74/root/etc/php.d/ | grep 50-redis - ``` - Try reinstalling the package if `ini` file is missing. -3. Make sure Redis module is loaded under specific user by running the following command: - ``` - su -c "php -m | grep redis" - ``` - - -**Ensuring the ALT-PHP Redis extension is configured correctly** - -1. Check if `redis.so` is present for a particular alt-php version: - ``` - ls /opt/alt/phpXY/usr/lib64/php/modules | grep redis.so - ``` - Consider the example for checking alt-php74 redis.so: - ``` - ls /opt/alt/php74/usr/lib64/php/modules | grep redis.so - redis.so - ``` -2. If the Redis module is missing: - - a. Install the `alt-phpXY-pecl-ext` package manually - b. Run the Redis configuration script `/usr/share/cloudlinux/wpos/enable_redis_for_alt_php.py` - - All errors will be displayed in standard output and logged into `/var/log/clwpos/main.log`. -3. If the Redis module is present for a particular php version, but the incompatibility issue persists, re-check the following: - - a. Make sure the Redis module is loaded under user: - ``` - su -c "php -m | grep redis" - ``` - b. Check the required extensions are enabled in `php.ini`: - ``` - cat /opt/alt/phpXY/etc/php.ini | grep redis.so - cat /opt/alt/phpXY/etc/php.ini | grep json.so - cat /opt/alt/phpXY/etc/php.ini | grep igbinary.so - ``` - - c. Enable missing extensions manually. - - -#### End-users of AccelerateWP encounter PHP-related issues during feature activation -End-users may encounter PHP-related errors while activating the AccelerateWP features. - -![](./images/awp/AWPBrokenPHP.png) - -The general examples of possible reasons are: -* broken PHP binaries -* missing PHP files -* etc. - -To check that this issue is caused by PHP itself, call any PHP command, for example: -``` -/opt/cpanel/ea-php80/root/usr/bin/php -i -``` -And make sure that installed `ea-php80` packages are not broken using -`rpm -V `. - -Reinstall broken packages if found. - -Consider the example issue (presented at the picture above) with broken `mbstring.so` for `ea-php80`: -``` -# /opt/cpanel/ea-php80/root/usr/bin/php -i -Segmentation fault (core dumped) -# rpm -V ea-php80 -# rpm -V ea-php80-php-mbstring -S.5....T. /opt/cpanel/ea-php80/root/usr/lib64/php/modules/mbstring.so -......G.. a /usr/lib/.build-id/9c/38ed78a6d401ff6dce059ccea51c95870d98c5 -# yum reinstall ea-php80-php-mbstring -``` diff --git a/docs/cloudlinux_installation/.DS_Store b/docs/cloudlinux_installation/.DS_Store deleted file mode 100644 index e04ec8588..000000000 Binary files a/docs/cloudlinux_installation/.DS_Store and /dev/null differ diff --git a/docs/cloudlinux_installation/README.md b/docs/cloudlinux_installation/README.md deleted file mode 100644 index 6539076de..000000000 --- a/docs/cloudlinux_installation/README.md +++ /dev/null @@ -1,1463 +0,0 @@ -# Installation - -[[toc]] - -## Hardware compatibility - -CloudLinux OS supports all the hardware supported by RHEL/CentOS/AlmaLinux, with few exceptions. Exceptions are usually hardware that require binary drivers, and that doesn't have any open source alternatives. - -:::tip Note -CloudLinux OS does not support ARM-based CPUs (e.g. Graviton). -::: - -:::warning Warning -In cases where your server hardware is incompatible with any version of RHEL/CentOS/AlmaLinux and CloudLinux OS or our components - we will not be able to provide assistance in adding such hardware support or solving possible issues related to such installation. -::: - -:::tip Note -Replacing the server hardware affects specifications and support for such hardware from CloudLinux OS end. -It is most likely that the CloudLinux OS will stop working if you replace any hardware component on the server. - -Example: the same HDD/SSD/NVMe model will have a new UUID and CloudLinux OS is mapped to old UUID which break the boot procedure. - -In this case, we are not responsible for the CloudLinux OS operation and cannot assist you in restoring the server or adapting CloudLinux OS installation to the new hardware. -::: - -There are some incompatible devices with **CL6**: - -| | | | -|-|--|-| -|**Device** | **Binary Driver** | **Source**| -| B110i Smart Array RAID controller | hpahcisr | [https://h10032.www1.hp.com/ctg/Manual/c01754456](https://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c01732801)| -| B120i/B320i Smart Array SATA RAID Controller | hpvsa | [https://www8.hp.com/h20195/v2/GetPDF.aspx/c04168333.pdf](https://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c01732801)| -| SanDisk DAS Cache | | [https://www.dell.com/en-us/work/learn/server-technology-components-caching](https://www.dell.com/en-us/work/learn/server-technology-components-caching)| - - -With RHEL8 (**CloudLinux OS 8/CloudLinux OS 7 Hybrid**), some devices are no longer supported. -You can check the entire list here: [Hardware enablement considerations in adopting RHEL 8](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/considerations_in_adopting_rhel_8/hardware-enablement_considerations-in-adopting-rhel-8#removed-hardware-support_hardware-enablement) - -## Getting license - -You will need a valid activation key - trial or paid - to be able to use your CloudLinux OS Solo server. - -### Getting trial license - -The trial activation key can be used to convert your server to CloudLinux OS. - -:::tip Note -The trial license subscription will work for 30 days. -::: - -If you have any issues getting activation key or if you have any questions regarding using your -trial subscription – contact [sales@cloudlinux.com](mailto:sales@cloudlinux.com) and we will help. - -To get the activation key: - -1. Register with CloudLinux Network: [https://cln.cloudlinux.com/console/register/customer](https://cln.cloudlinux.com/console/register/customer) (skip it if you already registered) -2. You will receive an email with activation link -3. Login at [https://cln.cloudlinux.com/console/auth/login](https://cln.cloudlinux.com/console/auth/login) -4. Choose the appropriate [CloudLinux edition](/introduction/) that fits your needs. -5. Click on `Get Trial Activation Key` - -You will get a key that looks like: `12314-d34463a182fede4f4d7e140f1841bcf2` - - -## Converting existing servers - -Sometimes it is required to convert already existing servers with `CentOS` or `AlmaLinux` and make them `CloudLinux OS`. - -It is easy to convert your existing installation by cldeploy script. The process takes a few minutes and replaces just a handful of RPMs. - -:::warning -Unlike [Fresh installation](#installing-new-servers), converting immediately requires CloudLinux OS license. -Please refer to the [guide](#license-activation) to get an activation key. -::: - -### Requirements - -Currently supported OS for conversion: -* CentOS 7 -* AlmaLinux OS 8, AlmaLinux OS 9 -* RockyLinux (installation only, no uninstall option) - - -:::warning Unsupported OS for conversion: -* CentOS 8 -* CentOS Stream -::: - - -Supported control panels: -* cPanel ([Documentation](https://docs.cpanel.net/installation-guide/system-requirements-cloudlinux/)) -* Plesk -* DirectAdmin -* CyberPanel ([Documentation](https://community.cyberpanel.net/t/1-convert-cyberpanel-to-cloudlinux-os-and-install-cagefs/174)) -* InterWorx ([Documentation](https://appendix.interworx.com/current/nodeworx/plugins/install-use-cloudlinux-plugin-interworx.html)) -* Webuzo ([Documentation](https://webuzo.com/docs/installing-webuzo/install-cloudlinux-os/)) - - -:::warning Other control panels: -Control panels not mentioned in the list of supported panels have native integration or integration by the developer of such a panel. -We cannot guarantee the stability or correct operation of CloudLinux components on such panels. -::: - -:::warning Warning: -Some CloudLinux components may not be supported by the control panel itself or the control panel can have its own analog of such a component. -You can verify this information when reviewing the system requirements for installing a particular CloudLinux component. -::: - - -#### Note: CentOS 8 is EOL - -CentOS 8 reached End Of Life (EOL) on December 31st, 2021. -If you would like to convert from CentOS 8 to CloudLinux OS 8, do the following: - -* Convert CentOS 8 to AlmaLinux 8 using [almalinux-deploy](https://github.com/AlmaLinux/almalinux-deploy) -* Convert AlmaLinux 8 to CloudLinux 8 using [cldeploy](/cloudlinux_installation/#cldeploy-explained) - - -### Downloading and running conversion script - -#### Key-based activation - -If you want to use your activation key for activation, run the following commands: - -``` -yum install wget -y -wget https://repo.cloudlinux.com/cloudlinux/sources/cln/cldeploy -bash cldeploy -k ACTIVATION_KEY -``` - -Where `ACTIVATION_KEY` is the one that you got on previous step. -Your CloudLinux OS edition will be detected automatically based on the `ACTIVATION_KEY` - -#### IP-based activation - -If your reseller provides you with an IP-based license, run the following commands: - -To convert server into the CloudLinux OS Shared edition: -``` -$ sh cldeploy -i -``` - -To convert server into the CloudLinux OS Admin edition: -``` -$ sh cldeploy -i --to-admin-edition -``` - -### Next steps -After successful conversion, reboot your system by running the following command: - -``` -reboot -``` - -Once you reboot - your server should be running with CloudLinux OS LVE kernel. - -You may check the booted kernel with the following command: - -``` -$ uname -r -``` - -:::warning Note -If after rebooting you do not see the CloudLinux kernel (the kernel has the abbreviation LVE in its name) -then please consider check our [knowledge base](https://cloudlinux.zendesk.com/hc/en-us/) or -contact [support](https://cloudlinux.zendesk.com/hc/en-us/requests/new). -::: - -:::warning Note -SELinux is not supported on CloudLinux OS 6 and 7. SELinux is supported on CloudLinux OS 8+, -but might not work or be compatible with control panels and various components. -::: - -:::tip Note -At the end of conversion from CentOS 7.x to CloudLinux OS Shared 7, -the cldeploy script converts CloudLinux OS Shared 7 to [CloudLinux OS Shared 7 Hybrid](/cloudlinux_os_kernel/#hybrid-kernels). -::: - -Automatic hybridization will be performed for the AMD processors with the following CPU families: - -* Zen / Zen+ / Zen 2 / Zen 3 -* Hygon Dhyana - -Automatic hybridization may be skipped by passing extra option '--no-force-hybridize'. -See also [advanced options for cldeploy](/command-line_tools/#cldeploy). - -### Minor version step-down - -If you are attempting to convert an AlmaLinux machine of a minor OS version higher than the most recent CloudLinux minor version, you won't be able to perform a standard conversion, since the required packages will be missing. - -E.g. if the AlmaLinux OS 8.8 has already become publicly accessible, but the latest CloudLinux OS release is still 8.7, a standard conversion will not be possible. - -This situation typically occurs after a new AlmaLinux release and persists for several weeks. - -If you cannot wait until the corresponding CloudLinux release, you have an option of performing a step-down conversion, in which cldeploy will install the previous CloudLinux OS minor version on your system. - -For instance, AlmaLinux 8.8 can be converted to CloudLinux 8.7 in such a scenario. - -:::tip Note -At the moment, the step-down conversion is only supported on systems with no panel, cPanel or Plesk. -::: - -:::tip Note -When performing a step-down conversion, cldeploy will add MySQL and MariaDB RPM packages to the Yum exclude list, in order to avoid downgrading them to CloudLinux-modified versions. - -Not doing so would risk rendering the databases non-functional, since MySQL explicitly does not support minor-version downgrades of its packages. - -If you want to update these packages on a step-down converted system, make sure to exclude/disable the CloudLinux package repositories while doing so. - -In addition, on CloudLinux 9 the kernel packages are downgraded and excluded from updates in order to maintain parity with the CloudLinux kernel modules. -::: - -cldeploy will automatically detect the latest available CloudLinux version and, depending on the result, will either proceed normally or perform the step-down conversion. - -If a normal conversion is not possible, it will request confirmation (yes/no) from the user. To implicitly respond "yes" to this and other questions, running script non-interacively, pass the `-y` option to the cldeploy script. - -#### Updating systems from a step-down conversion - -Once the previously missing minor CloudLinux release becomes available, you will likely want to upgrade to it from a step-down conversion. - -To do so, you need to do the following: - -* Remove the automatically created excludes for MySQL and MariaDB packages from `/etc/yum.conf` - * Specifically, remove `mysql* mariadb*`, and `kernel*` if present, from excludes in your `yum.conf`. - * Any other excluded packages except the above are unrelated to cldeploy and should remain in the configuration. -* Install the newest available `cloudlinux-release` package over the previous one. - * This will replace the AlmaLinux and CloudLinux package repository configuration files that were modified by cldeploy step-down conversion. - * Make sure the new files replace the old ones - check for presence of `.rpmnew` files. -* Update the system normally. - -### Troubleshooting - -If you receive any troubles during the conversion process, -please feel free to search our [knowledge base](https://cloudlinux.zendesk.com/hc/en-us) -or contact our support and attach the conversion log (/var/log/cldeploy.log). - -### How to enable secure boot for CloudLinux 9 - -#### Overview -CloudLinux 9 uses non-modified AlmaLinux 9 kernel.\ -To make secure boot work with CloudLinux's kernel module you need to enroll CloudLinux secure boot key to your server.\ -This procedure shows how to do it - -#### Requirements -* UEFI support -* mokutil package installed -* Access to server's BIOS options menu and boot screen - -#### Procedure -1. Download CloudLinux key - 1. `wget https://repo.cloudlinux.com/cloudlinux/SECURE-BOOT-KEY-cloudlinux-kmod.der` -2. Import the key - 1. `mokutil --import SECURE-BOOT-KEY-cloudlinux-kmod.der` - 2. When prompted, enter a password of your choice. This password will be used when enrolling the key into the MOK list. -3. Reboot server - 1. Upon rebooting, the "Shim UEFI key management" screen appears. Press any key withing 10 seconds to proceed. -4. Enroll the key - -Select `Enroll MOK`\ -![Step 1](./images/cl9_secureboot/1.png) - -Select `View key 0`\ -![Step 2](./images/cl9_secureboot/2.png) - -Make sure that CloudLinux's Secure Boot Key information is displayed\ -Press the Esc key when you are finished\ -![Step 3](./images/cl9_secureboot/3.png) - -Select `Continue` on the screen from Step 2 -It will ask "Enrol the key(s)?".\ -Select `Yes/OK`\ -![Step 4](./images/cl9_secureboot/4.png) - -Enter the password you used for importing the key (point 2.ii)\ -![Step 5](./images/cl9_secureboot/5.png) - -Select `Reboot` (Older versions may say `Continue boot`)\ -![Step 6](./images/cl9_secureboot/6.png) - -Now you can enable Secure Boot in BIOS options menu - -#### Useful commands -* `mokutil --sb-state` to check current Secure Boot state -* `mokutil --list-enrolled` to show list of enrolled keys - -#### If you wish to remove the CloudLinux key from the MOK list, follow the instructions below -:::warning Warning -Do not delete the key when secure boot is enabled - server will be unable to boot -::: - -1. Disable Secure Boot -2. `mokutil --delete SECURE-BOOT-KEY-cloudlinux-kmod.der` -3. `mokutil --list-delete` (to check the key to be deleted) -4. Reboot the system and go through the MOK management process to complete the deletion from the MOK list. - -### Technical details: cldeploy - -By its design, CloudLinux OS Shared is very close to the upstream operating system - RHEL. -This makes the conversion process relatively straightforward, requiring just one reboot. - -#### Installation process - -Here's what the cldeploy script does when you run it: - -* Backups the original repository settings into `/etc/cl-convert-saved`. -* Backups RHEL system ID into `/etc/cl-convert-saved` (RHEL systems only). -* Installs CloudLinux repository settings & imports CloudLinux RPM key. -* Replaces redhat/centos-release/almalinux-release, redhat-release-notes, redhat-logos with CloudLinux versions. -* Removes cpuspeed RPM (as it conflicts with CloudLinux limits). -* Reinstall CloudLinux version of rhnlib/rhnplugin. -* Checks for binary kernel modules, finds replacement if needed. -* Detects OVH servers and fixes mkinitrd and possible boot issues. -* Detects Linode servers and fixes grub issues. -* Checks if LES is installed. -* Checks that `/etc/fstab` has correct `/dev/root` -* Checks for EFI and performs the necessary configuration. -* Installs CloudLinux kernel, lve-utils, liblve, lve-stats RPMs. -* Installs CloudLinux Manager for the supported control panels. -* Installs mod_hostinglimits Apache module *: - * RPM install for supported control panels; - * On Plesk, replaces psa-mod_fcgid* with mod_fcgid; - * Perform CustomBuild tool execution for DirectAdmin. - -#### Uninstallation process - -Here's what the cldeploy script does, if one runs it to uninstall CloudLinux: - -* Restores CentOS/AlmaLinux repositories, and almalinux-release/centos-release/release-notes/logos. -* Removes lve, mod_hostinglimits, lve-stats, lvemanager packages. -* mod_hostinglimits RPM is removed. - -:::tip Note -**cldeploy doesn't remove the kernel** to prevent condition when server has no kernels and wouldn't boot. Instead, script provide the instructions on how you could remove it manually later, when it is safe to do so. -::: - -On cPanel servers, rebuild of Apache with EasyApache will complete the conversion back, but doesn't have to be performed immediately. * -On DirectAdmin servers, rebuild of Apache with custombuild will complete the conversion back, but doesn't have to be performed immediately. - -More information is also available here: [Uninstall CloudLinux](/cloudlinux_installation/#uninstalling). - - -## Installing new servers - -All CloudLinux OS editions may be installed using one ISO and source. - -### Downloading ISO - -You can download the latest CloudLinux OS ISO and use it to install CloudLinux OS on your server: - -* CloudLinux OS 9 - - * x86_64 version: [https://www.repo.cloudlinux.com/cloudlinux/9/iso/x86_64/](https://www.repo.cloudlinux.com/cloudlinux/9/iso/x86_64/) - -* CloudLinux OS 8 - - * x86_64 version: [https://www.repo.cloudlinux.com/cloudlinux/8/iso/x86_64/](https://www.repo.cloudlinux.com/cloudlinux/8/iso/x86_64/) - -* CloudLinux OS 7 - - * x86_64 version: [https://repo.cloudlinux.com/cloudlinux/7/iso/x86_64/](https://repo.cloudlinux.com/cloudlinux/7/iso/x86_64/) - -* CloudLinux OS 6 - - * x86_64 version: [https://repo.cloudlinux.com/cloudlinux/6/iso/x86_64/](https://repo.cloudlinux.com/cloudlinux/6/iso/x86_64/) - * i386 version: [https://repo.cloudlinux.com/cloudlinux/6/iso/i386/](https://repo.cloudlinux.com/cloudlinux/6/iso/i386/) - - -There are multiple ISO types available: - -* `CloudLinux-*-boot.iso` - this ISO is made specifically for network installation and does not contain any packages inside. -* `CloudLinux-*-dvd1.iso` - this one contains all packages from network installation repository, - so you can set up any possible configuration without network access. -* `CloudLinux-*-minimal.iso` - this one contains only minimal set of packages to set up light server without GUI and Development tools. - -### Installing using the Graphical User Interface - -The graphical installation interface is the preferred method of manually installing CloudLinux OS. -It allows you to have full control over all available settings, including disk partitioning and storage configuration. - -The graphical mode is used by default when you boot the system from the local media. Mount and boot the image, then follow the steps. - -#### Language selection - -The first screen displayed is the language selection page. - -![Welcome page screenshot](./images/welcome_page.png) - -First, find your preferred language in the left column and than select locale in the right one. -Selected language will be used during installation and also as a default language of the installed system. - -After you select your language and locale, click `Continue` to confirm your selection -and proceed to the [Installation Summary](#installation-summary). - -#### Installation summary - -The Installation summary screen is the main dashboard of your installation parameters. -Most of the options which can be configured during the installation can be accessed from here. - -![Welcome page screenshot](./images/installation_summary.png) - -The summary screen displays links to other configuration screens, those links can be in -several different states, which are graphically indicated: - -- Grayed out link means that the installer is currently updating this sections. - Please wait a little before accessing this section. - -- A warning symbol next to an icon means that a screen requires your attention before you start the installation. - -- Links without warning symbol mean that screen does not require your attention. - You can still change your settings in these screens, but it is not required to start installation. - -#### Choosing the installation source - -The first thing that you should define is where the system will be installed from. -There are basically two options: - -- ISO file -- On the network - - -#### On the network source - -Use this option to download packages to be installed from a network location. -This is the preferred way as you automatically receive all critical bug fixes that may affect installation. - -:::tip Note -Most likely your network is not configured by default, -so you can see the URL configuration field greyed out, like on the screenshot below. Please refer to the Network Configuration screen first to set up a network connection. -::: - -![Unavailable network source](./images/installation_source_gray_network.png) - -The correct installation URL for CloudLinux OS is - -```text -https://repo.cloudlinux.com/cloudlinux/8/BaseOS/x86_64/kickstart/ -``` - -Type in installation URL in the corresponding field, configure proxy if needed and press the `Done` button. - -![](./images/installation_source_network_address.png) - - -#### ISO file source - -This option is primary used as an alternative when you don't have internet connection on a target server. -It is only available if you downloaded Minimal or DVD ISO which contains some bundled packages in. - -![](./images/installation_iso_source.png) - -Tick the `ISO file` checkbox and press the `Done` button. - -#### Next steps - -After clicking `Done`, you will be redirected to the [Installation Summary](./#installation-summary) screen -where [Installation source](./#installation-source) and [Software Selection](./#software-selection) links -will be greyed and the `Downloading package metadata` message wll be shown. - -![](./images/installation_source_gray_working.png) - -Please hold on while that message disappears and proceed to the [Software Selection](./#software-selection) section. - -![](./images/installation_source_gray_done.png) - - -#### Software Selection - -The Software Selection screen allows you to choose a Base Environment and Add-ons. -These options control which software packages will be installed on your system during the installation process. - -This screen is only available if Installation Source is properly configured and only after the installer -has downloaded package metadata from the source. - -It is not possible to select specific packages during a manual installation, you can only select pre-defined environments and add-ons. - -You should choose the CloudLinux edition that matches your license on this stage: - ![](./images/software_selection.png) - - -The available options are: -* to install CloudLinux OS Shared or Shared Pro, choose the `CloudLinux OS Shared/Pro (minimal)` environment on the left of the screen. -* to install CloudLinux OS Admin, choose the `CloudLinux OS Admin (minimal)` environment on the left of the screen. -* to install CloudLinux OS Solo, choose the `CloudLinux OS Solo (minimal)` environment on the left of the screen. - - -Then, on the right side of the screen, select one or more add-ons which you want to install by ticking the -check boxes next to each add-on. - -#### Final preparations - -Installation is almost done, all you need to do is to [configure your installation target](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-disk-partitioning-setup-x86) -using the `Installation Destination` menu and create your [Root Password](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-configuration-progress-menu-x86#sect-account-configuration-x86). - -Doing that, the `Begin installation` button becomes blue, so click it. - -![](./images/installation_available.png) - -After this point, the installation process actually starts and changes are being made to your selected disks. -It is not possible to go back to the Installation Summary and change any settings configured there; -if you need to do so, you must wait for the installation process to finish, reboot your system, log in and change your settings -on the installed system. - -The bottom of the screen shows a progress bar and a message informing you of the current progress of the installation. -When the installation finishes, you can press the Finish installation button -to reboot your computer and log in to your newly installed system. - -:::warning Warning -Before you finish the installation and reboot, either remove the media -which you used to start the installation, or make sure that your system tries to boot -from the hard drive before trying removable media. Otherwise, your computer will start the installer again instead of the installed system. -::: - -![](./images/installation_done.png) - -#### Next steps - -Reboot your system, login and check EULA which is located in the `/usr/share/cloudlinux-release/EULA`. - -Next, [activate your installation](#license-activation) in order to get updates. - - -### License activation - -To register your **CloudLinux OS** server with CloudLinux Network using activation key, run the following command: - -``` -$ yum install rhn-setup -$ /usr/sbin/rhnreg_ks --activationkey= -``` - -Where <activation key> is like `1231-2b48feedf5b5a0e0609ae028d9275c93` - -If you have IP based license, use the `clnreg_ks` command instead: - -``` -$ yum install rhn-setup -$ /usr/sbin/clnreg_ks --force -``` - - -## Cloud provider images (CloudLinux OS Shared only) - -* [OpenStack QEMU/KVM](https://download.cloudlinux.com/cloudlinux/images/#kvm-tab) -* [VMware](https://download.cloudlinux.com/cloudlinux/images/#vmware-tab) -* [Google Cloud Engine](https://download.cloudlinux.com/cloudlinux/images/#gce-tab) -* [Amazon Web Services](https://download.cloudlinux.com/cloudlinux/images/#aws-tab) -* [Alibaba Cloud](https://download.cloudlinux.com/cloudlinux/images/#ali-tab) -* [Xen](/cloudlinux_installation/#installing-new-servers) -* [CloudLinux Azure Images](/cloudlinux_installation/#cloudlinux-azure-images) - -### CloudLinux Azure Images - -We build and release CloudLinux 7.9 and CloudLinux 8.6 for Azure and upload to the [Mircosoft Azure Community Galleries](https://learn.microsoft.com/en-us/azure/virtual-machines/share-gallery-community?tabs=cli). - -Images are built in both types Azure supports: *gen1 (BIOS based)* and *gen2 (UEFI based)*. CloudLinux Images could be found in the following regions: *West Europe, Germany West Central, Southeast Asia, East US, West US 2*. A publisher of CloudLinux Images in Azure is *cloudlinux*. Community gallery name is *cloudlinux-cbc76afd-63bc-4f6e-b801-65bd2f1ab0a0*. - -How to use CloudLinux Image in Azure: - -* When creating Virtual Machine, while choosing what OS should be used, click See al images. - ![](/images/AzureVirt.png) -* Switch from Marketplace to Community images. - ![](/images/AzureSwitch.png) -* Search by typing *cloudlinux* or filter by *Publisher* which is also *cloudlinux* or *Azure Compute Gallery* which is *cloudlinux-cbc76afd-63bc-4f6e-b801-65bd2f1ab0a0*. - ![](/images/AzureSearch.png) -* Choose a suitable image. Check that the Publisher of the selected images is *cloudlinux* and Public Gallery Name is *cloudlinux-cbc76afd-63bc-4f6e-b801-65bd2f1ab0a0*. - - -### Xen images - -:::tip Note -We do not provide Xen images of CloudLinux OS Shared anymore, use [ISO images](#installing-new-servers) instead -::: - -## Provider-specific guidelines (CloudLinux OS Shared only) - -* [Amazon Web Services](/cloudlinux_installation/#aws) -* [H-Sphere](/cloudlinux_installation/#h-sphere) -* [DigitalOcean](/cloudlinux_installation/#digitalocean) -* [Linode](/cloudlinux_installation/#linode) -* [Virtuozzo and OpenVZ](/cloudlinux_installation/#virtuozzo-and-openvz) - -### AWS - -CloudLinux OS Shared image list can be found [here](https://download.cloudlinux.com/cloudlinux/images/#aws-tab) - -If you are going to use CloudLinux OS Shared with cPanel image, you may find useful the following [article](https://cloudlinux.zendesk.com/hc/en-us/articles/360014130320-How-to-get-CloudLinux-OS-with-cPanel-AMI-working-on-AWS) - -### H-Sphere - -* [Requirements](/cloudlinux_installation/#requirements) -* [Converting from mod_fastcgi to mod_fcgid](/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid) -* [Older versions of H-Sphere](/cloudlinux_installation/#older-versions-of-h-sphere) - -:::tip Note -For H-Sphere 3.5+ -Please note, that CageFS and PHP Selector are not supported for H-Sphere -::: - -#### Requirements - -1. CloudLinux OS Shared with liblve 0.8 or later. -2. Apache 2.2.x or 1.3. -3. mod_suexec should be enabled. - -To achieve optimal performance, we recommend to [convert from mod_fastcgi to mod_fcgid](/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid). - -There is no need to install mod_hostinglimits – it comes built in with H-Sphere. Once you load kernel from CloudLinux OS Shared with liblve 0.8 or later – it will get enabled. - -You can check if LVE is enabled by running: - -``` -$ ps aux | grep httpd | grep DLIBLVE -``` - -If you see no output, it means that Apache didn't pick up LVE. Try checking file ` /hsphere/shared/scripts/apache-get-env.sh` - -The following lines should be there: -
- -``` -if [ -e /usr/lib64/liblve.so.0 -o -e /usr/lib/liblve.so.0 ]; then -APENV_DSSL="$APENV_DSSL -DLIBLVE" -fi -``` - -
- -If those strings are absent, you should add it, after: - -
- -``` -else -APENV_DSSL='-DSSL' -fi -### -``` - -
- -and before: - -
- -``` -# this is used by apacheGetEnv.pm perl module -if [ "$1" = 'show' ] ; then -set | egrep "^APENV_" -fi -``` - -
- -strings. - -Restart Apache afterward. - -:::tip Note -Don't forget to [convert from mod_fastcgi to mod_fcgid](/cloudlinux_installation/#converting-from-mod-fastcgi-to-mod-fcgid). -::: - -#### Converting from mod_fastcgi to mod_fcgid - -To achieve the best results in productivity and stability we recommend converting from `mod_fastcgi` to `mod_fcgid`. - -:::tip Note -H-Sphere 3.6.3+ -::: - -1. Download our fcgi.conf file: - -
- -``` -$ wget -O /hsphere/local/config/httpd2/fcgi.conf https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/fcgi.conf -``` -
- -2. Edit `~httpd2/conf/extra/httpd-hostinglimits.conf` to the following state: - -
- -``` -###### -LoadModule hostinglimits_module /hsphere/shared/apache2/modules/mod_hostinglimits.so - - -SkipErrors Off -AllowedHandlers cgi-script %php% fcgid-script application/x-miva-compiled -DenyHandlers hs-php5-script hs-php53-script hs-php54-script -Include /hsphere/local/config/httpd2/fcgi.conf - - -####### -``` -
- -3. Go to `P.Servers > web server [Config]` and be sure to have enabled: - * `apache_version=2` - * `apache_mpm=prefork` - * `apache_fastcgi` - * `apache_fcgid` - * `PHP version/mode: php_fastcgi`* - -:::tip Note -*No changes needed to `httpd.conf.tmpl.custom` or `usermodule.phpmode` as this version provides its own mod_fcgid. -::: - -#### Older versions of H-Sphere - -1. Compile mod_fcgid module: - -
- -``` -$ yum install gcc liblve-devel zlib-devel openssl-devel -$ wget https://apache.osuosl.org//httpd/mod_fcgid/mod_fcgid-2.3.9.tar.gz -$ tar zxvf mod_fcgid-2.3.9.tar.gz -$ cd mod_fcgid-2.3.9/ -$ APXS=/hsphere/shared/apache2/bin/apxs ./configure.apxs -$ make -$ mv modules/fcgid/.libs/mod_fcgid.so /hsphere/shared/apache2/modules -``` -
- -2. Download and apply patch [https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/usemodule.phpmode.patch](https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/usemodule.phpmode.patch) to `/hsphere/local/config/scripts/usemodule.phpmode`: - -
- -``` -$ wget https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/usemodule.phpmode.patch -$ patch /hsphere/local/config/scripts/usemodule.phpmode usemodule.phpmode.patch -``` - -
- -3. If `/hsphere/local/config/httpd2/httpd.conf.tmpl.custom` does not exists – create it: - -
- -``` -$ cp -rp /hsphere/local/config/httpd2/httpd.conf.tmpl /hsphere/local/config/httpd2/httpd.conf.tmpl.custom -``` -
- -Download and apply patch [https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/httpd.conf.tmpl.patch](https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/httpd.conf.tmpl.patch) to the `/hsphere/local/config/httpd2/httpd.conf.tmpl.custom`: - -
- -``` -$ wget https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/httpd.conf.tmpl.patch -$ patch --fuzz=3 /hsphere/local/config/httpd2/httpd.conf.tmpl.cusom httpd.conf.tmpl.patch -``` - -
- -4. Download pre-defined config file [https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/fcgi.conf](https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/fcgi.conf) to `/hsphere/local/config/httpd2`: - -
- -``` -$ wget -O /hsphere/local/config/httpd2/fcgi.conf https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/fcgi.conf -``` - -
- -5. Download our wrapper file [https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/php-wrapper](https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/php-wrapper) into `/hsphere/shared/php5/bin/` and make it executable: - -
- -``` -$ wget -O /hsphere/shared/php5/bin/php-wrapper https://repo.cloudlinux.com/cloudlinux/sources/mod_fcgid-hsphere/php-wrapper -$ chmod 755 /hsphere/shared/php5/bin/php-wrapper -``` - -
- -6. Change permissions for `/hsphere/local/home` to 755: - -
- -``` -$ chmod 755 /hsphere/local/home -``` - -
- -7. Edit `~httpd2/conf/extra/httpd-hostinglimits.conf` and add DenyHandlers, so section will look like: - -
- -``` - -SkipErrors Off -AllowedHandlers cgi-script %php% fcgid-script application/x-miva-compiled -DenyHandlers hs-php5-script hs-php53-script hs-php54-script - -``` - -
- -8. Configure physical server from H-Sphere admin > E.Manager > P.Servers > server_name [parameters] icon, settings should be: - -
- -``` -apache_version = 2 -apacha_fastcgi = yes -apache_status = yes -``` -
- - -![](/images/sshot-2013-07-30-21-25-48.png) - -9. Set PHP configuration to: - -
- -``` -php_libphp5 enabled but not default -php_fastcgi5 enabled and is default -``` -
- -![](/images/sshot-2013-07-30-21-31-05.png) - -Other options could be configured according to personal needs. - -When done - click _SUBMIT_ to apply changes. - -:::tip Note -After updating H-Sphere software on web server with CloudLinux OS Shared you need to re-apply step 2 (patch usemodule.phpmode) and restart apache with `/hsphere/shared/scripts/apache-restart` script. -::: - -### DigitalOcean - -* [Adding CloudLinux OS Shared image to DigitalOcean](/cloudlinux_installation/#adding-cloudlinux-os-shared-image-to-digitalocean) - -How to make CloudLinux OS Shared work on DigitalOcean: - -DigitalOcean doesn't support custom kernels. The droplet (VM) always runs DigitalOcean's kernel. CloudLinux OS Shared requires its own kernel. To enable CloudLinux OS Shared work on DigitalOcean droplets, we provide ability to boot into CloudLinux OS Shared kernel using `kexec` functionality. - -How does this work: - -* cldeploy script checks for presence of `/etc/digitalocean`. If the file detected, we assume that this is DigitalOcean droplet; -* `kexec-tools` are installed; -* `kexec` script will be created in `/etc/rc.d/init.d/` and set to run right after `rc.sysinit`. - -When executed, script `/etc/rc.d/init.d/kexec` detects the latest installed CloudLinux OS Shared kernel, and loads that kernel. - -If the system cannot boot into CloudLinux OS Shared kernel (due to any reason), subsequent reboot will skip `kexec`, allow droplet to boot into DigitalOceans' kernel. - -To disable booting into Cloudlinux OS Shared kernel, run: - -
- -``` -chkconfig --del kexec -``` -
- -To re-enable booting into CloudLinux OS Shared kernel, run: -
- -``` -chkconfig --add kexec -``` -
- -#### Adding CloudLinux OS Shared image to DigitalOcean - -Custom images are Linux distributions that have been modified to fit the specific needs of DigitalOcean users. You can find some basics of importing a custom CloudLinux OS Shared image below. - -Importing custom images to DigitalOcean is free, as you are only charged for the storage of your image. To save money, you can easily import your image, start a Droplet from your image, and delete the image, so you don’t incur any storage costs. - -Below, we will describe how to add a qcow2 (QEMU/KVM) CloudLinux OS Shared image as a custom image. You can find more information on image options at [https://www.digitalocean.com/docs/images/custom-images/overview/](https://www.digitalocean.com/docs/images/custom-images/overview/) - -1. To choose the right image, navigate to [https://download.cloudlinux.com/cloudlinux/images/#kvm-tab](https://download.cloudlinux.com/cloudlinux/images/#kvm-tab). Several different images are available for download (with and without a control panel). - -![](/images/cloudlinuximages.png) - -2. Copy the link for the image you are going to use and log into [cloud.digitalocean.com](https://blog.digitalocean.com/custom-images/cloud.digitalocean.com). - -Click _Images_ on the left of the screen and then choose _Custom Images_. Click the _Import via URL_ button and paste the CloudLinux OS Shared image link. - -![](/images/customimages.png) - -There are several options here, but the most important is _Choose a datacenter region_, i.e. which datacenter region your Droplets should be created in for this image. - -![](/images/uploadimage.png) - -Click the _Upload Image_ button and wait until the image is successfully uploaded. - -3. Add your public key to access your droplets using key-based authentication: navigate to the _Security_ sidebar menu and click the _Add SSH Key_ button. - -You can find more information about creating/adding SSH keys in [this article](https://www.digitalocean.com/docs/droplets/how-to/add-ssh-keys/). - -![](/images/addsshkey.png) - -4. You will then be able to start a CloudLinux OS Shared Droplet using the image. - - :::tip Note - Your Droplet will be created in the same datacenter that your custom image resides in. - ::: - -![](/images/startdroplet.png) - -5. Now, use your preferred SSH client software to connect to your Droplet. You can find more information on SSH client setup [here](https://www.digitalocean.com/docs/droplets/how-to/connect-with-ssh/). - -![](/images/sshclient.png) - - -### Linode - -* [CloudLinux OS Shared on Linode KVM](/cloudlinux_installation/#cloudlinux-os-shared-on-linode-kvm) -* [CloudLinux OS Shared on Linode Xen](/cloudlinux_installation/#cloudlinux-os-shared-on-linode-xen) - -:::warning Warning -If you are installing CloudLinux OS Shared 8, please make sure you’ve read [https://www.linode.com/community/questions/19397/i-just-upgraded-my-centos-8-linode-and-now-it-wont-boot-how-do-i-fix-this-proble](https://www.linode.com/community/questions/19397/i-just-upgraded-my-centos-8-linode-and-now-it-wont-boot-how-do-i-fix-this-proble) -::: - - -#### CloudLinux OS Shared on Linode KVM - -To install CloudLinux OS Shared 7 on Linode KVM server you should perform the following steps: - -1. Deploy CL to your Linode following the steps from [this section](/cloudlinux_installation/#converting-existing-servers) - -2. Install grub on your system: - -
- -``` -yum install grub2 -``` -
- -3. Add to `/etc/default/grub` the following parameters: - -
- -``` -GRUB_TIMEOUT=10 -GRUB_CMDLINE_LINUX="console=ttyS0,19200n8" -GRUB_DISABLE_LINUX_UUID=true -GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1" -``` -
- -4. Update grub config: - -
- -``` -grub2-mkconfig -o /boot/grub/grub.cfg -``` -
- -5. Edit your Linode profile, change the boot settings to `GRUB 2` . - -6. Reboot your Linode. - -After reboot you will have fully operational CloudLinux OS Shared 7 system and can proceed with other configuration you need. - -#### CloudLinux OS Shared on Linode Xen - -To install CloudLinux OS Shared 7 on Linode Xen please perform the following steps: - -1. Deploy CL to your Linode following the steps from [this section](/cloudlinux_installation/#converting-existing-servers). - -2. Create the file `/boot/grub/menu.lst` with the following content: - -
- -``` -timeout 5 -title CloudLinux 7.1, $KVERSION -root (hd0) -kernel /boot/vmlinuz-$KVERSION root=/dev/xvda1 ro quiet -initrd /boot/initramfs-$KVERSION.img -``` -
- -where `$KVERSION` is the version of the installed CloudLinux OS Shared 7 kernel. - -:::tip Note -You will need to update `/boot/grub/menu.lst` manually after every kernel update. -::: - -3. Switch boot settings to `pv-grub-x86_64` and switch off `Auto-configure networking` in Linode settings. - -4. Reboot your Linode. - -In case if you will migrate to KVM later you will need only switch the boot settings to `GRUB 2`. - - -### Virtuozzo and OpenVZ - -* [Virtuozzo 7 and OpenVZ 7](/cloudlinux_installation/#virtuozzo-7-and-openvz-7) -* [Virtuozzo 6 and OpenVZ 6](/cloudlinux_installation/#virtuozzo-6-and-openvz-6) - - -#### Virtuozzo 7 and OpenVZ 7 - - -To use CloudLinux Shared Pro in Virtuozzo container, please update the next packages to the specified versions (or higher): - -* alt-php-ssa-0.3-4 -* alt-php-xray-0.5-8 -* cloudlinux-linksafe-1-5.2 -* accelerate-wp-1.0-11 -* lvemanager-7.7.5-2 -* alt-python27-cllib-3.2.32-1 -* pam_lve-0.4-3 -* lve-wrappers-0.7.7-1 -* lve-utils-6.4.3-1 -* cagefs-7.5.1-1 -* liblve-2.1-11 -* tuned-profiles-cloudlinux-0.2-3 - - -#### Available functionality - -* [Lsapi](/cloudlinux_installation/#lsapi) -* [AccelerateWP](/cloudlinux_installation/#acceleratewp) -* [Hardened PHP](/control_panel_integration/#hardened-php) -* [Website monitoring and Slow Site Analyzer](/lve_manager/#website-monitoring-tool-and-slow-site-analyzer) -* [X-Ray](/cloudlinux-os-plus/#x-ray) -* [CageFS](/cloudlinux_installation/#cagefs) -* [PHP Selector](/cloudlinux_installation/#php-selector) -* [Wizard](/cloudlinux_installation/#cloudlinux-wizard) -* [Dashboard](/cloudlinux_installation/#dashboard) -* [Python Selector](/cloudlinux_installation/#python-selector) -* [Node.js Selector](/cloudlinux_installation/#node-js-selector) - - -#### Requirements - -* [Virtuozzo 7](https://wiki.openvz.org/Virtuozzo) as server system -* Virtuozzo container with CloudLinux Shared Pro 8 -* cloudlinux-updates-testing repo is enabled (+ `yum clean all`) - -#### How to install - -1. Prepare Virtuozzo container with ostemplate almalinux-8-x86_64 -2. Enter to the container -3. Install cPanel: -``` -cd /home && curl -o latest -L https://securedownloads.cpanel.net/latest && sh latest -``` -4. Download and start cldeploy: -``` -wget https://repo.cloudlinux.com/cloudlinux/sources/cln/cldeploy -chmod 775 cldeploy -./cldeploy -k SHARED_PRO_CLN_KEY_HERE --testing-repo -``` -5. You don't need to restart the container after the cldeploy script finished execution. - - -#### CloudLinux Wizard - -Wizard is a tool to set up CloudLinux OS components. - -In the current version only the lsapi module can be installed. - -![](/images/WizardVZ.png) - -#### Dashboard - -CloudLinux OS Shared dashboard provides a quick overview of statistics and all administrative information for server administrators. - -In the current version only statistics about the lsapi module is available. - -![](/images/DashboardVZ.png) - -#### Lsapi - -To install Lsapi via CloudLinux Wizard, please turn off mod_ruid2 in EasyApache 4 -> Apache Modules. - -:::tip Note -For EasyApache select `Currently Installed Packages`. -::: - -![](/images/LsapiVZ1.png) - -![](/images/LsapiVZ2.png) - -![](/images/LsapiVZ3.png) - - -:::tip Note -Currently mod_suexec is not available in containers and will be released in future versions. Just ignore this message, click "ok" and continue installing lsapi via the Wizard. -::: - -You can find the complete lsapi documentation [here](https://docs.cloudlinux.com/cloudlinux_os_components/#apache-mod-lsapi-pro). - -#### AccelerateWP - -If you'd like to try Smart Advice and AccelerateWP you should participate in the Beta tester program. To become a beta tester, please send your request at our Beta program page with the signup form [here](https://www.cloudlinux.com/wp-performance/). Once you submit the request, we will send you a confirmation email with program details, terms of use, and installation instructions. - -All additional information can be found [here](https://docs.cloudlinux.com/cloudlinux-os-plus/#acceleratewp). - - -#### CageFS - -You can fing CageFS documentation [here](/cloudlinux_os_components/#cagefs). - -:::warning Attention! -[Kernel config variables](/cloudlinux_os_kernel/#kernel-config-variables) are not available for the Virtuozzo container! -::: - - -#### PHP Selector - -#### How to install - -1. To install via SSH, update your packages in the container: - ```sh - yum update alt-python27-cllib pam_lve lve-wrappers lve-utils liblve tuned-profiles-cloudlinux lvemanager - ``` -2. The following commands can be executed via SSH or via CloudLinux Wizard - **Via SSH:** - ```sh - yum install cagefs - yum groupinstall alt-php - cagefsctl –init - ``` - **Via CloudLinux Wizard (cPanel only):** - ![](/images/CLWizardInstallation.png) -3. Make sure compatible handlers are installed: - **Via SSH:** - ``` - yum install ea-apache24-mod_suexec - yum install ea-apache24-mod_suphp - ``` - **Or**
- [Install lsapi](/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4)
- **It's also possible to install via CloudLinux Wizard:**
- The `mod_suexec` and `mod_suphp` can be installed via cPanel EasyApache4 installation tool.

-4. Make sure users are enabled in the CageFS: - ![](/images/UsersEnabled.png) - -Useful links: - -* [General information and requirements](/cloudlinux_os_components/#general-information-and-requirements-5) - * [Installation and update](/cloudlinux_os_components/#installation-and-update-4) - * [Installation instructions for cPanel users](/cloudlinux_os_components/#installation-instructions-for-cpanel-users) -* [Uninstalling](/cloudlinux_os_components/#uninstalling-3) - * [Configuration and using](/cloudlinux_os_components/#configuration-and-using) - * [Bundled PHP extensions](/cloudlinux_os_components/#bundled-php-extensions) - - -#### Python Selector - -Python Ыelector for Virtuozzo is available starting from the following packages version: - -* lve-2.1-14 -* alt-python27-cllib-3.2.47-1 -* lvemanager-7.8.8-1 -* cagefs-7.5.5-1 - -Please update or install the packages mentioned above using the following command: - -``` -yum update lve alt-python27-cllib lvemanager cagefs --enablerepo=cloudlinux-updates-testing -``` - -The installation of Python Selector is available via CloudLinux Wizard. Aslo, the information about manual installation can be found [here](/cloudlinux_os_components/#cpanel-2). - -Information about working with Python Selector via GUI can be found [here](/lve_manager/#python-selector-2). - - -#### Node.js Selector - -Node.js Selector for Virtuozzo is available starting from the following packages version: - -* lve-2.1-14 -* alt-python27-cllib-3.2.47-1 -* lvemanager-7.8.8-1 -* cagefs-7.5.5-1 - -Please update or install the packages mentioned above using the following command: - -``` -yum update lve alt-python27-cllib lvemanager cagefs --enablerepo=cloudlinux-updates-testing -``` - -#### Installation for cPanel - -To use Node.js Selector, install Node.js packages by running the following command: - -``` -yum groupinstall alt-nodejs -``` - -CloudLinux OS Shared 7 supports both `ea-ruby24-mod_passenger` and `ea-ruby27-mod_passenger`. - -:::tip Note -The `ea-apache24-mod-alt-passenger` is deprecated in favor of `ea-ruby24-mod_passenger` and `ea-ruby27-mod_passenger`. -::: - -#### General information - -General information can be found [here](cloudlinux_os_components/#general-information-and-requirements-7). - -#### Requirements - -Information about Requirements can be found [here](/cloudlinux_os_components/#requirements-2). - -#### Limitations - -Information about limitations can be found [here](/cloudlinux_os_components/#limitations). - -If during Node.js Selector usage on cPanel servers you get "ENOMEM npm ERR! errno-12" error, try to increase Memory limit in cPanel WHM → Server Configuration → Tweak Settings → System → Max cPanel process memory, then restart cPanel service with the following command to apply changes: - -``` -systemctl restart cpanel.service -``` - -#### Node.js deployment - -Information about Node.js deployment can be found [here](/cloudlinux_os_components/#node-js-deployment). - -#### Remote usage of Node.js interpreters - -Information about Remote usage of Node.js interpreters can be found [here](/cloudlinux_os_components/#remote-usage-of-node-js-interpreters). - -#### Node.js Selector UI - -Information about working with Node.js Selector via UI can be found [here](/lve_manager/#node-js-selector-2). - - - -#### FAQ - -Q: My CloudLinux Manager-> options menu is empty. - -A: You don't have AccelerateWP enabled and PHP X-Ray enabled, so there is nothing to configure. Install and enable any of those features to see settings. This minor UI issue will be fixed in future updates. - -Q: Dashboard says both: that data is updated and that I need to refresh it and both panels never disappear. - -A: Just click the refresh button and reload the page, data will be loaded soon. - -Q: Website monitoring does not appear enabled after clicking the toggle. - -A: Just reload the page, the feature will be displayed as active. - -Q: Website monitoring proposes me to enable autotracing while I disable it. - -A: Issue is known and will be fixed soon. - - -#### Known restrictions and issues - -1. We do not recommend using [disk quota](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-disk-quotas) inside of containers - PHP Selector may be not functional for a user when disk quota is exceeded for the user. - -2. The following systemd directives may break CageFS inside containers: - * PrivateDevices - * PrivateMounts - * PrivateTmp - * ProtectSystem - * ReadOnlyDirectories - * ReadWriteDirectories - * InaccessibleDirectories - * ProtectHome - -#### Virtuozzo 6 and OpenVZ 6 - -#### Installation - -:::tip Note -Make sure all containers are stopped prior to doing this operation. Or reboot the server after the installation. -::: - -:::tip Note -Please make sure you have `vzkernel-headers` and `vzkernel-devel` packages installed. -::: - -
- -``` -yum install vzkernel-headers vzkernel-devel - -$ wget -P /etc/yum.repos.d/ https://repo.cloudlinux.com/vzlve/vzlve.repo -$ yum install lve-kernel-module -``` - -
- - -This will setup LVE module for VZ kernel, as well as DKMS to update that module each time VZ kernel is updated. - -After this is done, you can add LVE support for any container on a node, at any time. - -To make CloudLinux OS Shared work inside VZ container, VZ node has to be enabled. This should be done for any container where LVE support needs to be added: - - -
- -``` -$ vzctl set CT_ID --devnodes lve:rw --save -``` - -
- -To disable LVE support for Container: - -
- -``` -$ vzctl set CT_ID --devnodes lve:none --save -``` - -
- -Inside the container, follow [standard CloudLinux installation procedures](/cloudlinux_installation/#converting-existing-servers). - -CloudLinux OS Shared license is required for each VZ container. - -:::tip Note -Some servers require increasing `fs.ve-mount-nr` on host node, otherwise CageFS will throw errors. -::: - -To increase `fs.ve-mount-nr`, on a host node: - -1. add `fs.ve-mount-nr = 15000` to `/etc/sysctl.conf`; - -2. apply it with the `sysctl -p` command. - -In very rare cases the value should be increased higher, up to 50000. - -#### Available functionality - -* CageFS -* PHP Selector -* max entry processes -* mod_lsapi -* MySQL Governor - - - - - -## LILO boot loader - -CloudLinux OS can be deployed on servers that don't have grub installed, by installing `хороgrub` first. - -To do that: - -1. Make sure grub and kernel packages are not excluded. Edit file `/etc/yum.conf` and check `exclude=` line for presence of `kernel* grub*`. - -2. Backup lilo config file: - -
- -``` -mv /etc/lilo.conf /etc/lilo.conf.bak -``` -
- -3. Convert to CloudLinux OS Shared using [deploy2cl](/cloudlinux_installation/#converting-existing-servers) utility. - -4. Check `grub.conf` – it should be configured automatically: - -
- - ``` - # cat /boot/grub/grub.conf -default=0 -timeout=5 - title CloudLinux Server (2.6.18-294.8.1.el5.lve0.7.33) - kernel /boot/vmlinuz-2.6.18-294.8.1.el5.lve0.7.33 root=/dev/sda1 ro - root (hd0,0) - initrd /boot/initrd-2.6.18-294.8.1.el5.lve0.7.33.img - title linux centos5_64 - kernel /boot/bzImage-2.6.33.5-xxxx-grs-ipv4-64 root=/dev/sda1 ro - root (hd0,0) -``` -
- -5. Install grub to master boot record: - -
- - ``` - /sbin/grub-install /dev/sda - ``` -
- -6. Reboot and check that you are running CloudLinux OS Shared. `uname -r` should show something like: `2.6.18-294.8.1.el5.lve0.7.33`. - -## Uninstalling - -You can always uninstall CloudLinux OS. In this case, the system will be converted back to AlmaLinux or CentOS* (Depends on what system the conversion was done from). - -:::warning -CentOS Linux 8 reached End Of Life (EOL) on December 31st, 2021. You can still uninstall CloudLinux and return to CentOS 8, but we don't guarantee stable operation of the system and its repositories after this action. -::: - -The following actions will be taken: - -1. LVE related packages will be removed. -2. CloudLinux OS Shared repositories & yum plugin will be removed. -3. AlmaLinux or CentOS* repositories will be set up. - -In the end, the script will provide instructions on how to finish the conversion back to AlmaLinux or CentOS*. That will require removal of CloudLinux OS Shared kernel (manual step), and installation of AlmaLinux or CentOS* kernel (if needed). - -:::warning -Do not forget to free up a CloudLinux OS Shared license by removing the server from the [Servers section of your CLN account](https://docs.cln.cloudlinux.com/dashboard/#servers). After that, if you don't intend to use the license anymore, you can [remove it](https://docs.cln.cloudlinux.com/dashboard/#cloudlinux-os-activation-keys) to avoid being billed for it. -::: - -To uninstall CloudLinux OS, run: - -``` -$ wget -O cldeploy https://repo.cloudlinux.com/cloudlinux/sources/cln/cldeploy -$ sh cldeploy -c -``` - -Now you have converted back to AlmaLinux or CentOS* and it is the time to install kernel. - -To delete CloudLinux OS kernel, run (change the kernel package name to the one you've been using): - - -``` -rpm -e --nodeps $(rpm -qa | grep kernel | grep lve) -``` - -To install new AlmaLlinux or CentOS* kernel once you deleted CloudLinux OS Shared kernel, run the following command: - -``` -yum install kernel -``` - -If `yum` says that the latest kernel is already installed, it is OK. - -Please check your bootloader configuration before rebooting the system. - -To remove unused kmods and lve libs, run: - -``` -yum remove lve kmod*lve* -``` - -Kernel package and related LVE packages should be deleted and the required kernel will be installed. - -Before the reboot, the following command should be executed for restoring Apache and httpd.conf without mod_hostinglimits. - -**For EasyApache 3:** - -``` -/scripts/easyapache --build -``` - -**For EasyApache 4:** - -``` -/usr/local/bin/ea_install_profile --install /etc/cpanel/ea4/profiles/cpanel/default.json -``` - -:::tip Note -Some of the packages from CloudLinux OS repo will still be present. They are the same as AlmaLinux or CentOS* packages, and don't have to be removed. They will be updated in the future from AlmaLinux or CentOS* repositories, as new versions come out. -::: diff --git a/docs/cloudlinux_installation/images/cl9_secureboot/1.png b/docs/cloudlinux_installation/images/cl9_secureboot/1.png deleted file mode 100644 index 7deb8182a..000000000 Binary files a/docs/cloudlinux_installation/images/cl9_secureboot/1.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/cl9_secureboot/2.png b/docs/cloudlinux_installation/images/cl9_secureboot/2.png deleted file mode 100644 index 56ead7aff..000000000 Binary files a/docs/cloudlinux_installation/images/cl9_secureboot/2.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/cl9_secureboot/3.png b/docs/cloudlinux_installation/images/cl9_secureboot/3.png deleted file mode 100644 index a61a709ba..000000000 Binary files a/docs/cloudlinux_installation/images/cl9_secureboot/3.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/cl9_secureboot/4.png b/docs/cloudlinux_installation/images/cl9_secureboot/4.png deleted file mode 100644 index a3030f74b..000000000 Binary files a/docs/cloudlinux_installation/images/cl9_secureboot/4.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/cl9_secureboot/5.png b/docs/cloudlinux_installation/images/cl9_secureboot/5.png deleted file mode 100644 index 615c56c88..000000000 Binary files a/docs/cloudlinux_installation/images/cl9_secureboot/5.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/cl9_secureboot/6.png b/docs/cloudlinux_installation/images/cl9_secureboot/6.png deleted file mode 100644 index 6993d30ac..000000000 Binary files a/docs/cloudlinux_installation/images/cl9_secureboot/6.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/installation_iso_source_old.png b/docs/cloudlinux_installation/images/installation_iso_source_old.png deleted file mode 100644 index 0e376e8f9..000000000 Binary files a/docs/cloudlinux_installation/images/installation_iso_source_old.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/installation_progress.png b/docs/cloudlinux_installation/images/installation_progress.png deleted file mode 100644 index b5c9bff7e..000000000 Binary files a/docs/cloudlinux_installation/images/installation_progress.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/installation_source_gray_done_old.png b/docs/cloudlinux_installation/images/installation_source_gray_done_old.png deleted file mode 100644 index 025860a74..000000000 Binary files a/docs/cloudlinux_installation/images/installation_source_gray_done_old.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/installation_source_gray_network_old1.png b/docs/cloudlinux_installation/images/installation_source_gray_network_old1.png deleted file mode 100644 index 7f7df0f15..000000000 Binary files a/docs/cloudlinux_installation/images/installation_source_gray_network_old1.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/installation_source_network_address_old.png b/docs/cloudlinux_installation/images/installation_source_network_address_old.png deleted file mode 100644 index cd0378ad1..000000000 Binary files a/docs/cloudlinux_installation/images/installation_source_network_address_old.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/installation_summary_old.png b/docs/cloudlinux_installation/images/installation_summary_old.png deleted file mode 100644 index 7353ab849..000000000 Binary files a/docs/cloudlinux_installation/images/installation_summary_old.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/software_selection1.png b/docs/cloudlinux_installation/images/software_selection1.png deleted file mode 100644 index 164a0eff8..000000000 Binary files a/docs/cloudlinux_installation/images/software_selection1.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/software_selection_solo.png b/docs/cloudlinux_installation/images/software_selection_solo.png deleted file mode 100644 index 262563b7e..000000000 Binary files a/docs/cloudlinux_installation/images/software_selection_solo.png and /dev/null differ diff --git a/docs/cloudlinux_installation/images/welcome_page_old.png b/docs/cloudlinux_installation/images/welcome_page_old.png deleted file mode 100644 index df6649f1e..000000000 Binary files a/docs/cloudlinux_installation/images/welcome_page_old.png and /dev/null differ diff --git a/docs/cloudlinux_os_components/README.md b/docs/cloudlinux_os_components/README.md deleted file mode 100644 index bd6f6d1d7..000000000 --- a/docs/cloudlinux_os_components/README.md +++ /dev/null @@ -1,9169 +0,0 @@ -# CloudLinux OS components - -* [Reseller limits](/limits/#reseller-limits) -* [LVE-Stats 2](/cloudlinux_os_components/#lve-stats-2) -* [CageFS](/cloudlinux_os_components/#cagefs) -* [MySQL Governor](/cloudlinux_os_components/#mysql-governor) -* [PHP Selector](/cloudlinux_os_components/#php-selector) -* [Python Selector](/cloudlinux_os_components/#python-selector) -* [Ruby Selector](/cloudlinux_os_components/#ruby-selector) -* [Node.js Selector](/cloudlinux_os_components/#node-js-selector) -* [Apache mod_lsapi PRO](/cloudlinux_os_components/#apache-mod-lsapi-pro) -* [Additional integration components](/cloudlinux_os_components/#additional-integration-components) -* [Apache suexec module](/cloudlinux_os_components/#apache-suexec-module) - -#### General information and requirements - -## LVE-Stats 2 - -### General information and requirements - -* [Why is it needed?](/cloudlinux_os_components/#why-is-it-needed) -* [Major improvements and features](/cloudlinux_os_components/#major-improvements-and-features) -* [What features will be implemented in the future?](/cloudlinux_os_components/#what-features-will-be-implemented-in-the-future) - -#### Why is it needed? - -* Old LVE-statistics store averages as integer numbers, as % of CPU usage. If user used 100% of CPU for 1 second within an hour, it is only 1-2% for a minute, and 0 for 5 minutes. Data in old LVE-statistics is aggregated to 1-hour intervals. So, such peak load will noExat be recorded and we need to store data with much higher precision. -* 100% CPU usage in old lve statistics means “all cores”. On 32 core servers usage is not visible for most users (as they are limited to 1 core). -* Old LVE-statistics does not provide a way to determine a cause of LVE faults, i.e. what processes are running when user hits LVE limits.Example -* Notifications in old LVE-statistics are not accurate because they are based on average values for CPU, IO, IOPS. -* Old LVE-statistics functionality is hard to extend. - -#### Major improvements and features - -* increased precision of statistics; -* CPU usage is calculated  in terms of % of a single core (100% usage means one core); -* lvestats-server emulates and tracks faults for CPU, IO, IOPS; -* lvestats-server saves “snapshots” of user’s processes and queries for each “incident” - added new lve-read-snapshot utility; -* improved notifications about hitting LVE limits (more informative and without false positives); -* implemented ability to add custom plugins; -* MySQL and PostGreSQL support; -* more pretty, scalable, interactive charts; -* snapshots include HTTP-requests. - -:::tip Note -[`mod_proctitle`](/cloudlinux_os_components/#mod-proctitle) has to be enabled for HTTP request collection to be available -::: - -#### What features will be implemented in the future? - -* Notifications for control panels other than CPanel. -* Burstable Limits/server health: We are monitoring server health ( LA , memory , idle CPU ) and automatically decreasing/increasing limits based on server health. -* Reseller Limits: plugin would analyze usage per group of users (reseller’s usage), and do actions. -* Suspend/notify plugin: would detect that user is being throttled for 10 minutes, and suspend him (just because), or notify, or increase limits. - -### Installation and update - -* [Downgrade](/cloudlinux_os_components/#downgrade) - -To install, please execute: - -
- -``` -yum install lve-stats -``` -
- -To update: - -
- -``` -yum update lve-stats -``` -
- -Settings of old lve-stats (ver. 0.x) are imported automatically on the first install/update of a new lve-stats package. - -SQLite database file is located in `/var/lve/lvestats2.db`, data from old lve-stats (ver. 0.x) are being migrated automatically in the background. Migrating process can last 2-8 hours (during this time lags are possible when admin is trying to check statistics, at the same time users will not be affected). Migrating the latest 30 days, SQLite DB stable migration is provided. - -Currently, the new lve-stats supports all databases available in CloudLinux OS Shared. - -:::tip Note -You can also use [LVE-stats 2 CLI](/command-line_tools/#lve-stats-2) -::: - -#### Downgrade - -If you have any problems after update, downgrade lve-stats2 to the previous stable version by running: - -
- -``` -yum downgrade lve-stats -``` -
- -and contact CloudLinux OS Shared support at [https://cloudlinux.zendesk.com/hc/requests/new](https://cloudlinux.zendesk.com/hc/en-us/requests/new) - -:::tip Note -You may need to rename `*.rpmsave` files to original ones in order to restore settings for old lve-stats (`/etc/sysconfig/lvestats`, `/etc/sysconfig/cloudlinux-notify`). -::: - -:::tip Note -You can also use [LVE-stats 2 CLI](/command-line_tools/#lve-stats-2) -::: - -### Configuration - -The main configuration file `/etc/sysconfig/lvestats2` contains the following options: - -* `db_type` - selects appropriate database type to use; -* `connect-string` - connection string for PostGreSQL and MySQL database, has the following form: - -
- - ``` - connect_string = USER:PASSWORD@HOST[:PORT]/DATABASE - ``` -
- - Default port is used for specific database, if port is not specified (typical port is 3306 for MySQL and 5432 for PostGreSQL). Connection string is not used for sqlite database. - -* `server_id` - sets the name of the server (at most 10 characters). This option is to use with centralized database ( PostGreSQL or MySQL). For use with sqlite database, value of this option should be "localhost" (without quotes). -* `plugins` – path to directory containing custom plugins for lve-stats (default path `/usr/share/lve-stats/plugins`). -* `db_timeout` - period of time to write data to database (in seconds); default value is 60 seconds. -* `timeout` - timeout for custom plugins (seconds). If plugin execution does not finish within this period, plugin is terminated. Default value is 5 seconds. -* `interval` - duration of one cycle of lvestats-server (seconds). This should be less than total duration of execution of all plugins. Default value is 5 seconds. Increasing this parameter makes precision of statistics worse. -* `keep_history_days` - period of time (in days) to keep history in database. Old data is removed from database automatically. Default value is 60 days. -* `mode` – sets compatibility output mode (compatibility with older lveinfo version - * Value `v1` enables compatibility with old version of lveinfo. - * Value `v2` enables `extended` output mode, but can break LVE plugins for control panels (statistics in LVE Manager, Resource Usage, etc). Support of `v2` mode will be added to LVE plugins in the recent future. When mode parameter is absent, later version of lveinfo is implied. -* `disable_snapshots` - disable snapshots and incidents. - Possible values: - * `true` - * `false` -* `hide_lve_more_than_maxuid` - disable displaying of lve ids more than max uid in resource usage. - Possible values: - * `true` - * `false` -* `use_big_uids` - the option is available from lvestats version `3.0.14-1`. It allows using the user uids more than 109 and up to 231-2 (2 147 483 646). Top border is the biggest value which `kmodlve` can use as LVE ID. You should recreate lvestats database by command `lve-create-db --recreate` if you change the option's value from `false` to `true`. - Possible values: - * `true` - * `false` - - -Configuration files for plugins are located in `/etc/sysconfig/lvestats.config` directory. - -`/etc/sysconfig/lvestats.config/SnapshotSaver.cfg` contains the following options: - -* `period_between_incidents` - the minimal interval of time between incidents (in seconds). If minimal interval of time between LVE faults is greater than value specified, than new "incident" will begin and new snapshots will be saved. Default value is 300 seconds. -* `snapshots_per_minute` - the maximum number of snapshots saved per minute for specific LVE id (default is `2`). -* `max_snapshots_per_incident` - the maximum number of snapshots saved for one "incident". Default is `10`. -* `litespeed` - enable or disable data import from LiteSpeed, default is `auto` (autodetect); `On`|`on`|`1` - force use litespeed; `Off`|`off`|`0` - force use apache - -`/etc/sysconfig/lvestats.config/StatsNotifier.cfg` contains the following options: - -* `NOTIFY_ADMIN` – enables notification for admin (`Y/N`, default `N`); -* `NOTIFY_RESELLER` – enables notification for reseller (`Y/N`, default `N`); -* `NOTIFY_CUSTOMER` - enables notification for customers (`Y/N`, default `N`); -* `NOTIFY_INCLUDE_RESELLER_CUSTOMER` – `Y`=notify all users, `N`=notify only hoster's users (whos reseller is root), default = `N`; -* `NOTIFY_CPU` – notify about CPU faults when customer hits 100% of his CPU limit (`Y/N`, default `N`); -* `NOTIFY_IO` - notify about IO faults when customer hits 100% of his IO limit (`Y/N`, default `N`); -* `NOTIFY_IOPS` - notify about IOPS faults when customer hits 100% of his IOPS limit (`Y/N`, default `N`); -* `NOTIFY_MEMORY` - notify about memory faults (`Y/N`, default `N`); -* `NOTIFY_EP` – notify about entry processes faults (`Y/N`, default `N`); -* `NOTIFY_NPROC` – notify about number of processes faults (`Y/N`, default `N`); -* `NOTIFY_MIN_FAULTS_ADMIN` – minimum number of faults to notify admin (default `1`); -* `NOTIFY_MIN_FAULTS_USER` – minimum number of faults to notify customer (default `1`); -* `NOTIFY_INTERVAL_ADMIN` – period of time to notify admin (default `12h`); -* `NOTIFY_INTERVAL_USER` – period of time to notify customer (default `12h`); -* `NOTIFY_FROM_EMAIL` - sender email address. For example: `NOTIFY_FROM_EMAIL=main_admin@host.com`; -* `NOTIFY_FROM_SUBJECT` - email message subject. For example: `NOTIFY_FROM_SUBJECT=Message from notifier` -* `REPORT_ADMIN_EMAIL` - custom email for admin reporting. For example: `REPORT_ADMIN_EMAIL=report_email@host.com` -* `NOTIFY_CHARSET_EMAIL` – charset type for email. Available for __lve-stats-2.9.4-1__ and later. Default is `us-ascii`. For example: `NOTIFY_CHARSET_EMAIL=utf-8`. If your email templates include non-Latin letters, it is recommended to use the UTF-8 encoding. - -These values can also be set using [cloudlinux-config CLI](/command-line_tools/#cloudlinux-config) utility - -Templates of notifications are located here: - -* `/usr/share/lve/emails/en_US/admin_notify.txt` -* `/usr/share/lve/emails/en_US/reseller_notify.txt` -* `/usr/share/lve/emails/en_US/user_notify.txt` -* `/usr/share/lve/emails/en_US/admin_notify.html` -* `/usr/share/lve/emails/en_US/reseller_notify.html` - -:::tip Note -Notifications about LVE faults are implemented for CPanel, Plesk, and DirectAdmin. -::: - -After changing any options above, please restart lvestats service: - -
- -``` -service lvestats restart -``` -
- -`/etc/logrotate.d/lvestats` - configuration file for `/var/log/lve-stats.log rotation` - -:::tip Note -You can also use [LVE-stats 2 CLI](/command-line_tools/#lve-stats-2) -::: - -### LVE-stats2 and DB servers compatible work setup - -* [LVE-stats2 and MySQL DB server compatible work setup](/cloudlinux_os_components/#lve-stats2-and-mysql-db-server-compatible-work-setup) -* [LVE-stats2 and PostgreSQL DB server compatible work setup](/cloudlinux_os_components/#lve-stats2-and-postgresql-db-server-compatible-work-setup) -* [Customize LVE-stats2 notifications](/cloudlinux_os_components/#customize-lve-stats2-notifications) - -#### LVE-stats2 and MySQL DB server compatible work setup - -:::tip Note -Run all the commands below under root. -::: - -**1. MySQL server setup** - -If MySQL Server is not installed, then install it according to control panel documentation. - -For non-panel system: - -* CloudLinux OS Shared 6 - -
- - ``` - yum install mysql mysql-server - service mysqld start - chkconfig mysqld on - ``` -
- -* CloudLinux OS Shared 7 - -
- - ``` - yum install mariadb mariadb-server - systemctl start mariadb.service - systemctl enable mariadb.service - ``` -
- - -**2. Database setup** - -* Run MySQL administrative utility: `mysql`. -* In utility run the commands: - - * creating server DB. Also, check **_Note_** below. - -
- - ``` - CREATE DATABASE db_lvestats2; - ``` -
- - * creating a user for LVE Stats 2 server to work under. Also, check **_Note_** below. - -
- - ``` - CREATE USER 'lvestats2'@'localhost' IDENTIFIED BY 'lvestats2_passwd'; - ``` -
- - * granting all the privileges for all DB tables to the user. Use the username and DB name from the points above. - -
- - ``` - GRANT ALL PRIVILEGES ON db_lvestats2.* TO 'lvestats2'@'localhost'; - ``` -
- - * refreshing privileges information. - -
- - ``` - FLUSH PRIVILEGES; - ``` -
- - * Exit administrative utility `(Ctrl+d)`. - -:::tip Note -DB name, username and their passwords above are given for an example - you can use any of your choices. Using old DB from LVE Stats version 1 is also acceptable as LVE Stats2 uses different tables and the old information will not be corrupted. -::: - -**3.** **LVE-stats2** **setup** - -* Stop LVE Stats 2 server by running the command: - -
- -``` -service lvestats stop -``` -
- -* In server configuration file `/etc/sysconfig/lvestats2`, edit the following options: - * `db_type = mysql` - * `connect_string = lvestats2:lvestats2_passwd@localhost/db_lvestats2` - -:::tip Note -`connect_string` option value is used in format: `user:pass@host/database`. -Username, password and DB name must be the same as in point 2 of Database Setup above. -::: - -* After making changes in configuration files run: - -
- -``` -/usr/sbin/lve-create-db -``` -
- - For DB primary initialization (creating tables, indexes, etc). There is no need to create anything in the DB manually. - -* When done, restart server by running: - -
- -``` -service lvestats restart -``` -
- - -**4. Additional security settings** - -If you need to provide access to LVE Stats information utilities (`lveinfo`, `lvechart`, `lve-read-snapshot`) for different users, then we recommend creating one more DB user with read-only privilege to guarantee information security. It can be done by running the following commands in administrative utility: - -* creating a user (check **_Note_** above) - -
- -``` -CREATE USER 'lvestats2_read'@'localhost' IDENTIFIED BY 'lvestats2_read_passwd'; -``` -
- -* granting read-only privilege to the user - -
- -``` -GRANT SELECT ON db_lvestats2.* TO 'lvestats2_read'@'localhost'; -``` -
- -* refreshing privileges information - -
- -``` -FLUSH PRIVILEGES; -``` -
- -If LVE Stats2 server is set correctly (see information below), the information utilities will work under this user. - -If you need to provide access to information utilities to other users, then in order to guarantee information security you should do the following: - -* Assign permission 600 to the main configuration file (`/etc/sysconfig/lvestats2`), so that it could be read only by LVE Stats 2 server and by utilities that run under root. -* Copy `/etc/sysconfig/lvestats2` to `/etc/sysconfig/lvestats2.readonly`, assign permission 644 to the new file, so that it could be read by any user but could only be changed by root. -* In `/etc/sysconfig/lvestats2.readonly` file, in the line `connect_string`, specify DB user with read-only permission, created above. - -These steps allow hiding main DB user username/password from other system users. - -If there is no need in such access differentiation, then `/etc/sysconfig/lvestats2` file access permission should be 644, so that it could be read by all users and could be changed only by root. - - -**5. Using special characters in database password** - -Since scheme `://user:password@host[:port]/database_name` [URI](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) is used in `connect_string` config option, then usage of special characters in user DB password is not allowed. - -To use special symbols in the password, it must be converted to [escape-sequence](https://en.wikipedia.org/wiki/Percent-encoding). You can convert a password to escape-sequence in a console as follows: - -
- -``` -echo -n '[You_P@$$]:' | perl -MURI::Escape -ne 'print uri_escape($_)."\n"' -%5BYou_P%40%24%24%5D%3A -``` -
- -Or replace the symbols manually: - -
- -``` -! # $ & ' ( ) * + , / : ; = ? @ [ ] -%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D -``` -
- -After that `сonnect_string` will look as follows: - -
- -``` -сonnect_string=lvestats2:%5BYou_P%40%24%24%5D%3A@localhost/db_lvestats2 -``` -
- - -#### LVE-stats2 and PostgreSQL DB server compatible work setup - - -:::tip Note -Run all the commands below under root. -::: - -**1.** **PostgreSQL** **server installation and setup** - -* **PostgreSQL installation and initialization** - - For control panels use proper documentation for installation on the links: [сPanel](https://documentation.cpanel.net/display/CKB/Install+or+Update+PostgreSQL+on+Your+cPanel+Server), [Plesk](https://kb.plesk.com/en/123729). - - For non-panel CloudLinux OS Shared, run the following commands: - - * CloudLinux OS Shared 6 - -
- - ``` - yum install postgresql-server postgresql - service postgresql initdb - service postgresql start - chkconfig postgresql on - ``` -
- - * CloudLinux OS Shared 7 - -
- - ``` - yum install postgresql-server postgresql - postgresql-setup initdb - systemctl start postgresql - systemctl enable postgresql - ``` -
- -* **Setup** - - * In `/var/lib/pgsql/data/pg_hba.conf` config file change user authentication mode. Add the following lines (place before all other authentication parameters): - -
- - ``` - # IPv4 local connections for lve-stats-2.x - host dblvestat all 127.0.0.1/32 password - # IPv6 local connections for lve-stats-2.x - host dblvestat all ::1/128 password - ``` -
- - These lines enable user authentication by the password for IP4/IP6 connections. You can set other modes if needed. - - * Apply config changes by running: - -
- - ``` - service postgresql restart - ``` -
- - -**2. DB for** **LVE-stats-2.x** **- creating and setup** - -* Run standard PostgreSQL psql administrative utility: - -
- -``` -sudo -u postgres psql postgres -``` -
- -OR for сPanel - -
- -``` -psql -w -U postgres -``` -
- -* In utility run: - - * creating server DB. Also, check **_Note_** below. - -
- - ``` - CREATE DATABASE dblvestat; - ``` -
- - * creating a user for LVE Stats 2 server to work under. Also, check **_Note_** below. - -
- - ``` - CREATE USER lvestat WITH password 'passw'; - ``` -
- - * granting lvestat user all privileges for work with dblvestat DB. - -
- - ``` - GRANT ALL privileges ON DATABASE dblvestat TO lvestat; - ``` -
- - * exit `psql` utility: - -
- - ``` - \q - ``` -
- - OR alternatively: - -
- - ``` - Ctrl+d - ``` -
- - -:::tip Note -DB name, username and their passwords above are given for an example - you can use any of your choices. Using old DB from LVE Stats version 1 is also acceptable as LVE Stats 2 uses different tables and the old information will not be corrupted -::: - -**3.** **LVE-stats-2.x** **setup** - -* Stop lve-stats2 server by running: - -
- -``` -service lvestats stop -``` -
- -* In server config file `/etc/sysconfig/lvestats2` edit options for connecting to DB: - -
- -``` -db_type = postgresql -connect_string=lvestat:passw@localhost/dblvestat -If DB is going to be used as centralized for multiple hosts then collect_usernames parameter must be changed: -collect_usernames=true -``` -
- -:::tip Note -`connect_string` option value is of the format: `user:pass@host/database`. Username, password and DB name must be the same as in Database Setup section above. -::: - -* After making changes in configuration files, for DB primary initialization (creating tables, indexes, etc), run: - -
- -``` -/usr/sbin/lve-create-db -``` -
- -* There is no need to create anything in the DB manually. When done, restart server by running: - -
- -``` -service lvestats restart -``` -
- -**4. Additional security settings** - -If you need to provide access to LVE Stats information utilities (`lveinfo`, `lve-read-snapshot` ) for other users (or if CageFS is disabled), then in order to guarantee DB security the following steps are required: - -* Create a DB user with read-only permission: - -
- -``` -CREATE USER lvestat_read WITH password 'passw'; -GRANT CONNECT ON DATABASE dblvestat to lvestat_read; -\connect dblvestat; -GRANT SELECT ON lve_stats2_history, lve_stats2_history_gov, lve_stats2_history_x60, lve_stats2_incident, lve_stats2_servers, lve_stats2_snapshot, lve_stats2_user TO lvestat_read; -``` -
- -* Assign root ownership and permission 600 to the main configuration file (`/etc/sysconfig/lvestats2`), so that it could be read only by LVE Stats 2 server and by utilities that run under root. - -* Copy `/etc/sysconfig/lvestats2` to `/etc/sysconfig/lvestats2.readonly`, assign permission 644 to the new file, so that it could be read by any user but could be changed only by root. - -* In `/etc/sysconfig/lvestats2.readonly` file, in the line `connect_string`, specify DB user with read-only permission, created above. - - These steps allow hiding main DB user username/password from other system users. - - If there is no need in such access differentiation, then `/etc/sysconfig/lvestats2` file access permission should be 644, so that it could be read by all users and could be changed only by root. - -* When done, restart server by running: - -
- -``` -service lvestats restart -``` -
- - -**5. Using special characters in database password** - -Since scheme `://user:password@host[:port]/database_name` [URI](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) is used in `connect_string` config option, then usage of special characters in user DB password is not allowed. - -To use special symbols in the password, it must be converted to [escape-sequence](https://en.wikipedia.org/wiki/Percent-encoding). You can convert a password to escape-sequence in a console as follows: - -
- -``` -echo -n '[You_P@$$]:' | perl -MURI::Escape -ne 'print uri_escape($_)."\n"' -%5BYou_P%40%24%24%5D%3A -``` -
- -OR replace the symbols manually: - -
- -``` -! # $ & ' ( ) * + , / : ; = ? @ [ ] -%21 %23 %24 %26 %27 %28 %29 %2A %2B %2C %2F %3A %3B %3D %3F %40 %5B %5D -``` -
- -After that `сonnect_string` will look as follows: - -
- -``` -сonnect_string=lvestats2:%5BYou_P%40%24%24%5D%3A@localhost/db_lvestats2 -``` -
- -#### Customize LVE-stats2 notifications - -[Jinja2](http://jinja.pocoo.org/) is used as a template engine for the notifications. - -The templates for notifications are located in `/usr/share/lve/emails/LOCALE`, where `LOCALE` is the directory with localization name (language codes are formed according to ISO 639-1 and ISO 639-2). - -By default the templates for English are set: `/usr/share/lve/emails/en_US.`. - -`/usr/share/lve/emails/en_US` contains the following templates: - -* `admin_notify.html` `admin_notify.txt` for administrator; -* `reseller_notify.html` `reseller_notify.txt` for reseller; -* `user_notify.txt` for user. - - -Starting from `lve-stats-4.1.2`, it allows server administrators to use their own lvestats notifier email notification templates. - -To use the custom templates, place them and the `locales.json` file to the `/etc/cl.emails.d/LOCALE` directory. File names are the same as in general `/etc/cl.emails.d/LOCALE` file. - -If the `/etc/cl.emails.d/LOCALE` doesn't exist or doesn't contain the templates, you can use the `/usr/share/lve/emails/LOCALE` directory, as it was in previous versions of lve-stats. - -Please do not edit the templates in the the `/usr/share/lve/emails` and place the new updated templates in the `/etc/cl.emails.d` directory. - - -The notification is formed as _Multipart content type_ [RFC1341(MIME)](https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html). - -The plain text is taken from the `.txt` files, html version - from the `.html` template. - -In case when only one template is present (`.txt` or `.html`) the notification is sent as a _Non-multipart content_ type notification. - -It is better to use _Multipart content_ type notifications because when a mail client can not display an html-format message, then it will be displayed as plain text version. - -To localize notifications, copy standard templates into directory with the proper locale name and translate the template. Also you can customize the main template making proper changes into it. - -The list of variables that can be used in the template: - -| | | | -|-|--|-| -|Variable | Example | Description| -|`TONAME` | `Customer` | Notification receiver user name. Taken from profile in the control panel, by default - `Customer` for user, `Administrator` for administrator, `Reseller` for reseller.| -|`TOMAIL` | `support@cloudlinux.com` | Notification receiver email address.| -|`DOMAIN` | `wordpress.test247.cloudlinux.com` | Main domain. Available only for user.| -|`LOCALE` | `en_US` | Locale in which the notification is sent. Available only for user.| -|`RESELLER` | `root` | User reseller. Available only for user.| -|`PERIOD` | `12 hours` | Verification and notification sending period.| -|`LOGIN` | `wordpress` | User login in the system.| -|`ID` | `500` | User ID in the system.| -| `lPMem` `lEP` `PMemF` `lVMem` `anyF` `IOf` `VMemF` `lCPU` `aIOPS` `aEP` `aPMem` `IOPSf` `lIO` `lIOPS` `aIO` `EPf` `aCPU` `aVMem` `NprocF` `aNproc` `lNproc` `CPUf` | | See description in `lveinfo --help` output. Available only for users| -|`STATS_HTML` | | html table with the list of users that exceeded limits. Available for administrator and reseller.| -|`STATS` | | ASCII - table with the list of users that exceeded limits. Available only for admins and resellers.| - -Sender’s email address by default is administrator email address from control panel settings `(root@{hostn_name}` if there is no email in the control panel). - -It can be changed with `NOTIFY_FROM_EMAIL` option in the config `/etc/sysconfig/lvestats.config/StatsNotifier.cfg` - -For example: - -`NOTIFY_FROM_EMAIL=support@hostername.com` - -To apply changes restart `lve-stats` service: - -
- -``` -service lvestats restart -``` -
- -for CloudLinux OS Shared 7 - -
- -``` -systemctl restart lvestats.service -``` -
- -Default subject is `Hosting account resources exceeded`.  It can be changed for each template (and for localized templates as well). To change subject, in the very beginning of the file (no blank lines allowed in the beginning of the template) add the field `Subject:`, leave two blank lines after it and add template body. - -Customized subjects can be taken only from the templates with the resolution `*.txt` (`admin_notify.txt`, `reseller_notify.txt`, `user_notify.txt`). Changes apply without `lvestats` restart. - -For backward compatibility the subject can be also changed with the key `NOTIFY_FROM_SUBJECT` in the config `/etc/sysconfig/lvestats.config/StatsNotifier.cfg`. - -Customized subjects have the higher priority than the key `NOTIFY_FROM_SUBJECT`. - -Example for the file `user_notify.txt` - -
- -``` -Subject: Customized subject example -Dear {{TONAME}}, - -Your {{DOMAIN}} web hosting account exceeded one or more of its resources within the last {{PERIOD}}. -{% if epf %}Exceeded the maximum of {{lep}} concurrent website connections. Your website was not available {{epf}} times because of this problem. -{% endif %}{% if pmemf %}Exceeded the physical memory limit of {{lpmem}}KB. Your website was not available {{pmemf}} times because of this problem. -{% endif %}{% if vmemf %}Exceeded the virtual memory limit of {{lvmem}}KB. Your website was not available {{vmemf}} times because of this problem. -{% endif %}{% if nprocf %}Exceeded the number of processes limit of {{lnproc}}. Your website was not available {{nprocf}} times because of this problem. -{% endif %}{% if cpuf %}You reached limit of {{lcpu}} of total server CPU usage {{cpuf}} times. Your website was forced to load slower to reduce its CPU usage. -{% endif %}{% if iof %}You reached limit of {{lio}}KB/s disk io rate {{iof}} times. The disk io speed for your account was slowed as a result of this problem. -{% endif %}{% if iopsf %}You reached limit of {{liops}} I/O operations {{iopsf}} times. The disk io speed for your account was slowed as a result of this problem. -{% endif %} - -To view full details about your web hosting account's resource usage, including the time of each incident listed above, please click the link below and log into your cpanel hosting control panel, then click the "Resource Usage" link under the "Logs and Statistics" section. -http://{{DOMAIN}}:2083 - -If your account is regularly exceeding it's available resources, please consider upgrading to a higher level hosting plan that includes more resources. If you have any questions or need help with anything, just reply to this email and let us know. - -Sincerely, - -Your Friendly Web Hosting Support Team -``` -
- -:::tip Note -The email template should be in the UTF-8 encoding. The other encodings are not supported. -::: - -Starting from lve-stats v. 3.0.15-1, it allows to localize the words that before were imported directly from the lve-stats program code and couldn't be changed. - -The email template looks like follows: - -``` -Dear {{TONAME}}, -Following accounts experienced issues in the past {{PERIOD}}{% if HOSTNAME is defined %} on host {{HOSTNAME}}{% endif %} - -{{STATS}} - -Sincerely, -Your Friendly Web Hosting Support Team -``` - -Before, the `{TONAME}` was replaced with “Administrator”/”Reseller”/”Customer” according to the type of the addressee. The `{PERIOD}` was replaced with the duration of the period during which the limits faults were detected. The period duration includes the words "days"/"hour"/"minutes"/"seconds". - -In the new version, in order for the lve-stats notifier to include these words in the letter in the language corresponding to the addressee locale, you should create a file for the required locale `/usr/share/lve/emails//locale_defines.json` with the following content: - -``` -{ - "NOTIFY_FROM_SUBJECT": "Your server has lve-stats faults", - "PERIOD": { - "days": "days", "hours": "hour(s)", "minutes": "minutes", "seconds": "seconds" - }, - "TONAME": { - "admin": "Administrator", "reseller": "Reseller", "customer": "Customer" - } -} -``` - -The file format should be JSON, and the file encoding should be UTF-8. If this file is found and successfully read, the words from it will be used in emails. -In case of any file reading/parsing error, a corresponding message will be written in the lve-stats log, and the contents of the file will be completely ignored. -If a key in the JSON file content is missing, then lve-stats notifier uses the word contained in the body of the program (just like in previous lve-stats versions). -Also, this file allows you to override/localize the subject of the email. - -It should be noted that this override of the subject line is the highest priority. I.e., if you want to use the subject from the configuration file `/etc/sysconfig/lvestats.config/StatsNotifier.cfg`, then do not specify the `NOTIFY_FROM_SUBJECT` key in the `locale_defines.json`. - - -### Plugins - -* [Creating a plugin for LVE-stats2](/cloudlinux_os_components/#creating-a-plugin-for-lve-stats2) -* [Introduction](/cloudlinux_os_components/#introduction) -* [Server plugin arrangement](/cloudlinux_os_components/#server-plugin-arrangement) -* [Plugin configuration](/cloudlinux_os_components/#plugin-configuration) -* [Types of plugins](/cloudlinux_os_components/#types-of-plugins) -* [Examples of plugins](/cloudlinux_os_components/#examples-of-plugins) - * [Collector](/cloudlinux_os_components/#collector) - * [Analyzer](/cloudlinux_os_components/#analyzer) - * [Persistor](/cloudlinux_os_components/#persistor) - * [Notifier](/cloudlinux_os_components/#notifier) -* [File info and format for /var/lve/info file](/cloudlinux_os_components/#file-info-and-format-for-var-lve-info-file) - -LVE-stats2 comes with a set of generic plugins: - -| | | | | | -|-|--|--|--|-| -|Plugin Name | Order | Default | Period (seconds) | Description| -|LVECollector | 1000 | Y | 5 | Collects usage/limits data from `/proc/lve/list`| -|CPUInfoCollector | 2000 | Y | 5 | collents info about CPU - `/proc/cpuinfo`| -|LVEUsernamesCollector | 3000 | Y | 3600 | collects usernames & user ids to match `uid <-> lve id` later on| -|LVEUsageAnalyzer | 4000 | Y | 5 | analyzes usage of LVE| -|LveUsageAggregator | 5000 | Y | 60 | aggregates data by time periods| -|DBGovSaver | 6000 | Y | 5 | Saves data about database governor| -|FileSaver | 7000 | Y | 5 | Saves LVE data into `/var/lve/info` | -|CloudLinuxTopFileSaver | 8000 | Y | 60 | saves data used by cloudlinux-top to `/var/lve/cloudlinux-top.json`| -|DBSaver | 9000 | Y | 60 | save LVE data to database| -|DbUsernamesSaver | 10000 | Y | 3600 | saves users name to database| -|DBSaverX60 | 11000 | Y | 3600 | saves aggregated hourly data into database| -|SnapshotSaver | 12000 | Y | 30 | collects & saves snapshots data| -|StatsNotifier | 13000 | Y | varied | notify user/admin based on usage| -|HistoryCleaner | 14000 | Y | 3600 | removes old usage| -|ResMEMCollector | 1500 | N | 30 | collects physical memory usage from processes RES field instead of `/proc/lve/list` | -|LVEDestroyer | - | N | 5 | destroys LVEs that weren't active for X iterations. Number of iterations is passed from config using iterations variable. `iterations=0` means plugin disabled| - - -To enable non-default plugin, copy or link it to `/usr/share/lve-stats/plugins` directory. - -For example to enable `ResMEMCollector` plugin, do: - -
- -``` -ln -s /usr/share/lve-stats/plugins.other/res_mem_collector.py /usr/share/lve-stats/plugins/ -service lvestats restart -``` -
- - -#### Creating a plugin for LVE-stats2 - -#### Introduction - - - LVE Stats 2 complex has scalable architecture, which allows to connect custom plugins. - - - LVE Stats server searches for plugins in the directory which is specified with plugins parameter of server’s _/etc/sysconfig/lvestats2_ configuration file. Default directory is _/usr/share/lve-stats/plugins_. - -Each plugin must be of a Python class, must be written in Python language and its file must have .py extension. Files with all other extensions will be ignored. For normal server work access permission 400 is enough; owner – root . - -Plugin classes can be of the same name, but better not, because classes' names can affect the set of parameters in _set_config_ method. You can find detailed plugins' configuring information below, in appropriate chapter. - -Plugin class must contain _execute()_ method, which is invoked by the server every 5 seconds (by default, can be changed by interval parameter of configuration file). -Also set_config method (configuration settings) can be available. You can find more info in [Plugins Configuration](/cloudlinux_os_components/#plugin-configuration) chapter. - -Additionally the following attributes can be set (plugin class instance variable): - -* order (integer) - defines plugin's position in the server's plugin list, (more info in Servers Plugin Arrangement ). -* timeout (integer or float ) – the longest allowable duration of one launch of the plugin (execute method). Default value of timeout parameter is 5 seconds. -* period (integer) – sets the interval between two launches of execute plugin method in seconds. If not defined, then plugin runs every 5 seconds ( interval parameter in configuration file). - -When _execute()_ method of the plugin is invoked, the server creates an attribute _now_ in it, where launch time is recorded. This value is equal to what a standard Python function _time.time()_ returns. All the plugins launched one after another receive the same  value of _now_ attribute from the server. _now_ is overwritten before _execute()_ method is invoked. - -The previous value of now attribute is not saved by the server. If plugin needs it, it has to save it by itself. - -Plugin class can be inherited from _LveStatsPlugin_ class, which is the part of the server itself. This is not obligatory, but inheritance can help to avoid different errors in servers work, particularly if a plugin doesn't contain required execute method. - - _LveStatsPlugin_ class is defined in the file: _/opt/alt/python27/lib/python2.7/site-packages/lvestats/core/plugin.py_ . - -#### Server plugin arrangement - - -When the server starts, it performs the search of plugins in the directory specified in _/etc/sysconfig/lvestats2_ configuration file. This directory is scanned only when the server starts, therefore if any plugin was added into the directory, the server has to be restarted with the following command: -
- -``` -service lvestats restart. -``` -
- -After successful restart, the plugins are graded and executed ascending by _order_ attribute. If any plugin _order_ attribute is not set, it is considered as a Python language constant _sys.maxint_ (which is usually 9223372036854775807). This in fact means that such plugins will be executed in the last. -If any plugins has similar _order_ meanings, their execution order is unpredictable. - -The server invokes _execute_ method of all plugins one after another. - -When the server invokes _execute()_ method of any plugin, it transmits a data dictionary ( _lve_data_ argument) into plugin. The dictionary is common for all the plugins. Any plugin can read, write and change any data in this dictionary. LVE Stats 2 server doesn't control this area. That is why one must be careful while developing new plugins, in order not to change or corrupt other plugins' data which can break their functionality. - -If an exception occurs in _execute()_ method, its text and python stack trace is recorded into server log _/var/log/lve-stats_ and all the changes made to _lve_data_ dictionary before the exception happened are lost. - -The keys of the _lve_data_ dictionary are recommended to look like “ _PluginName_Key_ ” , in order the plugins do not corrupt other data accidentally. - -Server contains some standard plugins which define and use the following keys in the common dictionary lve_data: _LVE_VERSION, stats, old_stats, procs_ and _lve_usage_ . User plugins can use data from these keys, but it is recommended not to change them if there is no special need, because it can break the next plugins in the execution queue. - -| | | -|-|-| -|Key | Content| -| `LVE_VERSION` | LVE version. The same as console command `lvectl lve-version` produces.| -| `stats` | Dictionary, that contains lve id’s as keys and LVEStat class objects as values. Every LVEStat object contains values of usages and limits taken from _/proc/lve/list_ file for every LVE Id . Dictionary keys – integer lve id , including 0 for “ default ” LVE. This dictionary is updated on each iteration of lvestats-server (every 5 seconds by default). LVEStat – is a standard server class, it can be imported with the command from _lvestats.core.lvestat_ `import LVEStat.` The class is described in the file _/opt/alt/python27/lib/python2.7/site-packages/lvestats/core/lvestat.py_ . Here you can find the whole list of data fields and their functions.| -| `old_stats` | _stats_ content from the previous iteration. Before the first iteration – empty dictionary.| -| `totalHz` | When LVE_VERSION is 4, real CPU frequency in Hz multiplied by number of cores. When LVE_VERSION > 4, CPU speed is in conventional units and equals to 1000000000 * cores (1 GHz per core).| -| `procs` | Quantity of CPU cores.| -| `lve_usages` | Contains accumulated LVE statistics for each 5-seconds interval in current minute. Cleared each minute.| -| `lve_usage` | Contains aggregated LVE Statistics for “previous” minute to store to database. Overwritten each minute.| - -Each plugin’s instance lifetime is from the moment it was loaded till the server stops working. But if _execute()_ method working time exceeds timeout, the plugin will be terminated and restarted in the next iteration. All changes to the _lve_data_ dictionary will be lost. - -During servers graceful shutdown (restart, server shutdown, commands `service lvestats stop, service lvestats restart` ), each plugin receives SIGTERM signal. -This is useful to correctly unload the plugin (terminate all subsidiary processes, save data to files etc.). If a plugin doesn't need to “finalize” its execution before termination, then there's no need to implement this signal handler. Below you can see an example of such handler. - -::: tip Note -If a plugin implements handler for SIGTERM, then this handler must end with `sys.exit(0)` command. Otherwise plugin process will not be terminated correctly and will become orphaned. -::: - -#### Plugin configuration - - - LVE Stats 2 Server allows to configure each plugin separately. - -On initialization stage the server invokes _set_config()_ method of the plugin and locates there a dictionary which contains: - -* all parameters from file _/etc/sysconfig/lvestats2_ (global). -* plugin's individual configuration file parameters (if one exists). Configuration files must be located in _/etc/sysconfig/lvestats.config_ directory, have .cfg extension and be the same format as _/etc/sysconfig/lvestats2_ . Files in this directory are matched with the plugins by name. For instance, if plugin class is _Plugin1_class_ , then server will try to find and download _/etc/sysconfig/lvestats.config/Plugin1_class.cfg_. Names are case sensitive. If any plugin doesn't have an individual configuration file, then it's not an error. In this case plugin will just receive parameters from _/etc/sysconfig/lvestats2_ . - -::: tip Note -An individual configuration file of every plugin is loaded after server configuration file. That is why if it contains any parameters with names similar to ones of server config, then plugin will use parameters from its individual config rather than server config parameters. - -If a plugin doesn't require any configuration to be done, then set_config method can be skipped. - -In addition, plugins can use their own configuration methods. -::: - -#### Types of plugins - - -According to server architecture, plugins can be of the following types: - -* collectors -* analyzers -* persistors -* notifiers - - Collectors are designed to collect information; analyzers – to analyze it and form some other data on its basis; persistors – to save information from the common dictionary into files, databases, etc.; notifiers - to notify system users about any events. - -This division is rather arbitrary. There is an opportunity to execute all the actions on collection, analysis and saving the information in one and only plugin. But at the same time the division into functionally independent parts allows to build flexible and easily configurable system for collecting and processing the data. - -Also it is possible to implement the systems of lazy-write, planning of collecting/processing tasks and notifying users about different events. - - -#### Examples of plugins - - -Here is a practical example of a user plugin. - -Specification: - -1. To trace specified file size changes. The name of file being traced must be specified in configuration file, which allows to change it without modifying the plugin itself. If file size has been changed, it has to be written as a message into our log. The name of log must be specified in configuration file as well. - -2. File size must be checked with default interval (5 seconds), and log notification must be held once a minute (to avoid resource expend for possibly regular write). - -3. System administrator must receive emails with file size at the moment the email was sent. These notifications must be sent even if the file size hasn’t been changed. Notification emails must be read periodicity from configuration file as well as sender/receiver emails . - -As file size check, fixing the result and notification sending must be held with different periods, then it’s impossible to realize all the tasks by means of one plugin. -The fact that one minute (60 seconds) is multiple to 5 seconds doesn’t matter in this case, because default period can be changed in server’s configuration file, but the condition of fixing the result once a minute is a part of the specification, which can not be violated. In addition, notification email period is known in advance, as it is specified by user in configuration file. - -That is why we realize 4 plugins: **collector, analyzer, persistor** and **notifier** . - - -#### **Collector** - - - Collector's aim is to determine the size of a proper file. - -
- -``` -# FSize_watcher_collector.py -# Example plugin for monitoring file size. -# Part 1. Collector - -import os -from lvestats.core.plugin import LveStatsPlugin - -# Key name -COLLECTOR_KEY = 'FSizeWatcher_fsize' -COLLECTOR_KEY_FILENAME = 'FSizeWatcher_fname' - -class FSize_watcher_collector (LveStatsPlugin): - # this plugin should be first in chain - order = 0 - # File to monitoring - file_to_monitoring = None - - def __init__(self): - pass - - # Sets configuration to plugin - def set_config(self, config): - self.file_to_monitoring = config.get('file_to_monitoring', None) - pass - # Work method - def execute(self, lve_data): - try: - # if monitoring file absent, do nothing - if self.file_to_monitoring is None or not os.path.exists(self.file_to_monitoring): - return - - # Get file size - stat_info = os.stat(self.file_to_monitoring) - fsize = stat_info.st_size - - # Place file name and file size to server data dictionary - lve_data[COLLECTOR_KEY_FILENAME] = self.file_to_monitoring - lve_data[COLLECTOR_KEY] = fsize - except (OSError, IOError): - # file absent or any other error - remove size from dictionary - del lve_data[COLLECTOR_KEY] -``` -
- -Plugin algorithm is extremely simple – file size is read and written into data dictionary. Files name is read from _set_config_ method configuration. If the name is not specified, then None is written into appropriate variable. All the errors are completely ignored (e.g. if specified file doesn't exist or there's no way to read any of it's information). - - _order_ attribute is specified as 0 to make this plugin go the first among three. Data collector must always be the first in plugins logical chain, because it provides all the necessary information for the analyzer which goes the next. Specific values of _order_ can be of any kind, but what is important is that when the server starts, all the plugins line up in proper sequence: collector – analyzer – persistor . - -In order to make plugin work, we have to create configuration file _/etc/sysconfig/lvestats.config/FSize_watcher_collector.cfg_ with the following content: - -
- -``` -# Config file for FSize_watcher_collector plugin -# Please define monitoring file here -# file_to_monitoring = /usr/local/cpanel/logs/error_log -file_to_monitoring = /usr/local/cpanel/logs/access_log -``` -
- -Note that file name _FSize_watcher_collector_ without .cfg extension matches plugin class name. - - _file_to_monitoring_ option is read by plugin in _set_config_ method and contains file’s full name for monitoring. - -Files for monitoring, suggested in the actual example - _/usr/local/cpanel/logs/error_log_ and _/usr/local/cpanel/logs/access_log_ - are real, these are cPanel control panel logs. - -The first file is errors log; the second is appeal log, is refreshed during common work with panel (e.g. if user email address is changed). - -Errors log tracking is more important, but appeal log monitoring allows to illustrate plugins work more in details, because it is refreshed more often. - -Note that plugin can monitor one file only. - -#### **Analyzer** - - - Analyzer decides if the file's size has changed and gives a command to persistor to refresh log. - -
- -``` -# FSize_watcher_analyzer.py -# Example plugin for monitoring file size. -# Part 2. Analyzer - -from lvestats.core.plugin import LveStatsPlugin - -# Key name from collector plugin -COLLECTOR_KEY = 'FSizeWatcher_fsize' - -# Key name 1 for saver plugin -SAVER_KEY = 'FSizeWatcher_fsize_to_store' -# Key name 2 for saver plugin -SAVER_DATA_PRESENCE = 'FSizeWatcher_fsize_present' - -class FSize_watcher_analyzer (LveStatsPlugin): - # this plugin should be second in chain - order = 1 - # Last file size - file_last_size = 0 - # Plugin run period in secondsperiod = 60 - - def __init__(self): - pass - - # work method - def execute(self, lve_data): - # Default setting for saver - lve_data[SAVER_DATA_PRESENCE] = 0 - # Check presence data - if COLLECTOR_KEY not in lve_data: - return - - # Get file size from server data dictionary - fsize = lve_data[COLLECTOR_KEY] - - # Check, if file size changed, store it for saver plugin - if fsize == self.file_last_size: - return - - # Put new size for saver plugin - lve_data[SAVER_KEY] = fsize - self.file_last_size = fsize - lve_data[SAVER_DATA_PRESENCE] = 1 -``` -
- -This plugin is extremely simple as well. It starts after collector (order=1) , searches for file size in the dictionary and compares it with the previous index. If it has changed, then it writes a sign of presence of a new size into the dictionary. If no changes seen, then sign resets. The previous file size is stored in the plugin itself in _file_last_size_ variable. Note that they are stored during the whole server lve-stats lifetime. - -If file size is not found in data dictionary, then plugin just ends. - -All the errors are completely ignored. - - Analyzer is unconfigurable, that is why it doesn’t require any configuration file and it doesn’t contain _set_config_ method. - -Plugin starts every 60 seconds (1 minute), because we need data fixation to be performed one time in a minute. - - -#### **Persistor** - - - Persistor saves information from the common dictionary into files, databases, etc. - -
- -``` -# FSize_watcher_saver.py -# Example plugin for monitoring file size and last modification date-time. -# Part 3. Data saver - -import signal -import sys -import time -from lvestats.core.plugin import LveStatsPlugin - -# Key name 1 for saver plugin -SAVER_KEY = 'FSizeWatcher_fsize_to_store' -# Key name 2 for saver plugin -SAVER_DATA_PRESENCE = 'FSizeWatcher_fsize_present' -# Monitoring file name -COLLECTOR_KEY_FILENAME = 'FSizeWatcher_fname' - -class FSize_watcher_saver (LveStatsPlugin): - # this plugin should be third in chain - order = 2 - # Plugin run period in seconds - period = 60 - # Log filename - log_file_name = None - # First run flag - is_first_run = True - - def __init__(self): - signal.signal(signal.SIGTERM, self.sigterm_handler) - - # Sets configuration to plugin - def set_config(self, config): - # Get log filename - self.log_file_name = config.get('log_filename', None) - - # work method - def execute(self, lve_data): - # do nothing, if log file not defined - if not self.log_file_name: - return - try: - # Check presence data - if SAVER_DATA_PRESENCE not in lve_data or lve_data[SAVER_DATA_PRESENCE] == 0: - # No data - return - # Get file size from server data dictionary - fsize = lve_data[SAVER_KEY] - - # Store data to log - f = open(self.log_file_name, 'a') - if self.is_first_run: - f.write('%s - FSize_watcher started. Monitoring file: %s, saving data period=%d sec\n' % (time.asctime(time.localtime()), lve_data[COLLECTOR_KEY_FILENAME], self.period)) - self.is_first_run = False - f.write('%s - FSize_watcher: file size is %d bytes\n' % (time.asctime(time.localtime()), fsize)) - f.close() - except: - # Ignore all errors - pass - - # Terminate handler - def sigterm_handler(self, signum, frame): - if self.log_file_name: - try: - # Store data to log file - f = open(self.log_file_name, 'a') - f.write('%s - File watcher saver plugin: TERMINATE\n' % time.asctime(time.localtime())) - f.close() - pass - except: - # Ignore all errors - pass - # Terminate process - sys.exit(0) -``` -
- -Configuration file `/etc/sysconfig/lvestats.config/FSize_watcher_saver.cfg`: -
- -``` -# Config file for FSize_watcher_saver.py plugin -# Please define log filename here -log_filename = /var/log/FSize_watcher.log -``` -
- -This plugin starts after analyzer (order=2) , checks new file size `presence` flag, and if positive – writes it into log. If the flag is cleared (which means the size hasn't changed), then plugin simply ends. - -Starts once in a minute (period=60). - -Also this plugin shows the work of signal handler. - -Plugin constructor registers handler-function of a proper signal: _signal.signal(signal.SIGTERM, self.sigterm_handler)_ . This means, that when the server finishes its work, then _sigterm_handler_ method of plugin class will be invoked. In the actual example the function just writes a notification into log, tracing the fact of it's invocation. - -Pay attention on _sys.exit(0)_ command in the end of the handler. Find the information on it in [Server Plugin Arrangement](/cloudlinux_os_components/#server-plugin-arrangement) section. - -In addition see into examples of file log _/var/log/FSize_watcher.log_ formed by the plugins above: -
- -``` -Tue Feb 3 13:06:24 2015 - FSize_watcher started. Monitoring file: /usr/local/cpanel/logs/access_log, saving data period=60 sec -Tue Feb 3 13:06:24 2015 - FSize_watcher: file size is 122972890 bytes -Tue Feb 3 13:07:25 2015 - FSize_watcher: file size is 122975507 bytes -Tue Feb 3 13:08:25 2015 - FSize_watcher: file size is 122978124 bytes -Tue Feb 3 13:09:25 2015 - FSize_watcher: file size is 122978997 bytes -Tue Feb 3 13:10:25 2015 - FSize_watcher: file size is 122981033 bytes -Tue Feb 3 13:11:25 2015 - FSize_watcher: file size is 122982052 bytes -Tue Feb 3 13:13:25 2015 - FSize_watcher: file size is 122983798 bytes -Tue Feb 3 13:20:15 2015 - File watcher saver plugin: TERMINATE -``` -
- -and -
- -``` -Thu Feb 5 13:07:27 2015 - FSize_watcher started. Monitoring file: /usr/local/cpanel/logs/error_log, saving data period=60 sec -Thu Feb 5 13:07:27 2015 - FSize_watcher: file size is 14771849 bytes -Thu Feb 5 14:03:32 2015 - FSize_watcher: file size is 14771995 bytes -Thu Feb 5 15:01:36 2015 - FSize_watcher: file size is 14772434 bytes -Thu Feb 5 17:15:47 2015 - FSize_watcher: file size is 14772873 bytes -Thu Feb 5 18:47:54 2015 - FSize_watcher: file size is 14775213 bytes -Thu Feb 5 19:11:56 2015 - FSize_watcher: file size is 14775652 bytes -Thu Feb 5 21:09:05 2015 - FSize_watcher: file size is 14776091 bytes -Thu Feb 5 23:06:14 2015 - FSize_watcher: file size is 14776530 bytes -Fri Feb 6 00:47:23 2015 - FSize_watcher: file size is 14778870 bytes -Fri Feb 6 01:02:24 2015 - FSize_watcher: file size is 14779309 bytes -Fri Feb 6 02:00:28 2015 - FSize_watcher: file size is 14779434 bytes -Fri Feb 6 03:16:34 2015 - FSize_watcher: file size is 14779873 bytes -Fri Feb 6 05:04:42 2015 - FSize_watcher: file size is 14779998 bytes -Fri Feb 6 05:12:43 2015 - FSize_watcher: file size is 14780437 bytes -Fri Feb 6 05:56:50 2015 - FSize_watcher: file size is 14780551 bytes -Fri Feb 6 06:01:50 2015 - FSize_watcher: file size is 14780975 bytes -Fri Feb 6 06:03:51 2015 - FSize_watcher: file size is 14782183 bytes -Fri Feb 6 06:04:51 2015 - FSize_watcher: file size is 14782575 bytes -Fri Feb 6 06:18:52 2015 - FSize_watcher: file size is 14782647 bytes -Fri Feb 6 06:21:52 2015 - FSize_watcher: file size is 14782898 bytes -Fri Feb 6 06:48:54 2015 - FSize_watcher: file size is 14785238 bytes -Fri Feb 6 07:09:56 2015 - FSize_watcher: file size is 14785677 bytes -Tue Feb 6 08:03:15 2015 - File watcher saver plugin: TERMINATE -``` -
- -You can see that log record is being held once a minute (what we actually need), new file size is written. - -Also we can notice that handler SIG_TERM was executed, signaling that plugin received the notification about server shut-down. - - -#### **Notifier** - - -Notifier informs system users about any events. -
- -``` -# FSize_watcher_saver.py -# Example plugin for monitoring file size and last modification date-time. -# Part 4. Notifier - -import time -import smtplib - -from lvestats.lib.commons import dateutil -from lvestats.core.plugin import LveStatsPlugin - - -# Key name -COLLECTOR_KEY_FSIZE = 'FSizeWatcher_fsize' -COLLECTOR_KEY_FILENAME = 'FSizeWatcher_fname' - -# email message pattern -EMAIL_MESSAGE_PATTERN = """Hello, administrator! -Size of the file '%s' is %d bytes. -""" - - -class FSize_watcher_notifier (LveStatsPlugin): - # Default period - DEFAULT_PERIOD_STR = '12h' - # this plugin should be third in chainorder = 3 - # Timeout - timeout = 20 - # Notifier Log filename - log_file_name = '/var/log/FSize_watcher_notifier.log' - # Email from address - email_from = None - # Email to address - email_to = None - # Email subject - email_subject = None - # Sets configuration to plugin - def set_config(self, config): - # Email settings - self.email_from = config.get('notify_from_email', None) - self.email_to = config.get('notify_to_email', None) - self.email_subject = config.get('notify_from_subject', 'Message from FSize_watcher_notifier plugin') - # Notify period - s_period = config.get('notify_period', None) - if s_period: - self.period = dateutil.parse_period2(s_period) - else: - self.period = dateutil.parse_period2(FSize_watcher_notifier.DEFAULT_PERIOD_STR) - f = open(self.log_file_name, 'a') - f.write('%s - FSize_watcher_notifier plugin: configure\n' % time.asctime(time.localtime())) - f.write(' - Period: %s\n' % self.period) - f.write(' - From: %s\n' % self.email_from) - f.write(' - To: %s\n' % self.email_to) - f.write(' - Subject: \'%s\'\n' % self.email_subject) - f.close() - - # work method - def execute(self, lve_data): - if COLLECTOR_KEY_FSIZE not in lve_data or COLLECTOR_KEY_FILENAME not in lve_data: - return - if not self.email_from or not self.email_to: - f = open(self.log_file_name, 'a') - f.write('%s - FSize_watcher_notifier plugin error: email_from or email_to not set\n') - f.close() - return - try: - from email.mime.text import MIMEText - # Send email - msg = MIMEText(EMAIL_MESSAGE_PATTERN % (lve_data[COLLECTOR_KEY_FILENAME], lve_data[COLLECTOR_KEY_FSIZE])) - msg['Subject'] = self.email_subject - msg['From'] = self.email_from - msg['To'] = self.email_to - - s = smtplib.SMTP('localhost') - s.sendmail(self.email_from, [self.email_to], msg.as_string()) - s.quit() - - f = open(self.log_file_name, 'a') - f.write('%s - FSize_watcher_notifier plugin: email message was successfully sent\n' % time.asctime(time.localtime())) - f.close() - except Exception as e: - f = open(self.log_file_name, 'a') - f.write('%s - FSize_watcher_notifier plugin error:\n%s\n' % (time.asctime(time.localtime()), str(e))) - f.close() -``` -
- -Configuration file _/etc/sysconfig/lvestats.config/FSize_watcher_notifier.cfg_ : -
- -``` -# Config file for FSize_watcher_notifier.py plugin -# Please define email options here - -NOTIFY_FROM_EMAIL=user@hostname -NOTIFY_FROM_SUBJECT=Message from FSize_watcher_notifier -NOTIFY_TO_EMAIL=admin@hostname -NOTIFY_PERIOD=12h -``` -
- -Plugin’s index number equals 3 ( order=3 ), that is why notifier starts after the rest. But since it uses only data formed by collector , then its order may equal any number bigger that collectors order (>0). - - Notifier reads the necessary parameters from the configuration (email address, topic, period) and writes them into its own log as reference. - -Plugin’s _execute_ method checks the availability of all the necessary data (email parameters, collectors data) and sends the message. All the notifications are written into the notifier's own log. - -If any data is missing, the message is not sent. - -Log example: -
- -``` -Thu Feb 5 11:51:34 2015 - FSize_watcher_notifier plugin: configure - - Period: 60.0 - - From: user@hostname - - To: admin@hostname - - Subject: 'Message from FSize_watcher_notifier' -Thu Feb 5 11:51:35 2015 - FSize_watcher_notifier plugin: email message was successfully sent -Thu Feb 5 11:52:35 2015 - FSize_watcher_notifier plugin: email message was successfully sent -Thu Feb 5 11:53:35 2015 - FSize_watcher_notifier plugin: email message was successfully sent -Thu Feb 5 11:54:35 2015 - FSize_watcher_notifier plugin: email message was successfully sent -Thu Feb 5 11:57:00 2015 - FSize_watcher_notifier plugin: configure - - Period: 43200.0 - - From: user@hostname - - To: admin@hostname - - Subject: 'Message from FSize_watcher_notifier' -Thu Feb 5 11:57:00 2015 - FSize_watcher_notifier plugin: email message was successfully sent -``` -
- -#### File info and format for /var/lve/info file - - -This file is used by control panels to display to user their 'current' usage. The file is updated every 5 seconds by lve-stats. - -When writing to this file we make sure that: average CPU/IOPS/MEM is never greater then LIMIT for that resource. - -Example: - -0,0,20,0,2500,0,262144,0,0,262144,0,0,100,0,0,0,0,1024,1024,0,0,0,0 -600,1,20,2492,2500,70,262144,0,0,262144,33,0,100,1,0,0,0,1024,1024,0,5,0,0 -200,0,20,0,2500,0,262144,0,0,262144,0,0,100,0,0,0,0,1024,1024,0,0,0,0 -500,0,20,0,2500,0,262144,0,0,262144,0,0,100,0,0,0,0,1024,1024,0,0,0,0 - -First line of the file is ' default limits '. - -Fields: -
- -``` -# 0 - id -# 1 - mep (average entry processes) -# 2 - lep (limit ...) -# 3 - cpu_usage (average speed) -# 4 - lcpu (limit spped) -# 5 - mem_usage (average virtual memory) -# 6 - lmem (limit ...) -# 7 - mem_fault (number of virtual memory faults) -# 8 - mep_fault (number of entry processes faults) -LVE_VERSION >=6 -# 9 - lmemphy (limit physical memory) -# 10 - memphy (average ...) -# 11 - memphy_fault (faults ...) -# 12 - lnproc (limit number of processes) -# 13 - nproc (average ...) -# 14 - nproc_fault (faults ...) -# 15 - lcpuw (CPU weight -- deprecated not used) -# 16 - io_usage (average IO usage) -# 17 - io_limit (limit ...) -LVE_VERSION >=8 -#18 - liops (limit IOPS) -#19 - iops (average IOPS) -``` -
- -:::tip Note -You can also use [LVE-stats 2 CLI](/command-line_tools/#lve-stats-2) -::: - -### Troubleshooting - - lvestats service and utilities write fatal errors to system log. - -There is `/var/log/lve-stats.log` file with additional information (warnings, tracebacks for errors). - -To see which letters were sent via lves-tats notifier in the logs, do the following: - -1. In the `/etc/sysconfig/lvestats2`, specify `logging_level=debug`; -2. Execute the `service lvestats restart` command. - -## CageFS - -### General information and requirements - -* [Minimum Requirements](/cloudlinux_os_components/#minimum-requirements) -* [CageFS quirks](/cloudlinux_os_components/#cagefs-quirks) - -CageFS is a virtualized file system and a set of tools to contain each user in its own 'cage'. Each customer will have its own fully functional CageFS, with all the system files, tools, etc. - -The benefits of CageFS are: - -* Only safe binaries are available to user -* User will not see any other users, and would have no way to detect presence of other users & their user names on the server -* User will not be able to see server configuration files, such as Apache config files. -* User's will have limited view of _/proc_ file system, and will not be able to see other users' processes - -At the same time, user's environment will be fully functional, and user should not feel in any way restricted. No adjustments to user's scripts are needed. CageFS will cage any scripts execution done via: -* Apache (suexec, suPHP, mod_fcgid, mod_fastcgi) -* LiteSpeed Web Server -* Cron Jobs -* SSH -* Any other PAM enabled service - -::: tip Note -mod_php is not supported, MPM ITK requires a custom patch -::: - -::: tip Note -CageFS is not supported for H-Sphere. -::: - -See also [Compatibility Matrix](/limits/#compatibility-matrix). - -#### Minimum Requirements: - -* kernel: CL6 with lve1.2.17.1 or later, CL7. -* 7GB of disk space. - -Depending on your setup, and number of users, you might also need: -* Up to 8MB per customer in `/var` directory (to store custom `/etc` directory) -* 5GB to 20GB in `/usr/share` directory (to store safe skeleton of a filesystem) - -::: danger Warning -If at any time you decide to uninstall CageFS, please make sure you follow [uninstall instructions](/cloudlinux_os_components/#uninstalling) -::: - -#### CageFS quirks - - -Due to the nature of CageFS, some options will not work as before or will require some changes: - -* lastlog will not work (`/var/log/lastlog`). -* PHP will load `php.ini` from `/usr/selector/php.ini`. That file is actually a link to the real `php.ini` file from your system. So the same `php.ini` will be loaded in the end. -* You have to run `cagefsctl --update` any time you have modified `php.ini`, or you want to get new/updated software inside CageFS. -* CageFS installation changes `jailshell` to regular bash on cPanel - [read why](https://cloudlinux.zendesk.com/hc/articles/115004517685-Why-CageFS-installation-changes-jailshell-to-regular-bash-on-cPanel-). - - -### Installation and update - -To install CageFS: -
- -``` -$ yum install cagefs -$ /usr/sbin/cagefsctl --init -``` -
- -That last command will create skeleton directory that might be around 7GB in size. If you don't have enough disk space in _/usr/share_, use following commands to have `cagefs-skeleton` being placed in a different location: -
- -``` -$ mkdir /home/cagefs-skeleton -$ ln -s /home/cagefs-skeleton /usr/share/cagefs-skeleton -``` -
- -The commands above should be executed before the `cagefsctl --init`. - -Also, it is needed approximately 4Kb of disk space per one user for the `/var/cagefs` directory. You should place the `/var/cagefs` directory on partition, which is large enough and has disk quota enabled. - -For example, to create the `/var/cagefs` directory on the `/home` partition, execute the following commands before the `cagefsctl --init`: - -
- -``` -mkdir /home/cagefs -ln -s /home/cagefs /var/cagefs -``` -
- - -:::danger IMPORTANT -Please make sure to turn on disk quota for a partition where the `/var/cagefs` directory is located, or move the `/var/cagefs` to a partition where disk quota is enabled. This is needed to prevent users from abusing disk quota inside CageFS. -::: - -If the `/var/cagefs` directory is already created, you can move it. How to move the `/var/cagefs` directory: -[https://docs.cloudlinux.com/cloudlinux_os_components/#moving-var-cagefs-directory](https://docs.cloudlinux.com/cloudlinux_os_components/#moving-var-cagefs-directory) - - -::: danger IMPORTANT -If you are placing skeleton in `/home` directory on cPanel servers, you must configure the following option in cPanel WHM: **WHM -> Server Configuration -> Basic cPanel/WHM Setup -> Basic Config -> Additional home directories** -Change the value to blank (not default Home ). Without changing this option, cPanel will create new accounts in incorrect places. -::: - -CageFS will automatically detect and configure all necessary files for: -* cPanel -* Plesk -* DirectAdmin -* ISPmanager -* Interworx -* MySQL -* PostgreSQL -* LiteSpeed - -Web interface to manage CageFS is available for cPanel, Plesk 10+, DirectAdmin, ISPmanager & Interworx. Command line tool would need to be used for other control panels. - -Once you initialized the template you can start enabling users. By default CageFS is disabled for all users. - -Starting from **cagefs-6.1-27** `fs.proc_can_see_other_uid` will be migrated (one time) from _/etc/sysctl.conf_ into _/etc/sysctl.d/90-cloudlinux.conf_ . If this variable is not set in either file, it will default to 0. - -It is strongly advised against setting this variable in `90-cloudlinux.conf`. Define it in `/etc/sysctl.conf` or in some other config file with an index number greater than `90-cloudlinux.conf`, e.g. `/etc/sysctl.d/95-custom.conf`. - -You can find more information on `fs.proc_can_see_other_uid` automatic migration in [Kernel Config Variables](/cloudlinux_os_kernel/#kernel-config-variables). - - -:::tip Note -You can also use [CageFS CLI](/command-line_tools/#cagefs) -::: - -### Uninstalling - -To uninstall CageFS, start by disabling and removing all directories: - -
- -``` -$ /usr/sbin/cagefsctl --remove-all -``` -
- -That command will: disable CageFS for all customers, unmount CageFS for all users, removes _/usr/share/cagefs-skeleton_ & _/var/cagefs_ directories. It will not remove _/etc/cagefs_ directory. - -Remove CageFS RPM: - -
- -``` -$ yum remove cagefs -``` -
- - -### Managing users - -CageFS provides for two modes of operations: - -1. Enabled for all, except those that are disabled. -2. Disabled for all, except those that are enabled. - -Mode #1 is convenient for production operation, where you want all new users to automatically be added to CageFS. -Mode #2 is convenient while you test CageFS, as it allows you to enable it on one by one for your customers. - -To start using CageFS you have to select one of the mode of operations: -
- -``` -$ /usr/sbin/cagefsctl --enable-all -``` -
-or -
- -``` -$ /usr/sbin/cagefsctl --disable-all -``` -
-or -
- -``` -$ /usr/sbin/cagefsctl --toggle-mode -``` -
-That will switch the operation mode, preserving current disabled/enabled users. - -To enable individual user do: -
- -``` -$ /usr/sbin/cagefsctl --enable [username] -``` -
-To disable individual user: -
- -``` -$ /usr/sbin/cagefsctl --disable [username] -``` -
-To list all enabled users: -
- -``` -$ /usr/sbin/cagefsctl --list-enabled -``` -
-To list all disabled users: -
- -``` -$ /usr/sbin/cagefsctl --list-disabled -``` -
-To see current mode of operation: -
- -``` -$ /usr/sbin/cagefsctl --display-user-mode -``` -
- - -:::tip Note -You can also use [CageFS CLI](/command-line_tools/#cagefs) -::: - -### Configuration - -* [File system templates](/cloudlinux_os_components/#file-system-templates) - -* [Excluding files](/cloudlinux_os_components/#excluding-files) - -* [Excluding users](/cloudlinux_os_components/#excluding-users) - -* [Mount points](/cloudlinux_os_components/#mount-points) - - * [Per user virtual mount points](/cloudlinux_os_components/#per-user-virtual-mount-points) - - * [Split by username](/cloudlinux_os_components/#split-by-username) - - * [Splitted by user’s UID mounts](/cloudlinux_os_components/#splitted-by-user-s-uid-mounts) - - * [Mounting user’s home directory inside CageFS](/cloudlinux_os_components/#mounting-users-home-directory-inside-cagefs) - - * [How to hide directory inside mount point](/cloudlinux_os_components/#how-to-hide-directory-inside-mount-point) - - * [Example](/cloudlinux_os_components/#example) - -* [Base home directory](/cloudlinux_os_components/#base-home-directory) - -* [PostgreSQL support](/cloudlinux_os_components/#postgresql-support) - -* [PAM configuration](/cloudlinux_os_components/#pam-configuration) - -* [Filtering options for commands executed by proxyexec](/cloudlinux_os_components/#filtering-options-for-commands-executed-by-proxyexec) - -* [Executing by proxy](/cloudlinux_os_components/#executing-by-proxy) - -* [Users with duplicate UIDs](/cloudlinux_os_components/#users-with-duplicate-uids) - -* [Examples](/cloudlinux_os_components/#examples) - - * [Example 1. Make users in CageFS be able to execute a script which must work outside CageFS](/cloudlinux_os_components/#example-1-make-users-in-cagefs-be-able-to-execute-a-script-which-must-work-outside-cagefs) - - * [Example 2. Permissions escalation](/cloudlinux_os_components/#example-2-permissions-escalation) - - * [Example 3. Custom proxyexec wrapper](/cloudlinux_os_components/#example-3-custom-proxyexec-wrapper) - -* [Custom /etc files per customer](/cloudlinux_os_components/#custom-etc-files-per-customer) - -* [Moving cagefs-skeleton directory](/cloudlinux_os_components/#moving-cagefs-skeleton-directory) - -* [Moving /var/cagefs directory](/cloudlinux_os_components/#moving-var-cagefs-directory) - -* [TMP directories](/cloudlinux_os_components/#tmp-directories) - -* [Syslog](/cloudlinux_os_components/#syslog) - -* [Excluding mount points](/cloudlinux_os_components/#excluding-mount-points) - -* [Shared memory (/dev/shm) isolation in CageFS](/cloudlinux_os_components/#shared-memory-dev-shm-isolation-in-cagefs) - -* [Preventing process from entering CageFS on error](/cloudlinux_os_components/#preventing-process-from-entering-cagefs-on-error) - - -#### File system templates - -:::warning Note -Please do not modify any existing files in the `/etc/cagefs/conf.d` directory because they may be overwritten while updating CageFS package. You should create a new file with a unique name instead. -::: - -CageFS creates a filesystem template in `/usr/share/cagefs-skeleton` directory. CageFS template will be mounted for each customer. The template is created by running: -
- -``` -# /usr/sbin/cagefsctl --init -``` -
- -To update the template, you should run: -
- -``` -$ /usr/sbin/cagefsctl --update -``` -
- -The behavior of the commands (and the files copied into _/usr/share/cagefs-skeleton_ directory) depends on the configuration files in _/etc/cagefs/conf.d_ -You can add additional files, users, groups and devices into CageFS template by adding .cfg file, and running: -
- -``` -$ /usr/sbin/cagefsctl --update -``` -
- -To delete files from CageFS template, remove corresponding .cfg file, and run: -
- -``` -$ /usr/sbin/cagefsctl --update -``` -
- -Here is an example _openssh-clients.cfg_ file: -
- -``` -[openssh-clients] - -comment=OpenSSH Clients - -paths=/etc/ssh/ssh_config, /bin/hostname, /usr/bin/scp, /usr/bin/sftp, /usr/bin/slogin, /usr/bin/ssh, /usr/bin/ssh-add, /usr/bin/ssh-agent, /usr/bin/ssh-copy-id, /usr/bin/.ssh.hmac, /usr/bin/ssh-keyscan, /usr/libexec/openssh/sftp-server, /etc/environment, /etc/security/pam_env.conf - -devices=/dev/ptmx -``` -
- -Example _mail.cfg_ file: -
- -``` -[mail] - -comment=Mail tools - -paths=/bin/mail, /etc/aliases.db, /etc/mail, /etc/mailcap, /etc/mail.rc, /etc/mime.types, /etc/pam.d/smtp.sendmail, /etc/rc.d/init.d/sendmail, /etc/smrsh, /etc/sysconfig/sendmail, /usr/bin/hoststat, /usr/bin/Mail, /usr/bin/mailq.sendmail, /usr/bin/makemap, /usr/bin/newaliases.sendmail, /usr/bin/purgestat, /usr/bin/rmail.sendmail, /usr/lib64/sasl2/Sendmail.conf, /usr/lib/mail.help, /usr/lib/mail.tildehelp, /usr/lib/sendmail.sendmail, /usr/sbin/mailstats, /usr/sbin/makemap, /usr/sbin/praliases, /usr/sbin/sendmail.sendmail, /usr/sbin/smrsh, /var/log/mail, /var/spool/clientmqueue, /var/spool/mqueue - -users=smmsp - -groups=smmsp -``` -
- -There is an easy way to add/delete files from particular RPMs into CageFS. That can be done by using `--addrpm` and `--delrpm` options in `cagefsctl` . Like: -
- -``` -$ cagefsctl --addrpm ffmpeg -$ cagefsctl --update -``` -
- -::: tip Note -ffmpeg RPM should be installed on the system already. -::: - - -#### Excluding files - - -To exclude files and directories from CageFS, edit file: -`/etc/cagefs/custom.black.list` -And add files or directories in there, one per line. - -Execute the following command to apply changes: -
- -``` -cagefsctl --force-update -``` -
- -Please do not edit `/etc/cagefs/black.list` file because it is replaced during the update of CageFS package. - -#### Excluding users - - -To exclude users from CageFS, create a file (any name would work) inside `/etc/cagefs/exclude` folder, and list users that you would like to exclude from CageFS in that file (each user in separate line). - -Then execute the following command to apply changes: -
- -``` -cagefsctl --user-status USER -``` -
- -And check that the command shows `Disabled`. - - -#### Mount points - -:::tip Note -Please do not mount the entire `/var` directory into CageFS (i.e. do not add the `/var` to the `cagefs.mp`). This will break CageFS. -::: - - - -CageFS creates individual namespace for each user, making it impossible for users to see each other's files and creating high level of isolation. The way namespace is organized: - -1. /usr/share/cagefs-skeleton with safe files is created -2. Any directory from the server that needs to be shared across all users is mounted into `/usr/share/cagefs-skeleton` -(a list of such directories is defined in /etc/cagefs/cagefs.mp) -3. /var/cagefs/[prefix]/username directory for each user. Prefix is defined as last two digits of user id. User id is taken from /etc/passwd file. -4. Separate /etc directory is created and populated for each user inside /var/cagefs/[prefix]/username -5. /tmp directory is mounted for each user separately into ~username/.cagefs/tmp directory -6. Additional custom directories can be mounted for each user by defining them in /etc/cagefs/cagefs.mp -7. You can define custom directories per user using [virt.mp](/cloudlinux_os_components/#per-user-virtual-mount-points) files _[CageFS 5.1 and higher]_ - -To define individual custom directories in /etc/cagefs/cagefs.mp following format is used: - -`@/full/path/to/directory,permission notation` - - -This is useful when you need to give each user its own copy of a particular system directory, like: - - `@/var/run/screen,777` - - -Such entry would create separate /var/run/screen for each user, with permissions set to 777 - -To modify mount points, edit /etc/cagefs/cagefs.mp. Here is an example of cagefs.mp: -
- -``` -/var/lib/mysql -/var/lib/dav -/var/www/cgi-bin -/var/spool -/dev/pts -/usr/local/apache/domlogs -/proc -/opt -@/var/spool/cron,700 -@/var/run/screen,777 -``` -
- -If you want to change mount points, make sure you re-initialize mount points for all customers: -
- -``` -$ cagefsctl --remount-all -``` -
-This command will kill all current processes and reset mount points. - - - -#### **Per user virtual mount points** - -_[CageFS 5.1 and higher]_ - -* _Please, see [Split by username](/cloudlinux_os_components/#split-by-username) feature, as it might be simpler to implement in some cases._ - -Starting with CageFS 5.1 you can specify additional directories to be mounted inside user's CageFS. This can be specified for each user. -To specify virtual mount points for a user, create a file: - - `/var/cagefs/[prefix]/[user]/virt.mp` - - -Inside that file, you can specify mount points in the following format: -
- -``` -virtdir1,mask -@subdir1,mask -@subdir2,mask -virdir2,mask -@subdir3,mask -@subdir4,mask ->virtdir3,mask -@subdir5,mask -@subdir6,mask -# comments -``` -
- -* _mask_ is always optional, if missing 0755 is used -* Create virtual directory _subdir/virtdir_ , mount it to: - * skeleton _jaildir/virtdir_ - * inside virtual directory, create directories _subdir1, subdir2_ - * mount _virtdir1/subdir1_ to _subdir/virtdir/subdir1_ - * if _virtdir_ is started with >, create directory _subdir/virtdir_ , but don't mount it into _jaildir_ . This is needed for cases when _virtdir_ is inside home base dir. -* if file _/var/cagefs/[prefix]/[user]/virt.mp_ is missing -- no virt directories are loaded for that user. - -Note that CageFS will automatically create those files for Plesk 10 & higher. - -For example if we have Plesk 11.5 with two users _cltest1_, and _cltest2_: -
- -``` -cltest1 uid 10000 has domains: cltest1.com, cltest1-addon.com and sub1.cltest1.com -cltest2 uid 10001 has domains: cltest2.com, cltest2-addon.com -``` -
- -In such case we would have file _/var/cagefs/00/cltest1/virt.mp_ : -
- -``` ->/var/www/vhosts/system,0755 -@cltest1-addon.com,0755 -@cltest1.com,0755 -@sub1.cltest1.com,0755 -``` -
- -and file: _/var/cagefs/01/cltest2/virt.mp:_ -
- -``` ->/var/www/vhosts/system -@cltest2-addon.com -@cltest2.com -``` -
- - -#### **Split by username** - -_[CageFS 5.3.1+]_ - -Sometimes you might need to make sure that directory containing all users would show up as containing just that user inside CageFS. For example, if you have directory structure like: -
- -``` -/home/httpd/fcgi-bin/user1 -/home/httpd/fcgi-bin/user2 -``` -
- -Then we can add the following line to /etc/cagefs/cagefs.mp file: -
- -``` -%/home/httpd/fcgi-bin -``` -
- -and execute: -
- -``` -cagefsctl --remount-all -``` -
- -After that each subdirectory of _/home/httpd/fcgi-bin_ will be mounted for appropriate user in CageFS: _/home/httpd/fcgi-bin/user1_ will be mounted for user1 and _/home/httpd/fcgi-bin/user2_ will be mounted for user2 . - -#### Splitted by user’s UID mounts - -:::tip Note -Requires CageFS v.7.4.2-1 and later -::: - -In addition to [splitted by username mounts](/cloudlinux_os_components/#split-by-username), there is an ability to “split” mounts by user’s UID. This feature is useful for systems with non-unique UIDs, i.e. when multiple users have the same UID. - -Using splitted by UID mounts is more preferable over splitted by username mounts, because you can mount the same directory for all users with the same UID. Also, splitted by UID mounts work fine with renaming of the users (when username changes but UID remains the same). - -For example if you have a directory structure like the following: - -``` -/data/uids/1000/data.db -/data/uids/1001/data.db -``` - -Then you can add the following line to the `/etc/cagefs/cagefs.mp` file: - -``` -*/data/uids -and execute -cagefsctl --remount-all -``` - -After that each subdirectory of the `/data/uids` will be mounted for the appropriate user in CageFS. The `/data/uids/1000` directory will be mounted for the user with UID 1000 and the `/data/uids/1001` directory will be mounted for the user with UID 1001. - - - -#### **Mounting users home directory inside CageFS** - - -CageFS 6.1-1 (and later) has improved mounting user’s home directory that is applied for users with home directories like _/home/user_ or _/homeN/user_ (where N = 0,1,..9). - -In such case, earlier versions of CageFS always mount user’s home directory to _/home/user_ and create symlink _/homeN -> /home_ when needed, so user’s home directory can be accessed both via _/home/user_ and _/homeN/user_ . This quirk leads to some rare incompatibilities between CageFS and other software (for example OpenCart), because real path of user’s home directory in CageFS and in real file system can differ. - -New CageFS mounts user’s home directory in a way that its real path in CageFS is always the same as in real file system. Additionally, CageFS searches for symlinks like - _/homeX -> /homeY_ and _/homeX/user -> /homeY/user_ in real system and creates such symlinks in user’s CageFS when found. - -This new mounting mode is enabled by default. You can switch to old mounting mode by executing the following commands: -
- -``` -# touch /etc/cagefs/disable.home.dirs.search -# cagefsctl --force-update -# cagefsctl --remount-all -``` -
- -:::tip Note -New mounting mode will be disabled automatically when "mounting base home directory" mode is enabled (`mount_basedir=1` setting in _/etc/cagefs/cagefs.base.home.dirs_ file). -::: - -#### How to hide directory inside mount point - -:::tip Note -For files outside a mount point, use blacklisting, see: [Excluding files](/cloudlinux_os_components/#excluding-files) -::: - -To hide directories inside a mount point, create a file in the `/etc/cagefs/empty.dirs` directory (you can use any name) with a list of directories to be hidden (these directories will look like empty for users in CageFS). -:::tip Note -Please do not edit the supplied config file (`/etc/cagefs/empty.dirs/emptied_dirs.default`). -::: - -#### Example - -Let’s take a `/var/www` directory which contains the following folders: `icons` and `html`. -To hide the `/var/www` directory content from users inside CageFS, we will do the following: - -* Create the `custom.empty` file with a single record: `/var/www` -* Place the `custom.empty` file to the `/etc/cagefs/empty.dirs` directory -* Run the `cagefsctl --remount-all` command - -Now, all users inside CageFS will see the `/var/www` directory as an empty directory even if there is `/var/www/html` in the `/etc/cagefs/cagefs.mp`. - - - -#### Base home directory - - -If you have a custom setup where home directories are in a special format, like: _/home/$USERNAME/data_ , you can specify it using regular expressions. This is needed by CageFS to create safe home space for end user, where no other users are visible. - -We will create empty: _/var/cagefs/[prefix]/$USERNAME/home_ , and then mount _/home/$USERNAME_ in that directory - -To do that, create a file: _/etc/cagefs/cagefs.base.home.dirs_ - -With content like: -
- -``` -^/home/ -^/var/www/users/ -``` -
- -If there is no such file, the home directory without last component will be considered as a base dir, like with - _/home/$USERNAME_ we would create _/var/cagefs/[prefix]/$USERNAME/home_ , and then mount - _/home/$USERNAME_ in there - -With _/home/$USERNAME/data_ as a home dir, we would assume that _/home/$USERNAME_ is the base directory, and we would create _/var/cagefs/[prefix]/$USERNAME/home/$USERNAME/data_ and then we would mount _/home/$USERNAME/data_ -- which would cause each user to see empty base directories for other users, exposing user names. - -**Sharing home directory structure among users** - -When you want to share directory structure among multiple users, you can add following line at the top of the _/etc/cagefs/cagefs.base.home.dirs_ file. This is useful on the systems that support sites with multiple users, with different home directories inside the main 'site' directory. -
- -``` -mount_basedir=1 -``` -
- -For example: - - user1 has home directory _/var/www/vhosts/sitename.com/web_users/user1_ - user2 has home directory _/var/www/vhosts/sitename.com/web_users/user2_ -site admin has home directory _/var/www/vhosts/sitename.com_ - -So, content of _/etc/cagefs/cagefs.base.home.dirs_ should be the following: - -
- -``` -mount_basedir=1 -^/var/www/vhosts/[^/]+ -``` -
- -Directory structure in _/var/www/vhosts/sitename.com_ will be mounted in CageFS for appropriate users. -Each user will have access to whole directory structure in _/var/www/vhosts/sitename.com_ (according to their permissions). - -::: tip Note -You should execute `cagefsctl --remount-all` in order to apply changes to CageFS (i.e. remount home directories). -::: - -#### PostgreSQL support - - -CloudLinux OS Shared 7: - -CageFS works with any PostgreSQL version installed from CloudLinux OS Shared or CentOS repositories. PostgreSQL packages for CloudLinux OS Shared 7 come from the upstream (CentOS) unmodified. PostgreSQL’s socket is located in _/var/run/postgresql_ directory. This directory is mounted to CageFS by default (in cagefs-5.5-6.34 or later). - -When PostgreSQL has been installed after CageFS install, please add line: -
- -``` -/var/run/postgresql -``` -
- -tо _/etc/cagefs/cagefs.mp_ file and then execute: -
- -``` -cagefsctl --remount-all -``` -
- -The steps above are enough to configure CageFS to work with PostgreSQL. - -CloudLinux OS Shared 6: - -CageFS provides separate _/tmp_ directory for each end user. Yet, PostgreSQL keeps its Unix domain socket inside server's main _/tmp_ directory. In addition to that, the location is hard coded inside PostgreSQL libraries. - -To resolve the issue, CloudLinux OS Shared provides a version of PostgreSQL with modified start up script that can store PostgreSQL's socket in _/var/run/postgres._ The script automatically creates link from _/tmp_ to that socket to prevent PostgreSQL dependent applications from breaking. - -In addition to that, CageFS knows how to correctly link this socket inside end user's _/tmp_ directory. - -To enable PostgreSQL support in CageFS: - -1. Make sure you have updated to latest version of PostgreSQL. - -2. Edit file _/etc/sysconfig/postgres_, and uncomment _SOCK_DIR_ line. - -3. Update CageFS configuration by running: - -
- -``` -cagefsctl --reconfigure-cagefs -``` -
- -4. Restart PostgreSQL by running: - -
- -``` -$ service postgresql restart -``` -
- -If you are using cPanel, you would also need to modify file: _/etc/cron.daily/tmpwatch_ - -And update line: -
- -``` -flags=-umc -``` -
- -to: -
- -``` -flags=-umcl -``` -
- -to prevent symlink from being removed. - -#### PAM configuration - - -CageFS depends on **pam_lve** module for PAM enabled services. When installed, the module is automatically installed for following services: - -* sshd -* crond -* su - -The following line is added to corresponding file in `/etc/pam.d/`: -
-``` -session required pam_lve.so 100 1 -``` -
- -Where 100 stands for minimum UID to put into CageFS & LVE , and 1 stands for CageFS enabled. - - -#### Filtering options for commands executed by proxyexec - -You can disallow a user in CageFS to execute specific commands with some specific *dangerous* options via proxyexec. - -To do so, you should create `.json` file in the `/etc/cagefs/filters` directory and specify the names of options you want to disable. - -For example, to disable some options of `sendmail` command, `/etc/cagefs/filters/sendmail.json` is created with the following content: - -
- -``` -{ - "default": { - "deny": [ - "-be", - "-bem" - ], - "restrict_path": [ - "-C", - "-D" - ] - }, - "/usr/sbin/sendmail": { - "deny": [ - "-be", - "-bem" - ], - "restrict_path": [ - "-C", - "-D" - ] - }, - "/var/qmail/bin/sendmail": { - "deny": [ - "-be", - "-bem" - ], - "restrict_path": [ - "-C", - "-D" - ] - }, - "/usr/sbin/sendmail.sendmail": { - "deny": [ - "-be", - "-bem" - ], - "restrict_path": [ - "-C", - "-D" - ] - }, - "/usr/local/cpanel/bin/sendmail": { - "deny": [ - "-be", - "-bem" - ], - "restrict_path": [ - "-C", - "-D" - ] - } -} -``` -
- -You can specify options for different paths separately (for example, `/usr/sbin/sendmail` or `/var/qmail/bin/sendmail`). - -If the path to the program being executed does not match any path specified in the config file, then default parameters are used. - -* `deny` list should contain options that should be disallowed for use by users (the black list of options, all other options will be allowed). -* You can specify the white list of options in the `allow` list (all other options will be denied). -* You cannot specify both white and black list (`allow` and `deny`). - -It is possible to verify that a path specified as a parameter for an option does not refer outside of the user’s home directory. This check is performed for options specified in the `restrict_path` list. All issues are reported in `/var/log/secure` log file. - -> NOTE: By default, option filters only compare the starting parts of arguments with entries specified by lists. -For instance, if option "-f" is forbidden, "-f /etc/list" will be forbidden, but "-vf /etc/list" will not. - -Starting from cagefs v. #7.4.12-1, specifying a `"strict_options": true` switch inside a filter file entry enables an extended parsing mechanism where each short option from a cluster is parsed separately. - -It is recommended to enable this option, unless it causes issues with the restricted command's functionality. - -
- -``` -{ - "default": { - "deny": [ - "-be", - "-bem" - ], - "restrict_path": [ - "-C", - "-D" - ], - "strict_options": true - } -} -``` -
- -#### Executing by proxy - - -Some software has to run outside CageFS to be able to complete its job. It includes such programs as passwd, sendmail, etc. CageFS provides proxyexec technology to accomplish this goal: you can define any program to run outside CageFS by specifying it in any file located in the `/etc/cagefs/` which ends with `.proxy.commands`. In the examples below we use `custom.proxy.commands`, but you can use any other name, e.g. `mysuperfile.proxy.commands`. - -::: tip Warning -Do not edit the existing `/etc/cagefs/proxy.commands` file as it will be overwritten with the next CageFS update. -::: - -The syntax of the `/etc/cagefs/[*.]proxy.commands` file is as follows: - -
- -``` -ALIAS[:wrapper_name]=[username:]path_to_executable -``` - -
- -| Parameter | Description | -| ------------------ | ----------- | -| `ALIAS` | Any name unique within all `/etc/cagefs/\[*.\]proxy.commands` files. Used as an identifier.| -| `wrapper_name` | Optional field. The name of the wrapper file which is used as a replacement for an executable file (set by `path_to_executable`) inside CageFS.

Possible values:
- a name of a wrapper you place into the `/usr/share/cagefs/safeprograms` directory;
- `noproceed` - a reserved word which means that the wrapper is not needed, e.g. when it is already installed by other ALIAS. Often used for the commands with several ALIAS as in the example below.
- omit this field - default wrapper `cagefs.proxy.program` will be used.

Used in cases when you'd like to give access only to the part of binary functions but it is not possible to do that using [options filtering](/cloudlinux_os_components/#filtering-options-for-commands-executed-by-proxyexec).
**Note**: wrapper works inside CageFS with user rights and executes “real” scripts using proxy daemon. | -| `path_to_executable` | A path to an executable file that will run via proxyexec.| -| `username` | Optional field. A name of a user on whose behalf `path_to_executable` will run in the real system. If `username` is not specified, then `path_to_executable` will run on behalf of the same user who is inside CageFS. | - - -Once the program is defined, run this command to populate the skeleton: - -
- -``` -$ cagefsctl --force-update -``` - -
- -#### Users with duplicate UIDs - -Sometimes hosters may have users with non-unique UIDs. Thus, `proxyexec` may traverse users' directories to find a specific one. That behavior turns into inappropriate if the user's directory is not cached locally (for example LDAP is used). - -To turn this feature off, run: - -
- -``` -touch /etc/cagefs/proxy.disable.duid -``` -
- -Or to activate it back, run: - -
- -``` -rm /etc/cagefs/proxy.disable.duid -``` -
- - -#### Examples - -Let's have a script that must do some stuff outside CageFS and return a result to a user. Let's name it `superbinary` and place it into the `/my/scripts/` directory. - -In the examples below, we will use a small script that: - -* checks if it works inside or outside of CageFS -* prints a number of users in the `/etc/passwd` file - -We use the `/etc/passwd` file because it is truncated inside the cage by default and we can easily see the difference between CageFS and the “real” system by just counting lines in it. - -
- -``` -$ cat /opt/scripts/superbinary -#!/usr/bin/env bash -if [[ -e /var/cagefs ]]; then - echo "I am running without CageFS" -else - echo "I am running in CageFS" -fi; -echo "I am running as: `whoami`" -echo "Number or records in /etc/passwd: `cat /etc/passwd | wc -l`" -``` -
- -First, let’s check that CageFS works: create a user and disable the cage: - -
- -``` -useradd test -cagefsctl --disable test -``` -
- -Then, run the following command as `root` and you will see the following output: - -
- -``` -[root ~]# su - test -c "/my/scripts/superbinary" -I am running without CageFS -I am running as: test -Number or records in /etc/passwd: 49 -``` -
- -Now, enable CageFS for the `test` user and run the command again: - -
- -``` -[root ~]# cagefsctl --enable test -[root ~]# su - test -c "/my/scripts/superbinary" --bash: /my/scripts/superbinary: No such file or directory -``` -
- -As you can see the access to the file is restricted by CageFS. - -#### Example 1. Make users in CageFS be able to execute a script which must work outside CageFS - -Add the following line into the `/etc/cagefs/custom.proxy.commands`: - -
- -``` -MYSUPERBINARY=/my/scripts/superbinary -``` -
- -Then run the `cagefsctl --force-update`, which will place a special wrapper instead of your script inside CageFS. And run your script again: - -
- -``` -[root ~]# su - test -c "/my/scripts/superbinary" -I am running without CageFS -I am running as: test -Number or records in /etc/passwd: 49 -``` -
- -To compare, let’s count a number of users in the `/etc/passwd` directly: - -
- -``` -[root ~]# su - test -c "cat /etc/passwd | wc -l" -25 -``` -
- -**Result**: the script escapes from CageFS and has access to all files which a user with disabled CageFS has. - -#### Example 2. Permissions escalation - -Let's imagine that you need to give the users the ability to run a script which gets information about their domains from the `apache.conf`. To do that, you need root permissions. You can achieve that with proxyexec. - -First, run the following: - -
- -``` -echo "MYSUPERBINARY=root:/my/scripts/superbinary" > /etc/cagefs/custom.proxy.commands -``` -
- -And then, run the example script again: - -
- -``` -[root ~]# su - test -c "/my/scripts/superbinary" -I am running without cagefs -I am running as: root -Number or records in /etc/passwd: 49 -``` -
- -As you can see, the script now works with root permissions, as set in the `custom.proxy.commands` file. In order to get information about a user who runs the script, use the following environment variables: - -
- -``` -PROXYEXEC_UID -PROXYEXEC_GID -``` -
- -**Example**: - -
- -``` -[root ~]# id test -uid=1226(test) gid=1227(test) groups=1227(test) -[root ~]# su - test -c "/my/scripts/superbinary" -I am running without CageFS -I am running as: root -Number or records in /etc/passwd: 49 -PROXYEXEC_UID=1226 -PROXYEXEC_GID=1227 -``` -
- -**Result**: users can run the script that gains the root permissions and work outside CageFS. Of course, you can set any other user instead of root in the `custom.proxy.commands`. - -#### Example 3. Custom proxyexec wrapper - -Let’s modify the test binary in a next way: - - -
- -``` - -[root ~]# cat /my/scripts/superbinary -#!/usr/bin/env bash -FILE="$1" -if [[ -e /var/cagefs ]]; then - echo "I am running without CageFS" -else - echo "I am running in CageFS" -fi; -echo "I am running as: `whoami`" -echo "Number or records in ${FILE}: `cat ${FILE} | wc -l`" -echo "PROXYEXEC_UID=${PROXYEXEC_UID}" -echo "PROXYEXEC_GID=${PROXYEXEC_GID}" -``` -
- -Now users can pass any path to the file as an argument. In order to restrict possible parameters (file paths) that users can pass, you can use the custom proxyexec wrapper. - -First, duplicate the default wrapper and give it a name, e.g. `cagefs.proxy.mysuperbinary`. - -
- -``` -[root ~]# cp /usr/share/cagefs/safeprograms/cagefs.proxy.program /usr/share/cagefs/safeprograms/cagefs.proxy.mysuperbinary -``` -
- -The default wrapper already contains a check that does not allow to run it by the root user: - -
- -``` -#!/bin/bash -##CageFS proxyexec wrapper - ver 15 - -if [[ $EUID -eq 0 ]]; then - echo 'Cannot be run as root' - exit 1 -fi -... -``` -
- -Add the new check below: - -
- -``` -if [[ $1 == "/etc/passwd" ]]; then - echo "it is not allowed for user to view this file!" - exit 1 -fi -``` -
- -Now, set a custom binary name in the `custom.proxy.commands`: - -
- -``` -[root ~]# cat /etc/cagefs/custom.proxy.commands -MYSUPERBINARY:cagefs.proxy.mysuperbinary=root:/my/scripts/superbinary -``` -
- -Run skeleton update and check that everything works as expected: - -
- -``` -[root ~]# cagefsctl --force-update -[root ~]# su - test -c "/my/scripts/superbinary /etc/passwd" -it is not allowed for user to view this file! -[root ~]# su - test -c "/my/scripts/superbinary /etc/group" -I am running without CageFS -I am running as: root -Number or records in /etc/group: 76 -PROXYEXEC_UID=1226 -PROXYEXEC_GID=1227 -``` -
- -::: tip Notes and warnings -1. Make sure that a directory with your script is not listed in the `/etc/cagefs/cagefs.mp` (is not mounted inside the cage). Otherwise, the proxyexec will not work because CageFS will not be able to replace your script with a special wrapper inside the cage. -2. Use this feature with caution because it gives users the ability to execute specified commands outside CageFS. SUID commands are extremely dangerous because they are executed not as a user, but as an owner of the file (typically root). You should give users the ability to execute safe commands only. These commands should not have known vulnerabilities. You should check that users cannot use these commands to get sensitive information on a server. You can disable specific dangerous options of programs executed via proxyexec using [filtering options](/cloudlinux_os_components/#filtering-options-for-commands-executed-by-proxyexec). -3. In cPanel, all the scripts located in the `/usr/local/cpanel/cgi-sys/`, that user might need to execute, should be added to the custom `*.proxy.commands` file. -::: - -#### Custom /etc files per customer - - -_[4.0-5 and later]_ - -To create a custom file in /etc directory for end user, create a directory: - _/etc/cagefs/custom.etc/[username]_ - -Put all custom files, and sub-directories into that direcotry. - -For example, if you want to create custom _/etc/hosts_ file for USER1 , create a directory: - _/etc/cagefs/custom.etc/USER1_ - -Inside that directory, create a _hosts_ file, with the content for that user. - -After that execute: -
- -``` -$ cagefsctl --update-etc USER1 -``` -
- -If you are making changes for multiple users, you can run: - -
- -``` -$ cagefsctl --update-etc -``` -
- -To remove a custom file, remove it from _/etc/cagefs/custom.etc/[USER]_ directory, and re-run: -
- -``` -$ cagefsctl --update-etc -``` -
- - -#### Moving cagefs-skeleton directory - - -Sometimes you might need to move cagefs-skeleton from _/usr/share_ to another partition. - -There are two ways: - -1. If `/usr/share/cagefs-skeleton` is not created yet ( cagefsctl --init wasn't executed), then execute: - -
- -``` -$ mkdir /home/cagefs-skeleton -$ ln -s /home/cagefs-skeleton /usr/share/cagefs-skeleton -$ cagefsctl --init -``` -
- -2. If _/usr/share/cagefs-skeleton_ already exists, see [this article](https://cloudlinux.zendesk.com/hc/en-us/articles/115004560129-How-do-I-move-usr-share-cagefs-skeleton-to-other-place-because-of-low-disk-space) - -#### Moving /var/cagefs directory - - -To move `/var/cagefs` to another location: - -
- -``` -$ cagefsctl --disable-cagefs -$ cagefsctl --unmount-all -``` -
- -Verify that `/var/cagefs.bak` directory does not exist (if it exists - change name "cagefs.bak" to something else) - -
- -``` -$ cp -rp /var/cagefs /new/path/cagefs -$ mv /var/cagefs /var/cagefs.bak -$ ln -s /new/path/cagefs /var/cagefs -$ cagefsctl --enable-cagefs -$ cagefsctl --remount-all -``` -
- -Verify that the following command gives empty output: -
- -``` -$ cat /proc/mounts | grep cagefs.bak -``` -
- -Then you can safely remove /var/cagefs.bak: -
- -``` -$ rm -rf /var/cagefs.bak -``` -
- -#### TMP directories - - -CageFS makes sure that each user has his own _/tmp_ directory, and that directory is the part of end-user's quota. - -The actual location of the directory is _$USER_HOME/.cagefs/tmp_ - -Once a day, using cron job, CageFS will clean up user's _/tmp_ directory from all the files that haven't been accessed during 30 days. - -This can be changed by running: -
- -``` -$ cagefsctl --set-tmpwatch='/usr/sbin/tmpwatch -umclq 720' -``` -
- -Where 720 is the number of hours that the file had to be inaccessible to be removed. - -By default this is done at 03:37 AM, but you can also force the clean up outdated files that match 'chosen period' of all user's _/tmp_ directories without waiting for a job to be launched by cronjob . Just run: - -
- -``` -$ cagefsctl --tmpwatch -``` -
- -The following paths will be cleaned as well: - -* `/var/cache/php-eaccelerator` (actual location `$USER_HOME/.cagefs/var/cache/php-eaccelerator`) -* `/opt/alt/phpNN/var/lib/php/session` (actual location `$USER_HOME/.cagefs/opt/alt/phpNN/var/lib/php/session`), where NN corresponds to Alt-PHP version. - - -You can configure `tmpwatch` to clean custom directories inside CageFS. - -Create `/etc/cagefs/cagefs.ini` configuration file and specify `tmpwatch_dirs` directive as follows: - -`tmpwatch_dirs=/dir1,/dir2` - -After that directories `/dir1` and `/dir2` inside CageFS  will be cleaned automatically. - -Note that actual location of those directories in real file system is `$USER_HOME/.cagefs/dir1` and `$USER_HOME/.cagefs/dir2`. - -**Cleanup PHP sessions in cPanel** - -For cPanel servers, CageFS version 6.0-42 or higher performs cleaning of PHP sessions based on `session.gc_maxlifetime` and `session.save_path` directives specified in proper `php.ini` files. - -`session.gc_maxlifetime` directive default value is 1440 seconds. Those session files will be deleted, that were created or had metadata (ctime) changes more time ago than it is specified in `session.gc_maxlifetime`. - -For Alt-PHP versions `session.save_path` value is normally `/tmp`. - -::: tip Note -For new installations of Alt-PHP packages, `session.save_path` will be changed from `/tmp` to `/opt/alt/phpNN/var/lib/php/session`, where NN corresponds to Alt-PHP version. -::: - -This applies to the following Alt-PHP versions (or later): -* alt-php44-4.4.9-71; -* alt-php51-5.1.6-81; -* alt-php52-5.2.17-107; -* alt-php53-5.3.29-59; -* alt-php54-5.4.45-42; -* alt-php55-5.5.38-24; -* alt-php56-5.6.31-7; -* alt-php70-7.0.23-5; -* alt-php71-7.1.9-5; -* alt-php72-7.2.0-0.rc.2.2. - -When using EasyApache 3, _session.save_path_ value is normally _/var/cpanel/php/sessions/ea3_ or _/tmp_ . Settings for EasyApache 3 are usualy taken from the file _/usr/local/lib/php.ini_ . - -When using EasyApache 4, _session.save_path_ value is normally _/var/cpanel/php/sessions/ea-phpXX_ , where _XX_ corresponds to PHP version. - -Cleaning is started by cron _/etc/cron.d/cpanel_php_sessions_cron_ , which starts the script _/usr/share/cagefs/clean_user_php_sessions_ twice within one hour. - -::: tip Note -Script _clean_user_php_sessions_ deletes only files which names match mask `sess_[a-z0-9]*`. If php was configured to use non-standart session file prefix in some custom save_handler, these session files wouldn't be managed by _clean_user_php_sessions_ . -::: - -The settings for ea-php are located in _/opt/cpanel/ea-phpXX/root/etc/php.d/local.ini_ or in _/opt/cpanel/ea-phpXX/root/etc/php.ini_ , where _XX_ corresponds to the PHP version. - -The settings for alt-php are located in _/opt/alt/phpXX/etc/php.ini_ files, where _XX_ corresponds to PHP version. - -The cleaning script cleans php sessions for all PHP versions ( _ea-php_ and _alt-php_ ) regardless of whether a version is used or selected via MultiPHP Manager or PHP Selector . When different _session.gc_maxlifetime_ values are specified for the same _session.save_path_ (for different php versions), the cleaning script will use the least value for cleaning _session.save_path_ . So, it is recommended to specify different _session.save_path_ for each PHP version. - -Users can define custom value of _session.gc_maxlifetime_ via PHP Selector in order to configure PHP's garbage collector, but that will not affect the script for cleaning PHP sessions. The script cleans PHP sessions based on global values of _session.gc_maxlifetime_ and _session.save_path_ directives taken from files mentioned above. Settings in custom users’ php.ini files are ignored. - -**Cleanup PHP session files in Plesk** - -For Plesk servers, CageFS version 6.0-52 or higher is provided with a special cron job for removing obsolete PHP session files. Cleanup script runs once an hour (similar to how it is done in Plesk). - -Each time the script runs, it performs the cleanup of the paths: - -1. set by `session.save_path` directive in _/opt/alt/phpXX/etc/php.ini_ files. If session.save_path is missing, then /tmp is used. Session files lifetime is set by session.gc_maxlifetime directive. If it is not found, then 1440 seconds value is used (24 minutes, as in Plesk). Lifetime set in the file is only taken into consideration if it is longer than 1440 seconds, otherwise 1440 seconds is used. All the installed Alt-PHP versions are processed. - -2. _/var/lib/php/session_ . Files lifetime is only defined by Plesk script _/usr/lib64/plesk-9.0/maxlifetime_ . If the script is missing or returns errors, then this directory is not processed. - -The following features are applied during the cleanup: - -* all the users with UID higher than specified in _/etc/login.defs_ are processed. Each user is processed independently from one another. -* only directories inside CageFS are being cleaned. The paths of the same name in the physical  file system are not processed. -* in all the detected directories, all the files with the names that correspond to `sess_ ` search mask are removed, the rest of the files are ignored. -* the files older than specified lifetime are removed. -* all non-fatal errors (lack of rights, missing directory) are ignored and do not affect the further work of the script. - -**Disable PHP sessions cleanup on cPanel and Plesk** - -Here is a possible workaround for PHP session expiration problem (session lives longer than it is possible in a control panel). To use your own custom PHP sessions cleanup scripts - you can turn off built-in sessions cleanup implementation in the following way: -add `clean_user_php_sessions=false` line to _/etc/sysconfig/cloudlinux_ . - - - -#### Syslog - - -By default, _/dev/log_ should be available inside end user's CageFS . This is needed so that user's cronjobs and other things that user _dev/log_ would get recorded in the system log files. - -This is controlled using file _/etc/rsyslog.d/schroot.conf_ with the following content: -
- -``` -$AddUnixListenSocket /usr/share/cagefs-skeleton/dev/log -``` -
- -To remove presence of _dev/log_ inside CageFS, remove that file, and restart rsyslog service. - - -#### Excluding mount points - -**How to exclude mounts from namespaces for all LVEs** - - -By default, all mounts from the real file system is inherited by namespaces of all LVEs . So, destroying all LVEs may be required in order to unmount some mount in real file system completely. Otherwise, mount point remains busy after unmounting it in the real file system because this mount exists in namespaces of LVEs . - - `lvectl start` command saves all mounts from real file system as “default namespace” for later use in all LVEs . **lve_namespaces** service executes `lvectl start` command during startup. - -In **lve-utils-2.0-26** (and later) there is an ability to exclude specific mounts from namespaces for all LVEs . -In order to do so, please create a file _/etc/container/exclude_mounts.conf_ with list of mounts to exclude (one mount per line) as regular expressions, and then execute `lvectl start` : -
- -``` -# cat /etc/container/exclude_mounts.conf -^/dir1/ -^/dir2$ -# lvectl start -``` -
- -After that, all new created LVEs will be without _/dir2_ mount and without mounts that start with _/dir1/_ (like _/dir1/x_ , _/dir1/x/y_ , etc). To apply changes to existing LVEs you should recreate LVEs : -
- -``` -# lvectl destroy all -# lvectl apply all -``` -
- -::: tip Note -You should recreate all LVEs only once after creating _/etc/container/exclude_mounts.conf_ file. After that the configuration changes will be applied to all new LVEs automatically. -::: - -#### Shared memory (/dev/shm) isolation in CageFS - -:::tip Note -Requires `cagefs-6.2.1-1` or later -::: - -The `/dev/shm` in a real file system directory is “world-writable”. This directory from the real file system is mounted to CageFS by default, so `/dev/shm` directory is common for all users by default. However, it is possible to improve security and isolate `/dev/shm` (shared memory) for each user in CageFS. - -To enable `/dev/shm` isolation, do the following steps: - -1. Delete `/dev/shm` line from the `/etc/cagefs/cagefs.mp` file - -
- - ``` - sed -i -e '/^\/dev\/shm/d' /etc/cagefs/cagefs.mp - ``` -
- -2. Create a configuration file with mount options for shared memory - -
- - ``` - echo 'mode=0777' > /etc/cagefs/dev.shm.options - ``` -
- -3. Remount CageFS to apply changes - -
- - ``` - cagefsctl --remount-all - ``` -
- -You can also specify additional mount options. - -For example, you can specify the size of shared memory in megabytes: - -
- -``` -echo 'mode=0777,size=1m' > /etc/cagefs/dev.shm.options -cagefsctl --remount-all -``` -
- -Or you can specify the size of user’s physical memory limit (PMEM) in percentage: - -
- -``` -echo 'mode=0777,size=50%' > /etc/cagefs/dev.shm.options -cagefsctl --remount-all -``` -
- -To disable `/dev/shm` isolation, do the following steps: - -1. Delete configuration file - -
- - ``` - rm -f /etc/cagefs/dev.shm.options - ``` -
- -2. Validate `/etc/cagefs/cagefs.mp` file - -
- - ``` - cagefsctl --check-mp - ``` -
- -3. Add `/dev/shm` line to `/etc/cagefs/cagefs.mp` file - -
- - ``` - echo '/dev/shm' >> /etc/cagefs/cagefs.mp - ``` -
- -4. Remount CageFS to apply changes - -
- - ``` - cagefsctl --remount-all - ``` -
- -:::tip Note -you should specify `mode=0777`. It is required for the proper operation of shared memory inside CageFS. This is not a security issue because the `/dev/shm` directory is isolated for each user and visible inside a user’s CageFS only. -::: - -:::tip Note -`/dev/shm` is mounted with `nosuid,nodev,noexec` mount options always (both in “isolated `/dev/shm`” mode and not). You cannot change this behavior. -::: - -:::tip Note -“isolated `/dev/shm`” mode will become the default in the future CageFS releases. -::: - -:::tip Note -when the size of the `/dev/shm` is specified in percentage of user’s physical memory limit (PMEM), you should remount CageFS after changing PMEM limit in order to change the size of shared memory allocated for the `/dev/shm` in user’s CageFS. To do so, execute `cagefsctl --remount-all` -::: - -#### Preventing process from entering CageFS on error - -Starting from CageFS v.7.2.0-1, you can prevent a process from work if it can't enter to CageFS. The option is disabled by default. - -To enable it, run the following commands: - -``` -touch /etc/cagefs/fail.on.error -cagefsctl --remount-all (cagefsctl --remount ) -``` - -To disable it, run the following commands: - -``` -rm -f /etc/cagefs/fail.on.error -cagefsctl --remount-all (cagefsctl --remount ) -``` - -The message “Act like CageFS is disabled” in the `/var/log/messages` will be displayed regardless the file `/etc/cagefs/fail.on.error` is available or not. - - -### Integration with control panels - -* [cPanel](/cloudlinux_os_components/#cpanel) -* [Plesk](/cloudlinux_os_components/#plesk) -* [ISPManager](/cloudlinux_os_components/#ispmanager) - -CageFS comes with a plugin for various control panels. - -The plugin allows to: - -* Initialize CageFS; - -* Select [mode of operation](/cloudlinux_os_components/#managing-users); - -* See and modify the list of enabled/disabled users; - -* Update CageFS skeleton. - -#### cPanel - -CageFS plugin for cPanel is located in Plugins section of WHM. - -It allows to initialize CageFS, select users CageFS will be enabled for, as well as update CageFS skeleton. - -![](/images/img1-zoom73.png) - -To enable CageFS for a proper user (users), in CageFS User Manager choose a user from the list on the right ( Disabled users) and click Toggle . The user will move to the list on the left ( Enabled users). - -To disable a user (users), choose a user from the list on the left ( Enabled users) and click Disable CageFS . The user will move to the list on the right ( Disabled users). - -To update CageFS skeleton, click Update CageFS Skeleton . - -![](/images/img2-zoom71.png) - -#### Plesk - -CageFS comes with a plugin for Plesk 10.x. It allows initializing and updating CageFS template, as well as managing users and mode of operation for CageFS. - -In modules section choose CageFS: - -![](/images/plesk_cagefs_icon.png) - -To enable CageFS for a proper user (users), in CageFS User Manager choose a user from the list on the right ( Disabled users) and click Toggle . The user will move to the list on the left ( Enabled users). - -To disable a user (users), choose a user from the list on the left ( Enabled users) and click Disable CageFS . The user will move to the list on the right ( Disabled users). - -To update CageFS skeleton, click Update CageFS Skeleton . - -![](/images/plesk_cagefs_manager_disable_all.png) - -#### ISPManager - -CageFS comes with plugin for ISP Manager to enable/disable CageFS on per user base. In edit user section chose Permission tab. Mark CageFS User Mode checkbox and click OK to apply. - -![](/images/ispmanager_cagefs_user_zoom98.png) - -Or you can manage global CageFS settings via CageFS menu -![](/images/img3.jpg) - - -See also [CageFS CLI tools](/command-line_tools/#cagefs). - -## MySQL Governor - -### General information and requirements - -:::tip Note -MySQL Governor 0.8-32+ -::: - -:::warning Warning -The "All" mode will be deprecated starting from September 1, 2021. You can read more [here.](https://blog.cloudlinux.com/mysql-governor-moving-from-all-to-abusers) -::: - - MySQL Governor is software to monitor and restrict MySQL usage in shared hosting environment. The monitoring is done via resource usage statistics per each MySQL thread. - - MySQL Governor has two active modes of operations: -* **off** - In this mode MySQL Governor will not throttle customer's queries, instead it will let you monitor the MySQL usage. -* **abusers** - In this mode, once user goes over the limits specified in the MySQL Governor, all customer's queries will execute inside that user's LVE. - -More details of the governor operation modes are described in the [Modes of operation](/cloudlinux_os_components/#modes-of-operation) section - - MySQL Governor allows to restrict customers who use too much resources. It supports following limits: - -| | | | -|-|--|-| -| CPU | % | CPU speed relative to one core. 150% would mean one and a half cores| -| READ | bytes | bytes read. Cached reads are not counted, only those that were actually read from disk will be counted| -| WRITE | bytes | bytes written. Cached writes are not counted, only once data is written to disk, it is counted| - -You can set different limits for different periods: current, short, med, long. By default those periods are defined as 1 second, 5 seconds, 1 minute and 5 minutes. They can be re-defined using [configuration file](/cloudlinux_os_components/#configuration-and-operation). The idea is to use larger acceptable values for shorter periods. Like you could allow a customer to use two cores (200%) for one second, but only 1 core (on average) for 1 minute, and only 70% within 5 minutes. That would make sure that customer can burst for short periods of time. - -Customers will also be limited to a finite number of concurrent connections, this number is 30 by default and can be changed. This is done so they wouldn't use up all the MySQL connections to the server. MySQL Governor can also kill off slow SELECT queries. - -### MySQL Governor limits interaction with LVE limits - -#### How is interaction between MySQL Governor and LVE organized? - -The main purpose of MySQL Governor is to monitor how many common resources are used by each user for working with MySQL/MariaDB and to manage usage restrictions for such resources by LVE containers. - -Before any SQL request, MySQL Governor determines which user sent the request and if this user exceed limits, the MySQL Governor pushes the request to appropriate LVE container. - -This is how common server resources can be managed. - -#### Why the СPU/IO charts are different for database and LVE usage? - -SQL requests are not limited inside LVE, so there are not any calculations for IO usage there. It can be clearly viewed via the lve-stats charts: - -![](/images/Chart1.png) - -**Blue chart (database)**: - -This is the user’s real IO Database usage which was calculated by MySQL Governor. - -**Green chart (LVE)**: - -This is the user’s IO Database usage which was calculated by lve-stats. - -Also for different types of database load (for example in case, there is a huge amount of shot requests), CPU usage charts for LVE and database can be different. - -Take a look on this chart: - -![](/images/Chart2.png) - -**Blue (database) CPU usage**: - -It is calculated by MYSQL Governor and the value is identical with top/htop values. - -**Green (LVE) CPU usage**: - -It is calculated by lve-stats. The values are less on the LVE CPU usage chart because user requests are placed in the LVE only for part of the time. - -#### For what purpose are the IO limits of MySQL Governor used? - -MySQL Governor uses its limits as triggers to place user’s requests to the LVE. If user’s requests exceed MySQL Governor limits they are placed to the LVE, which already limits resource usage. After some timeout (which can be configured in the MySQL Governor config file requests will not be placed to the LVE. The next placing of the SQL requests to the LVE will occur after the next limits are exceeded. - -#### How exactly does IO limiting work for MySQL/MariaDB requests? - -There is no direct IO limitation for database treads. But in case of exceeding governor IO user limits, their requests will be placed into the LVE and CPU LVE limitation will be applied to the requests. And it’s clear that any IO load causes CPU load. So by CPU limits IO usage will be limited indirectly. - -Take a look at the next chart. The I/O load is synchronous with the CPU load. - -![](/images/Chart3.png) - -### Installation and update - -* [Installation](/cloudlinux_os_components/#installation) -* [Upgrading database server](/cloudlinux_os_components/#upgrading-database-server) - -#### Installation - -:::danger IMPORTANT -Please note that MariaDB 10.4 release isn’t supported by cPanel, thus you can’t install this version with MySQL Governor + cPanel. More details are available here: [https://features.cpanel.net/topic/maria-10-4-support](https://features.cpanel.net/topic/maria-10-4-support). -::: - -::: danger IMPORTANT -Please make full database backup (including system tables) before you upgrade MySQL or switch to MariaDB. This action will prevent data loss in case if something goes wrong. -::: - -**_MySQL Governor is compatible only with MySQL 5.x, 8.0; MariaDB & Percona Server 5.6._** - -To install MySQL Governor on your server install governor-mysql package at first: - -
- -``` -$ yum remove db-governor db-governor-mysql # you can ignore errors if you don't have those packages installed -$ yum install governor-mysql -``` -
- -Then configure MySQL Governor properly. - -The installation is currently supported only on cPanel, Plesk, DirectAdmin, ISPmanager, InterWorx , as well as on servers without control panel. - -If you are installing CloudLinux OS Shared on a server running MySQL already, set your current MySQL version before calling installation script: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=mysqlXX -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install -``` -
- -Please make sure to specify your current MySQL version instead of XX as follows: - -* 55 — MySQL v5.5 -* 56 — MySQL v5.6 -* 57 — MySQL v5.7 -* 80 — MySQL v8.0 (requires MySQL Governor 1.2-37+) - -If you are installing CloudLinux OS Shared on a server running MariaDB already, do instead: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=mariadbXX -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install -``` -
- -Please make sure to specify your current MariaDB version instead of XX as follows: - -* 55 — MariaDB v5.5 -* 100 — MariaDB v10.0 -* 101 — MariaDB v10.1 -* 102 — MariaDB v10.2 -* 103 — MariaDB v10.3 [requires MySQL Governor 1.2-36+; for cPanel - MySQL Governor 1.2-41+] -* 104 – MariaDB v10.4 [requires MySQL Governor 1.2-53+] -* 105 - MariaDB v10.5 [requires MySQL Governor 1.2-62+] -* 106 - MariaDB v10.6 [requires MySQL Governor 1.2-76+] - -:::tip Note -MariaDB version 10.4 is not available for CloudLinux OS Shared 6. -::: - -Installation for Percona Server 5.6 [requires MySQL Governor 1.1-22+ or 1.2-21+]: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=percona56 -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install -``` -
- - -Please note that MySQL/MariaDB/Percona will be updated from CloudLinux OS Shared repositories. - -If you are installing MySQL Governor on a server without MySQL at all, you have an opportunity to choose desired MySQL version to be installed with MySQL Governor installation script. Use --mysql-version flag before calling the installation script: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=MYSQL_VERSION -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install -``` -
- - MYSQL_VERSION could be chosen from the list of versions currently supported by MySQL Governor : - -| | | -|-|-| -|mysql51 |MySQL v5.1 | -|mysql55 |MySQL v5.5 | -|mysql56 |MySQL v5.6 | -|mysql57 |MySQL v5.7 | -|mysql80 |MySQL v8.0 (requires MySQL Governor 1.2-37+)| -|mariadb55 |MariaDB v5.5 | -|mariadb100 |MariaDB v10.0 | -|mariadb101 |MariaDB v10.1 | -|mariadb102 |MariaDB v 10.2 | -|mariadb103 |MariaDB v 10.3 [requires MySQL Governor 1.2-36+; for cPanel - MySQL Governor 1.2-41+] | -|mariadb104 |MariaDB v 10.4 [requires MySQL Governor 1.2-53+]| -|mariadb105 |MariaDB v 10.5 [requires MySQL Governor 1.2-62+]| -|mariadb106 |MariaDB v 10.6 [requires MySQL Governor 1.2-76+]| -|percona56 | Percona Server v 5.6 | - -Generally, stable and beta channels contain different version of MySQL packages - beta contains newer version than stable or the same one. If you would like to install beta packages, use --install-beta flag instead of --install when calling installation script: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install-beta -``` -
- - -Starting with MySQL Governor version 1.2 when installing MySQL/MariaDB MySQL Governor asks for a confirmation of a database version to be installed. To avoid such behavior for the automatic installations, please use --yes flag. - -For example: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install --yes -``` -
- - -Please note that restore of previous packages in case of failed installation would also be confirmed with `--yes` flag. - -::: danger IMPORTANT -Use --yes flag on your own risk, because it confirms installation in any case - even in case if there are troubles during installation (for example, network problems causing incomplete download of packages), everything would be confirmed. -::: - -:::tip Note -See also [MySQL Governor CLI](/command-line_tools/#mysql-governor) -::: - -#### Upgrading database server - -::: danger Important -Upgrade from MySQL 8 to MariaDB 10.x isn't supported due to compatibility issues between these database server versions and will break your database server completely. You can find more information about the compatibility issues [here](https://mariadb.com/kb/en/upgrading-from-mysql-to-mariadb/) -::: - -:::warning Warning -Please note that DB Governor is capable of upgrading your database to a newer version, including sequential upgrades, but we make no guarantee that such upgrades do not affect the operation of the database, its components, control panel operation and other functions of database. Always create a backup copy of your data. -::: - -In order to change MySQL version you should run the following commands: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=MYSQL_VERSION -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install -``` -
- -where `MYSQL_VERSION` is the target database server version that should be replaced with the value from the table above. - -::: danger IMPORTANT -Make sure you have full database backup (including system tables) before you switch. This action will prevent data loss in case if something goes wrong. -::: - -### Uninstalling - -To remove MySQL Governor: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --delete -``` -
- -The script will install original MySQL server, and remove MySQL Governor. - -### Configuration and operation - -* [Configuration](/cloudlinux_os_components/#configuration-3) -* [Modes of operation](/cloudlinux_os_components/#modes-of-operation) -* [MySQL Governor limits](/cloudlinux_os_components/#mysql-governor-limits) -* [Starting and stopping](/cloudlinux_os_components/#starting-and-stopping) -* [Mapping a user to a database](/cloudlinux_os_components/#mapping-a-user-to-a-database) -* [Log files](/cloudlinux_os_components/#log-files) -* [Change MySQL version](/cloudlinux_os_components/#change-mysql-version) -* [PrivateDevices mode support](/cloudlinux_os_components/#privatedevices-mode-support) - -#### Configuration - - -:::warning Warning -The "All" mode will be deprecated starting from September 1, 2021. You can read more [here.](https://blog.cloudlinux.com/mysql-governor-moving-from-all-to-abusers) -::: - - MySQL Governor configuration is located in /etc/container/mysql-governor.xml - -It is best to modify it using [dbctl](/command-line_tools/#dbctl) tool. - -Once configuration file is updated, please, restart the MySQL Governor using: - -
- -``` -$ service db_governor restart -``` -
-Example configuration: -
- -``` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` -
- -These values can also be set using [cloudlinux-config](/command-line_tools/#cloudlinux-config) CLI utility - - -#### Modes of operation - - -:::warning Warning -The "All" mode will be deprecated starting from September 1, 2021. You can read more [here.](https://blog.cloudlinux.com/mysql-governor-moving-from-all-to-abusers) -::: - -:::tip Note -MySQL Governor 1.0+ -::: - -**Active modes** - -* **abusers - Use LVE for a user to restrict queries (default mode)**: In that mode, once user goes over the limits specified in the MySQL Governor , all customer's queries will execute inside that user's LVE. We believe this mode will help with the condition when the site is still fast, but MySQL is slow (restricted) for that user. If someone abuses MySQL, it will cause queries to share LVE with PHP processes, and PHP processes will also be throttled, causing fewer new queries being sent to MySQL. _Requires [`dbuser-map` file](/cloudlinux_os_components/#mapping-a-user-to-a-database)_. -* **off - Monitor Only**: In that mode MySQL Governor will not throttle customer's queries, instead it will let you monitor the MySQL usage to see the abusers at any given moment in time (and historically). This mode is good when you are just starting and want to see what is going on. - ---- - -**Deprecated modes** - -* **all - Always run queries inside user's LVE (will be deprecated on September 1, 2021)**: This way there is no need for separate limits for MySQL. Depending on overhead we see in the future, we might decide to use it as a primary way of operating MySQL Governor . The benefit of this approach is that limits are applied to both PHP & MySQL at the same time, all the time, preventing any spikes whatsoever. _Requires [`dbuser-map` file](/cloudlinux_os_components/#mapping-a-user-to-a-database)_. -* **single - Single restricted's LVE for all restricted customers (deprecated)**: In that mode once customer reaches the limits specified in the MySQL Governor , all customer's queries will be running inside LVE with id 3. This means that when you have 5 customers restricted at the same time, all queries for all those 5 customers will be sharing the same LVE. The larger the number of restricted customers - the less resources per restricted customer will be available. -* **on** - Synonym for **single** mode - -:::warning Note -After the `all` mode will be deprecated on September 1, 2021: -* the users, having it, will continue to work with this mode; -* all new installation will not have the `all` mode; -* moving to the `all` mode will be forbidden. -::: - -If the `dbuser-map` file is absent on the server, the `abusers` mode emulates the `single`. - -With the `single` and `abusers` mode, once user is restricted, the queries for that user will be limited as long as user is using more than limits specified. After a minute that user is using less, we will unrestricted that user. - -You can specify modes of operation using [dbctl](/command-line_tools/#dbctl) or by changing [configuration file](/cloudlinux_os_components/#configuration-3). - -#### MySQL Governor limits - -**MySQL Governor limit setting recommendations** - -:::tip Note -Please note that these recommendations on setting limits for MySQL Governor are general. The exact values of the limits for the effective work of MySQL and the site as a whole depend on many factors. -::: - -Here they are: - -* the load of the virtual server with incoming requests -* the database size -* SQL queries efficiency -* absolute values of the LVE limits - - -MySQL Governor allows setting the burstable limits for accounts. To provide that possibility, four levels of limits are defined: `current`, `short`, `middle`, and `long`. Correctly set limits can give users more CPU without having a bottleneck on MySQL. - -**General principles of choosing the limits**: - -* `current` and `short` can be more than the LVE limit and should not be less -* setting the `current` and `short` limits more than the LVE limit prevents bottlenecks in SQL request processing -* `middle` limit can be more or less that the LVE limit -* `long` on the contrary, should not be more than the LVE limit -* setting the `middle` and `long` limits less than the LVE limit prevents abuse of other processes in the account (Apache, PHP) by MySQL - -**Example of choosing MySQL Governor limits** - -* With the default LVE SPEED limit is `100`, the possible values of the MySQL Governor CPU limits can be 250/150/110/90. I.e., we admit the short-term exceeding of the limits for processing SQL requests. -* If you face spike CPU consumption with these limits, it is recommended to reduce the excess of the `current` and `short` limits over the LVE limit. For example, to the values 150/110/100/90. -* If the average level of CPU consumption is too high, then it is recommended to reduce the `middle` and `long` limits, too. For example, to the values 150/100/80/50. -* Then MySQL processes will fall into LVE and be limited by LVE limits more often. -* The same clues are applicable to the IO limits – the `current` and `short` IO limits for MySQL Governor can exceed IO LVE limits, but the `middle` and `long` cannot. - - -#### Starting and stopping - -To start: -
- -``` -$ service db_governor start -``` -
- -To stop: -
- -``` -$ service db_governor stop -``` -
- -#### Mapping a user to a database - - -**[** **MySQL Governor** **1.x]** - -Traditionally MySQL Governor used prefixes to map user to database. With the latest version, we automatically generate user -> database user mapping for cPanel , Plesk and DirectAdmin control panels. - -The mapping file is recreated daily by cron. - -Mapping recreation is also triggered by the following events on cPanel servers: - -* creation of user -* modification of user -* removal of user - -You can also rebuild the mapping file manually on cPanel, Plesk and DirectAdmin control panels by running the following command: - -``` -/usr/share/lve/dbgovernor/mysqlgovernor.py --dbupdate -``` - -The mapping file is located in: `/etc/container/dbuser-map` - -The format of the file: -
- -``` -[dbuser_name1] [account_name1] [UID1] -... -[dbuser_nameN] [account_nameN] [UIDN] -``` -
-For example: - -
- -``` -pupkinas_u2 pupkinas 502 -pupkinas_u1 pupkinas 502 -pupkinas_u3 pupkinas 502 -pupkin2a_uuu1 pupkin2a 505 -pupkin10_p10 pupkin10 513 -pupkin5a_u1 pupkin5a 508 -pupkin3a_qq1 pupkin3a 506 -pupkin3a_test22 pupkin3a 506 -pupkin3a_12 pupkin3a 506 -``` -
- -This would specify that db users: pupkinas_u2, pupkinas_u1, pupkinas_u3 belong to user pupkinas with uid (lve id) 502 -db user pupkin2a_uuu1 belongs to user pupkin2a with uid 505, etc... - -`db_governor` service checks this file for modifications every 5 minutes. - -If you need to force reload the mapping file, run: -
- -``` -service db_governor restart -``` -
- -#### Log files - - - **Error_log** - - MySQL Governor error log is used to track any problems that MySQL Governor might have - - **Restrict_log** - -Restrict log is located in /var/log/dbgovernor-restrict.log - -Restrictions: -
- -``` -_timestamp_ _username_ LIMIT_ENFORCED _limit_setting_ __current_value_ _restrict_level__ SERVER_LOAD TRACKED_VALUES_DUMP - ... -``` -
- -* TRACKED_VALUES_DUMP=busy_time:xx,cpu_time:xx,... -* SERVER_LOAD = load averages followed by output of vmstat -* TRACKED_VALUES_DUMP is available with MEDIUM & LONG format -* SERVER_LOAD is available with LONG format - - **Kill_log** - - MySQL Governor kill log is optional log located in the /var/log/dbgovernor-kill.log. Kill log is used to track all killed queries - -#### Change MySQL version - - -If you would like to change to a different MySQL version, or switch to MariaDB you have to start by backing up existing databases. - -::: tip Note -For experienced users only. Changing MySQL version is a quite complicated procedure, it causes system table structural changes which can lead to unexpected results. Think twice before proceeding. -::: - -::: danger IMPORTANT -Please make full database backup (including system tables) before you will do upgrade of MySQL or switch to MariaDB. This action will prevent data losing in case if something goes wrong. -::: - -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --mysql-version=MYSQL_VERSION -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install -``` -
- -* If you are using cPanel or DirectAdmin - recompile Apache . - -To install beta version of MySQL: -
- -``` -$ /usr/share/lve/dbgovernor/mysqlgovernor.py --install-beta -``` -
- - MYSQL_VERSION can be one of the following: - -| | | -|-|-| -| auto | default version of MySQL for given OS release (or cPanel settings)| -|mysql51 | MySQL v5.1| -|mysql55 | MySQL v5.5| -|mysql56 | MySQL v5.6| -|mysql57 | MySQL v5.7| -|mysql80 | MySQL v8.0 (requires MySQL Governor 1.2-37+)| -|mariadb55 | MariaDB v5.5| -|mariadb100 | MariaDB v10.0| -|mariadb101 | MariaDB v10.1| -|mariadb102 | MariaDB v 10.2| -|mariadb103 | MariaDB v 10.3 [requires MySQL Governor 1.2-36+; for cPanel - MySQL Governor 1.2-41+ ]| -|mariadb104 |MariaDB v 10.4 [requires MySQL Governor 1.2-53+]|| -|percona56 | Percona v 5.6| - -* We don't recommend to downgrade from MySQL v5.6, MariaDB 10.x - - -:::tip Note -cPanel does not officially support MariaDB 10.4, that is why we don’t recommend to use it on cPanel servers. Use on your own risk for Plesk servers, because downgrade can corrupt your databases. -::: - -:::tip Note -MariaDB version 10.4 is not available for CloudLinux OS Shared 6 yet. -::: - -:::tip Note -See also MySQL Governor [CLI](/command-line_tools/#mysql-governor) -::: - -#### PrivateDevices mode support - -MySQL Governor v. 1.2-66 and later on Cloudlinux OS Shared 7 and 8 supports the PrivateDevices mode for the mysqld service. - -To switch on the PrivateDevices mode, follow these steps. - -**On Cloudlinux OS Shared 7** - -* Make sure that the systemd version is at least **219-78.2.cloudlinux.1** -* Add the following instruction into the _Service_ section of the _mysqld_ service file: - ``` - PrivateDevices=true - ``` -* Invoke `systemctl daemon-reload` -* Restart _mysqld_ service - - -**On Cloudlinux OS Shared 8** - -* Add the following instructions into the _Service_ section of the _mysqld_ service file: - ``` - PrivateDevices=true - DeviceAllow=/dev/lve - BindPaths=/dev/lve - ``` -* Invoke `systemctl daemon-reload` -* Restart _mysqld_ service - -### Backing up MySQL - -On cPanel server disable MySQL service monitoring before doing the job: -
- -``` -$ whmapi1 configureservice service=mysql enabled=1 monitored=0 -``` -
- -Execute as root : -
- -``` -$ mkdir -p ~/mysqlbkp -$ service mysql restart --skip-networking --skip-grant-tables -$ mysql_upgrade -$ mysqldump --all-databases --routines --triggers > ~/mysqlbkp/dbcopy.sql -$ service mysql stop -$ cp -r /var/lib/mysql/mysql ~/mysqlbkp/ -$ service mysql start -``` -
- -On cPanel server enable monitoring back: -
- -``` -$ whmapi1 configureservice service=mysql enabled=1 monitored=1 -``` -
- -::: tip Note -This operation may take some time. -::: - -See also [MySQL Governor CLI tools](/command-line_tools/#mysql-governor). - -### MySQL Governor improvements for CPU calculation - -In MySQL Governor version 1.2-81, we provide improvements in the algorithm of calculation user CPU usage. New behavior helps to increase precision of resource distribution between server users. By default the new type of CPU usage calculation is tuned on. - -Server administrator can turn on/off the new type of CPU usage calculation by using the following command: - -``` -dbctl --lve-improved-accuracy off -``` - -#### What is the impact of improvements? - -The calculation of CPU usage has become more accurate, so the `dbtop` utility provides more correct information to the MySQL Governor and it places user’s requests to the LVE in a proper moment. And as a result, such improvements reduce the possibility of absorbing whole server resources by one user. - -One mpre possible outcome of calculation improvements is that some server users will become in need of MySQL Governor limits reconfiguration. - -#### How to view the impact of improvements? - -Let’s check the CPU usage charts from CloudLinux statistics (lve-stats). - -**The new type of  CPU usage calculation is turned off**. - -In this case, CPU usage by database could be less than LVE average CPU usage (blue chart is lower than green chart): - -![](/images/NewTurnedOff.png) - -**The new type of  CPU usage calculation is turned on**. - -In this case, CPU usage by database become more similar to LVE average CPU usage (blue chart and green chart on the sceen): - -![](/images/NewTurnedOn.png) - -### FAQ - -#### How is interaction between MySQL Governor and LVE organized? - -The main purpose of MySQL Governor is to monitor how many common resources are used by each user for working with MySQL/MariaDB and to manage usage restrictions for such resources by LVE containers. - -Before any SQL request, MySQL Governor determines which user sent the request and if this user exceed limits, the MySQL Governor pushes the request to appropriate LVE container. - -This is how common server resources can be managed. - -#### Why the СPU/IO charts are different for database and LVE usage? - -SQL requests are not limited inside LVE, so there are not any calculations for IO usage there. It can be clearly viewed via the lve-stats charts: - -![](/images/Chart1.png) - -**Blue chart (database)**: - -This is the user’s real IO Database usage which was calculated by MySQL Governor. - -**Green chart (LVE)**: - -This is the user’s IO Database usage which was calculated by lve-stats. - -Also for different types of database load (for example in case, there is a huge amount of shot requests), CPU usage charts for LVE and database can be different. - -Take a look on this chart: - -![](/images/Chart2.png) - -**Blue (database) CPU usage**: - -It is calculated by MYSQL Governor and the value is identical with top/htop values. - -**Green (LVE) CPU usage**: - -It is calculated by lve-stats. The values are less on the LVE CPU usage chart because user requests are placed in the LVE only for part of the time. - -#### For what purpose are the IO limits of MySQL Governor used? - -MySQL Governor uses its limits as triggers to place user’s requests to the LVE. If user’s requests exceed MySQL Governor limits they are placed to the LVE, which already limits resource usage. After some timeout (which can be configured in the MySQL Governor config file requests will not be placed to the LVE. The next placing of the SQL requests to the LVE will occur after the next limits are exceeded. - -#### How exactly does IO limiting work for MySQL/MariaDB requests? - -There is no direct IO limitation for database treads. But in case of exceeding governor IO user limits, their requests will be placed into the LVE and CPU LVE limitation will be applied to the requests. And it’s clear that any IO load causes CPU load. So by CPU limits IO usage will be limited indirectly. - -Take a look at the next chart. The I/O load is synchronous with the CPU load. - -![](/images/Chart3.png) - - - -### Troubleshooting - -**MariaDB 5.5 and MariaDB 10.0: How to set LimitNOFILE correctly for systemd.** - - MariaDB 5.5 and MariaDB 10.0 have only file for managing the service, but the file has LSB functions, so it is supported by `systemd` . - -For adding extra limits, do the following: - -1. Run: - -
- -``` -mkdir /etc/systemd/system/mariadb.service.d/ -``` -
- -2. Run: - -
- -``` -touch /etc/systemd/system/mariadb.service.d/limits.conf -``` -
- -3. Add the following content to the the file `/etc/systemd/system/mariadb.service.d/limits.conf` : - -
- -``` -[Service] -LimitNOFILE=99999 -``` -
- -**MySQL Governor lost connection to MySQL - “Can't connect to mysql” messages in /var/log/dbgovernor-error.log (Plesk and DirectAdmin)** - -This may be caused by changing root/administrator credentials without updating MySQL Governor configuration file. - -When you change root or administrator credentials in Plesk or DirectAdmin, you also need to update MySQL Governor configuration file. This could be done with the following command (available since governor-mysql 1.2-38): - -
- -``` -/usr/share/lve/dbgovernor/mysqlgovernor.py --update-config-auth -``` -
- -The command updates credentials in MySQL Governor configuration file and restarts `db_governor` service afterwards. - -After applying the command MySQL Governor successfully connects to MySQL. - -### Known limitations - -#### I/O LVE limits don't work for user’s SQL queries - -In the MySQL Governor default mode, once users go over the limits, all their SQL queries will execute inside that user's LVE. - -This technique was provided with the early 1.1.5 version of MySQL Governor. - -It turned out that memory limitation for MySQLrequests causes the OOM (Out Of Memory) issues and as a result database corruptions. So, it was decided not to apply LVE memory limits for SQL queries supplied by MySQL Governor. But the internal implementation of LVE is such that I/O and memory limits work together. That’s why the I/O LVE limits do not apply for user’s SQL queries now. - -Nevertheless, SQL queries inside LVE are restricted by CPU limit which indirectly limits I/O usage, too. - - -## PHP Selector - -### General information and requirements - -The main requirements: - -* CageFS is installed -* Alt-PHP packages are installed -* Mod_suexec is installed. You can find installation instruction [here](/cloudlinux_os_components/#apache-suexec-module) -* CageFS is initialized without errors -* CageFS is enabled for a domain user-owner -* An appropriate PHP handler is selected for PHP version which is system version. PHP Selector is **compatible** with the following technologies: _suPHP, mod_fcgid, CGI (suexec), LiteSpeed_. See also [Compatibility Matrix](/limits/#compatibility-matrix). -* PHP version in the CloudLinux OS Shared PHP selector does not equal to the Native PHP version - -::: tip Note -PHP Selector is not supported for H-Sphere. -::: - -::: tip Note -PHP Selector requires native PHP to be installed, otherwise you will get an error message with a proposal to install PHP package. -Here are some instructions for different control panels: -1. [for cPanel](https://documentation.cpanel.net/display/EA4/EasyApache+4+and+the+ea-php-cli+Package) -2. [for Plesk](https://support.plesk.com/hc/en-us/articles/115004177974-How-to-install-PHP-by-OS-vendor-in-Plesk-for-Linux) -3. [for DirectAdmin](https://help.directadmin.com/item.php?id=345) - -After installing native PHP, please run the `cloudlinux-selector setup --interpreter=php --json` command in order to reconfigure CageFS and LVE Manager. -::: - -### Installation and update - -* [Update](/cloudlinux_os_components/#update) - -The installation of PHP Selector presumes that you already have [CageFS](/cloudlinux_os_components/#cagefs) & [LVE Manager](/lve_manager/) installed. - -Use [compatibility matrix](/limits/#compatibility-matrix) to check if your Web Server/PHP mode is supporting PHP Selector. If not, you need a change to one of the supported models. - -Installation of different versions of PHP & modules: -
- -``` -$ yum groupinstall alt-php -``` -
- -Update CageFS & LVE Manager with support for PHP Alternatives: -
- -``` -$ yum update cagefs lvemanager -``` -
- -**cPanel/WHM**: Make sure 'Select PHP version' is enabled in Feature Manager . - -:::warning IMPORTANT -Please, do not use settings like `SuPHP_ConfigPath`, `PHPRC`, `PHP_INI_SCAN_DIR`. Do not redefine path to `php.ini` and ini-files for PHP modules. Doing that can break PHP Selector functionality. -::: - -For example, alternative php5.2 versions should load `/opt/alt/php52/etc/php.ini` file and scan `/opt/alt/php52/etc/php.d` directory for modules: -
- -``` -Configuration File (php.ini) Path /opt/alt/php52/etc -Loaded Configuration File /opt/alt/php52/etc/php.ini -Scan this dir for additional .ini files /opt/alt/php52/etc/php.d -additional .ini files parsed /opt/alt/php52/etc/php.d/alt_php.ini -``` -
- -Those are default locations for alt-php. - -If you need custom PHP settings per user, please change them via "Edit PHP settings" feature of PHP Selector . - -If a list of default modules is absent on the server in the `/etc/cl.selector/defaults.cfg` file for some alt-PHP version and there is `nd_mysqli` extension in this version, then on installation/update of the LVE Manager the `mysqli` extension will be disabled and `nd_mysqli` extension will be enabled automatically. - -* If _nd_mysqli_ module is absent or a list of enabled modules is available, then they won't be changed automatically. -* If alt-PHP is not installed on LVE Manager installation/update, then they won’t be changed automatically. - -To change the modules status (enabled/disabled) manually, run the following command in a console: -
- -``` -# /usr/sbin/cloudlinux-selector make-defaults-config --json --interpreter=php -``` -
- -#### Update - -To update PHP Selector, run the following command: -
- -``` -yum groupupdate alt-php -``` -
- -This command allows to install newly released versions in PHP Selector. - -:::tip Note -See also PHP Selector [CLI](/command-line_tools/#php-selector) -::: - -### Installation instructions for cPanel users - -1. Install CageFS as root via SSH: - -
- -``` -yum install cagefs -``` -
- -2. Install `alt-php` packages as root: - -
- -``` -yum groupinstall alt-php -``` -
- -3. Install `mod_suexec` package as root. See installation instructions [here](/cloudlinux_os_components/#installation-5). -4. Verify that CageFS is initialized successfully. - - * via SSH by running the following command: - -
- - ``` - cagefsctl --check-cagefs-initialized - ``` -
- - * via cPanel admin interface - - Go to cPanel → Admin interface → LVE Manager → Dashboard → click _Refresh_ - - ![](/images/cageFS-verify.png) - - If there is a problem you can see _Not initialized_ - - ![](/images/not-initialized.png) - -5. Initilize CageF (if it is not initialized) - - * Via SSH - -
- - ``` - cagefsctl --init - ``` -
- - * Via cPanel admin interface - - Go to cPanel → Admin interface → LVE manager → Options → CageFS INIT - - ![](/images/CageFS-init.png) - - If CageFS was initialized after refreshing Dashboard you will see that CageFS is enabled: - - ![](/images/CageFS-enabled.png) - -6. Enable CageFS to a user - - Go to cPanel → Admin interface → LVE manager → Users - - ![](/images/enable-CageFS-to-user.png) - - * For one user by individual slider (for LVE 1001 in the picture above) - * For a group of user by the _CageFS_ button (for LVE 1002 and 1003 in the picture above) - -7. Check that system PHP version is not `alt-php` (it should be `ea-php`) - - Go to cPanel → Admin interface → MultiPHP Manager → PHP versions - - ![](/images/check-ea-php.png) - -8. Check that an appropriate PHP handler is selected for PHP version which is system version - - Go to cPanel Admin interface → MultiPHP Manager → PHP Handlers - - ![](/images/php-handlers.png) - -9. Check version for domain in MultiPHP Selector. It should be equal to the system default version - -Go to cPanel Admin interface → MultiPhp Manager → PHP versions → scroll to _Set PHP Version per Domain_ - -10. Version for domain in User’s interface in PHP Selector should not be equal to the Native version. - - -### LiteSpeed support - -::: tip Note -LiteSpeed detects CloudLinux OS Shared and applies all settings out-of-the-box. -::: - -:::tip Note -If your LiteSpeed is installed to a non-standard, custom location path, create a symlink: `ln -s /path/to/custom/lsws /usr/local/lsws` then run `cagefsctl --setup-cl-selector`. -::: - -If the settings were not applied, you can use the following steps to set up LiteSpeed to use PHP Selector. - -1. Follow PHP Selector [installation guide](/cloudlinux_os_components/#installation-and-update-4). -2. Make sure the following settings are set in the LSWS Web Admin console: - * Configuration ➞ Server ➞ General ➞ CloudLinux OS Shared: `CageFS` or `CageFS without suEXEC` - * Configuration ➞ Server ➞ General ➞ PHP suEXEC: `Yes` - -**How to set up LiteSpeed version 5.3+ to use PHP Selector** - -**For Plesk** - -![](/images/LiteSpeedForPlesk.png) - -**For other control panels** - -![](/images/LiteSpeedForOtherCP.png) - -Additionally, we recommend setting up the following parameters: - -* Configuration ➞ Server ➞ PHP: -* Click _Edit_ in the PHP Handler Defaults section -* Set _Yes_ in the _Run On Startup_ -* Make sure to set _Max Idle Time_ (for example to 140) - -![](/images/LiteSpeedAdditionSettings.png) - -**How to set up LiteSpeed version lower than 5.3 to use PHP Selector** - -Go to the _External App_ tab, _External Application_ ➞ Add. - -![](/images/LiteSpeedExternalAppTab.png) - -* The _Command line_ should be `/var/www/cgi-bin/cgi_wrapper/cloudlinux_wrapper` on Plesk. -* For other control panels, the _Command line_ should be `/usr/local/bin/lsphp`. -* The _Run On Start Up_ line must contain `Yes` or `No`. - -**For Plesk** - -![](/images/LiteSpeedPlesk.png) - -**For other control panels** - -![](/images/LiteSpeedOtherCP.png) - - -Settings in text format: - -| | | -|-|-| -|Name|`lsphp_selector`| -|Address|`uds://tmp/lshttpd/lsphp_selector.sock`| -|Notes|Not Set| -|Max Connections|`35`| -|Environment|`PHP_LSAPI_MAX_REQUESTS=5000`
`PHP_LSAPI_CHILDREN=35`| -|Initial Request Timeout (secs)|`60`| -|Retry Timeout (secs)|`0`| -|Persistent Connection|`Yes`| -|Connection Keepalive Timeout|Not Set| -|Response Buffering|`No`| -|Auto Start|`Through CGI Daemon (Async)`| -|Command|* For Plesk `/var/www/cgi-bin/cgi_wrapper/cloudlinux_wrapper`
* For other control panels `/usr/local/bin/lsphp`| -|Back Log|`100`| -|Instances|`1`| -|suEXEC User|Not Set| -|suEXEC Group|Not Set| -|umask|Not Set| -|Run On Start Up|`Yes`| -|Max Idle Time|`70`| -|Priority|`0`| -|Memory Soft Limit (bytes)|`2047M`| -|Memory Hard Limit (bytes)|`2047M`| -|Process Soft Limit|`400`| -|Process Hard Limit|`500`| - -Go to the _Script Handler_ tab. For required suffixes, change the _Handler Name_ to `lsphp_selector`. - -![](/images/LiteSpeedHandlerName.png) - - -![](/images/LiteSpeedScriptHandler.png) - -:::tip Note -In order to use PHP Selector and custom php.ini, lsphp5 needs to be in SuEXEC non-daemon mode. -::: - -:::tip Note -Some PHP configurations require more memory for SuExec to work properly. If you are getting error 500 after switching suEXEC to non-daemon mode, try to increase Memory Soft Limit and Memory Hard Limit for external App to at least 650/800M. -::: - - -### ISPmanager support - - -As of July 2013, PHP Selector support for ISPmanager is limited to command line utilities. You should still be able to use it. - -As always, PHP Selector requires CGI, FCGI or suPHP to work. - -You will need to do following modifications: - -Create new file /usr/local/bin/php-cgi-etc: -
- -``` -#!/bin/bash -/usr/bin/php-cgi -c /etc/php.ini "$@" -``` -
-Make that file executable: -
- -``` -$ chmod +x /usr/local/bin/php-cgi-etc -``` -
-Edit file /usr/local/ispmgr/etc/ispmgr.conf - -Add a line: -
- -``` -path phpcgibinary /usr/local/bin/php-cgi-etc -``` -
- -Make sure there is no other lines with `path phpcgibinary` defined in the file. - -Restart ISPmanager : -
- -``` -$ killall ispmgr -``` -
- -After that FCGID wrappers (`/var/www/[USER]/data/php-bin/php`) for new users will be like this: - - #!/usr/local/bin/php-cgi-etc - -You might need to edit/modify wrappers for existing users if you want them to be able to use PHP Selector. You can leave them as is for users that don't need such functionality. - -### Uninstalling - -* [Disabling PHP extension globally](/cloudlinux_os_components/#disabling-php-extension-globally) - -It is not possible to remove PHP Selector from the system completely as it is an essential part of LVE Manager and CageFS packages. However, you can make PHP Selector unavailable for cPanel and Plesk users. - -To do so, go to _LVE Manager → PHP Selector_ and check _Disabled_ as PHP Selector status. Doing so allows you to disable web-interface of the PHP Selector in the user interface but does not reset custom settings (choosing a version of PHP and modules). - -To disable PHP Selector and make it has no effect on a PHP version on the sites, run the following command: - -* this command resets PHP versions to Native: - -
- -``` -cagefsctl --cl-selector-reset-versions -``` -
- -* this command resets PHP modules to Default: - -
- -``` -cagefsctl --cl-selector-reset-modules -``` -
- -::: danger -These commands can affect PHP version of your clients’ web sites. Use them with caution as improper usage might cause your clients’ web sites down. -::: - -:::tip Note -It is possible to manually uninstall the integral parts of PHP Selector - **alt-php** packages. However, since CloudLinux OS components heavily rely on them, we do not recommend doing so. Proceed with caution and keep an eye on yum dependencies if you decide to uninstall the packages. -::: - -#### Disabling PHP extension globally - -If you want to disable PHP extension globally, you don't need to remove file /opt/alt/phpXX/etc/php.d.all/$EXTENSION.ini . You should just comment out "extension=" directives in it. - -The extension will be visible in PHP Selector interface, but selecting it in users's interface will take no effect - extension will be disabled in fact. - -Reinstalling of `alt-php` packages will not reset settings (will not enable extension again). - -### Configuration and using - -* [Setting default version and modules](/cloudlinux_os_components/#setting-default-version-and-modules) -* [Individual PHP.ini files](/cloudlinux_os_components/#individual-php-ini-files) -* [How to add additional php.ini file for a user inside CageFS](/cloudlinux_os_components/#how-to-add-additional-php-ini-file-for-a-user-inside-cagefs) -* [Substitute global php.ini for individual customer](/cloudlinux_os_components/#substitute-global-php-ini-for-individual-customer) -* [How to substitute global php.ini for individual customer on cPanel server with EasyApache4](/cloudlinux_os_components/#how-to-substitute-global-php-ini-for-individual-customer-on-cpanel-server-with-easyapache4) -* [Managing interpreter version](/cloudlinux_os_components/#managing-interpreter-version) -* [Including PHP Selector only with some packages - cPanel](/cloudlinux_os_components/#including-php-selector-only-with-some-packages-cpanel) -* [PHP extensions](/cloudlinux_os_components/#php-extensions) -* [FFmpeg](/cloudlinux_os_components/#ffmpeg) -* [Native PHP configuration](/cloudlinux_os_components/#native-php-configuration) -* [How to configure alt-php72-zts to use with PHP Selector](/cloudlinux_os_components/#how-to-configure-alt-php72-zts-to-use-with-php-selector) -* [Using](/cloudlinux_os_components/#using) -* [Custom PHP.ini options](/cloudlinux_os_components/#custom-php-ini-options) -* [End user files and directories](/cloudlinux_os_components/#end-user-files-and-directories) -* [Compiling your own extensions](/cloudlinux_os_components/#compiling-your-own-extensions) -* [Roll your own PHP](/cloudlinux_os_components/#roll-your-own-php) -* [Detect user's PHP version](/cloudlinux_os_components/#detect-user-s-php-version) -* [PHP Selector without CageFS](/cloudlinux_os_components/#php-selector-without-cagefs) -* [Configuring "global” php.ini options for all Alt-PHP versions](/cloudlinux_os_components/#configuring-global%E2%80%9D-php-ini-options-for-all-alt-php-versions) - -#### Setting default version and modules - -Administrator can set default interpreter version and extensions for all users. All file operations are actually done by CageFS. CageFS takes settings from /etc/cl.selector/defaults.cfg. Currently the /etc/cl.selector/defaults.cfg is created and handled by CloudLinux OS Shared PHP Selector scripts. It has the following format: -
- -``` -[global] -selector=enabled - -[versions] -php=5.4 - -[php5.4] -modules=json,phar - -[php5.3] -modules=json,zip,fileinfo -``` -
- - -#### Individual PHP.ini files - -For each customer, inside CageFS, file alt_php.ini is located in /etc/cl.php.d/alt-phpXX (XX - version of PHP, like 52 or 53). The file contains PHP extension settings and extension directives selected by customer. This file exists for each customer, for each PHP version. - -Note, that this is 'local' to CageFS, and different users will have different files. The file is not visible in /etc/cl.php.d outside CageFS. If you would like to view that file, use: -
- -``` -# cagefsctl -e USERNAME -``` -
- -to enter into CageFS for that user. Then type: `exit` ; to exit from CageFS - -This file has to be updated using `cagefsctl --rebuild-alt-php-ini` after updating alt-php RPMs - -Admin can change individual settings for PHP extensions by changing that extension's ini file, like editing /opt/alt/php54/etc/php.d.all/eaccelerator.ini and then running: -
- -``` -cagefsctl --rebuild-alt-php-ini -``` -
-to propagate the change. - -#### How to add additional php.ini file for a user inside CageFS - -If you want to create additional `php.ini` file for a user inside CageFS in order to change some specific PHP options for that user, you can execute the following: - -
- -``` -# su -s /bin/bash - USER -# cd /etc/cl.php.d/alt-php72/ -# echo "upload_tmp_dir=/tmp" >> custom.ini -``` -
- -The commands above create `custom.ini` file that will be used for `alt-php72`. By default this approach is valid only for alt-php version selected via PHP Selector. When `/etc/cl.selector/symlinks.rules` file contains `php.d.location = selector` line, then the approach is valid for all alt-php versions regardless whether it is selected in PHP Selector or not. - -You can find more details [here](/cloudlinux_os_components/#bundled-php-extensions). - -But the recommended way is to modify PHP options via PHP Selector web or CLI interfaces, as described [here](/cloudlinux_os_components/#custom-php-ini-options). - - - -#### Substitute global php.ini for individual customer - - -Sometimes you might want to have a single customer with a different php.ini, than the rest of your customers. - -To do that, you will use [custom.etc directory functionality](/cloudlinux_os_components/#custom-etc-files-per-customer) - -1. Move default php.ini into _/etc_ directory and create a symlink to it: - -
- -``` -$ mv /usr/local/lib/php.ini /etc/php.ini -$ ln -fs /etc/php.ini /usr/local/lib/php.ini -``` -
- -2. Change path to php.ini in _/etc/cl.selector/native.conf_ file to: - -
- -``` -php.ini=/etc/php.ini -``` -
- -3. For each user that needs custom file, create directory _/etc/cagefs/custom.etc/USER_NAME/php.ini_ . - -For example if you want to create custom for USER1 and USER2 you would create files: - _/etc/cagefs/custom.etc/USER1/php.ini_ - _/etc/cagefs/custom.etc/USER2/php.ini_ - -Create such files for each user that should have custom file. - -4. Execute: - -
- -``` -$ cagefsctl --force-update -``` -
- -::: tip Notes - -1. Make sure that `php.ini` load path is set to `/etc/php.ini` - -2. Users will be able to override settings of those php.ini files (global or custom) via PHP Selector. If you want to prevent that, you should disable PHP Selector feature. - -3. Even if PHP Selector is disabled, user can override PHP settings by using `ini_set() php` function in PHP script, or by `php -c` command line option. - -4. If you modify anything in `/etc/cagefs/custom.etc` directory, you should execute: - -
- -``` -$ cagefsctl --update-etc -``` -
- -in order to apply changes to CageFS for all users. - -OR - -
- -``` -$ cagefsctl --update-etc user1 user2 -``` -
- -to apply changes to CageFS for specific users. - -::: - -#### How to substitute global php.ini for individual customer on cPanel server with EasyApache4 - -:::tip Note -It is enough to put `php.ini` in the directory where PHP script is located in order to run the PHP script with a custom `php.ini` when using SuPHP. Also, you can use cPanel MultiPHP Manager to create user’s custom `php.ini` file, and this approach should work for CGI, FCGI, and LSAPI. Recommended ways to manage `php.ini` settings per user are to use cPanel MultiPHP or CloudLinux OS Shared PHP Selector interfaces. -::: - -1. For each user that needs custom file, create directory `/etc/cagefs/custom.etc/USER_NAME/php.ini`. - - For example, if you want to create a custom file for USER1 and USER2 you would create files: - -
- - ``` - /etc/cagefs/custom.etc/USER1/php.ini - /etc/cagefs/custom.etc/USER2/php.ini - ``` -
- - Create such files for each user that should have a custom file. - -2. Execute the following command: - -
- - ``` - $ cagefsctl --force-update - ``` -
- -3. Configure `php.ini` load path for user’s domains. - -* When using **suphp** handler, you should use `SuPHP_ConfigPath` directive in virtual host configuration for these domains, or use this directive in `.htaccess` files: `suPHP_ConfigPath/etc`. - -* When using **mod_lsapi**, you should use `lsapi_phprc` directive in virtual host configuration: `lsapi_phprc/etc/`. - You can find the detailed description of `mod_lsapi` directives [here](/cloudlinux_os_components/#configuration-references). - -* When using **FCGI** or **CGI**, you should implement custom PHP wrapper and redefine the path to `php.ini` via `-c` command line option, like below: -
- - ``` - #!/bin/bash - [ -f /etc/php.ini ] && exec /usr/bin/php -c /etc/php.ini - exec /usr/bin/php - ``` -
- -**Notes:** - -1. You should restart Apache web server after modifying virtual host configuration for the domains. -2. Custom `php.ini` may break switching PHP version via CloudLinux OS Shared PHP Selector or cPanel MultiPHP Manager for the appropriate users or domains. -3. When using cPanel ea-php for the domains, additional `php.ini` files may not be loaded, so you should load all needed PHP extensions in custom `/etc/php.ini` file: -![](/images/custom_file_cPanel1.png) -4. When using CloudLinux OS Shared alt-php, additional `php.ini` files will be loaded: -![](/images/custom_file_cPanel2.png) -5. If you have modified anything in `/etc/cagefs/custom.etc` directory, you should execute one of the following: - - * to apply changes to CageFS for all users, run: - -
- - ``` - $ cagefsctl --update-etc - ``` -
- - * to apply changes to CageFS for specific users, run: - -
- - ``` - $ cagefsctl --update-etc user1 user2 - ``` -
- - -#### Managing interpreter version - - -Managing interpreter versions is done by means of manipulating a set of symbolic links that point to different versions of interpreter binaries. For example, if default PHP binary is `/usr/local/bin/php` : - -* First we move the default binary inside CageFS to `/usr/share/cagefs-skeleton/usr/selector` , and make /usr/local/bin/php a symlink pointing to /etc/cl.selector/php . This operation is done as part of CageFS deployment. -* Next suppose we have additional PHP version, say 7.2.5. The information about all additional interpreter binaries and paths for them is kept in /etc/cl.selector/selector.conf . This config file is updated by RPM package manager each time alternative PHP package is added, removed or updated -* `/usr/bin/selectorctl --list --interpreter=php` will get us list of all available PHP interpreter versions out of /etc/cl.selector/selector.conf file . -Next we want to know which PHP version is active for a given user (to supply a selected option in options list). We type: -* `/usr/bin/selectorctl --user USERNAME --interpreter=php --user-current` will retrieve PHP version set for a particular user. The script gets the path from `/var/cagefs/LAST_TWO_DIGITS_OF_UID/USERNAME/etc/cl.selector/php` symlink, compares it with contents of /etc/cl.selector/selector.conf file and if path is valid, prints out the current interpreter version. -* `/usr/bin/selectorctl --user USERNAME --interpreter=php --set-user-current=7.2` sets the current PHP version for particular user by creating symlink in `/var/cagefs/LAST_TWO_DIGITS_OF_UID/USERNAME/etc/cl.selector` directory. All old symlinks are removed, and new symlinks are set. - - -#### Including PHP Selector only with some packages (cPanel) - - - cPanel has a ' Feature Manager ' in WHM that allows you to disable PHP Selector for some of the packages that you offer. - -In reality it only disables the icon in cPanel interface. Yet, in most cases it should be enough in shared hosting settings. - -You can find more info on ' Feature Manager ' here: [http://docs.cpanel.net/twiki/bin/view/11_30/WHMDocs/FeatureManager](http://docs.cpanel.net/twiki/bin/view/11_30/WHMDocs/FeatureManager) - - -Once PHP Selector is enabled, you can find it in the Feature Manager . Disabling it in Feature Manager , will remove the icon for users that are using that particular 'Feature List' - - - - -#### PHP extensions - -**Configuring Alt-PHP modules loading** - - - CloudLinux OS Shared PHP Selector and Alt-PHP can be used in conjunction with Plesk PHP Selector and cPanel MultiPHP . To be compatible, CloudLinux OS Shared PHP Selector works as follows: modules that are selected in CloudLinux OS Shared PHP Selector are loaded for Alt-PHP version selected in CloudLinux OS Shared PHP Selector only. For the rest Alt-PHP versions default module set is loaded ( _/opt/alt/phpXX/etc/php.d/default.ini_ ) . Described above is default behavior. - -::: tip Note -If system default PHP version selected in cPanel MultiPHP Manager is not ea-php, then default module set is loaded for all Alt-PHP versions by default (/opt/alt/phpXX/etc/php.d/default.ini). - -When "php.d.location = selector" option is in effect, modules selected via PHP Selector will be loaded for all alt-php versions. -::: - - -This behavior is implemented in CageFS-6.1-10 and later. - -In LVE Manager 1.0-9.40+ this behavior can be modified so that modules selected in CloudLinux OS Shared PHP Selector would be loaded for all Alt-PHP versions (with CageFS enabled), which can be quite useful if you use  ‘ per directory ’ or ‘ per domain ’ Alt-PHP configuration and want to select modules using CloudLinux OS Shared PHP Selector . - -To modify it, create a file _/etc/cl.selector/symlinks.rules_ (read-only for regular users) with the following content: _php.d.location = selector_ - -And run the command to apply changes: -
- -``` -/usr/bin/selectorctl --apply-symlinks-rules -``` -
-To revert to the default behavior: - -* Delete _/etc/cl.selector/symlinks.rules_ file. -* Alternatively remove _php.d.location_ option from the file. -* Alternatively set _default_ value for _php.d.location_ option. - -And run the command to apply changes: -
- -``` -/usr/bin/selectorctl --apply-symlinks-rules -``` -
- -#### FFmpeg - -:::tip Note -The PHP-FFmpeg project has not been renewed for the last few years and is not compatible with the RHEL 8 based systems. Since code for alt-PHP-FFmpeg is outdated and FFmpeg has a lot of third-party dependencies, this module is not available for CloudLinux OS Shared 8. -::: - -Due to possible patent issues CloudLinux OS Shared does not provide FFmpeg libraries ( [https://ffmpeg.org/legal.html](https://ffmpeg.org/legal.html) ). We highly recommend researching if you can legally install FFmpeg extension on your server. This might differ based on where you and your servers are located. More information can be found on the link: [https://ffmpeg.org/legal.html](https://ffmpeg.org/legal.html) - -For your convenience we provide FFMPEG PHP binding. For them to work, you need to install FFmpeg package from the “Nux Dextop” repository following the [instructions](http://li.nux.ro/repos.html). - -Once FFmpeg is installed you can install PHP bindings, by running: -
- -``` -yum install alt-php*ffmpeg -``` -
- -Enable PHP-FFmpeg extension via PHP Selector : -
- -``` -selectorctl --enable-extensions=ffmpeg --user USERNAME --version X.Y -``` -
- -#### Native PHP configuration - -PHP Selector requires access to the native PHP version for proper work. It is specified in the file `/etc/cl.selector/native.conf` of the following content (example): -
- -``` -php=/usr/bin/php-cgi -php-cli=/usr/bin/php -php.ini=/etc/php.ini -lsphp=/usr/local/bin/lsphp -php-fpm=/usr/local/sbin/php-fpm -``` -
- - -Then execute the following command to apply changes. -
- -``` -cagefsctl --setup-cl-selector -``` -
- -The file is created when installing CageFS on the servers with cPanel, Plesk, DA, Interworx and ISP Manager , if it is missing. On all other servers the file is not being created at all. - -That is why, if the file is not created automatically, then it must be created manually and correct paths must be written to its directives. - -Access permission 644 must be set: -
- -``` -chmod 0644 /etc/cl.selector/native.conf -``` -
- - -#### How to configure alt-php72-zts to use with PHP Selector - -**Requirements** - -To use `alt-php72-zts` with PHP Selector you need the following: - -* `cagefs-6.1.8-1` or later -* `alt-php72-zts-7.2.21-4` or later - -**Using zts PHP** - -1. Install `alt-php72-zts` with the following command: - -
- - ``` - yum install alt-php72-zts - ``` -
- -2. Make sure that `/etc/cl.selector/selector.conf` file contains correct paths to the PHP `zts` binaries. - - You should remove the old lines: - -
- - ``` - php 7.2 7.2.20 /opt/alt/php72/usr/bin/php-cgi - php-cli 7.2 7.2.20 /opt/alt/php72/usr/bin/php - ``` -
- - And replace them with the lines with the new paths: - -
- - ``` - php 7.2 7.2.20 /opt/alt/php72/usr/bin/zts-php-cgi - php-cli 7.2 7.2.20 /opt/alt/php72/usr/bin/zts-php - ``` -
- -3. Make sure that `/opt/alt/php72/etc/php.d.all` path refers to the directory containing `ini` files for `zts` PHP extensions: - -
- - ``` - cd /opt/alt/php72/etc - ln -fsn php.d.all.zts php.d.all - ``` -
- -4. Execute the following command: - -
- - ``` - cagefsctl --setup-cl-selector - ``` -
- - -**Using non-zts PHP** - -1. Make sure that `/etc/cl.selector/selector.conf` file contains correct paths to the `non-zts` PHP binaries. - - You should remove the old lines: - -
- - ``` - php 7.2 7.2.20 /opt/alt/php72/usr/bin/zts-php-cgi - php-cli 7.2 7.2.20 /opt/alt/php72/usr/bin/zts-php - ``` -
- -And replace them with the lines with the new paths: - -
- - ``` - php 7.2 7.2.20 /opt/alt/php72/usr/bin/php-cgi - php-cli 7.2 7.2.20 /opt/alt/php72/usr/bin/php - ``` -
- -2. Make sure that `/opt/alt/php72/etc/php.d.all` path refers to the directory containing `ini` files for `non-zts` PHP extensions: - -
- - ``` - cd /opt/alt/php72/etc - ln -fsn php.d.all.def php.d.all - ``` -
- -3. Execute the following command: - -
- - ``` - cagefsctl --setup-cl-selector - ``` -
- -#### Using - -Once PHP Selector is installed, you will see the [**Selector**](/lve_manager/#selector-tab) tab in the **LVE Manager**. - -Customers can use [PHP Selector client plugin](/lve_manager/#php-selector-client-plugin) to change their PHP Selctor related settings. - -#### Custom PHP.ini options - -PHP Selector allows customer to edit php.ini settings. Admin has a full control over which settings can be modified. - -To allow settings to be modifiable, it has to be whitelisted in `/etc/cl.selector/php.conf`. - -Here are some of the examples of allowed directives: -
- -``` -Directive = safe_mode -Type = bool -Remark = <5.4.0 -Comment = Enables PHP safe mode. This mode puts a number of restrictions on scripts (say, access to file system) mainly for security reasons. -``` -
- -
- -``` -Directive = safe_mode_include_dir -Type = value -Remark = <5.4.0 -Comment = If PHP is in the safe mode and a script tries to access some files, files from this directory will bypass security (UID/GID) checks. The directory must also be in include_path. For example: /dir/inc -``` -
- -| | | -|-|-| -|Directive | php.ini setting| -|Type | bool, value (any text), list| -|Range | list of values for list Type| -|Comment | explanation of the setting to display in UI| - -Default values, that are shown in PHP Selector web interface, are taken from '/opt/alt/phpXX/usr/bin/php -i' runtime values, if -directive is not there, it will use the output of phpinfo() function. So, if you wish to change default value of any option for -"alternative" php version, please modify /opt/alt/phpXX/etc/php.ini files (where XX = 55, 54, 53, etc according to php version). - -Admin can modify the settings using [selectorctl](/command-line_tools/#selectorctl) command. - -Users can use web interface to modify php.ini settings: - -![](/images/php_selector_options.png) - - -#### End user files and directories - -The following files and directories are created inside CageFS for each customer: - - /etc/cl.selector - PHP binaries symbolic links. - - /usr/selector/php - Native PHP binaries. - - /etc/cl.php.d/alt-php* - Links to enabled modules. - - /home/user/.cl.selector/alt_phpXX.cfg - Config file for custom PHP options. - -like: - - /etc/cl.php.d/alt-php54/fileinfo.ini - /opt/alt/php54/etc/php.d.all/fileinfo.ini - - -#### Compiling your own extensions - -Sometimes you might want to compile your own PHP extension for your users to use. In most cases, it is better to contact our support by sending us a support [ticket](https://cloudlinux.zendesk.com/hc/requests/new) . We will try to provide such extension for you via regular updates within 5-7 days. - -If you have decided that you want to build it on your own, you would need to build it for each and every supported version of PHP that you have installed. The module installation process is a bit different from standard - you would need to use the version of phpize and php-config binaries that come with particular Alt-PHP version. - -The full process for PHP 5.X and 7.X looks as follows: - -1. Download and unpack extension, cd into it's directory. - -2. Execute our version of phpize if necessary: - -
- -``` -/opt/alt/phpXX/usr/bin/phpize -``` -
- -3. Execute configure with our binary: - -
- -``` -./configure --with-php-config=/opt/alt/phpXX/usr/bin/php-config -``` -
- -4. Make the .so file: - -
- -``` -make -``` -
- -5. Copy it to the modules directory (on 32-bit server, use usr/lib/php/modules ). - -
- -``` -cp -rp modules/*.so /opt/alt/phpXX/usr/lib64/php/modules/ -``` -
- -6. Add ini file for module to `/opt/alt/phpXX/etc/php.d.all` . - -7. Register new Alt-PHP version with: - -
- -``` -$ cagefsctl --setup-cl-selector -``` -
- -#### Roll your own PHP - -To add your own PHP version in PHP Selector : - -* Create directory in (like: /opt/alt/php51), and mimic directory structure inside to be similar to the one of PHP versions bundled by CloudLinux OS Shared. -* Put all the ini files for all the modules into /opt/alt/php51/etc/php.d.all -* Create a symbolic link /opt/alt/php51/etc/php.d -> /etc/cl.php.d/alt-php51 - -Place all such files into /opt/alt/php51/usr/lib/php/modules - -Add an absolute path to PHP binaries into /etc/cl.selector/selector.conf using the following format: - -
- -``` -php 5.1 5.1.2 /opt/alt/php51/usr/bin/php-cgi -php-cli 5.1 5.1.2 /opt/alt/php51/usr/bin/php -php-fpm 5.1 5.1.2 /opt/alt/php51/usr/sbin/php-fpm - ^ ^ ^ ^----- absolute path - | | |---------------------- real version - | | -------------------------- version to display - |--------------------------------- binary to 'substitute' -``` -
- -Execute: -
- -``` -cagefsctl --setup-cl-selector -``` -
- -The new PHP version must be available now for selection in PHP Selector. - -#### Detect user's PHP version - - -:::tip Note -LVE Manager 0.5-63 or higher -::: - - PHP Selector provides an easy way to figure out which versions are available and selected for end user from the command line. You can get this information by running: - -
- -``` -$ selectorctl --interpreter=php --user-summary --user=USERNAME -``` -
- -
- -``` -The output: -5.2 e - - -5.3 e - s -5.4 e - - -5.5 e - - -native e d - -``` -
- -The first column defines the PHP version. _Native_ means native PHP version, like the one installed by cPanel with EasyApache. - -The second column will contain either **e** or **-.** If **e** is present, it means that given version is enabled, and can be selected by the end user. - -The third column can have values **d** or **-.** If **d** is present, that version is considered a 'default' version. Only one PHP version will have **d** indicator. - -The fourth column can have values **s** or **-.** If **s** is present, that is the selected version, currently being used by the end user. Only one PHP version will have **s** indicator. - -In case a user is not inside CageFS, and as such doesn't use PHP Selector , you will see the following error message: - -
- -``` -ERROR:User USERNAME not in CageFS -``` -
- -#### PHP Selector without CageFS - - -**[LVE Manager 2.0-11.1 or higher]** - - PHP Selector can now be used with CageFS turned off (in case when there is only one user account on the server). - -To install run: -
- -``` -yum groupinstall alt-phpyum install cagefs lvemanager -``` -
- -(no need to initialize or turn on CageFS) - -
- -``` -selectorctl --setup-without-cagefs USER -``` -
- -( USER - the name of a user who is using selector. If not specified, the first available cPanel account username will be used). - -When executing `--setup-without-cagefs`, the following actions are performed: - -* Creating symlinks to the user modules and options for each Alt-PHP version: - _/opt/alt/php55/link/conf/alt_php.ini -> /home/USER/.cl.selector/alt_php55.ini_ - -* In user home directory creating: - _.cl.selector/_ - -“Backup” settings files (selected version, modules, options): - _.cl.selector/defaults.cfg_ - _.cl.selector/alt_php44.cfg_ - -Symlinks to the selected version: - _.cl.selector/lsphp -> /opt/alt/php44/usr/bin/lsphp_ - _.cl.selector/php.ini -> /opt/alt/php44/etc/php.ini_ - _.cl.selector/php-cli -> /opt/alt/php44/usr/bin/php_ - _.cl.selector/php -> /opt/alt/php44/usr/bin/php-cgi_ - -Additional symlinks for environment variable $PATH (search path) in the file ~/.bashrc : - _.cl.selector/selector.path/_ - _.cl.selector/selector.path/php-cgi -> ../php_ - _.cl.selector/selector.path/php -> ../php-cli_ - -Generated ini files with selected modules and options for each version: - _.cl.selector/alt_php44.ini_ - _.cl.selector/alt_php51.ini_ - _.cl.selector/alt_php52.ini_ - _.cl.selector/alt_php53.ini_ - _.cl.selector/alt_php54.ini_ - _.cl.selector/alt_php55.ini_ - _.cl.selector/alt_php56.ini_ - _.cl.selector/alt_php70.ini_ - _.cl.selector/alt_php71.ini_ - -Symlinks above are being created according to the settings in ~/.cl.selector/defaults.cfg and ~/.cl.selector/alt_php44.cfg files (44 - corresponding PHP version), which are storing PHP Selector settings for the user. These files are usually taken from user home directory backup or when migrating account from another server. Thus, when migrating account from server to server, PHP Selector settings are saved. - -If no PHP Selector settings backup files are found when running `selectorctl --setup-without-cagefs`, then default settings from `/etc/cl.selector/defaults.cfg` global file are applied (as in selector normal mode). If the file is absent, then native PHP version will be selected for the user. - -* The following line: _PATH=$HOME/.cl.selector/selector.path:$HOME/.cl.selector:$PATH_ - -is being added to the user file `~/.bashrc` - - Apache PHP handlers settings are not changed. - -* Also `selectorctl --setup-without-cagefs` command does the following: - - * Turns off link traversal protection (linksafe); - * Turns off cagefs service. - -To get back to the selector normal mode (“with CageFS”) run: -
- -``` -selectorctl --revert-to-cagefs -``` -
- -(CageFS should be initialized by using `cagefsctl --init` command before running the command above) - -This command removes symlinks: -`/opt/alt/php55/link/conf/alt_php.ini` -> `/home/USER/.cl.selector/alt_php55.ini` -turns on link traversal protection (linksafe) and cagefs service. - -:::tip Note -See also PHP Selector [CLI](/command-line_tools/#php-selector) -::: - -#### Configuring "global” php.ini options for all Alt-PHP versions - -:::tip Note -CageFS 6.0-33 or higher, LVE Manager 2.0-11.2 or higher -::: - -There is `/etc/cl.selector/global_php.ini` file, where you can specify values of PHP options that should be applied for all Alt-PHP versions that are installed on a server. These settings will also be automatically applied to the new Alt-PHP versions that will be installed later. - -Example: - _# cat /etc/cl.selector/global_php.ini_ - _[Global PHP Settings]_ - _date.timezone = Europe/Warsaw_ - _error_log = error_log_ - _memory_limit = 192M_ -Sections are ignored. Only name of an option and a value have meaning. - -When an option is absent in _/etc/cl.selector/global_php.ini_ file, than it is not changed (applied) to php.ini for Alt-PHP versions. - - date.timezone and error_log options are handled differently than the others. When these options are not in _/etc/cl.selector/global_php.ini_ file, than values for the options will be taken from "native" php.ini file. And when the option is in php.ini for some Alt-PHP version already (and its value is not empty), than value from _/etc/cl.selector/global_php.ini_ will be NOT applied. - -:::tip Note -CageFS version 6.1.5-1 or later -::: - -The behavior above is changed for cPanel servers with EasyApache 4. The `/usr/local/lib/php.ini` file is removed for new installations of cPanel v80 and later. - -* When `/usr/local/lib/php.ini` file exists, `error_log` and `date.timezone` options will be taken from that `php.ini` file. -* When `/usr/local/lib/php.ini` file does not exist, `error_log` and `date.timezone` options will be taken from the `php.ini` file for system default PHP version selected in MultiPHP Manager. - -This functionality works when the system default PHP version is `ea-php` only. When the system default PHP version is `alt-php`, `error_log` and `date.timezone` directives will be NOT taken from that `php.ini` file. - - -To confirm changes (not affecting "date.timezone" and "error_log" options) please run: - -
- -``` -/usr/sbin/cagefsctl --setup-cl-selector -``` -
- -To confirm changes (including `date.timezone` and `error_log` options) please run: - -
- -``` -/usr/bin/selectorctl --apply-global-php-ini -``` -
-or - -
- -``` -/usr/sbin/cagefsctl --apply-global-php-ini -``` -
-(two commands above work the same way). - -If you don't want to change `error_log`, but want to change `date.timezone`, you can execute: - -
- -``` -selectorctl --apply-global-php-ini date.timezone -``` -
- -Similarly, command `selectorctl --apply-global-php-ini error_log` applies error_log and all other options specified in _/etc/cl.selector/global_php.ini_ file, except date.timezone . - -So, you can specify 0, 1 or 2 parameters from the list: error_log, date.timezone . - -Using `--apply-global-php-ini` without arguments applies all global PHP options including two above. - -Example: - -
- -``` -selectorctl --apply-global-php-ini error_log -selectorctl --apply-global-php-ini date.timezone -selectorctl --apply-global-php-ini date.timezone error_log -``` -
- -The latter command has the same effect as `/usr/bin/selectorctl --apply-global-php-ini`. - -:::tip Note -See also PHP Selector [CLI](/command-line_tools/#php-selector) -::: - - -### Integration with control panels - -* [PHP Selector integration with cPanel/WHM](https://cloudlinux.zendesk.com/hc/en-us/articles/360014084800-PHP-Selector-Integration-with-cPanel) -* [PHP Selector integration with Plesk](https://cloudlinux.zendesk.com/hc/en-us/articles/115004582105-PHP-Selector-Integration-with-Plesk-Panel) -* [PHP Selector integration with DirectAdmin](https://cloudlinux.zendesk.com/hc/en-us/articles/360010322460-PHP-Selector-Integration-with-DirectAdmin) - -This is the list of commands that we use to integrate PHP Selector with control panels. - -**PHP summary:** - -Command: -
- -``` -/usr/bin/selectorctl --summary -``` -
-Result: -
- -``` -4.4 e - -5.1 e - -5.2 e - -5.3 e - -5.4 e - -5.5 e - -5.6 e - -7.0 e - -7.1 e - -native e d -``` -
-When native PHP version needs to be displayed: - -Command: -
- -``` -/usr/bin/selectorctl --summary --show-native-version -``` -
- -Result: -
- -``` -4.4 e - -5.1 e - -5.2 e - -5.3 e - -5.4 e - -5.5 e - -5.6 e - -7.0 e - -7.1 e - -native(5.6) e d -``` -
- -The first column: PHP version -The second column: enabled or not ( e - enabled) -The third column: if selected as default ( d - default) - -**Set default version:** -
- -``` -/usr/bin/selectorctl --set-current=_VERSION_ -``` -
- -**Disable version:** - -
- -``` -/usr/bin/selectorctl --disable-alternative=_VERSION_ -``` -
- -**Enable version:** - -
- -``` -/usr/bin/selectorctl --enable-alternative=_VERSION_ -``` -
- -**List extensions for a version:** - -
- -``` -/usr/bin/selectorctl --list-extensions --version=5.6 -``` -
- -Result: -
- -``` -- apc -- bcmath -- big_int -- bitset -- bloomy -~ bz2 -- bz2_filter -~ calendar -- coin_acceptor -- crack -~ ctype -+ curl -``` -
- -+: enabled -~: included in php binary (cannot be disabled) or enabled in php global config file _/opt/alt/phpXX/etc/php.ini_ --: disabled - -**Select default extensions (enable comma-separated list of extensions globally for a version):** - -
- -``` -/usr/bin/selectorctl --version=5.6 --enable-extensions=pdo,json,mysql -``` -
- -**Deselect default extensions (disable comma-separated list of extensions globally for a version):** - -
- -``` -/usr/bin/selectorctl --version=5.6 --disable-extensions=pdo,json,mysql -``` -
- -**Replace extensions with comma-separated list of extensions for a version globally:** - -
- -``` -/usr/bin/selectorctl --version=5.6 --replace-extensions=pdo,json,mysql -``` -
- -**Select PHP version for a user:** - -
- -``` -/usr/bin/selectorctl --set-user-current=_VERSION_ --user=_USER_ -``` -
- -**List enabled extensions for a user:** - -
- -``` -/usr/bin/selectorctl --list-user-extensions --user=_USER_ --version=_VERSION_ -``` -
- -**Enable comma-separated list of extensions for a user:** - -
- -``` -/usr/bin/selectorctl --enable-user-extensions=pdo,json,mysql --user=_USER_ --version=_VERSION_ -``` -
- -**Reset user’s extensions to defaults:** - -
- -``` -/usr/bin/selectorctl --reset-user-extensions --user=_USER_ --version=_VERSION_ -``` -
- -**Replace user extensions with comma-separated list of extensions:** - -
- -``` -/usr/bin/selectorctl --replace-user-extensions=EXT_LIST --user=_USER_ --version=_VERSION_ -``` -
- - _EXT_LIST_ _a is comma separated list of PHP extensions (for example:_ _pdo,json,mysql_ ) - -**List available options for php.ini editing:** - -
- -``` -/usr/bin/selectorctl --print-options --user=_USER_ --version=_VERSION_ [--json] -``` -
- -**List available options for php.ini editing (print safe strings):** - -
- -``` -/usr/bin/selectorctl --print-options-safe --user=_USER_ --version=_VERSION_ [--json] -``` -
- -**Set php.ini options for end user:** - -
- -``` -/usr/bin/selectorctl --user=_USER_ --version=_VERSION_ --replace-options=_OPTIONS_ --base64 [--json] -``` -
- -Here is an example of how you can generate _OPTIONS_ in base64 format: - -
- -``` -OPTIONS=`echo disable_functions:exec,syslog|base64 -w 0`,`echo display_errors:off|base64 -w 0`,`echo post_max_size:128M|base64 -w 0` -echo $OPTIONS -``` -
- -See also [PHP Selector CLI tools](/command-line_tools/#php-selector). - -### Bundled PHP extensions - -Large number of PHP extensions are bundled with each version of PHP. - -* [PHP 4.4 extensions](/cloudlinux_os_components/#php-4-4-extensions) -* [PHP 5.1 extensions](/cloudlinux_os_components/#php-5-1-extensions) -* [PHP 5.2 extensions](/cloudlinux_os_components/#php-5-2-extensions) -* [PHP 5.3 extensions](/cloudlinux_os_components/#php-5-3-extensions) -* [PHP 5.4 extensions](/cloudlinux_os_components/#php-5-4-extensions) -* [PHP 5.5 extensions](/cloudlinux_os_components/#php-5-5-extensions) -* [PHP 5.6 extensions](/cloudlinux_os_components/#php-5-6-extensions) -* [PHP 7.0 extensions](/cloudlinux_os_components/#php-7-0-extensions) -* [PHP 7.1 extensions](/cloudlinux_os_components/#php-7-1-extensions) -* [PHP 7.2 extensions](/cloudlinux_os_components/#php-7-2-extensions) -* [PHP 7.3 extensions](/cloudlinux_os_components/#php-7-3-extensions) -* [PHP 7.4 extensions](/cloudlinux_os_components/#php-7-4-extensions) -* [PHP 8.0 extensions](/cloudlinux_os_components/#php-8-0-extensions) -* [PHP 8.1 extensions](/cloudlinux_os_components/#php-8-1-extensions) -* [PHP 8.2 extensions](/cloudlinux_os_components/#php-8-2-extensions) - -#### PHP 4.4 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|bcmath
bz2
calendar
ctype
curl
dba
dbase
dbx
domxml
exif | fileinfo
ftp
gd
gettext
gmp
iconv
imap
interbase
ioncube_loader
json
ldap | mbstring
mcrypt
mhash
mysql
mysql
ncurses
odbc
openssl
overload
pcntl
pcre | pgsql
posix
pspell
readline
recode
session
shmop
snmp
sockets
sourceguardian | standard
sybase_ct
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlrpc
zlib| -
- -#### PHP 5.1 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|Reflection
SPL
SimpleXML
bcmath
big_int
bitset
bz2
bz2_filter
calendar
coin_acceptor
crack
ctype
curl
date
dba
dbase
dom
doublemetaphone
exif | ftp
gd
geoip
gettext
gmagick
gmp
gnupg
haru
hash
huffman
iconv
idn
igbinary
imagick
imap
inclued
inotify
interbase |
oncube_loader
ldap
libxml
lzf
mbstring
mcrypt
memcache
msgpack
mysql
mysqli
ncurses
odbc
openssl
pcntl
pcre
pdo
pdo_oci*
pdo_firebird | pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pgsql
posix
pspell
quickhash
radius
readline
redis
session
shmop
snmp
sourceguardian
soap
sockets
ssh2 | standard
stats
stem
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
translit
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
zlib | -
- -* CloudLinux 6/7 - -#### PHP 5.2 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|Reflection
SPL
SimpleXML
apc
apm
ares
bcmath
bcompiler
big_int
bitset
bloomy
bz2
bz2_filter
calendar
coin_acceptor
crack
ctype
curl
date
dba
dbase
dbx
dom
doublemetaphone
eaccelerator
enchant
exif
ffmpeg** | fileinfo
filter
ftp
gd
gender
geoip
geos
gettext
gmagick
gmp
gnupg
haru
hash
hidef
htscanner
http
huffman
iconv
idn
igbinary
imagick
imap
inclued
inotify
interbase
intl
ioncube_loader| json
ldap
libxml
lzf
mailparse
mbstring
mcrypt
memcache
memcached
mhash
mongo
msgpack
mssql
mysql
mysqli
ncurses
oauth
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird |
pdo_mysql
pdo_oci**
pdo_odbc
pdo_pgsql
pdo_sqlite
pgsql
phar
posix
pspell
quickhash
radius
rar
readline
recode
redis
rsync
session
shmop
snmp
soap
sockets
sourceguardian
spl_types
sqlite
ssh2
standard
stats
stem | stomp
suhosin
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
translit
uploadprogress
uuid
wddx
xcache
xcache_3
xdebug
xhprof
xml
xmlreader
xmlrpc
xmlwriter
xrange
xsl
xcache*
yaf
yaz
zend_optimizer
zip
zlib| -
- -* CloudLinux 6 - -** CloudLinux 6/7 - -#### PHP 5.3 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|amqp
apc
apcu
apm
ares
bcmath
bcompiler
big_int
bitset
bloomy
brotli
bz2
bz2_filter
calendar
clamav**
coin_acceptor
core
crack
ctype
curl
date
dba
dbase
dbx
dom
doublemetaphone
eaccelerator
eio
enchant
ereg
exif
ffmpeg*
fileinfo
filter
ftp | functional
gd
gender
geoip
geos
gettext
gmagick
gmp
gnupg
haru
hash
hidef
htscanner
http
huffman
iconv
idn
igbinary
imagick
imap
inclued
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libevent
libxml
lzf | mailparse
mbstring
mcrypt
memcache
memcached
mhash
mongo
msgpack
mssql
mysql
mysqli
mysqlnd
ncurses
nd_mysql
nd_mysqli
nd_pdo_mysql
oauth
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_oci*
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pgsql | phalcon*
phar
posix
propro
pspell
quickhash
radius
raphf
rar
readline
recode
redis
reflection
rsync
session
shmop
simplexml
snmp
soap
sockets
sourceguardian
solr
spl
spl_types
sqlite
sqlite3
ssh2
standard
stats
stem
stomp
suhosin | sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
tideways
timezonedb
tokenizer
trader
translit
uploadprogress
uri_template
uuid
wddx
weakref
xcache*
xcache_3
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xrange
xsl
xhprof
yaf
yaml
yaz
zend_guard_loader
zip
zlib
zmq| -
- -* CloudLinux 6/7 - -** CloudLinux 7 - -#### PHP 5.4 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|aapm**
amqp
apc
apcu
apm
ares
bcmath
big_int
bitset
brotli
bz2
bz2_filter
calendar
core
ctype
curl
clos_ssa
date
dba
dbase
dbx
dom
doublemetaphone
eaccelerator
eio
enchant
ereg
exif
ffmpeg*
fileinfo
filter
ftp
functional
gd
gender | geoip
geos
gettext
gmagick
gmp
gnupg
haru
hash
hidef
htscanner
http
iconv
igbinary
imagick
imap
inclued
inotify
interbase
intl
ioncube_loader
json
ldap
libevent
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring| mcrypt
memcache
memcached
mhash
mongo
mongodb
msgpack
mssql
mysql
mysqli
mysqlnd
ncurses
nd_mysql
nd_mysqli
nd_pdo_mysql
oauth
oci8*
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_oci*
pgsql
phalcon*
phar | posix
propro
pspell
quickhash
radius
raphf
rar
readline
recode
redis
reflection
rsync
session
shmop
simplexml
snmp
soap
sockets
solr
sourceguardian
spl
spl_types
sqlite3
ssh2
standard
stats
stem
stomp
suhosin
sybase_ct
sysvmsg | sysvsem
sysvshm
tidy
tideways
timezonedb
tokenizer
trader
translit
uploadprogress
uri_template
uuid
wddx
weakref
xcache*
xcache_3
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xrange
xray***
xsl
xhprof
jsmin
yaf
yaml
yaz
zend_guard_loader
zip
zlib
zmq| -
- -* CloudLinux 6/7 - -** CloudLinux 7 - -*** CloudLinux 7/8 - -#### PHP 5.5 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|aapm**
amqp
apcu
apm
ares
bcmath
big_int
bitset
brotli
bz2
bz2_filter
calendar
clamav**
core
ctype
curl
clos_ssa
date
dba
dbase
dbx
dom
doublemetaphone
diseval
eio
enchant
ereg
exif
ffmpeg*
fileinfo
filter
ftp
gd
gender
geoip | geos
gettext
gmagick
gmp
gnupg
gRPC
haru
hash
hidef
htscanner
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libevent
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt | memcache
memcached
mhash
mongo
mongodb
msgpack
mssql
mysql
mysqli
mysqlnd
ncurses
nd_mysql
nd_mysqli
nd_pdo_mysql
oauth
oci8*
odbc
opcache*
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_oci*
pgsql | phalcon*
phalcon3
phar
posix
postal*
propro
pspell
quickhash
radius
raphf
rar
readline
recode
redis
reflection
rsync
session
shmop
simplexml
snmp
soap
sockets
sourceguardian
solr
spl
spl_types
sqlite3
ssh2
standard
stats
stem
stomp
suhosin | sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
tideways
timezonedb
tokenizer
trader
translit
uploadprogress
uri_template
uuid
wddx
weakref
xcache_3
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xrange
xray
xsl
xhprof
yaf
yaml
yaz
zend_guard_loader
zip
zlib
zmq | -
- -* CloudLinux 6/7 - -** CloudLinux 7 - - -#### PHP 5.6 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|aapm**
amqp
apcu
apm
ares
bcmath
big_int
bitset
brotli
bz2
bz2_filter
calendar
core
ctype
curl
clos_ssa**
date
dba
dbase
dbx
dom
doublemetaphone
diseval
eio
enchant
ereg
exif
ffmpeg*
fileinfo
filter
ftp
gd
gender
geoip
gettext | geos
gmagick
gmp
gnupg
gRPC
haru
hash
htscanner
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libevent
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt
memcache
memcached
mhash | mongo
mongodb
msgpack
mssql
mysql
mysqli
mysqlnd
ncurses
nd_mysql
nd_mysqli
nd_pdo_mysql
oauth
oci8
odbc
opcache*
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_oci*
pgsql
phalcon*
phalcon3 | phar
posix
postal**
propro
pspell
quickhash
radius
raphf
rar
readline
recode
redis
reflection
rsync
session
shmop
simplexml
snmp
soap
sockets
sourceguardian
spl
spl_types
sqlite3
ssh2
standard
stats
stem
stomp
solr | suhosin
sybase_ct
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
translit
tideways
uploadprogress
uri_template
uuid
wddx
xcache_3
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xrange
xray
xsl
xhprof
yaml
yaz
zend_guard_loader
zip
zlib
zmq| -
- -* CloudLinux 6/7 - -** CloudLinux 7 - - -#### PHP 7.0 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|aapm**
amqp
apcu
bcmath
bitset
brotli
bz2
clos_ssa**
calendar
core
ctype
curl
date
dba
dbase
dom
diseval
eio
enchant
exif
fileinfo
filter
ftp
ffmpeg*
gd
gearman
gender
geos | geoip
gettext
gmagick
gmp
gnupg
gRPC
hash
htscanner
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt | memcached
memcache
mongodb
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
_newrelic_
oauth
oci8*
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
psr
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_sqlsrv
pdo_oci
pgsql
phalcon3
phar | posix
postal**
propro
pspell
phalcon4
raphf
rar
readline
rrd
redis
reflection
recode
session
shmop
simplexml
snmp
snuffleupagus
soap
sockets
sourceguardian
sodium
solr
spl
sqlite3
sqlsrv
ssh2
standard
stats
suhosin7
sysvmsg | swoole
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
tideways_xhprof
uploadprogress
uuid
vips*
vld**
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xray
xsl
yaml
yaz
yaf
zip
zlib
zmq| -
- - -* CloudLinux 6/7 - -** CloudLinux 7 - -::: tip Note -To use `newrelic` extension you should set your own `New Relic License Key` in your own `/opt/alt/php7*/etc/php.ini` file. -Please find more info about New Relic License Key in the [New Relic documentation](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/license-key). -::: - - -#### PHP 7.1 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|aapm**
amqp
snuffleupagus
vld
apcu
bcmath
brotli
bz2
clos_ssa**
calendar
core
ctype
curl
date
dba
dbase
dom
diseval
eio
enchant
exif
fileinfo
filter
ftp
ffmpeg*
gd
gearman
gender
geoip
gettext | geos
gmagick
gmp
gnupg
gRPC
hash
htscanner
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
jsmin
json
ldap
libsodium
libxml
lzf
luasandbox*
mailparse
mbstring
mcrypt
memcached | memcache
mongodb
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
_newrelic_
oauth
oci8
odbc
opcache
openssl
pcntl
pcre
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc
pdo_pgsql psr

pdo_sqlite
pdo_sqlsrv
pgsql
phalcon3
phar
pdf | pdo_oci
phalcon4
posix
propro
pspell
psr**
raphf
rar
readline
redis
reflection
rrd
recode
solr
session
shmop
simplexml
snmp
soap
sockets
sourceguardian
spl
sodium
sqlite3
sqlsrv
ssh2
standard
stats
suhosin7
sysvmsg | swoole
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
tideways_xhprof
uploadprogress
uuid
vips*
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
xray
yaz
yaml
yaf
zip
zlib
zmq| -
- -* CloudLinux 6/7 - -** CloudLinux 7 - - -::: tip Note -To use `newrelic` extension you should set your own `New Relic License Key` in your own `/opt/alt/php7*/etc/php.ini` file. -Please find more info about New Relic License Key in the [New Relic documentation](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/license-key). -::: - -#### PHP 7.2 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|aapm**
jsmin
psr
rrd
yaz
amqp
snuffleupagus
vld
apcu
bcmath
brotli
bz2
calendar
clos_ssa**
core
ctype
curl
date
dba
dom
dbase
diseval
eio
enchant
exif
fileinfo
filter
ftp
ffmpeg*
gd
gender
geoip
gettext | gearman
geos
gmagick
gmp
gnupg
gRPC
hash
http
iconv
igbinary
imagick
imap
inotify
interbase
intl
ioncube_loader
json
ldap
libxml
lzf
luasandbox*
mcrypt
memcache
mailparse
mbstring
memcached
mongodb | mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
_newrelic_
oauth
oci8
odbc
opcache
openssl
pcntl
pcre
pdo
pdo_dblib
pdo_firebird
pdf
pdo_oci
phalcon4
pdo_mysql
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_sqlsrv
pgsql
phalcon3
phar | posix
propro
pspell
raphf
readline
redis
reflection
recode
sodium
sourceguardian
swoole
session
shmop
simplexml
snmp
soap
sockets
spl
sqlite3
sqlsrv
ssh2
standard
stats
sysvmsg
sysvsem | sysvshm
tidy
timezonedb
tokenizer
trader
tideways_xhprof
uploadprogress
uuid
vips*
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
xdebug
yaf
yaml
zip
zlib
zmq
xray| -
- -::: tip Note -To use `newrelic` extension you should set your own `New Relic License Key` in your own `/opt/alt/php7*/etc/php.ini` file. -You can find more info about New Relic License Key in the [New Relic documentation](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/license-key). -::: - - -* CloudLinux 6/7 - -** CloudLinux 7 - - -#### PHP 7.3 extensions - - -
- -| | | | | | | -|-|-|-|-|-|-| -|ffmpeg*
aapm**
amqp
clos_ssa**
gearman
jsmin
mailparse
memcache
psr
rrd
solr
tideways_xhprof
zmq
snuffleupagus
vld
apcu
bz2
brotli
calendar
core
ctype
curl
date
exif
enchant
filter
ftp
gettext
gmp
gnupg
hash
iconv
interbase
luasandbox* | libxml
mysqlnd
opcache
openssl
pcntl
pcre
pdo_pgsql
phar
readline
reflection
session
shmop
simplexml
sourceguardian
spl
sqlite3
standard
snmp
stats
tokenizer | trader
xmlreader
bcmath
fileinfo
grpc
intl
lzf
nd_mysqli
pdf
pdo
posix
swoole
uploadprogress
xmlrpc
gd
http
ioncube_loader
mbstring | nd_pdo_mysql
pdo_dblib
pdo_sqlite
propro
soap
sysvmsg
uuid
xmlwriter
dbase
gender
igbinary
mcrypt
newrelic
pdo_firebird
pdo_sqlsrv
pspell
sockets
sysvsem
vips*
xsl | dba
geoip
imagick
json
memcached
oauth
pdo_mysql
pgsql
raphf
sodium
sysvshm
yaml
dom
geos
imap
ldap
mongodb
oci8
pdo_oci | phalcon3
recode
sqlsrv
tidy
wddx
yaz
eio
gmagick
inotify
leveldb
mysqli
odbc
pdo_odbc
phalcon4
redis
ssh2
timezonedb
xdebug
zip
xml
zlib
xray
yaf| - -
- -* CloudLinux 6/7 - -** CloudLinux 7 - -:::tip Note -To use `newrelic` extension you should set your own `New Relic License Key` in your own `/opt/alt/php7*/etc/php.ini` file. -You can find more info about New Relic License Key in the [New Relic documentation](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/license-key). -::: - -#### PHP 7.4 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|leveldb
sourceguardian
ffmpeg*
amqp
clos_ssa**
gearman
ioncube_ loader
jsmin
mailparse
mcrypt
memcache
psr
rrd
solr
ssh2
tideways_xhprof
yaz
zmq
apcu
bcmath
brotli
bz2
calendar
core
ctype
curl
date
dba
dbase
dom
eio
enchant
exif
fileinfo
filter
ftp
gd
gender
geoip
geos | gettext
gmagick
gmp
gnupg
grpc
hash
http
iconv
igbinary
imagick
imap
inotify
intl
json
ldap
libxml
luasandbox*
lzf
mbstring
memcached
mongodb | mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
newrelic
snuffleupagus
oauth
oci8
odbc
opcache
openssl
pcntl
pcre
pdf
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_oci
pdo_odbc
pdo_pgsql
vld
pdo_sqlite
pdo_sqlsrv | pgsql
phalcon4
phar
posix
propro
pspell
raphf
readline
redis
reflection
phalcon5
session
shmop
simplexml
snmp
soap
sockets
sodium
spl
sqlite3
sqlsrv
standard | stats
swoole
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
trader
xray
uploadprogress
uuid
vips*
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
yaml
zip
zlib | -
- -* CloudLinux 6/7 - -** CloudLinux 7 - -#### PHP 8.0 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|brotli
amqp
clos_ssa***
core
date
filter
gearman
geoip
gmagick
gnupg***
grpc
apcu
bcmath
bz2
calendar
ctype
curl
dba
dbase
dom
enchant
exif
ffi**
fileinfo | hash
igbinary
inotify
jsmin
json
libxml
mcrypt
memcache ftp
gd
gettext
gmp
iconv
imagick
imap
intl
ldap
lzf
mailparse
mbstring | mongodb
newrelic
oauth
oci8
openssl
pcntl
pcre
pdo_oci
pdo_sqlsrv
readline
redis
reflection
rrd
session memcached
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
odbc
opcache
pdo
pdo_dblib
pdo_firebird
pdo_mysql
pdo_odbc | snuffleupagus
solr
SPL
sqlsrv
ssh2
standard
swoole
tideways_xhprof
trader pdo_pgsql
pdo_sqlite
pgsql
phar
posix
pspell
psr
raphf
shmop
simplexml
snmp
soap
sockets | uploadprogress
uuid
vips*
vld
xdebug
xmlrpc**
yaml
yaz
zip
zlib sodium
sqlite3
sysvmsg
sysvsem
sysvshm
tidy
timezonedb
tokenizer
xml
xmlreader
xmlwriter
xsl
zmq
sourceguardian
phalcon5
xray | -
- -* CloudLinux 6/7 - -** CloudLinux 7/8 - -*** CloudLinux 7 - -#### PHP 8.1 extensions - - -
- -| | | | | | -|-|-|-|-|-| -|amqp
apcu
bcmath
brotli
bz2
calendar
clos_ssa***
Core
ctype
curl
date
dba
dbase
dom
enchant
exif
ffi**
fileinfo
filter
ftp | gd
geoip
gearman
gettext
gmagick
gmp
gnupg**
grpc
hash
ioncube_loader
iconv
igbinary
imagick
imap
inotify
intl
jsmin
json
ldap
libxml
lzf
mailparse
mbstring
mcrypt | memcache
memcached
mongodb
mysqli
mysqlnd
nd_mysqli
nd_pdo_mysql
newrelic
oauth
oci8
odbc
opcache
openssl
pcntl
pcre
pdo
pdo_dblib
pdo_mysql
pdo_oci
pdo_odbc
phalcon5
pdo_pgsql
pdo_firebird
pdo_sqlite
pdo_sqlsr | pgsql
phar
posix
process
pspell
psr
rrd
raphf
readline
redis
Reflection
session
shmop
SimpleXML v snmp
solr
sourceguardian
soap
sockets
sodium
SPL
sqlite3
sqlsrv
ssh2
standard
swoole | sysvmsg
sysvsem
sysvshm
tideways_xhprof
tidy
timezonedb
tokenizer
trader
uploadprogress
uuid
vips*
xdebug
xml
xmlreader
xmlrpc**
xmlwriter
xsl
yaf
yaml
zip
zlib
zmq
xray | -
- -* CloudLinux 6/7 - -** CloudLinux 7/8 - -*** CloudLinux 7 - - - -#### PHP 8.2 extensions - - -| | | | | | -|-|-|-|-|-| -|amqp**
apcu**
bcmath
brotli**
bz2
calendar
Core
ctype
curl
date
dba
dbase**
dom
enchant
exif
ffi
fileinfo
filter
ftp
gd
gearman**
geoip** | gettext
gmagick**
gmp
gnupg*
grpc**
hash
iconv
igbinary**
imagick**
imap
inotify**
intl
jsmin**
json
ldap
libxml
lzf**
mailparse**
mbstring
mcrypt**
memcache**
memcached** | mongodb**
mysqlnd
nd_mysqli
nd_pdo_mysql
oauth**
oci8**
odbc
opcache
openssl
pcntl
pcre**
pdo
pdo_dblib
pdo_firebird
pdo_mysql*
pdo_oci**
pdo_odbc
pdo_pgsql
pdo_sqlite
pdo_sqlsrv**
pgsql | phar
posix
pspell
psr**
random
raphf**
readline
redis**
Reflection
rrd**
session
shmop
SimpleXML
snmp
soap
sockets
sodium
solr**
SPL
sqlite3
sqlsrv**
ssh2** | standard
swoole**
sysvmsg
sysvsem
sysvshm
tideways_xhprof**
tidy
timezonedb**
tokenizer
trader**
uploadprogress**
uuid**
vips*
xdebug**
xml
xmlreader
xmlrpc**
xmlwriter
xsl
yaml**
zip
zlib
zmq**| - - -* CloudLinux 7 - -** CloudLinux 7/8 - -## Python Selector - -### General information - -Python Selector is a CloudLinux OS Shared component that allows each user to easily deploy and manage Python applications. Users can manage applications at the control panel interface level or from the command line (CLI). - -### Requirements - -* cPanel or DirectAdmin control panel. Plesk isn't supported. -* Apache or LiteSpeed webserver. Apache + Nginx (as a reverse proxy) combination is also supported. -* Python Selector uses `mod_passenger` to host Python. For more details about `mod_passenger`, please read [documentation](https://www.phusionpassenger.com/). The needed version will be installed along with Python Selector. - -### Supported versions - -* Python Selector supports the following alt-python versions for all actual CloudLinux OS Shared versions: - - * `alt-python 2.7` - * `alt-python 3.3` - * `alt-python 3.4` - * `alt-python 3.5` - * `alt-python 3.6` - * `alt-python 3.7` - * `alt-python 3.8` - * `alt-python 3.9` - * `alt-python 3.10` - -### Installation - -You can install Python Selector using the [CloudLinux OS Shared Installation Wizard](/lve_manager/#cloudlinux-os-shared-installation-wizard). - -After installation, please make sure that you have set appropriate checkboxes in CloudLinux Manager Options tab to show Python App in the web-interface. - -#### Manual installation - -Here you can find the installation steps for supported control panels: - -* [cPanel](/cloudlinux_os_components/#cpanel-2) -* [DirectAdmin](/cloudlinux_os_components/#directadmin) - -#### cPanel - -To use Python Selector, it is required to install the following: - -* alternative Python packages by running the following command: - -
- -``` -yum groupinstall alt-python -``` -
- -* CloudLinux Manager, LVE Utils and Phusion Passenger to create isolated Python environments by running the following command: - -
- -``` -yum install lvemanager lve-utils alt-python-virtualenv -``` -
- -Phusion Passenger could be installed by using **either** ```ea-ruby24-mod_passenger``` **or** ```ea-ruby27-mod_passenger```. ```ea-ruby27-mod_passenger``` is **not** compatible with systems running CloudLinux OS Shared OS 6. CloudLinux OS Shared OS 7 supports **both** ```ea-ruby24-mod_passenger``` and ```ea-ruby27-mod_passenger```. If your system runs CloudLinux OS Shared OS 8, you can **only** use ```ea-ruby27-mod_passenger```. - -Adding Python module requires executing permissions to `gcc/make` binaries. -Please enable compilers in Compiler Access section of WHM, then run: - -
- -``` -cagefsctl --force-update -``` -
- -* We recommend use CageFS for better security. See [CageFS documentation for details](/cloudlinux_os_components/#cagefs). - -#### DirectAdmin - -To use Python Selector, it is required to install the following: - -* alternative Python packages by running the following command: - -
- -``` -yum groupinstall alt-python -``` -
- -* CloudLinux Manager, LVE Utils and Phusion Passenger to create isolated Python environments by running the following command: - -
- -``` -yum install lve-utils lvemanager alt-python-virtualenv alt-mod-passenger -``` -
- -* We recommend use CageFS for better security. See [CageFS documentation for details](/cloudlinux_os_components/#cagefs). - - -* See also [Python Selector UI](/lve_manager/#python-selector-2). -* See also [Python Selector CLI](/command-line_tools/#python-selector). - -## Ruby Selector - -### General information and requirements - -We have the ability to deploy Ruby applications via an application server. Ruby Selector uses `mod_passenger` to host Ruby applications. - -Ruby Selector works only on cPanel/WHM servers. - -You can find a list of supported `alt-ruby` versions using the following commands. - -
- -``` -yum grouplist | grep alt-ruby -``` -
- - -### Installation and update - -::: tip Note -The instructions below are suitable only for EasyApache 3 and EasyApache 4. You should follow [this instruction](https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:cloudlinux:enable_ruby_python_selector) if you use LiteSpeed. -::: - -To use Ruby Selector install alternative Ruby packages: - -
- -``` -yum groupinstall alt-ruby -``` -
- -::: tip Note -After installation, please make sure that you have unmarked appropriate checkboxes in VE Manager Options tab to show Ruby App in web-interface. Find the instructions on the [link](/cloudlinux_os_components/#hide-ruby-selector-icon). -::: - -::: tip Note -Adding Ruby modules requires executing permissions to `gcc/make` binaries. Please enable compilers in Compiler Access section of WHM, then run: `cagefsctl --force-update` -::: - -### Configuration and using - -* [End user access](/lve_manager/#ruby-selector-client-plugin) -* [Hide Ruby Selector icon](/cloudlinux_os_components/#hide-ruby-selector-icon) -* [Deploying Redmine using Ruby Selector](/cloudlinux_os_components/#deploying-redmine-using-ruby-selector) -* [EasyApache 4](/cloudlinux_os_components/#easyapache-4-2) - -#### End user access - -You can find an example of Ruby application setup [here](https://cloudlinux.zendesk.com/hc/en-us/articles/115004495049-How-to-run-Redmine-with-Ruby-Selector) - -:::tip Note -See also Ruby Selector [CLI](/command-line_tools/#ruby-selector) section. -::: - -#### Hide Ruby Selector icon - -It is possible to hide or show Ruby Selector icon by marking or unmarking proper checkboxes in LVE Manager Options tab. - -![](/images/CL-hide-ruby.png) - -The same result can be accomplished in CLI by running: - -
- -``` -cloudlinux-config set --json --data '{"options":{"uiSettings":{"hideRubyApp":false}}}' -``` -
- -:::tip Note -If you are using cPanel/WHM, you can also configure hide/show CloudLinux OS Shared Ruby Selectors in WHM | Feature Manager. -For that, you’d need to first uncheck `Hide Ruby App in web-interface` in the LVE Manager. This will make the menu appear for all accounts. After that, you are free to disable this app in WHM | Feature Manager for the required feature lists. -::: - -#### Deploying Redmine using Ruby Selector - -::: tip Note -You can find Redmine version 2.6.0 and newer deployment guide [here](https://cloudlinux.zendesk.com/hc/en-us/articles/115004495049-How-to-run-Redmine-with-Ruby-Selector) -::: - -#### EasyApache 4 - -:::tip Note -```ea-apache24-mod-alt-passenger``` is deprecated in favor of ```ea-ruby24-mod_passenger``` and ```ea-ruby27-mod_passenger``` -::: - -Starting with cPanel/WHM version 66 provides ```ea-ruby24-mod_passenger``` (more information on the [link](https://documentation.cpanel.net/display/66Docs/Application+Manager)), this allows creating Ruby applications with cPanel application manager. - -CloudLinux OS Shared features its own Python and Ruby Selectors, which allow creating applications with one of ```mod_passenger``` Apache modules: - -* ```ea-ruby24-mod_passenger``` -* ```ea-ruby27-mod_passenger``` - -```ea-ruby27-mod_passenger``` is **not** compatible with systems running CloudLinux OS Shared 6. CloudLinux OS Shared 7 supports **both** ```ea-ruby24-mod_passenger``` and ```ea-ruby27-mod_passenger```. If your system runs CloudLinux OS 8, you can **only** use ```ea-ruby27-mod_passenger```. - -The ```ea-ruby2X-mod_passenger``` allows you to run applications via cPanel application manager and Ruby Selector. - -To install, run: -
- -``` -# yum install lvemanager alt-python-virtualenv -# yum install ea-ruby24-mod_passenger -``` -
- -or: - -
- -``` -# yum install lvemanager alt-python-virtualenv -# yum install ea-ruby27-mod_passenger -``` -
- -See also [Ruby Selector CLI tools](/command-line_tools/#ruby-selector). - - -## Node.js Selector - -### General information and requirements - -* [Requirements](/cloudlinux_os_components/#requirements-3) -* [Limitation](/cloudlinux_os_components/#limitations) - - Node.js Selector is a CloudLinux OS Shared component that allows each user to easily create Node.js applications, choose Node.js version and other parameters for applications based on their needs. - -#### **Requirements** - -* Node.js Selector supports Node.js versions 6.x, 8.x, 9.x, 10.x, 11.x, 12.x, 14.x, 16.x, 18.x, 19.x. -* Node.js Selector requires LVE Manager 4.0 or later. -* It supports cPanel and DirectAdmin servers as well as non-panel installations (Plesk is not supported as it already has Node.js support.) For more details, please go to Plesk & Node.js documentation [here](https://www.plesk.com/blog/product-technology/node-js-plesk-onyx/) and [here](https://docs.plesk.com/en-US/onyx/administrator-guide/website-management/nodejs-support.76652/) . -* Node.js Selector uses `mod_passenger` to host Node.js. For more details about mod_passenger and Node.js, please read documentation [here](https://www.phusionpassenger.com/library/walkthroughs/deploy/nodejs/) and [here](https://www.phusionpassenger.com/library/walkthroughs/deploy/nodejs/ownserver/apache/oss/el7/deploy_app.html) . -* Node.js Selector supports both EasyApache 3 and EasyApache 4. - -#### **Limitations** - -Since Node.js Selector uses `mod_passenger` to host Node.js, then Node.js Selector has the same limitations as Phusion Passenger. Phusion Passenger cannot load ECMAScript modules and can only load Common js modules. -If you get an ERR_REQUIRE_ESM error when starting an application app.js. - -``` -Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: app.js -``` - -In this case you can use the following cjs wrapper app_wrapper.cjs to load esm script app.js: - -``` -cat app_wrapper.cjs -(() => import('app.js'))(); -``` - -### Installation and update - -:::tip Note -Node.js Selector support is added to LiteSpeed Web Server starting from the 5.3RC1 release. See details [here](https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:cloudlinux:node.js_selector). -::: - -**cPanel** - -To use Node.js Selector, install Node.js packages by running the following command: -
- -``` -yum groupinstall alt-nodejs -``` -
-Also, please install LVE Manager, LVE Utils and Phusion Passenger by running the following command: -
- -``` -yum install lvemanager lve-utils -``` -
- -Phusion Passenger could be installed by using **either** ```ea-ruby24-mod_passenger``` **or** ```ea-ruby27-mod_passenger```. ```ea-ruby27-mod_passenger``` is **not** compatible with systems running CloudLinux OS Shared 6. CloudLinux OS Shared 7 supports **both** ```ea-ruby24-mod_passenger``` and ```ea-ruby27-mod_passenger```. If your system runs CloudLinux OS Shared 8, you can **only** use ```ea-ruby27-mod_passenger```. - -:::tip Note -```ea-apache24-mod-alt-passenger``` is deprecated in favor of ```ea-ruby24-mod_passenger``` and ```ea-ruby27-mod_passenger``` -::: - -For EasyApache 3: -
- -``` -yum install lvemanager lve-utils alt-mod-passenger -``` -
-And we recommend to install CageFS for better security (not mandatory) by running the following command: -
- -``` -yum install cagefs -``` -
- -::: tip Note -If during Node.js Selector usage on cPanel servers you get "ENOMEM npm ERR! errno-12" error, try to increase Memory limit in cPanel WHM → Server Configuration → Tweak Settings → System → Max cPanel process memory, then restart cPanel service with the following command to apply changes. -::: - - -CloudLinux OS Shared 7: -
- -``` -systemctl restart cpanel.service -``` -
- -CloudLinux OS Shared 6: -
-``` -service cpanel restart -``` -
- -**DirectAdmin** - -To use Node.js Selector, please install Node.js packages by running the following command: -
- -``` -yum groupinstall alt-nodejs6 alt-nodejs8 alt-nodejs9 -``` -
-Also, please install LVE Manager, LVE Utils and Fusion Passenger by running the following command: -
- -``` -yum install lvemanager lve-utils alt-mod-passenger -``` -
-And we recommend to install CageFS for better security (not mandatory) by running the following command: -
- -``` -yum install cagefs -``` -
- - - -### Node.js deployment - - -* The first approach - remote usage of Node.js Interpreters of different versions -* The second approach - remote usage of the cloudlinux-selector utility. - -* [Remote usage of Node.js interpreters](/cloudlinux_os_components/#remote-usage-of-node-js-interpreters) -* [Remote usage of the cloudlinux-selector utility](/cloudlinux_os_components/#remote-usage-of-the-cloudlinux-selector-utility) - -#### Remote usage of Node.js interpreters - -1. Create a Node.js project in IntelliJ IDEA/WebStorm . You can download [this archive](https://docs.cloudlinux.com/nodejs_example.zip) and use it as a basis. -2. Install alt-nodejs packages on the server in use. See [installation instructions](/cloudlinux_os_components/#installation-and-update-7). -3. Create an application on the server. You can do it by three ways: - * Via UI of the Node.js plugin. - * Using the following command to create an application: - -
- -``` -cloudlinux-selector create --interprete=nodejs --json --app-root= --app-uri= --app-mode=develompent --version= --domain= -``` -
- -::: tip Note -In the IntelliJ IDEA you can create and run any remote script (Preferences — Remote SSH External Tools — Add). -::: - -![](/images/createapp_zoom70.png) - - * Choose a location of the application on the server and synchronize the files with the IntelliJ IDEA project. -4. Set up Run/Debug Configurations in the project created. - -![](/images/setconfiguration_zoom70.png) - - * Specify a path to the remote Node.js interpreter. To be able to specify the remote interpreter, you should install the _Node.js Remote Interpreter_ plugin first. Please find more information [here](https://www.jetbrains.com/help/idea/configure-node-js-remote-interpreter.html) , using server access credentials for a user _(Main menu → Run → Edit configurations...)_ . - * Specify initial _JavaScript file_ that will be run with the _node_ command (it is the _app.js_ file from the archive). - * Specify _Path Mappings_ between a local and a remote project _(Preferences → Deployments → Add)_ . If you have created your application with the _cloudlinux-selector utility_ or via plugin UI the _Path Mappings_ should be as follows: - -
- -``` -/home// -``` -
- -5. Synchronize the project directories on the local and the remote machine as per _Path Mappings_ specified. -6. Deploy the modules on the remote and the local machine with the **_npm install_** command (if there are dependent modules). In the UI you can click the _Run NPM Install_ button. -7. Run Node.js application with the configuration set at the 4th step _(Main menu → Run → Run… → Select configuration)_ . - -![](/images/runapp_zoom60.png) - -8. If you are using the application from the archive attached, you can see the running application on port 3003 — _http://DOMAIN:3003_ . - -::: tip Note -The port should be available to a server user. -::: - -![](/images/runningappdomain_zoom70.png) - -The following information should be displayed on this page: -* A version of the running Node.js interpreter; -* Current environment variables; -* The current time. - -So that, you can be sure that deployed modules are used properly. - -If you’d like to use a different version of Node.js to run an application, change a path to the interpreter in the configuration settings of the running. -To apply all changes to the project, synchronize all changes with the server and restart the running application. - -9. To debug a script, set breakpoints in the code and run the configuration via Main Menu _(Main menu → Run → Debug… → Select configuration)_ . - -Useful links: -* IntelliJ IDEA : [https://www.jetbrains.com/help/idea/configure-node-js-remote-interpreter.html](https://www.jetbrains.com/help/idea/configure-node-js-remote-interpreter.html) -* Plugin _Node.js Remote Interpreter_ : [https://plugins.jetbrains.com/plugin/8116-node-js-remote-interpreter](https://plugins.jetbrains.com/plugin/8116-node-js-remote-interpreter) -* WebStorm : [https://www.jetbrains.com/help/webstorm/configure-node-js-remote-interpreter.html](https://www.jetbrains.com/help/webstorm/configure-node-js-remote-interpreter.html) - -::: tip Note -It is not required to install _Passenger_ while working in IDE if you are using this approach. -::: - -#### Remote usage of the cloudlinux-selector utility - - -1. Create an application via UI or with the command as described in the Remote Usage of Node.js Interpreters approach, step 3 (a,b). -2. Set up project mapping on the local machine with the created remote application _/home// (Preferences → Deployments → Add)_ . -3. Set up the remote commands of cloudlinux-selector _(Preferences → Remote SSH External Tools → Add)_ for the following actions: - * Restart application; - * Install packages; - * Run script; - * Change Node.js version for the application. -You can see the running app at http://DOMAIN/APPLICATION_URL -To apply all changes, restart the application. - -* See also [Node.js Selector CLI tools](/command-line_tools/#node-js-selector). -* See also [Node.js Selector UI](/lve_manager/#node-js-selector-2). - -### Troubleshooting - -* [Debugging errors](/cloudlinux_os_components/#debugging-errors) - -#### Debugging errors - -Since alt-mod-passenger-5.3.7-2, directives such as PassengerFriendlyErrorPages and PassengerAppEnv are available for use from htaccess file. This allows end users to see errors from their application during the development process. For example, if you add one of the following lines to the htaccess file on the application page, you will see the information (if there was an error) similar to one on the picture. -
- -``` -PassengerAppEnv development -``` -
-or -
- -``` -PassengerFriendlyErrorPages on -``` -
- -![](/images/errorapplog.png) - -This is a much more convenient approach to developing an application and debugging errors. On the other hand, if these directives are turned off you will see: - -![](/images/errorapplogsorry.png) - -In this case, there is no useful information for debugging errors and this is suitable for production mode. More information about [PassengerFriendlyErrorPages](https://www.phusionpassenger.com/library/config/apache/reference/#passengerfriendlyerrorpages) and [PassengerAppEnv](https://www.phusionpassenger.com/library/config/apache/reference/#passengerappenv). - - -## Apache mod_lsapi PRO - -### General information and requirements - -mod_lsapi PRO is an [Apache HTTP Server](https://httpd.apache.org/) module based on [LiteSpeed Technologies API](https://www.litespeedtech.com/open-source/litespeed-sapi) . It serves to execute PHP scripts on a web-server by analogy with other modules like mod_suphp, php-fpm, mod_php. However, mod_lsapi PRO usage offers excellent PHP performance, low memory footprint coupled with great security and support for opcode caching. - -**How does it work?** - -1. Apache passes handling for PHP request to mod_lsapi PRO; -2. mod_lsapi PRO use liblsapi to transfer request to lsphp parent process; -3. lsphp is forking child process which executes the request and returns data to mod_lsapi PRO; -![](/images/mod_lsapidiagrammnew.jpg) -_mod_lsapi PRO integrates with Apache, allows to handle concurrent requests and manages the lsphp processes_ - -* If there are no requests for lsapi_backend_pgrp_max_idle seconds, lsphp parent process will be  terminated; -* If there are no lsphp child processes available when a new request comes, the new lsphp child process will be created; -* lsphp childs process concurrent requests simultaneously; -* The maximum number of simultaneously running lsphp child processes can be set by the lsapi_backend_children directive. - -**What is lsphp?** - -lsphp - PHP + LSAPI. What is PHP LSAPI? [LiteSpeed Server Application Programming Interface](https://www.litespeedtech.com/open-source/litespeed-sapi/php) (LSAPI) is designed specifically for seamless, optimized communication between LiteSpeed Web Server and third-party web applications. Now with mod_lsapi PRO this protocol is available for Apache 2.2/2.4. - -Using mod_lsapi PRO, we have seen the higher performance than Apache with mod_php, easier installation than php-fpm and easier integration with any control panel. mod_lsapi PRO means faster and more stable dynamic web pages. - -**Requirements** - -Currently, the mod_lsapi is not compatible with: - -* Apache mod_ruid2 - should be disabled; -* Apache mod_itk - should be disabled; -* PHP-FPM - should be disabled because PHP-FPM is also a PHP Handler just as mod_lsapi. - -**Optional requirements** - -* Configured LVE containers for end-users ( **recommended - higher security level** ); -* Installed and configured mod_hostinglimitsfor Apache ( **recommended - higher security level** ); -* Installed mod_suexec for Apache and configured [SuExecUserGroup](https://httpd.apache.org/docs/2.4/mod/mod_suexec.html#page-header) directive for each virtual host ( **recommended - higher security level** ); -* Enabled CageFS for end-users ( **recommended - higher security level** ); -* PHP Selector with alt-php - an easy way to select different PHP versions for each end-user provided by CloudLinux OS Shared; -* ea-php - alternative to alt-php provided by cPanel (for cPanel only). - -### Installation - -mod_lsapi PRO can be installed through YUM package manager, however, the installation process varies depending on the control panel. - -Select the control panel you are using: -* [cPanel](/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4) -* [Plesk](/cloudlinux_os_components/#installing-on-plesk-servers) -* [DirectAdmin](/cloudlinux_os_components/#installing-on-directadmin-servers) -* [No control panel](/cloudlinux_os_components/#installing-on-servers-with-no-control-panel) - - -:::tip Note -See also [mod_lsapi PRO](/command-line_tools/#apache-mod-lsapi-pro). -::: - -#### Installing on cPanel servers with EasyApache 4 - -Install mod_lsapi PRO and related packages through YUM package manager as follows: -
- -``` -$ yum install liblsapi liblsapi-devel -$ yum install ea-apache24-mod_lsapi -``` -
-After installing mod_lsapi PRO packages run the next command to setup mod_lsapi to cPanel: -
- -``` -$ /usr/bin/switch_mod_lsapi --setup -``` -
-Now, when the module is installed, restart Apache to ensure that the mod_lsapi PRO is enabled: -
- -``` -$ service httpd restart -``` -
-Now the lsapi handler is available for managing through cPanel MultiPHP Manager. - -For more details about swith_mod_lsapi, please visit [switch_mod_lsapi tool](/command-line_tools/#apache-mod-lsapi-pro). - - -#### Installing on Plesk servers - -Install mod_lsapi PRO and related packages through YUM package manager as follows: -
- -``` -$ yum install liblsapi liblsapi-devel -$ yum install mod_lsapi -``` -
-Once completed, run the command to setup mod_lsapi PRO and register LSPHP handlers to Plesk Panel: -
- -``` -$ /usr/bin/switch_mod_lsapi --setup -``` -
- -Now, when the module is installed, restart Apache to ensure that mod_lsapi PRO is enabled: -
- -``` -$ service httpd restart -``` -
- -Now LSPHPXY alt-php PHP handlers are available for managing through Plesk PHP Settings. - -![](/images/plesk-php-settings.png) - -For more details about swith_mod_lsapi, please visit [switch_mod_lsapi tool](/command-line_tools/#apache-mod-lsapi-pro). - - -#### Installing on DirectAdmin servers - -Installation process is done with custombuild script: -
- -``` -$ yum install liblsapi liblsapi-devel -$ cd /usr/local/directadmin/custombuild -$ ./build update -$ ./build set php1_mode lsphp -$ ./build php n -$ ./build apache -``` -
-Restart Apache afterwards: -
- -``` -$ service httpd restart -``` -
-Now all domains under php1_mode are using lsphp handler and no further actions are required to enable mod_lsapi PRO on DirectAdmin. - -#### Installing on servers with no control panel - -Install mod_lsapi PRO and related packages through YUM package manager as follows: -
- -``` -$ yum install liblsapi liblsapi-devel -$ yum install mod_lsapi -``` -
-Once completed, run a command to setup mod_lsapi PRO: -
- -``` -$ /usr/bin/switch_mod_lsapi --setup -``` -
-Now, when the module is installed, restart Apache to ensure that mod_lsapi PRO is enabled: -
- -``` -$ service httpd restart -``` -
- -If you are using an alternative Apache - [httpd24](https://www.cloudlinux.com/cloudlinux-os-blog/entry/httpd24-updated-for-cloudlinux-6) , then install mod_lsapi as follows: - -
- -``` -$ yum install liblsapi liblsapi-devel -$ yum install httpd24-mod_lsapi -``` -
-Once completed, run a command to setup mod_lsapi PRO: -
- -``` -$ /usr/bin/switch_mod_lsapi --setup -``` -
-Now, when the module is installed, restart Apache to ensure that mod_lsapi PRO is enabled: -
- -``` -$ service httpd24 restart -``` -
- -For more details about swith_mod_lsapi, please visit [switch_mod_lsapi tool](/command-line_tools/#apache-mod-lsapi-pro). - - -### Uninstalling - - -Uninstall mod_lsapi PRO is performed depending on your control panel. - -Select the control panel you are using: -* [cPanel](/cloudlinux_os_components/#uninstall-procedure-for-cpanel-servers-with-easyapache-4) -* [Plesk](/cloudlinux_os_components/#uninstall-procedure-for-plesk-servers) -* [DirectAdmin](/cloudlinux_os_components/#uninstall-procedure-for-directadmin-servers) -* [No control panel](/cloudlinux_os_components/#uninstall-procedure-for-servers-with-no-control-panel) - - -#### Uninstall procedure for cPanel servers with EasyApache 4 - -To remove lsapi handler from cPanel MultiPHP Manager and uninstall mod_lsapi PRO, run a command: -
- -``` -$ /usr/bin/switch_mod_lsapi --uninstall -``` -
-Then remove packages with YUM package manager: -
- -``` -$ yum erase liblsapi liblsapi-devel ea-apache24-mod_lsapi -``` -
-Restart Apache afterwards: -
- -``` -$ service httpd restart -``` -
-Now mod_lsapi PRO is fully uninstalled. - - -#### Uninstall procedure for Plesk servers - -To unregister LSPHP handlers and uninstall mod_lsapi PRO, run the command: -
- -``` -$ /usr/bin/switch_mod_lsapi --uninstall -``` -
-Then remove packages with YUM package manager: -
- -``` -$ yum erase liblsapi liblsapi-devel mod_lsapi -``` -
-Restart Apache afterwards: -
- -``` -$ service httpd restart -``` -
-Now LSPHPXY alt-php PHP handlers and mod_lsapi PRO are fully uninstalled. - - -#### Uninstall procedure for DirectAdmin servers - -Uninstall is done with custombuild script: -
- -``` -$ cd /usr/local/directadmin/custombuild -$ ./build update -$ ./build set php1_release [any other php mode] -$ ./build php n -$ ./build apache -``` -
-The following PHP modes are available for DirectAdmin: - -* mod_php -* fastcgi -* php-fpm -* suphp - -Restart Apache afterwards: -
- -``` -$ service httpd restart -``` -
-Now all domains under php1_mode are using the chosen handler and mod_lsapi PRO is fully uninstalled. - -#### Uninstall procedure for servers with no control panel - -To uninstall mod_lsapi PRO, run the command: -
- -``` -$ /usr/bin/switch_mod_lsapi --uninstall -``` -
-Then remove packages with YUM package manager: -
- -``` -$ yum erase liblsapi liblsapi-devel mod_lsapi -$ rm [path to mod_lsapi.conf] -``` -
-Restart Apache to restore the standard PHP handler: -
- -``` -$ service httpd restart -``` -
- -If you are using an alternative Apache: - [httpd24](https://www.cloudlinux.com/cloudlinux-os-blog/entry/httpd24-updated-for-cloudlinux-6), then uninstall mod_lsapi PRO as follows: - -
- -``` -$ /usr/bin/switch_mod_lsapi --uninstall -``` -
-Then remove packages with YUM package manager: -
- -``` -$ yum erase liblsapi liblsapi-devel httpd24-mod_lsapi -$ rm [path to mod_lsapi.conf] -``` -
-Restart Apache afterwards: -
- -``` -$ service httpd24 restart -``` -
-Now mod_lsapi PRO is fully uninstalled. - - -### Configuration - -* [Configuration references](/cloudlinux_os_components/#configuration-references) - -In order to get mod_lsapi PRO work properly, you'll need to configure Apache. To do this, we use a separate _lsapi.conf_ file. - -First of all, for the mod_lsapi PRO work, you need to ensure that the module is loaded. In your lsapi.conf you need to make sure the [LoadModule](http://httpd.apache.org/docs/current/mod/mod_so.html#loadmodule) directive has not been commented out. A correctly configured directive may look like this: -
- -``` -LoadModule lsapi_module modules/mod_lsapi.so -``` -
- -In order to enable the module to process requests, you need to add the lsapi_engine directive to your _lsapi.conf_ file as follows: -
- -``` -lsapi_engine On -``` -
- -The mod_lsapi PRO handler can be enabled using the [AddType](https://httpd.apache.org/docs/2.4/mod/mod_mime.html#addtype) directive. The AddType directive tells Apache that a given filename extension should be handled by mod_lsapi PRO. Apache will assume that and will attempt to execute it when that particular resource is requested by a client. -
- -``` -AddType application/x-httpd-lsphp .php -``` -
- -If no handler is explicitly set for a request, the specified content type will be used as the handler name, therefore, please disable php.conf or any other PHP handler for using mod_lsapi PRO. In this example application/x-httpd-lsphp is a default handler by which mod_lsapi PRO process requests with lsphp binary from _/usr/local/bin/_ directory. - -The final lsapi.conf configuration might look like this: -
- -``` -LoadModule lsapi_module modules/mod_lsapi.so - - - - lsapi_engine On - AddType application/x-httpd-lsphp .php - lsapi_backend_connect_timeout 100000 - lsapi_backend_connect_tries 10 - lsapi_backend_children 20 - lsapi_backend_pgrp_max_idle 30 - lsapi_backend_max_process_time 300 - lsapi_debug Off - -``` -
- -In order to mod_lsapi PRO work lsapi.conf should be loaded to Apache through [Include](https://httpd.apache.org/docs/2.4/mod/core.html#include) directive. - -For more detailed description of the module directives please visit [Configuration reference](/cloudlinux_os_components/#configuration-references). -For installation guide mod_lsapi PRO please visit [Installation](/cloudlinux_os_components/#installation-3). - -#### Configuration references - - -[mod_lsapi customization](/cloudlinux_os_components/#mod-lsapi-customization): -* [lsapi_engine](/cloudlinux_os_components/#lsapi-engine) -* [lsapi_socket_path](/cloudlinux_os_components/#lsapi-socket-path) -* [lsapi_poll_timeout](/cloudlinux_os_components/#lsapi-poll-timeout) -* [lsapi_per_user](/cloudlinux_os_components/#lsapi-per-user) -* [lsapi_output_buffering](/cloudlinux_os_components/#lsapi-output-buffering) -* [lsapi_disable_reject_mode](/cloudlinux_os_components/#lsapi-disable-reject-mode) -* [lsapi_terminate_backends_on_exit](/cloudlinux_os_components/#lsapi-terminate-backends-on-exit) -* [lsapi_avoid_zombies](/cloudlinux_os_components/#lsapi-avoid-zombies) -* [lsapi_use_req_hostname](/cloudlinux_os_components/#lsapi-use-req-hostname) -* [lsapi_debug](/cloudlinux_os_components/#lsapi-debug) - -[Tuning LSPHP backend](/cloudlinux_os_components/#tuning-lsphp-backend): -* [lsapi_set_env](/cloudlinux_os_components/#lsapi-set-env) -* [lsapi_set_env_path](/cloudlinux_os_components/#lsapi-set-env-path) -* [lsapi_backend_children](/cloudlinux_os_components/#lsapi-backend-children) -* [lsapi_backend_connect_tries](/cloudlinux_os_components/#lsapi-backend-connect-tries) -* [lsapi_backend_connect_timeout](/cloudlinux_os_components/#lsapi-backend-connect-timeout) -* [lsapi_backend_max_process_time](/cloudlinux_os_components/#lsapi-backend-max-process-time) -* [lsapi_backend_pgrp_max_idle](/cloudlinux_os_components/#lsapi-backend-pgrp-max-idle) -* [lsapi_backend_use_own_log](/cloudlinux_os_components/#lsapi-backend-use-own-log) -* [lsapi_backend_common_own_log](/cloudlinux_os_components/#lsapi-backend-common-own-log) -* [lsapi_backend_coredump](/cloudlinux_os_components/#lsapi-backend-coredump) -* [lsapi_backend_accept_notify](/cloudlinux_os_components/#lsapi-backend-accept-notify) -* [lsapi_backend_pgrp_max_reqs](/cloudlinux_os_components/#lsapi-backend-pgrp-max-reqs) -* [lsapi_backend_pgrp_max_crashes](/cloudlinux_os_components/#lsapi-backend-pgrp-max-crashes) -* [lsapi_backend_loglevel_info](/cloudlinux_os_components/#lsapi-backend-loglevel-info) -* [lsapi_backend_oom_score_adj](/cloudlinux_os_components/#lsapi-backend-oom-score-adj) -* [lsapi-server-tweak](/cloudlinux_os_components/#lsapi-server-tweak) Beta - -[Connection pool mode](/cloudlinux_os_components/#connection-pool-mode): -* [lsapi_with_connection_pool](/cloudlinux_os_components/#lsapi-with-connection-pool) -* [lsapi_backend_max_idle](/cloudlinux_os_components/#lsapi-backend-max-idle) -* [lsapi_backend_max_reqs](/cloudlinux_os_components/#lsapi-backend-max-reqs) - -[CRIU support](/cloudlinux_os_components/#criu-support-cloudlinux7-only): -* [lsapi_criu](/cloudlinux_os_components/#lsapi-criu) -* [lsapi_criu_socket_path](/cloudlinux_os_components/#lsapi-criu-socket-path) -* [lsapi_criu_imgs_dir_path](/cloudlinux_os_components/#lsapi-criu-imgs-dir-path) -* [lsapi_backend_initial_start](/cloudlinux_os_components/#lsapi-backend-initial-start) -* [lsapi_criu_use_shm](/cloudlinux_os_components/#lsapi-criu-use-shm) -* [lsapi_backend_semtimedwait](/cloudlinux_os_components/#lsapi-backend-semtimedwait) -* [lsapi_reset_criu_on_apache_restart](/cloudlinux_os_components/#lsapi-reset-criu-on-apache-restart) -* [lsapi_criu_debug](/cloudlinux_os_components/#lsapi-criu-debug) - -[PHP configuration management](/cloudlinux_os_components/#php-configuration-management): -* [lsapi_process_phpini](/cloudlinux_os_components/#lsapi-process-phpini) -* [lsapi_phpini](/cloudlinux_os_components/#lsapi-phpini) -* [lsapi_phprc](/cloudlinux_os_components/#lsapi-phprc) -* [lsapi_tmpdir](/cloudlinux_os_components/#lsapi-tmpdir) -* [lsapi_enable_user_ini](/cloudlinux_os_components/#lsapi-enable-user-ini) -* [lsapi_user_ini_homedir](/cloudlinux_os_components/#lsapi-user-ini-homedir) -* [lsapi_keep_http200](/cloudlinux_os_components/#lsapi-keep-http200) -* [lsapi_mod_php_behaviour](/cloudlinux_os_components/#lsapi-mod-php-behaviour) -* [php_value, php_admin_value, php_flag, php_admin_flag](/cloudlinux_os_components/#php-valuephp-admin-valuephp-flagphp-admin-flag) - -[Security](/cloudlinux_os_components/#security): -* [lsapi_use_suexec](/cloudlinux_os_components/#lsapi-use-suexec) -* [lsapi_user_group](/cloudlinux_os_components/#lsapi-user-group) -* [lsapi_uid_gid](/cloudlinux_os_components/#lsapi-uid-gid) -* [lsapi_use_default_uid](/cloudlinux_os_components/#lsapi-use-default-uid) -* [lsapi_target_perm](/cloudlinux_os_components/#lsapi-target-perm) -* [lsapi_paranoid](/cloudlinux_os_components/#lsapi-paranoid) -* [lsapi_check_document_root](/cloudlinux_os_components/#lsapi-check-document-root) -* [lsapi_disable_forced_pwd_var](/cloudlinux_os_components/#lsapi-disable-forced-pwd-var) -* [lsapi_max_resend_buffer](/cloudlinux_os_components/#lsapi-max-resend-buffer) - -#### **mod_lsapi customization** - -#### **lsapi_engine** - -**Syntax** : lsapi_engine on/off -**Default** : lsapi_engine off -**Context** : httpd.conf, htaccess - -**Description** : -Switching mod_lsapi handler on or off. - ---- - -#### **lsapi_socket_path** - -**Syntax** : lsapi_socket_path [path] -**Default** : lsapi_socket_path `/var/mod_lsapi` -**Context** : httpd.conf - -**Description:** -Path to backend lsphp sockets. By default `/var/mod_lsapi` - ---- - -#### **lsapi_poll_timeout** - -**Syntax** : lsapi_poll_timeout [number] -**Default** : lsapi_poll_timeout 300 -**Context** : httpd.conf, htaccess - -**Description** : -Time to wait for response from the lsphp daemon, in seconds. 0 stands for infinity. For preventing long running processes which can use EP (limit number of entry processes). Default value is 300. Should be more or equal to 0. In the case of wrong format, the default value will be used. - ---- - -#### **lsapi_per_user** - -**Syntax** : lsapi_per_user On/Off -**Default** : lsapi_per_user Off -**Context** : httpd.conf - -**Description** : -Invoke master lsPHP process not per VirtualHost but per account. -When On, invoke backend not per VirtualHost but per account. -Default value is Off. -It is possible, for example, to set it to On in global config file and to Off in config files of some particular Virtual Hosts. -Then these Virtual Hosts will have a dedicated backend process, while others will have backend processes shared on account basis. - ---- - -#### **lsapi_output_buffering** - -**Syntax** : lsapi_output_buffering On/Off -**Default** : lsapi_output_buffering On -**Context** : httpd.conf, virtualhost, htaccess - -**Description** : -Enable or disable output buffering on Apache level. Default value is On. - ---- - -#### **lsapi_disable_reject_mode** - -**Syntax** : lsapi_disable_reject_mode On/Off -**Default** : lsapi_disable_reject_mode Off -**Context** : httpd.conf, virtualhost - -**Description** : -If a new HTTP request is coming to LSPHP daemon when all LSPHP workers are still busy, it can process this situation in two different ways. In REJECT mode LSPHP daemon will reject such request immediately. Otherwise, in legacy mode, LSPHP daemon will put this request into infinite queue, until one or more LSPHP daemon becomes free. When HTTP request is rejected in REJECT mode, mod_lsapi will write into Apache error_log the following message: Connect to backend rejected, and the client will receive 507 HTTP response. -By default LSPHP daemon in CloudLinux OS Shared uses REJECT mode. It can be switched off with this option. - ---- - -#### **lsapi_terminate_backends_on_exit** - -**Syntax** : lsapi_terminate_backends_on_exit On/Off -**Default** : lsapi_terminate_backends_on_exit On -**Context** : httpd.conf - -**Description** : -httpd.conf, On - stop lsphp services on apache restart, Off - leave live started lsphp services on apache restart (for php+opcache). The lsphp will not restart, even if Apache gets restarted. - ---- - -#### **lsapi_avoid_zombies** - -**Syntax** : lsapi_avoid_zombies On/Off -**Default** : lsapi_avoid_zombies Off -**Context** : httpd.conf, virtualhost - -**Description** : -Enable or disable a mechanism to avoid creation of zombie processes by lsphp. Default value is Off. - ---- - -#### **lsapi_use_req_hostname** - -**Syntax** : lsapi_use_req_hostname On/Off -**Default** : lsapi_use_req_hostname Off -**Context** : httpd.conf, virtualhosts - -**Description** : -By default, we are using hostname from the server_rec structure (off), it means that mod_lsapi takes hostname from the VirtualHost section of the configuration file. Using hostname from the request_rec structure (On) means that mod_lsapi takes hostname from the HOST section of the request. It could be useful for those who use dynamically generated configs for virtual hosts for example with mod_lua. - ---- - -#### **lsapi_sentry** - -**Syntax** : lsapi_sentry On/Off -**Default** : lsapi_sentry On -**Context** : httpd.conf - -**Description** : -When this option is enabled, errors that occur in the operation of the mod_lsapi will be sent to the remote sentry server. You can see the error messages that were sent to the sentry server in the directory /var/log/mod_lsapi. If you do not want to send error notifications from your server, you can disable this directive in lsapi.conf. - ---- - -#### **lsapi_debug** - -**Syntax** : lsapi_debug On/Off -**Default** : lsapi_debug Off -**Context** : httpd.conf, virtualhost - -**Description** : -Extended debug logging. - ---- - -#### **Tuning LSPHP backend** - -#### **lsapi_set_env** - -**Syntax** : lsapi_set_env VAR_NAME [VAR_VALUE] -**Default** : - -**Context** : httpd.conf - -**Description** : -Pass env variable to lsphp. By default lsphp environment have only TEMP, TMP and PATH variables set. -Example: lsapi_set_env TMP "/var/lsphp-tmp" -Note: PATH env var default "/usr/local/bin:/usr/bin:/bin" cannot be changed because of security reasons. -To change it, use explicitly lsapi_set_env_path option. - -:::tip Beta -When the `lsapi_server_tweak` option is switched `On`, this option can be used in the virtualhost context. -::: - ---- - -#### **lsapi_set_env_path** - -**Syntax** : lsapi_set_env_path [path(s)] -**Default** : lsapi_set_env_path /usr/local/bin:/usr/bin:/bin -**Context** : httpd.conf - -**Description** : -Change PATH variable in the environment of lsPHP processes. Default path /usr/local/bin:/usr/bin:/bin will be used if not set. - -:::tip Beta -When the `lsapi_server_tweak` option is switched `On`, this option can be used in the virtualhost context. -::: - ---- - -#### **lsapi_backend_children** - -**Syntax** : lsapi_backend_children [number] -**Default** : lsapi_backend_children [EP] -**Context** : httpd.conf - -**Description** : -Sets maximum number of simultaneously running child backend processes. Optional, a default directive value is equal to 120. LSAPI_CHILDREN environment variable is set according to the following rules: -* If NPROC and EP are unlimited, the directive value is used. -* If NPROC is set to any limited value and the directive value is set to a number less than NPROC-1, the directive value is used. -* If the value is bigger than NPROC-1 and EP is set to unlimited, NPROC-1 is used. -* If the value is bigger than NPROC-1 and EP is set to any limited value, EP+1 is used. - -For example, with the default lve settings NPROC=100 and EP=20, the effective LSAPI_CHILDREN will be EP+1, that is LSAPI_CHILDREN=21. - ---- - -#### **lsapi_backend_connect_tries** - -**Syntax** : lsapi_backend_connect_tries [number] -**Default** : lsapi_backend_connect_tries 20 -**Context** : httpd.conf - -**Description** : -Number of retries to connects to lsPHP daemon. - ---- - -#### **lsapi_backend_connect_timeout** - -**Syntax** : lsapi_backend_connect_timeout [number] -**Default** : lsapi_backend_connect_timeout 500000 -**Context** : httpd.conf - -**Description** : -Number of usec to wait while lsPHP starts (if not started on request). - ---- - -#### **lsapi_backend_max_process_time** - -**Syntax** : lsapi_backend_max_process_time [number] -**Default** : lsapi_backend_max_process_time 300 -**Context** : httpd.conf, virtualhost - -**Description** : -Sets env variable LSAPI_MAX_PROCESS_TIME -Optional. Default value is 300. -Timeout to kill runaway processes. - ---- - -#### **lsapi_backend_pgrp_max_idle** - -**Syntax** : lsapi_backend_pgrp_max_idle [number] -**Default** : lsapi_backend_pgrp_max_idle 30 -**Context** : httpd.conf - -**Description** : -Sets env variable LSAPI_PGRP_MAX_IDLE, in seconds. -Controls how long a control process will wait for a new request before it exits. # 0 stands for infinite. -Optional, default value is 30. -Should be more or equal to 0. - ---- - -#### **lsapi_backend_use_own_log** - -**Syntax** : lsapi_backend_use_own_log On/Off -**Default** : lsapi_backend_use_own_log Off -**Context** : httpd.conf, virtualhost - -**Description** : -Redirecting log output of backend processes from Apache error_log to dedicated log file or files, depending on value of lsapi_backend_common_own_log option. If Off, use Apache error log file for backend output, or separate file otherwise. - ---- - -#### **lsapi_backend_common_own_log** - -**Syntax** : lsapi_backend_common_own_log On/Off -**Default** : lsapi_backend_common_own_log Off -**Context** : httpd.conf, virtualhost - -**Description** : -It will be used only when lsapi_backend_use_own_log set to On. On - backend processes of the all virtual hosts will share the common log file. Off - every virtual host will have its own backend log file. - ---- - -#### **lsapi_backend_coredump** - -**Syntax** : lsapi_backend_coredump On/Off -**Default** : lsapi_backend_coredump Off -**Context** : httpd.conf, htaccess - -**Description** : -env variable LSAPI_ALLOW_CORE_DUMP (On or Off). Pass LSAPI_ALLOW_CORE_DUMP to lsphp or not. If it will be passed - core dump on lsphp crash will be created. -Off by default. -By default LSAPI application will not leave a core dump file when crashed. If you want to have LSAPI PHP dump a core file, you should set this environment variable. If set, regardless the value has been set to, core files will be created under the directory that the PHP script in. - ---- - -#### **lsapi_backend_accept_notify** - -**Syntax** : lsapi_backend_accept_notify On/Off -**Default** : lsapi_backend_accept_notify On -**Context** : httpd.conf, virtualhost - -**Description** : -Switch LSAPI_ACCEPT_NOTIFY mode for lsphp. This option can be used both in Global and VirtualHost scopes.This mode is incompatible with PHP 4.4. - ---- - -#### **lsapi_backend_pgrp_max_reqs** - -**Syntax** : lsapi_backend_prgrp_max_reqs [number] -**Default** : lsapi_backend_max_reqs 0 -**Context** : httpd.conf, virtualhost - -**Description** : -Controls how many requests a control process will process before it exits. Should be more or equal to 0. In the case of wrong format, a default value will be used. Optional, the default value is 0, which means an unlimited number of requests. - ---- - -#### **lsapi_backend_pgrp_max_crashes** - -**Syntax** : lsapi_backend_prgrp_max_crashes [number] -**Default** : lsapi_backend_max_crashes 0 -**Context** : httpd.conf, virtualhost - -**Description** : -Controls how many crashes of its worker processes a control process will detect before it exits. Should be more or equal to 0. In the case of wrong format, a default value will be used. Optional, the default value is 0, which means an unlimited number of crashes. - ---- - -#### **lsapi_backend_loglevel_info** - -**Syntax**: lsapi_backend_loglevel_info [On/Off] - -**Default**: lsapi_backend_loglevel_info Off - -**Context**: httpd.conf, virtualhost - -**Description**: Controls which log level will be used to write PHP warnings and notices into Apache’s error_log. Optional, the default value is `Off`. In that case `LOG_WARNING` log level will be used. Otherwise, with `On` value, `LOG_INFO` log level will be used. - ---- - -#### **lsapi_backend_oom_score_adj** - -**Syntax**: lsapi_backend_oom_score_adj [number] - -**Default**: lsapi_backend_oom_score_adj 0 - -**Context**: httpd.conf, virtualhost - -**Description**: This option can be used to apply **oom_score_adj** values for PHP processes created by mod_lsapi. Value is an integer in the -1000 to 1000 range. The lower the value, the lower the chance that the process will be killed. -When your server becomes low on free memory and an OOM killer is invoked then desirable that lsphp processes are sacrificed to free up memory. To do this, you need to set oom_score_adj to a large value. -For more information on setting value **oom_score_adj**, see the page [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) - ---- - -#### **lsapi_server_tweak** - -**Syntax**: lsapi_server_tweak [On/Off] - -**Default**: lsapi_server_tweak Off - -**Context**: httpd.conf - -**Description**: This option, when switched on, allows the use of `lsapi_set_env` and `lsapi_set_env_path` config options in the virtualhost context. - ---- - -#### **Connection pool mode** - -#### **lsapi_with_connection_pool** - -**Syntax** : lsapi_with_connection_pool On/Off -**Default** : lsapi_with_connection_pool Off -**Context** : httpd.conf - -**Description** : -On/Off - disable enable connect pool, default is Off. - ---- - -#### **lsapi_backend_max_idle** - -**Syntax** : lsapi_backend_max_idle [number] -**Default** : lsapi_backend_max_idle 300 -**Context** : httpd.conf - -**Description** : -It is relevant only with lsapi_with_connection_pool option switched on. Controls how long a worker process will wait for a new request before it exits. 0 stands for infinite. Should be more or equal to 0. In the case of wrong format default value will be used. Optional, default value is 300. - ---- - -#### **lsapi_backend_max_reqs** - -**Syntax** : lsapi_backend_max_reqs [number] -**Default** : lsapi_backend_max_reqs 10000 -**Context** : httpd.conf - -**Description** : -It is relevant only with lsapi_with_connection_pool option switched on. Controls how many requests a worker process will process before it exits. Should be more than 0. In the case of wrong format default value will be used. Optional, default value is 10000. - ---- - -#### **CRIU support** - -#### **lsapi_criu** - -**Syntax** : lsapi_criu On/Off -**Default** : lsapi_criu Off -**Context** : httpd.conf - -**Description** : -Enable/disable CRIU for lsphp freezing. Default: Off. - ---- - -#### **lsapi_criu_socket_path** - -**Syntax** : lsapi_criu_socket_path [path] -**Default** : lsapi_criu_socket_path /var/run/criu/criu_service.socket -**Context** : httpd.conf - -**Description** : -Set path to socket for communication with criu service. Default: /var/run/criu/criu_service.socket. - ---- - -#### **lsapi_criu_imgs_dir_path** - -**Syntax** : lsapi_criu_imgs_dir_path [path] -**Default** : lsapi_criu_imgs_dir_path /var/mod_lsapi/ -**Context** : httpd.conf - -**Description** : -Path to folder where images of freezed PHP will be stored. Should be path. Default: /var/mod_lsapi/ - ---- - -#### **lsapi_backend_initial_start** - -**Syntax** : lsapi_backend_initial_start [number] -**Default** : lsapi_backend_initial_start 0 -**Context** : httpd.conf - -**Description** : -Number of requests to virtualhost, when lsphp will be freezed. Default: 0 - means disable freezing. - ---- - -#### **lsapi_criu_use_shm** - -**Syntax** : lsapi_criu_use_shm Off/Signals -**Default** : lsapi_criu_use_shm Off -**Context** : httpd.conf - -**Description** : -Method of requests counting. Off - use shared memory. Signals - use signals from child processes to parent. Default: Off - ---- - -#### **lsapi_backend_semtimedwait** - -**Syntax** : lsapi_backend_semtimedwait On/Off -**Default** : lsapi_backend_semtimedwait On -**Context** : httpd.conf - -**Description** : -Use semaphore for checking when lsphp process will be started. Speed of start lsphp increased with semaphore using. This method avoid cycles of waiting for lsphp start. Default: On. - ----- - -#### **lsapi_reset_criu_on_apache_restart** - -**Syntax** : lsapi_reset_criu_on_apache_restart On/Off -**Default** : lsapi_reset_criu_on_apache_restart Off -**Context** : httpd.conf, virtualhost - -**Description** : -This option allows cleaning all CRIU images on Apache restart. -Setting lsapi_reset_criu_on_apache_restart to On means that on each Apache restart the CRIU images which are stored in directory specified by lsapi_criu_imgs_dir_path directive will be recreated on new request to domain(only after restart). -If this option set to Off then CRIU images won’t be recreated on Apache restart. - ----- - -#### **lsapi_criu_debug** - -**Syntax**: lsapi_criu_debug On/Off -**Default**: lsapi_criu_debug Off -**Context**: httpd.conf, virtualhost - -**Description** : -Enable/disable CRIU related debug logging. - ----- - -#### **PHP configuration management** - -#### **lsapi_process_phpini** - -**Syntax** : lsapi_process_phpini On/Off -**Default** : lsapi_process_phpini Off -**Context** : httpd.conf, virtualhost, directory - -**Description** : -Enable or disable phpini_* directive processing. Default value is Off. - ---- - -#### **lsapi_phpini** - -**Syntax** : lsapi_phpini [path] -**Default** : lsapi_phpini - -**Context** : httpd.conf, virtualhost, htaccess - -**Description** : -When lsapi_process_phpini option switched to Off, these values will be silently ignored. lsapi_phpini values with absolute filename of php.ini file can be inserted into .htaccess files in order to set custom php.ini which will override/complement settings from system default php.ini. - ---- - -#### **lsapi_phprc** - -**Syntax** : lsapi_phprc [No | Env | Auto | DocRoot] -**Default** : lsapi_phprc No -**Context** : httpd.conf, virtualhost - -**Description** : -The value of PHPRC env variable. -Special values are "No", "Env", "Auto" and "DocRoot". -Default value is "No" - without PHPRC at all. -"Auto" value stands for php.ini from DocumentRoot of the corresponding VirtualHost if it is present, or from user's home directory otherwise "DocRoot" value stands for php.ini from DocumentRoot of the corresponding VirtualHost. -"Env" value for using PHPRC from the environment, to set it with SetEnv config option, for example -lsapi_phprc No -lsapi_phprc Auto -lsapi_phprc DocRoot -lsapi_phprc Env -lsapi_phprc /etc/ - ---- - -#### **lsapi_tmpdir** - -**Syntax** : lsapi_tmpdir [path] -**Default** : lsapi_tmpdir /tmp -**Context** : httpd.conf, virtualhost - -**Description** : -Set alternate request body temporary files directory. - ---- - -#### **lsapi_enable_user_ini** - -**Syntax** : lsapi_enable_user_ini On/Off -**Default** : lsapi_enable_user_ini Off -**Context** : httpd.conf, virtualhost - -**Description** : -Enable .user.ini files for backend. Same as suphp, php-fpm and fcgid mechanism of .user.ini. Default value is Off. - ---- - -#### **lsapi_user_ini_homedir** - -**Syntax** : lsapi_user_ini_homedir On/Off -**Default** : lsapi_user_ini_homedir Off -**Context** : httpd.conf, virtualhost - -**Description** : -If lsapi_enable_user_ini option is set to On, then enable/disable processing .user.ini file in home directory also. Default value is Off. - ---- - -#### **lsapi_keep_http200** - -**Syntax** : lsapi_keep_http200 On/Off -**Default** : lsapi_keep_http200 Off -**Context** : httpd.conf, .htaccess - -**Description** : -If set to On, always keep backend's response status as mod_php does. If set to Off, response status can be overridden by Apache as suphp does (in case of call via ErrorDocument directive). - ---- - -#### **lsapi_mod_php_behaviour** - -**Syntax** : lsapi_mod_php_behaviour On/Off -**Default** : lsapi_mod_php_behaviour On -**Context** : httpd.conf, virtualhost, directory - -**Description** : -On/Off - disable php_* directives, default On. - ---- - -#### **php_value, php_admin_value, php_flag, php_admin_flag** - -**Syntax** : [php_value|php_admin_value|php_flag|php_admin_flag] -**Default** : -**Context** : httpd.conf, virtualhost, htaccess - -**Description** : -mod_php emulation. - ---- - -#### **Security** - -#### **lsapi_use_suexec** - -**Syntax** : lsapi_use_suexec On/Off -**Default** : lsapi_use_suexec On -**Context** : httpd.conf - -**Description** : -Use or not suexec to a target user. - ---- - -#### **lsapi_user_group** - -**Syntax** : lsapi_user_group [user_name] [group_name] -**Default** : - -**Context** : httpd.conf, virtualhost, directory - -**Description** : -Set user & group for requests. - ---- - -#### **lsapi_uid_gid** - -**Syntax** : lsapi_uid_gid [uid] [gid] -**Default** : - -**Context** : httpd.conf, virtualhost, directory - -**Description** : -Set user & group for request. - ---- - -#### **lsapi_use_default_uid** - -**Syntax** : lsapi_use_default_uid On/Off -**Default** : lsapi_use_default_uid On -**Context** : httpd.conf - -**Description** : -Use default Apache UID/GID if no uid/gid set. Values: On/Off. If Off, and no UID/GID set, error 503 will be returned. - ---- - -#### **lsapi_target_perm** - -**Syntax** : lsapi_target_perm On/Off -**Default** : lsapi_target_perm Off -**Context** : httpd.conf - -**Description** : -Check target PHP script permissions. If set to On, lsapi will check that script is owned by the same user, as user under which it is being executed. Return 503 error if they don't match. Default: Off. - ---- - -#### **lsapi_paranoid** - -**Syntax** : lsapi_paranoid On/Off -**Default** : lsapi_paranoid Off -**Context** : httpd.conf - -**Description** : -Check or not permissions of target php scripts. Optional, default value is Off. - ---- - -#### **lsapi_check_document_root** - -**Syntax** : lsapi_check_document_root On/Off -**Default** : lsapi_check_document_root On -**Context** : httpd.conf - -**Description** : -Check or not owner of DOCUMENT_ROOT. Optional, default value is On. - ---- - -#### **lsapi_disable_forced_pwd_var** - -**Syntax** : lsapi_disable_forced_pwd_var On/Off -**Default** : lsapi_disable_forced_pwd_var Off -**Context** : httpd.conf, virtualhost - -**Description** : -To disable addition of PWD variable. Default value is Off. If set to On, the PWD variable will not be added into a backend environment. - ---- - -#### **lsapi_max_resend_buffer** - -**Syntax** : lsapi_max_resend_buffer [number]tmp -**Default** : lsapi_max_resend_buffer 200 -**Context** : httpd.conf, virtualhost - -**Description** : -Maximum buffer in KiB to resend for request that has a body (like POST request body). - - -See also [Apache mod_lsapi PRO CLI tools](/command-line_tools/#apache-mod-lsapi-pro). - -### Troubleshooting - -**Debugging mod_lsapi issues: error_log & sulsphp_log** - - -mod_lsapi errors will be located in error_log and sulsphp_log. -Note that errors can appear in both logs at the same time, and you might need to refer to both of them to solve the issue. - -See next table for more details: - -| | | | -|-|--|-| -|**error_log** | **sulsphp_log** | **Solution**| -|Could not connect to lsphp backend: connect to lsphp failed: 111 Connection refused. Increase memory limit for LVE ID |uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp | Increase pmem or vmem limits for the user uid.| -|Error sending request: ReceiveLSHeader: nothing to read from backend socket |No need to check this log. | lsphp was killed. It can be due to apache restart or lfd. If you see this message too often - change lsapi_terminate_backends_on_exit to Off in lsapi.conf or add to /etc/csf/csf.pignore the following lines: exe:/usr/local/bin/lsphp pexe:/opt/alt/php.*/usr/bin/lsphp| -|Error sending request (lsphp is killed?): ReceiveLSHeader: nothing to read from backend socket, referer: http://XXXXXXX Child process with pid: XXXXX was killed by signal: 11, core dump: 0 |No need to check this log. | lsphp has crashed. Next slide will explain what to do (core dump creating). Also, check configuration options for apc and suhosin in php.ini. Once you have a core file generated at DocumentRoot contact [https://cloudlinux.zendesk.com/](https://cloudlinux.zendesk.com/hc/) so we can investigate the cause.| -|Could not connect to lsphp backend: connect to lsphp failed: 111 Connection refused |file is writable by others: (///usr/local/bin/lsphp) | Incorrect lsphp file permissions. For fixing: chmod 755 /usr/local/bin/lsphp cagefsctl --force-update.| -|Could not determine uid/gid for request |No need to check this log. | UID/GID are not set in virtualhost. Set lsapi_use_default_uid On in lsapi.conf (it is On by default since 0.1-98 version, this solution is for older versions).| -|Own id for script file (/xxxx/xxx/xxxx) is xxx; should be xxxx |No need to check this log. | File is not owned by the user PHP executed by. To overwrite (insecure), set lsapi_target_perm Off in lsapi.conf. | -|Could not connect to lsphp backend: connect to lsphp failed: 111 Connection refused |Entering jail error | Check if СageFS enabled. Try running cagefsctl --remount-all. | -|Backend error on sending request(GET /XXXX HTTP/1.1); uri(/XXXX) content-length(0) (lsphp is killed?): ReceiveAckHdr: backend process reset connection: errno 104 (possibly memory limit for LVE ID XXXX too small) |uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp | Increase PMEM limits for the user UID.| -|Reached max children process limit: XX, extra: 0, current: XX, please increase LSAPI_CHILDREN.

Backend error on sending request(GET /XXXX HTTP/1.1); uri(/XXXX) content-length(0) (lsphp is killed?): ReceiveAckHdr: backend process reset connection: errno 104 (possibly memory limit for LVE ID XXXX too small) |uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp | Increase value of lsapi_backend_children for UID in vhost.conf or globally in lsapi.conf.| -|fork() failed, please increase process limit: Cannot allocate memory

Backend error on sending request(GET /XXXX HTTP/1.1); uri(/XXXX) content-length(0) (lsphp is killed?): ReceiveAckHdr: backend process reset connection: errno 104 (possibly memory limit for LVE ID XXXX too small) |uid:(xxx); gid:(xxx); uid limit warning: EP should be < than NPROC, current EP: XX, NPROC: XX

uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp | Increase NPROC limits for the UID. It should be greater than EP and lsapi_backend_children. | -|Child process with pid: XXXXXX was killed by signal: 9, core dump: 0

Backend error on sending request(GET /XXXX HTTP/1.1); uri(/XXXX) content-length(0) (lsphp is killed?): ReceiveAckHdr: nothing to read from backend socket (LVE ID XXXX |uid: (xxx/xxxxxxxx) gid: (xxx/xxxxxxxxxx) cmd: /usr/local/bin/lsphp | These errors occurs when the amount of PMEM limits is incommensurable with the number of EP. Increase PMEM limits or decrease EP number for the user UID.| -|totBytesRead (X) != bodyLen (X), referer: XXXX

Backend error on sending request(POST /XXXX HTTP/1.1); uri(/XXXX) content-length(X) (lsphp is killed?): ReceiveAckHdr: nothing to read from backend socket (LVE ID XXXX)

lsphp(XXXX): Child process with pid: XXXX was killed by signal: 15, core dump: 0 |No need to check this log. | Increase LimitRequestBody (Apache) or/and SecRequestBodyNoFilesLimit (mod_security) configuration limits| -|Connect to backend failed: connect to lsphp failed: 13 |No need to check this log. | Check that `mod_ruid2` is disabled| -|Connect to backend rejected on sending request(POST /XXXXX HTTP/1.1); uri(/XXXXX) |No need to check this log.|Set `lsapi_disable_reject_mode On` in your `lsapi.conf` and reload Apache. This way LSPHP daemon will put requests that cannot be served by LSPHP daemon right away into infinite queue, until one or more LSPHP daemon becomes free. Visit [Configuration Reference](/cloudlinux_os_components/#configuration-references) for more info.| - - -**Non-standard apache user** - -If apache runs under a username other than "apache" or "nobody" , you should rebuild sulsphp (where username is built in for security reasons) with corresponding username: -
- -``` -$ yum install liblsapi liblsapi-devel -$ cd ~$ wget [https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz](https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz) -$ tar zxvf mod_lsapi.tar.gz -$ cd mod-lsapi-0.1-37 -$ cmake -DHTTPD_USER= . -$ make -$ make install -``` -
-This will:
-- Install: /usr/lib/apache/mod_lsapi. so (or to another correct httpd modules path)
-- Install: /usr/sbin/sulsphp - -**lsphp started under user apache/nobody** - -Check if SuExecUserGroup specified for virtual hosts. This parameter is used by mod_lsapi for user identification. - -**Could not connect to lsphp backend: connect failed: 111 Connection refused** - -* Switch in lsapi.conf or mod_lsapi.conf value to: lsapi_terminate_backends_on_exit Off - -* Check if empty: cat /etc/cron.d/kill_orphaned_php-cron | grep lsphp , then run: - -
- -``` -yum install lve-utils -``` -
-Then restart cron service. - -**Running PHP for users with UID < 99** - -If you need to run PHP using mod_lsapi using users with UID < 99, you would need to re-compile sulsphp: - -
- -``` -$ yum install liblsapi liblsapi-devel -$ cd ~ -$ wget [https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz](https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz) -$ tar zxvf mod_lsapi.tar.gz -$ cd mod-lsapi-0.1-XX -$ cmake -DUID_MIN=80 -DGID_MIN=80 . -$ make -$ make install -``` -
-will be installed
-- Installing: /usr/lib/apache/mod_lsapi.so (or another httpd modules path)
-- Installing: /usr/sbin/sulsphp - -**Apache binary called not httpd (httpd.event, httpd.worker)** - -
- -``` -$ yum install liblsapi liblsapi-devel -$ cd ~ -$ wget https://repo.cloudlinux.com/cloudlinux/sources/da/mod_lsapi.tar.gz -$ tar zxvf mod_lsapi.tar.gz -$ cd mod-lsapi-0.1-XX -$ cmake -DPARENT_NAME="". -$ make -$ make install -``` -
-Will be installed:
-- Installing: /usr/lib/apache/mod_lsapi.so (or another httpd modules path)
-- Installing: /usr/sbin/sulsphp - -**WHMCS Status page not accessible after installing CL and mod_lsapi (cPanel).** - -* add user: useradd userstat -* add to file (to the end of file before ) /usr/local/apache/conf/conf.d/lsapi.conf: -lsapi_user_group userstat userstat - -* service httpd restart - -This is safe solution for easyapache rebuilding and cpanel-mod-lsapi updating. - -**PHP page with Suhosin return 503 error** - -Make php.ini for suhosin as recommended below: -
- -``` -[suhosin] -suhosin.simulation = Off -suhosin.mail.protect = 1 -suhosin.cookie.disallow_nul = Off -suhosin.cookie.max_array_depth = 1000 -suhosin.cookie.max_array_index_length = 500 -suhosin.cookie.max_name_length = 500 -suhosin.cookie.max_totalname_length = 500 -suhosin.cookie.max_value_length = 200000 -suhosin.cookie.max_vars = 16384 -suhosin.get.disallow_nul = Off -suhosin.get.max_array_depth = 1000 -suhosin.get.max_array_index_length = 500 -suhosin.get.max_name_length = 500 -suhosin.get.max_totalname_length = 500 -suhosin.get.max_value_length = 1000000 -suhosin.get.max_vars = 16384 -suhosin.post.disallow_nul = Off -suhosin.post.max_array_depth = 1000 -suhosin.post.max_array_index_length = 500 -suhosin.post.max_name_length = 500 -suhosin.post.max_totalname_length = 500 -suhosin.post.max_value_length = 1000000 -suhosin.post.max_vars = 16384 -suhosin.request.disallow_nul = Off -suhosin.request.max_array_depth = 1000 -suhosin.request.max_array_index_length = 500 -suhosin.request.max_totalname_length = 500 -suhosin.request.max_value_length = 1000000 -suhosin.request.max_vars = 16384 -suhosin.request.max_varname_length = 524288 -suhosin.upload.max_uploads = 300 -suhosin.upload.disallow_elf = Off -suhosin.session.cryptua = Off -suhosin.session.encrypt = Off -suhosin.session.max_id_length = 1024 -suhosin.executor.allow_symlink = Off -suhosin.executor.disable_eval = Off -suhosin.executor.disable_emodifier = Off -suhosin.executor.include.max_traversal = 8 -``` -
- -**PHP page with APC return 503 error** - -Make php.ini for APC as recommended below: -
- -``` -[apc]...apc.shm_segments=1apc.shm_size=32... -``` -
-shared memory should be not less than 32MB - -**Messages appearing in error_log: Child process with pid: XXXXX was killed by signal: 11, core dump: 0** - -This means that lsphp was crashed. The solution is: - -* Check if apc for user enabled. Tune its options as described in previous slide. -* Check if suhosin is enabled for user. Tune its options as described in this article. -* If previous items do not help, contact us at [https://helpdesk.cloudlinux.com/](https://helpdesk.cloudlinux.com/) - -**How to get lsphp core dump on crash** - -* Configure mod_lsapi to allow lsphp to generate core dumps. In mod_lsapi.conf: - -
- -``` -lsapi_backend_coredump On -``` -
- -* Enable core file generation in sysctl: - -
- -``` -sysctl -w ‘kernel.core_uses_pid=1’ -sysctl -w ‘kernel.core_pattern=core.%p’ -``` -
- -* Configure system to change max size of core files. In /etc/security/limits.conf add: - -
- -``` -user1 soft core unlimited -user1 hard core unlimited -``` -
-where user1 is the username for which lsphp crashes. - -* If /etc/profile.d/limits.sh exists, look up for the following lines: - -
- -``` -if [ "$LIMITUSER" != "root" ]; then -ulimit -n 100 -u 35 -m 200000 -d 200000 -s 8192 -c 200000 -v unlimited 2>/dev/null -``` -
-Substring “-c 200000” must be replaced with “-c unlimited” . - -* Add line into ulimit -c unlimited into apachectl script just after another invokes of the ulimit command. - -* Do cold restart of Apache with the command like this: - -
- -``` -service httpd stop; sleep 2; killall lsphp; service httpd start -``` -
- -* You can make sure that ulimit for lsphp is changed to unlimited successfully with the following command: - -
- -``` -cat /proc/PID/limits | grep ‘Max core file size’ -``` -
- -where PID is a pid of any lsphp process. ps -u user1 | grep lsphp - -* Core dump of lsphp will be created in the DocumentRoot of the corresponding virtual server. -On cPanel server it should map to - -**mod_lsapi is not included in output of httpd -M after installation and setup command for cPanel EasyApache 3** - -1. Check if the file _/usr/local/apache/conf/conf.d/lsapi.conf_ exists and not empty; - -2. Check if output of the command - -
- -``` -cat /usr/local/apache/conf/httpd.conf | grep "/usr/local/apache/conf/conf.d/\*\.conf" -``` -
-is not empty. - -If it is empty: - -1. Add to "include" section of _/var/cpanel/conf/apache/main_ string: - - -``` -"include": '"/usr/local/apache/conf/conf.d/*.conf"' - "include": - "directive": 'include' - "items": - ... - - - "include": '"/usr/local/apache/conf/conf.d/*.conf"' - "listen": -``` - -2. Do: - -
- -``` -mkdir -p /usr/local/apache/conf/conf.d/; -cp /usr/share/lve/modlscapi/confs/lsapi.conf /usr/local/apache/conf/conf.d/lsapi.conf -``` -
- -3. Call: - -
- -``` -/scripts/rebuildhttpdconf/scripts/restartsrv_httpd -``` -
- -See also mod_lsapi PRO FAQ [here](https://cloudlinux.zendesk.com/hc/articles/360025828414-Apache-mod-lsapi-PRO-FAQ). - -### CRIU Support - - -:::tip Note - CloudLinux OS Shared 7, CloudLinux OS Shared 7 Hybrid, and CloudLinux OS Shared 8 only -::: - -CRIU is _Checkpoint/Restore In Userspace_ , (pronounced kree-oo ), is a software tool for Linux operating system. Using this tool, you can freeze a running application (or part of it) and checkpoint it as a collection of files on disk. You can then use the files to restore the application and run it exactly as it was during the time of freeze (more information on the link [https://criu.org/Main_Page](https://criu.org/Main_Page) ). - -mod_lsapi-1.1-1 is the first beta version with freezing PHP implemented. mod_lsapi now supports the following parameters: - -| | | | | -|-|--|--|-| -|**Option name** | **Description** | **Values** | **Default**| -|lsapi_criu | Enable/disable CRIU for lsphp freezing. | On/Off | Off | -|lsapi_criu_socket_path | Set path to socket for communication with criu service. | [path to socket] | /var/run/criu/criu_service.socket | -|lsapi_backend_semtimedwait | Enable/disable flag for notification about lsphp started. This method avoid cycles of waiting for lsphp start. | On/Off | On | -|lsapi_backend_initial_start | Number of request when lsphp should be freezed. | [number] 0 - no freezing | 0| -|lsapi_criu_use_shm | Method of requests counting. Off - use shared memory. Signals - use signals from child processes to parent. | Off/Signals | Off | -|lsapi_criu_imgs_dir_path | Path to folder where imgs of freezed PHP will be stored. | [path] | /var/mod_lsapi/ | -|lsapi_criu_debug | Enable/Disable CRIU related debug logging. | On/Off | Off | - -Example: -
- -``` -lsapi_criu On -lsapi_criu_socket_path /var/run/criu/criu_service.socket -lsapi_backend_semtimedwait On -lsapi_backend_initial_start 15 -lsapi_criu_use_shm Off -lsapi_criu_debug Off -``` -
- -When Apache module mod_lsapi detects CRIU enabled (lsapi_criu On) it prepares a directory for images (on the first request of virtualhost) to store ( lsapi_criu_imgs_dir_path /var/mod_lsapi/[dir_name] ), and starts lsphp process. Lsphp increases counter ( lsapi_criu_use_shm Off|Signals ) via shared memory or signals, when counter reaches limit ( lsapi_backend_initial_start 15 ), lsphp sends the request to CRIU for freezing. CRIU service makes images of requested processes. Lsphp will not be frozen if counter has not reached the limit. The next time when lsphp will be stopped, it will be unfrozen from the images. - -The images of the processes will be saved even if Apache is restarted. But all images will be deleted after server restart by default configuration. This can be modified by setting the new path lsapi_criu_imgs_dir_path . - -:::warning Important! -If php.ini or configuration file from php.d is changed, the images must be deleted manually. -::: - -:::tip Note -CRIU (version lower than criu-lve-3.6-1) can't correctly freeze lsphp with PrivateTmp enabled. For correct work, PrivateTmp must be disabled in httpd.service file . -::: - -To disable it, copy _httpd.service_ to _/etc/systemd/system_ and change there PrivateTmp: -  -
- -``` -# cat httpd.service -[Unit] -Description=Apache web server managed by cPanel Easy -ApacheConditionPathExists=!/etc/httpddisable -ConditionPathExists=!/etc/apachedisable -ConditionPathExists=!/etc/httpdisable - -[Service]Type=forking -ExecStart=/usr/local/cpanel/scripts/restartsrv_httpd --no-verbose -PIDFile=/var/run/apache2/httpd.pid -PrivateTmp=false - -[Install] -WantedBy=multi-user.target -``` -
-Or it would be technically better to provide a small override of service file rather than copying the whole new version in /etc/systemd/system - -[http://www.freedesktop.org/software/systemd/man/systemd.unit.html](http://www.freedesktop.org/software/systemd/man/systemd.unit.html) - -
- -``` -mkdir /etc/systemd/system/httpd.service.d -echo "[Service]" > /etc/systemd/system/httpd.service.d/nopt.conf -echo "PrivateTmp=false" >> /etc/systemd/system/httpd.service.d/nopt.conf -``` -
- -and - -
- -``` -# systemctl daemon-reload -``` -
- -#### CRIU Installation - -Criu is installed with dependency to mod_lsapi package. To activate it: - -1. Enable service and start it: - -
- -``` -systemctl enable criu -systemctl start criu -``` -
- -2. Edit lsapi.conf file, turn CRIU On and set some defaults: - -
- -``` -lsapi_criu On -lsapi_criu_socket_path /var/run/criu/criu_service.socket -lsapi_backend_semtimedwait On -lsapi_backend_initial_start 15 -lsapi_criu_use_shm Off -``` -
- -3. Restart apache: - -
- -``` -service httpd restart -``` -
- -#### CRIU Image Cleanup - -1. An option added to the Apache configuration for cleaning all the images earlier saved by CRIU. - -| | | | | -|-|--|--|-| -|**Option name** | **Description** | **Value** | **Default**| -|lsapi_reset_criu_on_apache_restart | This option allows cleaning all CRIU images on Apache restart. | On/Off | Off | - -On the next restart of Apache all of the images will be cleaned. - -It can be enabled by writing lsapi_reset_criu_on_apache_restart On in _lsapi.conf_ (Virtual Host and .htaccess do not allow to use this option). - -Note that this option works only if lsapi_terminate_backends_on_exit is On (default value is On , it is set in _lsapi.conf_ too). - -2. If you need to clean CRIU images for one user you can simply add file to the user's directory with CRIU images (default _/var/mod_lsapi/lsapi_ * _criu_imgs_ ). On the next restart of lsphp the images will be cleaned. - -3. Global reset flag for cleaning all earlier saved images by CRIU. - -Current mod_lsapi allows cleaning all images only with one flag file. - -Create /usr/share/criu/mod_lsapi/lsphp.criu.reset file. Also don't forget to set such permissions [nobody:nobody] (or [apache:apache] for non cPanel) and access mode [700] to the /usr/share/criu/mod_lsapi directory. - -Steps to do : - -
- -``` -mkdir /usr/share/criumkdir /usr/share/criu/mod_lsapi -chown nobody:nobody /usr/share/criu/mod_lsapi -touch /usr/share/criu/mod_lsapi/lsphp.criu.reset -``` -
- -On the next requests to all virtual hosts images will be recreated (deleted first and created again later - it depends on lsapi_backend_initial_start value). - -4. Аdded possibility to clean CRIU images from user space. - -If a user needs to clean CRIU images for lsphp, he should create a file: ~/mod_lsapi_reset_me_[vhost_name] . Where [vhost_name] is a ServerName from the VirtualHost block in the configuration file. On the next restart of lsphp, the images will be cleaned. - -_Example:_ - -
- -``` -cd; touch mod_lsapi_reset_me_criu.test.com -``` -
- -where _vhost.conf_ contains: -`ServerName criu.test.com` - -This mode is enabled by default and creates a separate lsphp process for each virtual host. - -`mod_lsapi_reset_me[vhost_name]` flag will not work for a user when lsapi_per_user option is `On`. - -5. There is (default `off`) option in mod_lsapi that creates only one lsphp process for a user, regardless of the number of his virtual hosts. We don't recommend to use this option with CRIU, but if you use it, make sure that your virtual hosts (under the same user) have the same environment configurations. If they are not the same, this may cause undesirable lsphp process operation. - - - -## Additional integration components - -CloudLinux OS Shared uses various ways to integrate with existing system. - -### LVE PAM module - -pam_lve.so is a PAM module that sets up LVE environment. It provides easy way to setup LVE for SSH sessions, as well as other PAM enabled applications, such as crontab, su, etc. - -pam_lve.so is installed by default when you convert existing server. - -Installation: - -
- -``` -# yum install pam_lve -``` -
- -After you install RPM , add the following line to the PAM config file for the required application: - -
- -``` -session required pam_lve.so 500 1 wheel,other -``` -
- -In this line: -* 500 stands for minimum UID for which LVE will be setup. For any user with UID < 500, LVE will not be setup. If CageFS is installed, use: -`cagefsctl --set-min-uid UID` to setup minimum UID. The parameter in PAM files will be ignored in that case. -* 1 stands for CageFS enabled (0 – CageFS disabled) -* 3rd optional argument defines group of users that will not be placed into LVE or CageFS. Starting with **pam_lve 0.3-7** you can specify multiple groups, comma separated. - -:::tip Warning -It is crucial to place all users that su or sudo to root into that group. Otherwise, once such user gains root, user will be inside LVE, and all applications restarted by that user will be inside that user LVE as well. -::: - -:::tip Warning -Please do not add the `pam_lve.so` in the PAM configuration for sudo. It can affect user’s work with the resource usage plugin, and Python/Node.js/PHP selector plugins. -::: - -For example, to enable LVE for SSH access, add that line to the `/etc/pam.d/sshd`. To enable LVE for SU, add that line to the `/etc/pam.d/su`. - -By default, module will not place users with group wheel into lve. If you want to use different group to define users that will not be placed into LVE by pam_lve - pass it as the 3rd argument. - -:::tip Warning -Be careful when you test it, as if you incorrectly add this line to the `/etc/pam.d/sshd`, it will lock you out ssh. Don't log out of your current SSH session, until you sure it works. -::: - -For preventing cases when user enters under usual user (using ssh) and then tries to enter as super user (via sudo or su) - pam_sulve was created, which tries to enter to LVE=1 and leaves it right away. If action fails, user gets message: - -
- -``` -!!!! WARNING: YOU ARE INSIDE LVE !!!! -``` -
- -To check if pam_sulve is enabled on the server: - -
- -``` -grep pam_sulve.so /etc/pam.d/* -``` -
- -should not be empty. - -### LVE wrappers - -* [Placing programs inside LVE](/cloudlinux_os_components/#placing-programs-inside-lve) - -LVE wrappers are the set of tools that allow system administrator to run various users, programs & daemons within Lightweight Virtual Environment. This allows system administrator to have control over system resources such program can have. Additionally it prevents misbehaving programs running within LVE to drain system resources and slow down or take down the whole system. The tools are provided by lve-wrappers RPM. - -You can install them by running: - -
- -``` -$ yum install lve-wrappers -``` -
- -#### Placing programs inside LVE - -LVE Wrappers provide two tools for placing programs inside LVE: `lve_wrapper` and `lve_suwrapper`. - -`/bin/lve_wrapper` can be used by any non-root user, as long as that user is in group lve (see `/etc/groups` file). - -**Syntax** - -
- -``` -lve_wrapper -``` -
- -**Example** - -
- -``` -$ lve_wrapper make install -``` -
- -The program will be executed within LVE with ID matching user's id. - -`/bin/lve_suwrapper` can be used by root user or any user in group lve (see `/etc/groups` file) to execute command within specified LVE. - -**Syntax** - -
- -``` -lve_suwrapper LVE_ID -``` -
- -**Example** - -
- -``` -# lve_suwrapper 10000 /etc/init.d/postgresql start -``` -
- -**Switches** - -* `-f` - force namespace -* `-n` - without namespace -* `-c` - remove CPU limits (requires `lve_wrapper` >= 2.1.2) - -### MPM ITK - -CloudLinux OS Shared httpd RPM comes with MPM ITK built in. Yet, if you would like to build your own Apache, you need to apply our patch for MPM ITK - -* Download file: [https://repo.cloudlinux.com/cloudlinux/sources/da/cl-apache-patches.tar.gz](https://repo.cloudlinux.com/cloudlinux/sources/da/cl-apache-patches.tar.gz) -* Extract: apache2.2-mpm-itk-seculrelve12.patch -* And apply this patch to your Apache source code. - -When running MPM ITK , you should disable mod_hostinglimits. All the functionality needed by MPM ITK is already built into the patch. - -Directives which can be used by Apache with ITK patch: - -* `AssignUserID` - uses ID as LVE ID -* `LVEErrorCodeITK` - error code to display on LVE error (508 by default) -* `LVERetryAfterITK` - same as `LVERetryAfter` - respond with `Retry-After` header when LVE error 508 occurs -* `LVEId` - ovverides id used for LVE ID instead of `AssignUserID` -* `LVEUser` - overrides user to use to retrieve LVE ID, instead of AssignUserID - -### HostingLimits module for Apache - -* [Additional notes](/cloudlinux_os_components/#additional-notes) -* [Installation](/cloudlinux_os_components/#installation-4) -* [Directives](/cloudlinux_os_components/#directives) - * [SecureLinks](/cloudlinux_os_components/#securelinks) - * [SkipErrors](/cloudlinux_os_components/#skiperrors) - * [AllowedHandlers](/cloudlinux_os_components/#allowedhandlers) - * [DenyHandlers](/cloudlinux_os_components/#denyhandlers) - * [LVEErrorCode](/cloudlinux_os_components/#lveerrorcode) - * [LVEid](/cloudlinux_os_components/#lveid) - * [LVEUser](/cloudlinux_os_components/#lveuser) - * [LVEUserGroupID](/cloudlinux_os_components/#lveusergroupid) - * [LVERetryAfter](/cloudlinux_os_components/#lveretryafter) - * [LVESitesDebug](/cloudlinux_os_components/#lvesitesdebug) - * [LVEParseMode](/cloudlinux_os_components/#lveparsemode) - * [LVEPathRegexp](/cloudlinux_os_components/#lvepathregexp) - * [LVELimitRecheckTimeout](/cloudlinux_os_components/#lvelimitrechecktimeout) - * [LVEUse429](/cloudlinux_os_components/#lveuse429) - -mod_hostinglimits works with existing CGI/PHP modules, to put them into LVE context. In most cases the CGI/PHP process will be placed into LVE with the ID of the user that sites belongs to. mod_hostinglimits detects the user from `SuexecUserGroup` (suexec module), `SuPHP_UserGroup` (from mod_suphp), `AssignUserID` (MPM ITK), `RUidGid` (mod_ruid2 ) directives. - -This can be overwritten via LVEId or LVEUser parameter on the Directory level. - -:::tip Note -Those parameters will not work with mod_fcgid and mod_cgid. -::: - -The order of detection looks as follows: - -* LVEId -* LVEUser -* SuexecUserGroup -* suPHP_UserGroup -* RUidGid -* AssignUserID - - -:::tip Note -LVE doesn't work for mod_include #include due to its "filter" nature. -::: - -Example: - -
- -``` -LoadModule hostinglimits_module modules/mod_hostinglimits.so - - AllowedHandlers cgi-script php5-script php4-script - SecureLinks On - -``` -
- -#### **Additional notes** - -**mod_hostinglimits** (since version 1.0-22) supports `min-uid - cagefsctl --set-min-uid=600`. - -Min UID is read on Apache start/restart and stored in the memory during apache runtime. - -If the min UID has changed, you should restart Apache for **mod_hostinglimits** applying new min UID value. Full min UID is supported only with APR. - -The following message should appear: - -
- -``` -[notice] mod_hostinglimits: found apr extention version 3. -``` -
- -This means that the correct APR is installed with mod_hostinglimits. - -mod_hostinglimist has variable for Apache CustomLog format string `%{LVE_ID}y`. - -**How to use**: - -LogFormat - -
- -``` -"%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i" req for lve "%{LVE_ID}y" -``` -
- -combined - -shows in access_log the following info: - -
- -``` -*.*.*.* - - [09/Apr/2015:07:17:06 -0400] "GET /1.php HTTP/1.1" 200 43435 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0" req for lve 500 - -*.*.*.* - - [09/Apr/2015:07:17:06 -0400] "GET /1.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2524 "************/1.php""Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0" req for lve 500 - -*.*.*.* - - [09/Apr/2015:07:17:06 -0400] "GET /1.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2146 "************/1.php""Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0" req for lve 500 -``` -
- -#### Installation - -**cPanel** - -Installed by default during EasyApache build. Requires `lve-stats` & `lve-utils` packages to be installed. - -**DirectAdmin** - -Can be built using custombuild: - -
- -``` -$ yum install liblve-devel -$ cd /usr/local/directadmin/custombuild -$ ./build update -$ ./build set cloudlinux yes -$ ./build apache -$ ./build rewrite_confs -``` -
- -If you run `suphp`, then run the following: - -
- -``` -$ ./build suphp -``` -
- -**Plesk** - -
- -``` -$ yum install mod_hostinglimits -``` -
- -**ISPmanager** - -
- -``` -$ yum install mod_hostinglimits -``` -
- -**InterWorx** - -
- -``` -$ yum install mod_hostinglimits -``` -
- -**H-Sphere** - -Included by default in H-Sphere 3.5+ - -**Standard Apache from RPM** - -
- -``` -$ yum install mod_hostinglimits -``` -
- -**Custom Apache installation** - -Compile from the source: [https://repo.cloudlinux.com/cloudlinux/sources/mod_hostinglimits.tar.gz](https://repo.cloudlinux.com/cloudlinux/sources/mod_hostinglimits.tar.gz) - -
- -``` -$ wget https://repo.cloudlinux.com/cloudlinux/sources/mod_hostinglimits.tar.gz -$ yum install cmake -$ tar -zxvf mod_hostinglimits*.tar.gz -$ cd mod_hostinglimits* -$ cmake . -$ make -$ make install -``` -
- -* Apache Module Identifier: `hostinglimits_module` -* Source Files: `mod_hostinglimits.c` -* Compatibility: MPM prefork, worker, event, ITK - -#### Directives - -
- -#### **SecureLinks** - -
- -| | | -|-|-| -|**Description**| Makes sure that for any virtual hosts, only files owned by user specified via SuexecUserGroup or other ways as described above are served. For files owned by any other user apache will return `Access Denied` error. The directive will not affect VirtualHost without user id specified, or with uid < 100| -|**Syntax**| `SecureLinks On`| -|**Default**| `SecureLinks Off`| -|**Context**| server config| - -Prevents apache from serving files not owned by user, stopping symlink attacks against php config files. - -**Example** - -
- -``` -SecureLinks On -``` -
- -*** - -
- -#### **SkipErrors** - -
- -| | | -|-|-| -|**Description**| Allow apache to continue if LVE is not available| -|**Syntax**| `SkipErrors On`| -|**Default**| `SkipErrors On`| -|**Context**| server config| -|**Status**| deprecated| - -Prevents Apache from exiting if LVE is not available. - -**Example** - -
- -``` -SkipErrors Off -``` -
- -*** - -
- -#### **AllowedHandlers** - -
- -| | | -|-|-| -|**Description**| List of handlers that should be placed into LVE, support regexp| -|**Syntax**|`AllowedHandlers cgi-script %^php% my-script`| -|**Default**| cgi-script %php% fcgid-script application/x-miva-compiled| -|**Context**| server config| - -This directive allows to list handlers which will be intercepted and placed into LVE. - -**Examples** - -* Match requests handled by cgi-script handler: - -
- - ``` - AllowedHandlers cgi-script - ``` -
- -* Match all requests: - -
- - ``` - AllowedHandlers * - ``` -
- -* Match all requests that handled by handler that contains PHP: - -
- - ``` - AllowedHandlers %php% - ``` -
-* Match all requests handled by handler that starts with PHP: - -
- - ``` - AllowedHandlers %^php% - ``` -
- -The default modhostinglimits module configuration only handles cgi scripts and ignores static content like html files and images. -With the default configuration, an Apache server denial of service situation can occur when there are many requests for large html files and images. But on the other hand, processing all static files is unprofitable, since when processing many small files, the load average will increase significantly due to the overhead of entering/exiting lve. Therefore, it is better to enable processing only for a subset of static files based on criteria such as file location or file name extension using Apache directives as Location, Directory and Files. - -This functionality is available since version 1.0-40. - -In the following example, the module hostinglimits will process files for a URLs starting with weightcontent, for files with an .avi extension, and for files from the video subdirectory. - - ``` - - - SkipErrors Off - AllowedHandlers cgi-script %php% fcgid-script application/x-miva-compiled - - - AllowedHandlers * - - - - AllowedHandlers * - - - - AllowedHandlers * - - - - ``` - -*** - -
- -#### **DenyHandlers** - -
- -| | | -|-|-| -|**Description**| List of handlers that should not be placed into LVE, support regexp| -|**Syntax**| `DenyHandlers text/html`| -|**Default**| none| -|**Context**| server config| - -This directive works together with AllowHandlers, to exclude some handlers from being allowed in LVE. - -**Example**: - -Match all requests, but `text/*` - -
- -``` -AllowedHandlers *DenyHandlers %text/*% -``` -
- -*** - -
- -#### **LVEErrorCode** - -
- -| | | -|-|-| -|**Description**| Error code to display once entry is rejected due to maxEntryProcs| -|**Syntax**| values from 500 to 510| -|**Default**| 508| -|**Context**| directory config| - -Specifies ErrorCode to use on LVE error (like too many concurrent processes running). - -The message that will be displayed by default is: -
- -``` -Resource Limit Is Reached. - -The website is temporarily unable to serve your request as it exceeded resource limit. - -Please try again later. -``` -
- -You can redefine error message using `ErrorDocument` directive - -Example: -
- -``` -LVEErrorCode 508ErrorDocument 508 508.html -``` -
- -*** - -
- -#### **LVEid** - -
- -| | | -|-|-| -|**Description**| Allows to setup separate LVE ID on per directory level. If not set, user ID of a corresponding user is used.| -|**Syntax**|`LVEId number`| -|**Default**| User Id is used| -|**Context**| directory config| - -Specifies LVE id for particular directory - -**Example**: - -
- -``` - - LVEId 10001 - -``` -
- -*** - -
- -#### **LVEUser** - -
- -| | | -|-|-| -|**Description**| Allows to setup separate LVE ID on per directory level.| -|**Syntax**|`LVEUser username`| -|**Default**| none| -|**Context**| directory config| - -Specifies LVE ID for particular directory. - -**Example**: - -
- -``` - - LVEUser user1 - -``` -
- -*** - -
- -#### **LVEUserGroupID** - -
- -| | | -|-|-| -|**Description**| Use group ID instead of user ID for LVE container number.| -|**Syntax**| `LVEUserGroupID On/Off`| -|**Default**| User Id is used| -|**Context**| global config only| - -* If the option enabled, group ID will be used instead of a user ID. Apache will display the following string in error logs: - -
- -``` -mod_hostinglimits: use GroupID instead of UID -mod_hostinglimits: found apr extension version 2 -mod_hostinglimits: apr_lve_environment_init_group check ok -``` -
- -* If a compatible apr library is not found, the following error message will be display in error logs. - -
- -``` -mod_hostinglimits: apr_lve_* not found!!! -``` -
- -**Example**: - -
- -``` - - LVEUserGroupID On - -``` -
- -*** - -
- -#### **LVERetryAfter** - -
- -| | | -|-|-| -|**Description**| Returns Retry-After header when LVE error 508 occurs.| -|**Syntax**|`LERetryAfter MINUTES`| -|**Default**| 240 minutes| -|**Context**| directory config| - -Specifies interval for `Retry-After` header. The `Retry-After` response-header field can be used to indicate how long the service is expected to be unavailable to the requesting client. - -**Example**: - -
- -``` -LVERetryAfter 180 -``` -
- -*** - -
- -#### **LVESitesDebug** - -
- -| | | -|-|-| -|**Description**| Provides extended debug info for listed sites.| -|**Syntax**|`LVESitesDebug test.com test2.com`| -|**Default**| none | -|**Context**| directory config| - -Specifies virtual hosts to provide extra debugging information. - -**Example**: - -
- -``` - - LVESitesDebug abc.com yx.cnet - -``` -
- -*** - -
- -#### **LVEParseMode** - -
- -| | | -|-|-| -|**Description**| Determines the way LVE ID will be extraced. In Conf| -|**Syntax**|`LVEParseMode CONF` `PATH` `OWNER` [`REDIS`](/limits/#redis-support-for-hostinglimits)| -|Default: | `CONF`| -|Context: | directory config| - -* In `CONF` mode, standard way to extract LVE ID is used (SuexecUserGroup, LVEId, or similar directives). - -* In `PATH` mode, username is extracted from the home directory path. The default way to match username is via the following regexp: `/home/([^/]*)/` . Custom regexp can be specified in LVEPathRegexp. - -* In `OWNER` mode, the owner of the file is used as an LVE ID. - -* In [`REDIS`](/limits/#redis-support-for-hostinglimits) mode, LVE ID is retrieved from Redis database. - -**Example**: - -
- -``` -LVEParseMode CONF -``` -
- -*** - -
- -#### **LVEPathRegexp** - -
- -| | | -|-|-| -|**Description**| Regexp used to extract username from the path. Used in conjuction with `LVEParseMode PATH`| -|**Syntax**|`LVEPathRegexp regexp`| -|**Default**| `/home/([^/]*)/`| -|**Context**| directory config| - -Used to extract usersname via path. - -**Example**: - -
- -``` -LVEPathRegexp /home/([^/]*)/ -``` -
- -*** - -
- -#### **LVELimitRecheckTimeout** - -
- -| | | -|-|-| -|**Description**| Timeout in milliseconds, a site will return EP without lve_enter for LA decreasing after this time| -|**Syntax**|`LVELimitRecheckTimeout number`| -|**Default**| 0| -|**Context**| httpd.conf, virtualhost| - -Example: - -``` -LVELimitRecheckTimeout 1000 -``` - -
- -#### **LVEUse429** - -
- -| | | -|-|-| -|**Description**| Use 429 error code as code returned on max entry limits ( on/off ).| -|**Syntax**|`LVEUse429 on`| -|**Default**|`off`| -|**Context**| httpd.conf, virtualhost| - -**Example**: - -
- -``` -LVEUse429 on -``` -
- -Available for RPM based panels, EasyApache 4 and DirectAdmin. - -### cPanel/WHM JSON API - -* [Parameters](/cloudlinux_os_components/#parameters) -* [Manage reseller limits/users/packages via cPanel/WHM JSON API - JSONHandler](cloudlinux_os_components/#manage-reseller-limits-users-packages-via-cpanel-whm-json-api-jsonhandler) -* [Using a WHM API token](/cloudlinux_os_components/#using-a-whm-api-token) - -CloudLinux OS Shared offers JSON API for [lvectl](/command-line_tools/#lvectl) and [cloudlinux-limits](/command-line_tools/#cloudlinux-limits) via WHM. You can access it using the following URL: - -
- -``` -https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=lvectl&handler=list -https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=cloudlinux-limits&handler=get -``` -
- -The output will look as follows: - -
- -``` -{"data":[{"ID":"default","CPU":"30","NCPU":"1","PMEM":"1024M","VMEM":"1024M","EP":"28","NPROC":"0","IO":"2048"}]} -``` -
- -#### **Parameters** - -||| -|-|-| -|`cgiaction`|always `jsonhandler`| -|`command`|`lvectl` or `cloudlinux-limits` (default `lvectl`)| -|`handler`|should match [lvectl](/command-line_tools/#lvectl) or [cloudlinux-limits](/command-line_tools/#cloudlinux-limits) command| - -For commands like `set`, `destroy` & `delete`, where you need to specify LVE (user) ID, like `lveid=500` (matches user ID 500). - -**Example**: - -
- -``` -https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=lvectl&handler=set&lveid=500&speed=30%&io=2048 - -https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=lvectl&handler=set&lveid=500&speed=300Mhz&io=2048 - -https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=lvectl&handler=set&lveid=500&speed=3Ghz&io=2048 - -https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=cloudlinux-limits&handler=set&lveid=500&inodes=9090,8989 -``` -
- -:::tip Note -**Speed** limit can be specified in several units of measure - %, MHz, GHz . The figures will be different according to the unit of measure. -::: - -**Output**: - -
- -``` -{"status":"OK"} -``` -
- -To do `set default`, use `lveid=0`, like: - -
- -``` -https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set&lveid=0&speed=30%&io=2048 -``` -
- -For commands like `apply all`, `destroy all`, use: - -
- -``` -handler=apply-all - -handler=destroy-all -``` -
- -You can use the following commands that allow to specify user name instead of user ID: - -| | | -|-|-| -|`set-user` | Set parameters for a LVE and/or create a LVE using username instead of ID.| -| `list-user ` | List loaded LVEs, display username instead of user ID.| -| `delete-user ` | Delete LVE and set configuration for that user to defaults.| - -If the limits for users are set with cPanel LVE Extension, then turnkey billing solutions can be applied (e.g. WHMCS). - - -#### Manage reseller limits/users/packages via cPanel/WHM JSON API (JSONHandler) - -| | | | -|----|----|--| -|**Action**|**lvectl command**|**JSONHandler**| -|enable reseller limits|`lvectl set-reseller res1 --speed=35%`|`https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set-reseller&lveid=res1&speed=30%&io=2048`| -|disable reseller limits|`lvectl remove-reseller res1`|`https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=remove-reseller&lveid=res1`| -|set default limits for reseller|`lvectl set-reseller-default res1 --speed=91%`|`https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set-reseller-default&lveid=res1&speed=30%`| -|set limits for package, created by reseller|`lvectl package-set res1_pack1 --reseller res1 --speed=88%`|`https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=package-set&lveid=res1_pack1&reseller=res1&speed=30%`| -|set limits for user, created by reseller|`lvectl set-user r1user1 --reseller res1 --speed=77%`|`https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set-user&lveid=r1user1&reseller=res1&speed=30%`| -|set unlimited for user, created by reseller|`lvectl set-user r1user1 --reseller res1 --unlimited`|`https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=set-user&lveid=r1user1&reseller=res1&unlimited`| -|set inodes limit|`cloudlinux-limits set --username=r1user1 --inodes=9090,8989`|`https://IP:2087/cpsess_YOURTOKEN/cgi/CloudLinux.cgi?cgiaction=jsonhandler&command=cloudlinux-limits&handler=set&username=r1user1&inodes=9090,8989`| -#### Using a WHM API token - -You can use a WHM API token with curl as follows: - -
- -``` -curl -X POST -k -s -H "Authorization: whm root:WHM_TOKEN" "https://SERVER_IP:2087/cgi/CloudLinux.cgi?cgiaction=jsonhandler&handler=LVE_METHOD&PARAMETERS -``` -
- -Where: - -* `WHM_TOKEN` – a generated WHM API token (see: [Creating an API token](https://documentation.cpanel.net/display/DD/Guide+to+API+Authentication+-+API+Tokens+in+WHM#0ac291c40e454694a8b981c45988c1cb)) -* `LVE_METHOD` – lvectl method (for example: `list`. See also: [lvectl](/command-line_tools/#lvectl)) -* `PARAMETERS` – all other parametrs and options for a method according to the [documentation](/command-line_tools/#lvectl) - - -### mod_proctitle - -* [How to read mod_proctitle information](/cloudlinux_os_components/#how-to-read-mod-proctitle-information) -* [Tuning parameters](/cloudlinux_os_components/#tuning-parameters) - -mod_proctitle is a module for gathering URL information per request. It is available only for Apache 2.4 now. - - -**For installation:** - -cPanel EasyApache 3 and non cPanel ( _CloudLinux 7 only for non cPanel_ ): - -
- -``` -# yum install mod_proctitle --enablerepo=cloudlinux-updates-testing -# service httpd restart -``` -
- -cPanel EasyApache 4: - -
- -``` -# yum install ea-apache24-mod_proctitle -# service httpd restart -``` -
-DirectAdmin: -
- -``` -# cd /usr/local/directadmin/custombuild -# ./build update -# ./build mod_procticle -``` -
- -#### How to read mod_proctitle information - -**How to read information gathered by the module** - - -For reading information saved by module use the following script (the script is not in the package): -
- -``` -#!/bin/bash - -httpd=httpd - -for pid in `/usr/bin/pgrep $httpd`; do - for tid in `ls /proc/$pid/task`; do - found=no - for shm in `ls /dev/shm/apache_title_shm_${pid}_${tid}_* 2>/dev/null`; do - found=yes - title=`/usr/bin/tr -d '\0' < $shm` - thread_id=`/bin/basename "${shm}" | sed "s/apache_title_shm_${pid}_${tid}_//"` - echo "$pid.$tid - $thread_id - $title" - break - done - if [ "$found" = "no" ]; then - echo "$pid.$tid not found" - fi - done -done -``` -
-Here are the examples of saved by module: -
- -``` -# sh proctitles_info.sh -571258.571258 NOT FOUND -571300.571300 NOT FOUND -571303.571303 - 000000000000000 - 1466513333.6 test.cloudlinux.com GET /1.php HTTP/1.1 -571304.571304 - 000000000000000 - 1466513335.3 test.cloudlinux.com GET /1.php HTTP/1.1 -571305.571305 - 000000000000000 - httpd -571306.571306 - 000000000000000 - httpd -571307.571307 - 000000000000000 - httpd -571372.571372 - 000000000000000 - httpd -571374.571374 - 000000000000000 - httpd - -Item info: -[pid].[tid] - [posix thread id] - [request info] -``` -
- -Request information can contain: - - _NOT FOUND_ - means that process of Apache doesn't handle requests.
- _httpd_ - request is active and waiting for new connection.
- _[seconds].[tenths of second] [host] [METHOD] [URL] [PROTOCOL]_ - -#### Tuning parameters - -**Module parameters for tuning** - -| | | -|-|-| -|WatchHandlers | List of handlers for monitoring (httpd.conf, virtualhost).| -|ProctitleUseFilter On/Off | Use old method of cleaning information or new via filter (for prefork better to use Off )| - -### alt-suexec - -**What is alt-suexec package needed for?** - -If you use standard httpd from our repository, but your users' sites do not match standard Apache location of `/var/www`, then you should use alt-suexec. -alt-suexec package brings suEXEC binaries pre-compiled for specific locations, like /home . - -**How to switch suEXEC with alt-suexec** - -Based on httpd 2.2.16 basic for Cloudlinux OS Shared 6, httpd 2.4.6 basic for CloudLinux OS Shared 7 and httpd 2.4.37 basic for CloudLinux OS Shared 8, the package brings to a server a set of suEXECs with different DOCUMENT ROOTs and MIN_UID/MIN_GID parameters. The first set of suEXECs is listed by such modes: - -
- -``` -# switch_suexec -h -USE_BIZ - DOCUMENT ROOT /biz/ MIN_UID 500 MIN_GID 100 CALLER apache -USE_HOSTING - DOCUMENT ROOT /hosting/ MIN_UID 500 MIN_GID 100 CALLER apache -USE_HSPHERE - DOCUMENT ROOT /hsphere/local MIN_UID 100 MIN_GID 100 CALLER httpd -USE_HOME - DOCUMENT ROOT /home/ MIN_UID 500 MIN_GID 100 CALLER apache -USE_WWW - DOCUMENT ROOT /var/www/ MIN_UID 500 MIN_GID 100 CALLER apache -USE_FSROOT - DOCUMENT ROOT / MIN_UID 500 MIN_GID 100 CALLER apache -USE_STORAGE - DOCUMENT ROOT /storage/content/ MIN_UID 500 MIN_GID 100 CALLER apache -USE_DATAS - DOCUMENT ROOT /datas/ MIN_UID 500 MIN_GID 100 CALLER apache -``` -
-The package also brings its own utility for installing specific suEXEC: - -| | | -|-|-| -|-l | list of available suexec| -|-u | update suexec according to /etc/sysconfig/alt-suexec | -|-s | set new suexec and install it| -|-p | set new suexec path and install it| -|-o | set new suexec owners and install it| -|-r | restore native apache suexec| - -There are two ways to set up new suEXEC binary: - -1) via config file _/etc/sysconfig/alt-suexec_ -2) via utility _switch_suexec_ - -Here are the examples of how to set up suEXEC with DOC_ROOT = "/home": - -**1.** - -1) add string "USE_HOME" to _/etc/sysconfig/alt-suexec_ -2) run the command switch_suexec -u - -**2.** - -1) switch_suexec -sUSE_HOME - -Result of both methods: -
- -``` -# cat /etc/sysconfig/alt-suexec -USE_HOME -``` -
- -Here is standard suEXEC for CloudLinux OS Shared 6 clean server: -
- -``` -# /usr/sbin/suexec -V --D AP_DOC_ROOT="/var/www" --D AP_GID_MIN=100 --D AP_HTTPD_USER="apache" --D AP_LOG_EXEC="/var/log/httpd/suexec.log" --D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" --D AP_UID_MIN=500 --D AP_USERDIR_SUFFIX="public_html" --D AP_SAFE_DIRECTORY="/usr/local/safe-bin" -``` -
- -Here is output of new suEXEC after USE_HOME installtion: -
- -``` -# /usr/sbin/suexec -V --D AP_DOC_ROOT="/home/" --D AP_GID_MIN=100 --D AP_HTTPD_USER="apache" --D AP_LOG_EXEC="/var/log/httpd/suexec.log" --D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" --D AP_UID_MIN=500 --D AP_USERDIR_SUFFIX="public_html" --D AP_SAFE_DIRECTORY="/usr/local/safe-bin" -``` -
- -Description of other switch_suexec parameters: - -| | | -|-|-| -|-p | if suexec binary file will be placed not in standard way /usr/sbin - specify this new path with p-option| -|-o | if suexec binary file not owned by root:apache - specify new owner with o-option| - -For most cases -p and -o options for standard Apache are useless. - -Correct suEXEC will be restored even after httpd update or reinstall. - -List of pre-built suEXEC binary files stored without suid bit and not executable. - -**How to install alt-suexec?** - -For installation run the command: -
- -``` -yum install alt-suexec -``` -
- -**New suexec with custom parameters** - -If you need suEXEC with custom parameters absent in current set of alt-suexec, please submit a ticket on [https://cloudlinux.zendesk.com](https://cloudlinux.zendesk.com/) and we will add new suEXEC with needed parameters. - -### cPanel Nginx and application selectors - -Recently, cPanel added support for the [Nginx](https://documentation.cpanel.net/display/CKB/Nginx) web server and for [Python](https://documentation.cpanel.net/display/CKB/How+to+Install+a+Python+WSGI+Application) and [Node.js](https://documentation.cpanel.net/display/CKB/How+to+Install+a+Node.js+Application) applications. - -We have checked the compatibility of ea-nginx and cPanel application Selectors with CloudLinux OS Shared LVE and CageFS. -All tests passed successfully and all processes started by ea-nginx and cPanel selectors are launched inside LVE and CageFS. - - -Don’t forget, you can use Ruby/Python/Node.js Selectors from CloudLinux OS Shared. Here you can find a large number of supported versions for Ruby/Python/Node.js applications. - -* [CloudLinux OS Shared Python Selector](/cloudlinux_os_components/#python-selector) -* [CloudLinux OS Shared Ruby Selector](/cloudlinux_os_components/#ruby-selector) -* [CloudLinux OS Shared NodeJS Selector](/cloudlinux_os_components/#node-js-selector) - -:::tip Note -Nginx support is currently experimental. -::: - -### How to use Certbot with alt-python36 - -To run Certbot with `alt-python36`, follow the next steps: - -1. Add a path to the `alt-python36` in the environment variable `PATH` as the first element: `/opt/alt/python36/bin/`. -2. Run Certbot with the `--no-bootstrap` parameter. - -**Example:** - -The old command to run Certbot on CentOS 6/Cloudlinux OS Shared 6: - -
- -``` -# certbot-auto --nginx -``` -
- -The new command to run Certbot on CentOS 6/CloudLinux OS Shared 6: - -
- -``` -# PATH="/opt/alt/python36/bin/:$PATH" certbot-auto --no-bootstrap --nginx -``` -
- -## Apache suexec module - -### General information and requirements - -* [How does it work with CloudLinux OS Shared?](/cloudlinux_os_components/#how-does-it-work-with-cloudlinux-os-shared) - -This module is used by the Apache HTTP Server to switch to another user before executing CGI programs. The suEXEC feature provides users of the Apache HTTP Server with the ability to run CGI and SSI programs under user IDs different from the user ID of the calling web server (apache/nobody). Normally, when a CGI or SSI program executes, it runs as the same user who is running the web server. - -If we are talking about shared hosting where different accounts are launched on the same server, the installation of this module is necessary to ensure security. - -#### How does it work with CloudLinux OS Shared? - -The DirectAdmin and CloudLinux OS Shared (for httpd, httpd24-httpd and cPanel EasyApache 4) both provide a patched version of suexec. For other distributions you can use patches available here: -[https://repo.cloudlinux.com/cloudlinux/sources/da/cl-apache-patches.tar.gz](https://repo.cloudlinux.com/cloudlinux/sources/da/cl-apache-patches.tar.gz) - -1. Besides the ability to run CGI programs under user IDs, suexec with CloudLinux OS Shared patch adds the ability to run that script under CageFS. - :::tip NOTE - Therefore, this module is necessary for the proper work of PHP Selector. - ::: -2. This module is also necessary for the proper work of mod_hostinglimits. The `SuexecUserGroup` directive indicates for `mod_hostinglimits` in which LVE the user process should be put in. - - -### Configuration - -**SuexecUserGroup Directive** - -**Syntax**: SuexecUserGroup User Group - -**Context**: `httpd.conf`, `virtualhost` - -**Description**: The SuexecUserGroup directive allows you to specify a user and a group for CGI programs to run as. Startup will fail if this directive is specified but the suEXEC feature is disabled. - -::: warning Note -Control panels such as cPanel, Plesk, and DirectAdmin add this directive to the Apache configuration automatically when creating a domain. If you use the server without a control panel, make sure this directive is added for each virtual host. -::: - - -### Installation - -The `mod_suexec` installation process varies depending on the control panel and Apache. - -* [Installing on cPanel servers with EasyApache 4](/cloudlinux_os_components/#installing-on-cpanel-servers-with-easyapache-4-2) - * [Via command line](/cloudlinux_os_components/#via-command-line) - * [Via administrator interface](/cloudlinux_os_components/#via-administrator-interface) -* [Installing on Plesk servers](/cloudlinux_os_components/#installing-on-plesk-servers-2) -* [Installing on DirectAdmin servers](/cloudlinux_os_components/#installing-on-directadmin-servers-2) -* [Installing on servers with no control panel](/cloudlinux_os_components/#installing-on-servers-with-no-control-panel-2) - -#### Installing on cPanel servers with EasyApache 4 - -#### Via command line - -1. Install `mod_suexec` through YUM package manager as follows: - -
- - ``` - $ yum install ea-apache24-mod_suexec - ``` -
- - :::warning NOTE - `ea-apache24-mod_suexec` conflicts with the `mod_ruid2` therefore, before installing the module, remove `ea-apache24-mod_ruid2` as follows: `$ yum remove ea-apache24-mod_ruid2` - ::: - -2. Now, when the module is installed, restart Apache: - -
- - ``` - $ service httpd restart - ``` -
- - :::tip Note - If you use CageFS + PHP Selector, you should run the `cagefsctl --force-update` command. - ::: - -#### Via administrator interface - -1. Open EasyApache4 page. -2. Click _Customize_ for _Currently installed Packages_. - - ![](/images/mod_suexec_admin_ui_1.png) - -3. Click _Apache Modules_. Find `mod_suexec` and click _Yes_ to install it. - - ![](/images/mod_suexec_admin_ui_2.png) - -4. Select _Review_ and _Provision_. - - ![](/images/mod_suexec_admin_ui_3.png) - -5. Wait while _Provision_ will be finished. - - :::tip Note - If you use CageFS + PHP Selector, you should run the `cagefsctl --force-update` command. - ::: - -#### Installing on Plesk servers - -This module is integrated into Apache for Plesk control panel by default. - -#### Installing on DirectAdmin servers - -This module is integrated into Apache for DirectAdmin control panel by default. - -#### Installing on servers with no control panel - -This module is integrated into httpd Apache rpm provided by Cloudlinux OS Shared by default. - -If you are using an alternative Apache - [httpd24](https://www.cloudlinux.com/cloudlinux-os-blog/entry/httpd24-updated-for-cloudlinux-6), nothing has to be done as this module is also integrated into httpd24-httpd Apache rpm provided by Cloudlinux by default. - diff --git a/docs/cloudlinux_os_kernel/README.md b/docs/cloudlinux_os_kernel/README.md deleted file mode 100644 index 89300a21a..000000000 --- a/docs/cloudlinux_os_kernel/README.md +++ /dev/null @@ -1,1092 +0,0 @@ -# CloudLinux OS kernel - -This documentation describes specific features of the CloudLinux kernel. In other cases the kernel has the same features and innovations as any similar RHEL kernel. -More information about the actual kernel changes and releases can be obtained from our [changelog](https://changelog.cloudlinux.com/). - -* [Hybrid Kernels](/cloudlinux_os_kernel/#hybrid-kernels) -* [SecureLinks and Link Traversal Protection](/cloudlinux_os_kernel/#securelinks-and-link-traversal-protection) -* [File change API](/cloudlinux_os_kernel/#file-change-api) -* [Tuned-profiles-cloudlinux](/cloudlinux_os_kernel/#tuned-profiles-cloudlinux) -* [Kernel config variables](/cloudlinux_os_kernel/#kernel-config-variables) -* [Virtualized /proc filesystem](/cloudlinux_os_kernel/#virtualized-proc-filesystem) -* [Ptrace block](/cloudlinux_os_kernel/#ptrace-block) -* [Xen XVDA](/cloudlinux_os_kernel/#xen-xvda) -* [Umask behavior](/cloudlinux_os_kernel/#umask-behavior) -* [IO limits latency](/cloudlinux_os_kernel/#io-limits-latency) -* [Reading LVE usage](/cloudlinux_os_kernel/#reading-lve-usage) -* [Flashcache](/cloudlinux_os_kernel/#flashcache) -* [OOM killer for LVE processes](/cloudlinux_os_kernel/#oom-killer-for-lve-processes) -* [File system quotas](/cloudlinux_os_kernel/#file-system-quotas) -* [Enter LVE when using cPanel utilities](/cloudlinux_os_kernel/#enter-lve-when-using-cpanel-utilities) -* [Proactive reporting kernel crash events with Sentry and Kernel Panic Receiver](/cloudlinux_os_kernel/#proactive-reporting-kernel-crash-events-with-sentry-and-kernel-panic-receiver) - -## Hybrid Kernels - -Hybrid kernels give you the ability to take advantage of the benefits and features available in newer kernels without having to completely upgrade to another version of the operating system. Example - for the CloudLinux 7 kernel, based on version 3.10, you can install a hybrid kernel (same as on CloudLinux 8), which is based on version 4.18. This provides more kernel options, memory and overall optimization, as well as a positive impact on system performance. - -#### How to migrate from the normal kernel to hybrid one - -::: tip Note -The system must have an active CloudLinux OS license -::: - -:::warning Warning -If you use `yum-plugin-protectbase`, please make sure it is disabled before stating the normal-to-hybrid script. -::: - -You should perform the following commands: - -``` -yum update -normal-to-hybrid -``` -Then if the script execution is completed without errors - perform the server reboot. - -::: tip Note -You can always migrate from the hybrid kernel to normal one with the following commands: -``` -yum update -hybrid-to-normal -``` -::: - -#### Known limitations and issues of hybrid kernels - -**CloudLinux OS Shared 6 Hybrid kernel** - -1. We do not remove Hybrid kernel after migration from Hybrid to the normal channel, but we remove linux-firmware package which is needed to boot Hybrid kernel. This is because CloudLinux OS Shared 6 does not allow to remove the package of currently running kernel. Thus please don't reboot the server back to Hybrid kernel after you remove it. - -2. Kernel module signature isn't checking for now, as 3.10 kernel is using x509 certificates to generate keys and CloudLinux OS Shared 6 cannot detect signatures created in such way. - -## SecureLinks and Link Traversal Protection - -::: tip Note -Link Traversal Protection is disabled by default for the CloudLinux OS Shared. -::: - -CloudLinux OS Shared and CloudLinux OS Admin provides comprehensive protection against -symbolic link attacks popular in shared hosting environment. - -The protection requires setting multiple kernel parameters to be enabled: - -**SecureLinks:** -* [fs.enforce_symlinksifowner](/cloudlinux_os_kernel/#fs-enforce-symlinksifowner) -* [fs.symlinkown_gid](/cloudlinux_os_kernel/#fs-symlinkown-gid) - -**Link Traversal Protection:** -* [fs.protected_symlinks_create](/cloudlinux_os_kernel/#fs-protected-symlinks-create) -* [fs.process_symlinks_by_task](/cloudlinux_os_kernel/#fs-process-symlinks-by-task) - -Please reffer to [this article](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/configuring-kernel-parameters-at-runtime_managing-monitoring-and-updating-the-kernel#doc-wrapper) in order to know how to setup these parameters. - -#### **fs.enforce_symlinksifowner** - -To protect against symlink attack where attacker tricks Apache web server to read some other user PHP config files, or other sensitive file, enable: - -``` -fs.enforce_symlinksifowner=1 -``` - -Setting this parameter will deny any process running under gid _fs.symlinkown_gid_ to follow the symlink if owner of the link doesn’t match the owner of the target file. - -Defaults: - -``` -fs.enforce_symlinksifowner = 1 -fs.symlinkown_gid = 48 -``` - -| | | -|-|-| -| _fs.enforce_symlinksifowner = 0_ | do not check symlink ownership| -| _fs.enforce_symlinksifowner = 1_ | deny if symlink ownership doesn’t match target, and process gid matches _symlinkown_gid| - -When _fs.enforce_symlinksifowner_ set to 1, processes with GID 48 will not be able to follow symlinks if they are owned by user1 , but point to file owned user2 . - -:::tip Note -_fs.enforce_symlinksifowner = 2_ is deprecated and can cause issues for the system operation. -::: - -##### **fs.symlinkown_gid** - -On standard Apache installation, this webserver is usually running under GID 48. -On cPanel servers, Apache is running under user nobody, GID 99. - -To change GID of processes that cannot follow symlink, edit the file _/etc/sysctl.conf_ , add the line: - -``` -fs.symlinkown_gid = XX -``` - -And execute: - -``` -$ sysctl -p -``` - -To disable symlink owner match protection feature, set _fs.enforce_symlinksifowner = 0_ in _/etc/sysctl.conf_ , and execute: - -``` -$ sysctl -p -``` - -::: tip Note -_fs.symlinkown_gid_ parameter values for httpd service user and _fs.proc_super_gid_ for nagios service user is written to _/etc/sysctl.d/90-cloudlinux.conf_. -::: - -#### **fs.protected_symlinks_create** - -:::warning Warning -When used outside CageFS (from cPanel tools for instance), `fs.protected_symlinks_create` isn't sufficient for symlink protection. -To fully protect symlink access in this case, use `fs.process_symlinks_by_task=1` in addition to `fs.protected_symlinks_create=1`. -::: - - [CageFS](/cloudlinux_os_components/#cagefs) is extremely powerful at stopping most information disclosure attacks, where a hacker could read sensitive files like _/etc/passwd_ . - -Yet, CageFS does not work in each and every situation. For example, on cPanel servers, it is not enabled in WebDAV server, cPanel file manager and webmail, as well as some FTP servers don’t include proper change rooting. - -This allows an attacker to create symlink or hardlink to a sensitive file like _/etc/passwd_ and then use WebDAV , filemanager, or webmail to read the content of that file. - -You can prevent such attacks by preventing user from creating symlinks and hardlinks to files that they don’t own. - -This is done by set following kernel options to 1: -
- -``` -fs.protected_symlinks_create = 1 -fs.protected_hardlinks_create = 1 -``` -
- -::: danger -We do not recommend to use protected_symlinks option for cPanel users as it might break some of the cPanel functionality. -Please read the known issues section before enabling this feature. -::: - -* [Known issues with fs.protected_symlinks_create=1 on cPanel servers](/cloudlinux_os_kernel/#known-issues-with-fs-protected-symlinks-create-1-on-cpanel-servers) - -#### **fs.process_symlinks_by_task** - -::: tip Note -This option only available on CloudLinux 7 Hybrid or on CloudLinux 8 Shared and Admin editions. -Also please note that this feature is available for cPanel only. -::: - -This parameter is needed to protect against symlink vulnerability where an attacker might get access to files out of the CageFS via cPanel tools: File Manager, WebDAV, Webmail, etc. When a symlink is accessed from cPanel tools (non-root user case) we check whether the current process UID matches the symlink target UID. - -To enable the protection for CloudLinux OS Shared , set the `fs.process_symlinks_by_task` parameter to 1: -
- -``` -fs.process_symlinks_by_task=1 -``` -
- -To disable the protection for CloudLinux OS Shared 7 hybrid, set the `fs.process_symlinks_by_task` parameter to 0: -
- -``` -fs.process_symlinks_by_task=0 -``` -
- -#### Known issues with fs.protected_symlinks_create=1 on cPanel servers - -Here are some examples of what may go wrong on cPanel servers. If `fs.protected_symlinks_create=1` is set on the server, it can cause the following issues: - -* `rsync` is failed - -If you use the `rsync` to copy/transfer files and they contain symlinks, you'll see the errors like these: - -
- -``` -"rsync error: some files could not be transferred (code 23)" and the transfer will be failed. -``` -
- - It affects `rsync` tasks as well as cPanel transfer tools. - -* backup extracting may not work. Errors during the restoration: - -
- -``` -Error extracting /home/domain/backups/home.tar.gz : /bin/tar: .cagefs/tmp/mysql.sock: Cannot create symlink to `/var/lib/mysql/mysql.sock'. -Permission denied. /bin/tar: .cagefs/tmp/.s.PGSQL.5432: Cannot create symlink to `/var/run/postgres/.s.PGSQL.5432': No such file or directory. -``` -
- -Any backup for accounts (including cPanel backup) cannot be extracted. - -* `dmesg` is flooded with the `may_create_sym_link` messages like: - -
- -``` -may_create_sym_link: can't find ea-phpXX in cron -may_create_sym_link: can't find ea-phpXX in ea-php-cli -``` -
- -It's popping up each second and may increase the size of the `/var/log/messages` file. - -## File change API - -### General - -**General description** - -One of the main problems on a shared hosting system for file backup operations is to figure out which files have changed. Using INOTIFY on a 1T drive with a large number of small files and directories guarantees slow startup times, and a lot of context switching between kernel and userspace - generating additional load. On the other hand scanning disk for newly modified files is very IO intensive, and can kill the performance of the fastest disks. - -**CloudLinux OS Shared approach** - - CloudLinux File Change API is a kernel level technology with the user space interface that buffers lists of modified files in the kernel and then off-loads that list to user space daemon. - -After that - any software (with enough permissions) can get a list of files that has been modified for the last 24 hours. - -The software is very simple to use and produces the list of modified files. As such we expect file backup software, including integrated cPanel backup system to integrate with this API soon. - -### Usage and integration - -**Userland utilities** - -/usr/bin/cloudlinux-backup-helper is a utility for getting the list of changed files. - -It is supposed to be run by a super user only. - -Command line parameters: -
- -``` --t | --timestamp retrieve file names for files modified after specified timestamp --u | --uid retrieve file names for particular UID only -``` -
-If no UID specified, are retrieved for all users. If no timestamp specified, all database events are shown. - -**Output format** -
- -``` -protocol version (1 right now), timestamp (in seconds) - up to which time data was collected -UID:absolute path to file changed -UID:absolute path to file changed -… -``` -
- -:::tip Note -The timestamp in output is needed so you can clearly identify from which timestamp to get list of changed files next. -::: - -**_Examples:_** -
- -``` -[root@localhost ~]# cloudlinux-backup-helper -t 1495533489 -u -1,1495533925 -1001:/home/user2/public_html/output.txt -1001:/home/user2/public_html/info.php -[root@localhost ~]# cloudlinux-backup-helper -t 1495533489 -1,1495533925 -1000:/home/user1/.bashrc -1001:/home/user2/public_html/output.txt -1001:/home/user2/public_html/info.php -1003:/home/user3/logs/data.log -``` -
-**Getting changed files by end user** - -/usr/bin/cloudlinux-backup-helper-uid is a SUID wrapper for the cloudlinux-backup-helper utility that enables an end user to get the list of files changed. It accepts timestamp argument only and retrieves data of the user who is running it only. - -**_Examples:_** -
- -``` -[user@localhost ~]$ cloudlinux-backup-helper-uid -1,1495530576 -1000:/home/user/.bash_history - -[user@localhost ~]$ cloudlinux-backup-helper-uid -t 1495547922 -1,1495548343 -1000:/home/user/file1.txt -1000:/home/user/file2.txt -``` -
-This command is available within CageFS. - -### Installation and configuration - - - **cloudlinux-fchange-0.1-5** - -**Requirements** - - CloudLinux OS 6 (requires Hybrid kernel) or 7 -Kernel Version: 3.10.0-427.36.1.lve1.4.47 - -**Installation and configuration** - -To install cloudlinux-fchange system run: - -_CloudLinux OS Shared 7:_ -
- -``` -yum install cloudlinux-fchange --enablerepo=cloudlinux-updates-testing -``` -
- -_CloudLinux OS Shared 6 Hybrid:_ - -
- -``` -yum install cloudlinux-fchange --enablerepo=cloudlinux-hybrid-testing -``` -
-Configuration file can be found in /etc/sysconfig/cloudlinux-fchange - -Database containing list of modified files is located at /var/lve/cloudlinux-fchange.db by default. - -**Starting and stopping** - -After successful installation the event collecting daemon starts automatically, providing all kernel-exposed data are in place. - -To start daemon: -_CloudLinux OS Shared 7:_ - -
- -``` -systemctl start cloudlinux-file-change-collector -``` -
- -_CloudLinux OS Shared 6 Hybrid:_ - -
- -``` -service cloudlinux-file-change-collector start -``` -
-To stop daemon: - -_CloudLinux OS Shared 7:_ - -
- -``` -systemctl stop cloudlinux-file-change-collector -``` -
- -_CloudLinux OS Shared 6 Hybrid:_ - -
- -``` -service cloudlinux-file-change-collector stop -``` -
- - -To uninstall cloudlinux-fchange run: -
- -``` -yum remove cloudlinux-fchange -``` -
- -### Configuration details - - -Configuration resides in /etc/sysconfig/cloudlinux-fchange. The following is the default configuration (see comments): -
- -``` -# sqlite database file path. If commented out a default value is used -#database_path=/var/lve/cloudlinux-fchange.db - -# If uncommented paths starting with 'include' one are processed only -# Pay attention this parameter is a regular string, not a regex -# To include more than one item just specify several lines to include: -# include=/one -# include=/two - -# If uncommented exclude paths which contain 'exclude' -# Pay attention this parameter is a regular string, not a regex -# To exclude more than one item just specify several lines to exclude: -# exclude=var -# exclude=tmp - -# Daemon polling interval in seconds -polling_interval=5 - -# Time to keep entries in days. Does not clean if commented out or zero -time_to_keep=1 - -# User read-only mode minimal UID -# If file change collector stopped, all users with UID >= user_ro_mode_min_uid -# are restricted to write to their home directory. This prevents to miss -# a file change event. -# Value of -1 (default) allows to disable the feature -user_ro_mode_min_uid=-1 - -# Minimal UID of events to be processed. -# Events of users with UID less then specified are not handled. -# By default 500 (non-system users for redhat-based systems) -#minimal_event_uid=500 - -# SQLite shared lock prevents setting more restrictive locks. That is a -# process cannot write to a database table when a concurrent process reads -# from the table. As saving data to database is considered far more important -# than getting them (data could be reread a second later after all), database -# writer could try to terminate concurrent reading processes. Just set -# terminate rivals to 'yes' to turn this ability on. -# terminate_rivals=no - -# Events to be handled. Currently the following types of events are processed: -# 1. file creation -# 2. file deletion -# 3. directory creation -# 4. directory deletion -# 5. file content/metadata modification -# 6. file/directory attributes/ownership modification -# 7. hardlink creation -# 8. symlink creation -# 9. file/directory moving/renaming -# By default all events are processed. Keep in mind that events for a filepath -# are cached, i.e if a file was deleted and then a file with the same absolute -# name is created, only the deletion event is triggerred. Changing file -# modification timestamp with command 'touch' will trigger modification event -# as if a file content is modified. -# Currently supported options are: -# file_created, file_modified, file_deleted, dir_created, dir_deleted, -# owner_changed, attrib_changed, moved, hardlink_created, symlink_created, all -# Options that don't have 'file' or 'dir' prefix, applied to both files and -# directories. To set more than one options, separate them with commas, -# e.g. event_types=file_created,file_deleted,file_modified. Unknown options are -# ignored. -# -# event_types=all -``` -
- -:::tip Note -Please keep in mind, that current implementation implies that one process is writing to a database and another is reading from it. As reading sets shared lock to a database table, the writing process cannot write to the table until the lock is released. That’s why passing a timestamp to cloudlinux-backup-helpermatters: this way the number of records to be returned is substantially decreased, lowering the processing time and filtering out old records. Likewise, pay attention to narrowing the scope of events being recorded. Chances are that changing attributes, ownership, directory creation/deletion, symlink events are not relevant and there’s no need to keep them. -::: - -### Low-level access - -:::tip Note -Using this options is dangerous, and might cause problems with CloudLinux File Change API. -::: - -The kernel exposes the functionality to /proc/sys/fs/datacycle/ folder. - -1. **enable** - enable/disable the functionality. Write 1 to this file to enable, 0 to disable. If disabled, no events are coming to events file. - -2. **events** - the modified files log itself. Events in the format ::: are constantly appending to the end of the file if datacycle enabled. File events are never duplicated: if we have file modification event, we would not get file deletion event if the file has been later deleted. This events buffer has limited capacity, therefore from time to time, the events log requires flushing. - -3. **flush** - a file for clearing events log. For flushing, the last event_id from the events file is written to this file. Right after this, events log is truncated to that event_id . - -4. **user_ro_mode** - forbidding users with UIDs equal or bigger that set in this file writing to their home directories. At the boot, the file has -1. When it’s written positive value, say 500, the system starts effectively preventing users from modifying their home dirs (on write attempt a user gets ‘read-only filesystem’ error). This feature is designed to prevent users from updating their home dirs when events are not handled. - -5. **entries_in_buffer** - just counter of log entries of events file. - -6. **min_event_uid** - this file has minimal UID of events to be handled. Events from users with smaller UID are not handled. By default 500 (non-system users in redhat-based systems). - -## Tuned-profiles-cloudlinux - -The **_tuned-profiles-cloudlinux_** package brings a range of kernel under-the-hood tunings to address high LA, iowait issues what were detected earlier on particular users deploys. The package also encloses OOM adjustments to prioritize the elimination of overrun PHP, lsphp, Phusion Passenger workers processes over other processes (e.g. ssh, a cron job). - -There are three profiles provided by CloudLinux OS Shared: -
- -``` -# tuned-adm list | grep cloudlinux -- cloudlinux-default - Default CloudLinux tuned profile -- cloudlinux-dummy - Empty CloudLinux tuned profile -- cloudlinux-vz - Empty CloudLinux tuned profile -``` -
- - - cloudlinux-dummy and cloudlinux-vz are used for internal needs or when Virtuozzo/OpenVZ detected and actually do nothing. - - cloudlinux-default is one to be used, it actually does the following: - -1. Switches CPU power consumption mode to the maximum. CPU operates at maximum performance at the maximum clock rate: - -
- -``` -governor=performance -energy_perf_bias=performance -``` -
- -::: tip Note -If standard software CPU governors are used. -::: - - - - 2. Applies the following kernel options: - -vm.force_scan_thresh=100 - Improves kernel memory clean-up in case of big number of running LVE. - -UBC parameters set the limits for the containers: - - ubc.dirty_ratio=100 - Defines maximum RAM percentage for dirty memory pages. - dirty_background_ratio=75 - Defines RAM percentage when to allow writing dirty pages on the disk. - -3. _[CloudLinux OS Shared 7 only]_ Detects used disk types and changes elevator to 'deadline' for HDD and to 'noop' for SSD in /sys/block/[blockname]/queue/scheduler . - -::: tip Note -The script uses /sys/block/[blockname]/queue/rotational flag, some RAID controllers can not set it properly. For example, SSD used for RAID but rotational is set to 1 by RAID driver. As a workaround add the following to /etc/rc.d/rc.local to make it applied on boot: -::: - -
- -``` -echo "noop" > /sys/block/[blockname]/queue/scheduler -echo "0" > /sys/block/[blockname]/queue/rotational -``` -
- - -Where _[blockname]_ is used device name, like _sda/sdb_ . - -And make it executable: -
- -``` -chmod +x /etc/rc.d/rc.local -``` -
- -4. _[CloudLinux OS Shared 7 only]_ The profile sets I/O scheduler. For the normal discs the Deadline Scheduler is set to improve IO performance and decrease IO latency, for SSD - noop. -When configuring scheduler I/O queue is changed and set to the value 1024 which improves overall I/O subsystem performance by caching IO requests in memory. - -5. Disables transparent HugePage . - -6. Provides adjustment group file for OOM-Killer to kill overrun php, lsphp and Phusion Passenger workers first. - -To install: - -
- -``` -yum install tuned-profiles-cloudlinux -``` -
- -To start using a profile: - -
- -``` -tuned-adm profile cloudlinux-default -``` -
- -To stop using a profile: - -
- -``` -tuned-adm off -``` -
- - -## Kernel config variables - -Starting from **lvemanager 4.0-25.5**, **lve-utils 3.0-21.2**, and **cagefs-6.1-26**, CloudLinux OS Shared utilities can read/write kernel config variables from a custom config /etc/sysctl.d/90-cloudlinux.conf (earlier, the parameters were read/written only from sysctl.conf ). - -CloudLinux OS Shared utilities get parameter by using `sysctl` system utility. So for now, even if a config variable is not set in the `sysctl.conf` and in the `/etc/sysctl.d` config files, this variable will be read by `sysctl` utility directly from `/proc/sys`. - -If you changed some kernel variables in `/etc/sysctl.d/90-cloudlinux.conf` you need to apply these changes to the kernel parameter by running the command: - -
- -``` -sysctl --system -``` -
- -After that, the variable can be read by the sysctl utility. - -Starting from **cagefs-6.1-27**, fs.proc_can_see_other_uid will be migrated (one time) from /etc/sysctl.conf into /etc/sysctl.d/90-cloudlinux.conf . If this variable is not set in either file, it will default to 0. -It is strongly advised against setting this variable in 90-cloudlinux.conf . Define it in /etc/sysctl.conf or in some other config file with an index number greater than 90-cloudlinux.conf , e.g. `/etc/sysctl.d/95-custom.conf`. - -Starting from **lve-utils-3.0-23.7** fs.proc_super_gid and fs.symlinkown_gid will be migrated (one time) from /etc/sysctl.conf into /etc/sysctl.d/90-cloudlinux.conf . - -For **lve-utils** versions from 3.0-21.2 to 3.0-23.7 the migration was performed the same way, but during every package install/update. -Variables setting guidelines are the same as for CageFS (see above). - -As requested by some our customers, we've implemented a new kernel setting to hide `/proc/net/{tcp,udp,unix}` files for additional security/isolation. -You can hide them by runnign `sysctl -w kernel.proc_disable_net=1` command, and by default, it's `0` (nothing hidden). -Currently this is implemented for CloudLinux OS Shared 7 only. - -## Virtualized /proc filesystem - -You can prevent user from seeing processes of other users (via ps/top command) as well as special files in /proc file system by setting fs.proc_can_see_other_uid sysctl. - -To do that, edit /etc/sysctl.conf -
- -``` -fs.proc_can_see_other_uid=0 -fs.proc_super_gid=600 -``` -
-And do: -
- -``` -# sysctl -p -``` -
-fs.proc_can_see_other_uid=0 - -If fs.proc_can_see_other_uid is set to 0, users will not be able to see special files. If it is set to 1 - user will see other processes IDs in /proc filesystem. - -fs.proc_super_gid=XX - -The fs.proc_super_gid sets group ID which will see system files in /proc, add any users to that group so they will see all files in /proc. Usually needed by some monitoring users like nagios or zabbix and [cldetect utility](/command-line_tools/#cldetect) can configure few most commonly used monitoring software automatically. - -#### Automatic configuration of a group in the fs.proc_super_gid - -Starting from **lve-utils v.4.2.0-1**, when installing (not updating) the `lve-utils` package it automatically creates the `clsupergid` group and registers this group in the `fs.proc_super_gid` (if this group was not created before). -If a group was created in the `fs.proc_super_gid` earlier all stays the same. - - -Virtualized /proc filesystem in CloudLinux OS Shared 8/CloudLinux OS Shared 7 hybrid will display all files to unprivileged users. But unprivileged users will have access only to the following files (as well as directories for PIDs for the user): -
- -``` -/proc/cpuinfo -/proc/version -/proc/stat -/proc/uptime -/proc/loadavg -/proc/filesystems -/proc/stat -/proc/cmdline -/proc/meminfo -/proc/mounts -/proc/net/tcp -/proc/net/tcp6 -/proc/net/udp -/proc/net/udp6 -/proc/net/assocs -/proc/net/raw -/proc/net/raw6 -/proc/net/unix -/proc/net/dev -``` -
- -:::tip Note -Starting from lve-utils 3.0-21.2, fs.proc_super_gid parameter in da_add_admin utility is written to /etc/sysctl.d/90-cloudlinux.conf. -::: - -### Remounting procfs with "hidepid" option - -In **lve-utils-2.1-3.2** and later `/proc` can be remounted with `hidepid=2` option to enable additional protection for procfs. This remount is performed in lve_namespaces service. -This option is in sync with `fs.proc_can_see_other_uid` kernel parameter described above. -When `/etc/sysctl.conf` does not contain `fs.proc_can_see_other_uid` setting, the protection is off (procfs is remounted with `hidepid=0` option). In this case `fs.proc_super_gid` setting is ignored. Users are able to see full `/proc` including processes of other users on a server. This is a default behavior. - -If `/etc/sysctl.conf` contains `fs.proc_can_see_other_uid=1` setting, then `/proc` will be remounted with `hidepid=0` option (disable `hidepid` protection for all users). -If `/etc/sysctl.conf` contains `fs.proc_can_see_other_uid=0` setting, then `/proc` will be remounted with `hidepid=2` option (enable `hidepid` protection for all users). -If `/etc/sysctl.conf` contains `fs.proc_can_see_other_uid=0` and `fs.proc_super_gid=$GID` settings, then `/proc` will be remounted with `hidepid=2, gid=$GID` options (enable `hidepid` for all users except users in group with gid $GID). - -To apply `/etc/sysctl.conf` changes, you should execute -
- -``` -service lve_namespaces restart -``` -
- Or -
- -``` -/usr/share/cloudlinux/remount_proc.py -``` -
- -So, admin can prevent users from seeing processes of other users via `fs.proc_can_see_other_uid` and `fs.proc_super_gid` settings in `/etc/sysctl.conf`, like earlier. - -Also, you can override this by specifying desired options for `/proc` in `/etc/fstab`. - -To disable hidepid, add to `/etc/fstab` the following: -
- -``` -proc /proc proc defaults,hidepid=0,gid=0 0 0 -``` -
-Or you can specify desired hidepid and gid values explicitly: -
- -``` -proc /proc proc defaults,hidepid=2,gid=clsupergid 0 0 -``` -
- You should execute -
- -``` -mount -o remount /proc -``` -
- -to apply `/etc/fstab` changes. -Nevertheless, we recommend to manage procfs mount options via `/etc/sysctl.conf` as described above for backward compatibility. - -::: tip Note -There is a known issue on CloudLinux OS Shared 6 systems. User cannot see full /proc inside CageFS even when this user is in “super” group, that should see full /proc. This issue does not affect users with CageFS disabled. CloudLinux OS Shared 7 is not affected. -::: - -::: tip Note -Starting from lve-utils 3.0-21.2, lve_namespaces service can read parameters from the /etc/sysctl.d/90-cloudlinux.conf. -::: - -::: tip Note -Even if fs.proc_can_see_other_uid and fs.proc_super_gid parameters are not set in config files but specified in /proc/sys, then when restarting lve_namespaces service the parameters from /proc/sys will be used. So, /proc will be remounted according to these parameters. -::: - -### Remounting procfs on CloudLinux OS Shared 8 - -On CloudLinux OS Shared 8, starting from the kernel version `4.18.0-193.28.1.lve1.el8.x86_64` remounting is controlled by the kernel. - -As before, admins are able to change the settings `fs.proc_can_see_other_uid` and `fs.proc_super_gid` in the `/etc/sysctl.d/90-cloudlinux.conf` or `/etc/sysctl.conf`. - -To apply changes, execute the following command: - -``` -sysctl --system -``` - -It is no longer needed to manually run the `/usr/share/cloudlinux/remount_proc.py` to remount `/proc`. - -::: tip Note -On Cloudlinux OS Shared 8, changing the `/etc/fstab` file for setting `/proc` remounting with the `hidepid=` option **will not cause any effect** as remounting is totally controlled by the kernel and depends on the `fs.proc_can_see_other_uid` option. -::: - -## Ptrace block - -Starting with kernel 3.10.0-427.18.s2.lve1.4.21 ( CloudLinux OS Shared 7) and 2.6.32-673.26.1.lve1.4.17 ( CloudLinux OS Shared 6) we re-implemented ptrace block to protect against ptrace family of vulnerabilities. It prevents end user from using any ptrace related functionality, including such commands as strace, lsof or gdb . - -By default, CloudLinux OS Shared doesn't prevent ptrace functionality. - -Defaults: -
- -``` -kernel.user_ptrace = 1 -kernel.user_ptrace_self = 1 -``` -
- -The option kernel.user_ptrace disables PTRACE_ATTACH functionality, option kernel.user_ptrace_self disables PTRACE_TRACEME . - -To disable all ptrace functionality change both sysctl options to 0, add this section to /etc/sysctl.conf : -
- -``` -## CL. Disable ptrace for users -kernel.user_ptrace = 0 -kernel.user_ptrace_self = 0 -## -``` -
- -Apply changes with: -
- -``` -$ sysctl -p -``` -
- -Different software could need different access to ptrace , you may need to change only one option to 0 to make them working. In this case, there will be only partial ptrace protection. - -::: danger -ptrace protection is known to break PSA service for Plesk 11 -::: - -## Xen XVDA - -2.6.32 kernels have different mode of naming Xen XVDA drives. - -By adding xen_blkfront.sda_is_xvda=0 to kernel boot line in grub.conf you will make sure no naming translation is done, and the drives will be identified as xvde . - -By default, this option is set to 1 in the kernel, and drives are detected as xvda . -This is needed only for CloudLinux OS Shared 6 and Hybrid kernels. - -## Umask behavior - -:::tip Note -CloudLinux OS Shared 6, CloudLinux OS Shared 6 hybrid, CloudLinux OS Shared 7, CloudLinux OS Shared 7 hybrid kernels. -::: - -Starting from the kernel module **lve-kmod-2.0-10**, the behavior of umask is changed. - -Now, when entering LVE task's original umask value is preserved, instead of using LVE's umask value. -This behavior is typical for all kernels: CloudLinux OS Shared 6, CloudLinux OS Shared 6 hybrid, CloudLinux OS Shared 7, CloudLinux OS Shared 7 hybrid kernels. - -## IO limits latency - -**[lve1.2.29+]** - -When customer reaches IO Limit, the processes that are waiting for IO will be placed to sleep to make sure they don't go over the limit. That could make some processes sleep for a very long time. -By defining IO latency, you can make sure that no process sleeps due to IO limit for more then X milliseconds. By doing so, you will also let customers to burst through the limits, and use up more than they were limited too in some instances. - -This option is OFF by default. - -_For CloudLinux OS Shared 6 , CloudLinux OS Shared 7, CloudLinux OS Shared 8 (kmodlve 2.1-2 and later):_ - -To enable IO Limits latency and set it to 10 seconds: -
- -``` -# echo 10000 > /sys/module/kmodlve/parameters/latency -``` -
-To disable latency: -
- -``` -# echo 2000000000 > /sys/module/kmodlve/parameters/latency -``` -
- -It is possible to set, for example, 1000 as a permanent value. To do so, create a file /etc/modprobe.d/kmodlve.conf with the following content: -`options kmodlve latency=1000` - - -_For CloudLinux OS Shared 5 (OBSOLETE):_ - -To enable IO Limits latency and set it to 10 seconds: -
- -``` -# echo 10000 > /sys/module/iolimits/**parameters/latency -``` -
-To disable latency: -
- -``` -# echo 2000000000 > /sys/module/iolimits/**parameters/latency -``` -
- - -## Reading LVE usage - -CloudLinux OS Shared kernel provides real time usage data in file. - -All the statistics can be read from that file in real time. Depending on your kernel version you will get either Version 6 of the file, or version 4 of the file. -You can detect the version by reading the first line of the file. It should look like: - -6:LVE... for version 6 -4:LVE... for version 4 - -First line presents headers for the data. -Second line shows default limits for the server, with all other values being 0. -The rest of the lines present limits & usage data on per LVE bases. - -Version 6 (CL6 & hybrid kernels): -
- -``` -6:LVE EP lCPU lIO CPU MEM IO lMEM lEP nCPU fMEM fEP lMEMPHY lCPUW lNPROC MEMPHY fMEMPHY NPROC fNPROC -0 0 25 1024 0 0 0 262144 20 1 0 0 262144 100 0 0 0 00 -300 0 25 1024 1862407 0 0 262144 20 1 0 0 262144 100 0 31 000 -``` -
- -| | | | | -|-|--|--|-| -|**Label** | **Description** | **Value** | **Supported versions**| -| LVE | LVE ID | number | | -| EP | Number of entry processes | number | | -| lCPU | CPU Limit | % relative to total CPU power | | -| lIO | IO limits for CL6 | KB/s for v6, from 1 to 100 for v4 | | -| CPU | CPU usage since reboot | in nanoseconds for v6, hertz for v4 | | -| MEM | Virtual memory usage | number of 4k pages | | -| IO | IO usage | KB/s for v6, 0 for v4 | | -| lMEM | Virtual memory limit | number of 4k pages | | -| lEP | Entry Processes limit | number | | -| nCPU | Number of cores limit | number of cores | | -| fMEM | Virtual memory faults | number of faults | | -| fEP | Entry Processes faults | number of faults | v6+| -| lMEMPHY | Physical memory limit | number | v6+| -| lCPUW | CPU weight (not used) | from 1 to 100 | v6+| -| lNPROC | Number of processes limit | number | v6+| -| MEMPHY | Physical memory usage | number of 4k pages | v6+| -| fMEMPHY | Physical memory faults | number of faults | v6+| -| NPROC | Number of processes | number | v6+| -| fNPROC | Number of processes faults | number of faults | v6+| -| IOPS | IO operations since reboot | number | v8+| - -## Flashcache - -:::tip Note -Available only for x86_64, CloudLinux OS Shared 6 and Hybrid servers -::: - - Flashcache is a module originally written and released by Facebook (Mohan Srinivasan, Paul Saab and Vadim Tkachenko ) in April of 2010. It is a kernel module that allows Writethrough caching of a drive on another drive. This is most often used for caching a rotational drive on a smaller solid-state drive for performance reasons. This gives you the speed of an SSD and the size of a standard rotational drive for recently cached files. Facebook originally wrote the module to speed up database I/O , but it is easily extended to any I/O . - -To install on CloudLinux OS Shared 6 & Hybrid servers: -
- -``` -$ yum install flashcache -``` -
- -More info on flashcache : [https://github.com/facebook/flashcache/](https://github.com/facebook/flashcache/) - - ArchLinux has a good page explaining how to use flashcache : -[https://wiki.archlinux.org/index.php/Flashcache](https://wiki.archlinux.org/index.php/Flashcache) - - -## OOM killer for LVE processes - -When LVE reaches its memory limit, the processes inside that LVE are killed by OOM Killer and appropriate message is written to /var/log/messages . When any LVE hits huge number of memory limits in short period of time, then OOM Killer could cause system overload. Starting from kernel 2.6.32-673.26.1.lve1.4.15 ( CloudLinux OS Shared 6) and from kernel 3.10.0-427.18.2.lve1.4.14 ( CloudLinux OS Shared 7) heavy OOM Killer could be disabled. If so - lightweight SIGKILL will be used instead. - -:::tip Note -It is recommended to disable OOM killer for LVE processes and use SIGKILL instead -::: - -By default OOM Killer is enabled, to disable it please run: - -_For CloudLinux OS Shared 6_ : -
- -``` -# echo 1 > /proc/sys/ubc/ubc_oom_disable -``` -
- -Also, add the following to _/etc/sysctl.conf_ file to apply the same during boot: -
- -``` -ubc.ubc_oom_disable=1 -``` -
- -_For CloudLinux OS Shared 7:_ - -
- -``` -# echo 1 > /proc/sys/kernel/memcg_oom_disable -``` -
- -Also, add the following to `/etc/sysctl.conf` file to apply the same during boot: - -
- -``` -kernel.memcg_oom_disable=1 -``` -
- - -## File system quotas - - -In **Ext4** file system, the process with enabled capability CAP_SYS_RESOURCE is not checked on the quota exceeding by default. It allows userland utilities _selectorctl_ and _cagefs_ to operate without fails even if a user exceeds a quota. - -To disable quota checking in **XFS** file system set `cap_res_quota_disable` option to 1 using the following command: - -
- -``` -# echo 1 > /proc/sys/fs/xfs/cap_res_quota_disable -``` -
- -## Enter LVE when using cPanel utilities - -cPanel tools might use more resources than desired, so to limit resource usage, you might want to enter the corresponding LVE when using cPanel tools on-behalf of a non-root user. - - -This feature is considered experimental, as in this case there might be contention for LVE limits between cPanel tools and web-requests for a given user, which might not be suitable. - -The `lve_setuid_enter` parameter controls whether you want to enter the corresponding LVE when using cPanel tools on behalf of a non-root user. - -By default, the feature is disabled (0), to enable it, run the following for CloudLinux OS Shared 7 hybrid: - -
- -``` -# echo 1 > /sys/module/kmodlve/parameters/lve_setuid_enter -``` -
- -## Proactive reporting kernel crash events with Sentry and Kernel Panic Receiver - -As updating the kernel is one of the most sensitive tasks, we'd like to achieve the maximum stability along the way. -In case something goes wrong, proactive reacting to kernel crashes can help tremendously. - -Our new tool, _Kernel Panic Receiver_, released in [June 2020](https://blog.cloudlinux.com/kernel-panic-receiver-a-new-tool-to-organize-kernel-panic-logs) allows you to to organize kernel panic logs. -Kernel Panic Receiver is an open-source component designed to pre-emptively resolve any kernel-related issues. - -Visit the [Kernel Panic Receiver project GitHub page](https://github.com/cloudlinux/kernel_panic_receiver). - -#### Usage - -To send required kernel logs from the clients' machines to _Kernel Panic Receiver_, we configure the default Linux kernel feature called _netconsole_. - -The configuration is done by the `initscripts` package, starting from the following versions: - -* For CloudLinux OS Shared 6: `9.03.61-1.cloudlinux` -* For CloudLinux OS Shared 7: `9.49.49-1.cloudlinux` -* For CloudLinux OS Shared 8: `10.00.4-1.cloudlinux` - -To update the `initscripts` package, run the following command: - -``` -yum update initscripts --enablerepo=cloudlinux-updates-testing -``` - -When a kernel panic occurs, the _netconsole_ module sends logs to our server as plain text via the UDP protocol. - -#### What data is transferred by netconsole? - -The _netconsole_ sends only OOPs-related messages from the kernel ring buffer. It doesn't transfer any sensitive data, such as usernames, encryption keys, paths, etc. So, there are no security problems you should worry about. - -### Disabling the feature - -If you don't want to send us the data, you can turn the _netconsole_ service off (we don't recommend it, though). -To disable transferring the data, just comment the `SYSLOGADDR` parameter in the _netconsole_ config file (`/etc/sysconfig/netconsole`): - -``` -# For more information about this data transmission, check this page: -# https://cloudlinux.zendesk.com/hc/en-us/articles/360016481200 -# SYSLOGADDR=sentrykernel.cloudlinux.com -``` - -And stop the _netconsole_ service by running the following command: - -``` -service netconsole stop -``` - -:::tip Note -_Netconsole_ is used only for Kernel Panic Receiver, so disabling it doesn't lead to issues with other CloudLinux OS Shared services. -::: diff --git a/docs/command-line_tools/.DS_Store b/docs/command-line_tools/.DS_Store deleted file mode 100644 index 22057bd40..000000000 Binary files a/docs/command-line_tools/.DS_Store and /dev/null differ diff --git a/docs/command-line_tools/README.md b/docs/command-line_tools/README.md deleted file mode 100644 index 6055973c2..000000000 --- a/docs/command-line_tools/README.md +++ /dev/null @@ -1,4061 +0,0 @@ -# Command-line tools (CLI) - -The list of the commands (CLI) you can use to manage CloudLinux OS components. - -* [CageFS](/command-line_tools/#cagefs) -* [LVE-stats 2](/command-line_tools/#lve-stats-2) -* [MySQL Governor](/command-line_tools/#mysql-governor) -* [PHP Selector](/command-line_tools/#php-selector) -* [Python Selector](/command-line_tools/#python-selector) -* [Ruby Selector](/command-line_tools/#ruby-selector) -* [Node.js Selector](/command-line_tools/#node-js-selector) -* [Apache mod_lsapi PRO](/command-line_tools/#apache-mod-lsapi-pro) -* [Website monitoring tool and Slow Site analyzer](/command-line_tools/#website-monitoring-tool-and-slow-site-analyzer) -* [X-Ray Autotracing](/command-line_tools/#x-ray-autotracing) -* [Other CLI tools](/command-line_tools/#other-cli-tools) - -## CageFS - -* [Running command inside CageFS](/command-line_tools/#running-command-inside-cagefs) -* [Sanity check](/command-line_tools/#sanity-check) - -`cagefsctl` is used to manage CageFS. It allows initializing and updating CageFS, as well as enabling/disabling CageFS for individual users. - -Use the following syntax to manage CageFS: -`/usr/sbin/cagefsctl [OPTIONS]` - - -Options: - -| | | | -|-|-|-| -|-i | --init |initialize CageFS (create CageFS if it does not exist)| -|-r | --reinit |reinitialize CageFS (make backup and recreate CageFS)| -|-u | --update |update files in CageFS (add new and modified files to CageFS, remove unneeded files)| -|-f | --force |recreate CageFS (do not make backup, overwrite existing files)| -|-d | --dont-clean |do not delete any files from skeleton (use with --update option)| -|-k | --hardlink |use hardlinks if possible| -| | --create-mp |Creates _/etc/cagefs/cagefs.mp_ file| -| | --mount-skel |mount CageFS skeleton directory| -| | --unmount-skel |unmount CageFS skeleton directory| -| | --remove-all |disable CageFS, remove templates and _/var/cagefs_ directory| -| | --sanity-check |perform basic self-diagnistics of common cagefs-related issues (mostly useful for support)| -| | --addrpm |add rpm-packages in CageFS (run `cagefsctl --update` in order to apply changes)| -| | --delrpm |remove rpm-packages from CageFS (run `cagefsctl --update` in order to apply changes)| -| | --list-rpm |list rpm-packages that are installed in CageFS| -|-e | --enter |enter into user's CageFS as root| -| | --update-list |update specified files only (paths are read from stdin)| -| | --update-etc |update _/etc_ directory of all or specified users| -| | --set-update-period |set min period of update of CageFS in days (default = 1 day)| -| | --force-update |force update of CageFS (ignore period of update)| -| | --force-update-etc |force update of _/etc_ directories for users in CageFS| -| | --reconfigure-cagefs |configure CageFS integration with other software (control panels, database servers, etc)| - -Use the following syntax to manage users: - `/usr/sbin/cagefsctl [OPTIONS] username [more usernames]` - -Options: - -| | | | -|-|-|-| -|-m | --remount |remount specified user(s)| -|-M | --remount-all |remount CageFS skeleton directory and all users (use this each time you have changed _cagefs.mp_ file| -|-w | --unmount |unmount specified user(s)| -|____ | --unmount-dir |unmount specified dir for all users| -|-W | --unmount-all |unmount CageFS skeleton directory and all users| -|-l | --list |list users that entered in CageFS| -| | --list-logged-in |list users that entered in CageFS via SSH| -| | --enable |enable CageFS for the user| -| | --disable |disable CageFS for the user| -| | --enable-all |enable all users, except specified in _/etc/cagefs/users.disabled_| -| | --disable-all |disable all users, except specified in _/etc/cagefs/users.enabled_| -| | --display-user-mode |display the current mode ( "Enable All" or "Disable All" )| -| | --toggle-mode |toggle mode saving current lists of users (lists of enabled and disabled users remain unchanged)| -| | --list-enabled |list enabled users| -| | --list-disabled |list disabled users| -| | --user-status |print status of specified user (enabled or disabled)| -| | --getprefix |display prefix for user| - - PHP Selector related options: - -| | | -|-|-| -| --setup-cl-selector | setup PHP Selector or register new alt-php versions| -| --remove-cls-selector |unregister alt-php versions, switch users to default php version when needed| -| --rebuild-alt-php-ini |rebuild _alt_php.ini_ file for specified users (or all users if none specified)| -| --validate-alt-php-ini |same as `--rebuild-alt-php-ini` but also validates _alt_php.ini_ options| -| --cl-selector-reset-versions |reset php version for specifed users to default (or all users if none specified)| -| --cl-selector-reset-modules |reset php modules (extensions) for specific users to defaults (or all users if none specified)| -| --create-virt-mp |create virtual mount points for the user| -| --create-virt-mp-all |create virtual mount points for all users| -| --remount-virtmp |create virtual mount points and remount user| -| --apply-global-php-ini |use with 0, 1 or 2 arguments from the list: `error_log`, `date.timezone` without arguments applies all global php options including the two above| - -Common options: - -| | | | -|-|-|-| -|___ | --disable-cagefs |disable CageFS| -| | --cagefs-status |print CageFS status: ( enabled or disabled )| -| | --set-min-uid |Set min UID | -| | --get-min-uid |Display current MIN_UID setting| -| | --print-suids |Print list of SUID and SGID programs in skeleton| -| | --do-not-ask |assume "yes" in all queries (should be the first option in command)| -| | --clean-var-cagefs |clean _/var/cagefs_ directory (remove data of non-existent users)| -| | --set-tmpwatch |set `tmpwatch` command and parameters (save to _/etc/cagefs/cagefs.ini_ file)| -| | --tmpwatch |execute tmpwatch (remove outdated files in tmp directories in CageFS for all users)| -| | --toggle-plugin |disable/enable CageFS plugin| -|-v | --verbose |verbose output| -| | --wait-lock |wait for end of execution of other `cagefsctl` processes (when needed) before execution of the command| -|-h | --help |this message| - - - -#### Running command inside CageFS - -::: tip Note -lve-wrappers 0.6-1+ -::: - -Sometimes you will need to execute a command as user inside CageFS. - -If a user has shell enabled - you can simply use: -
- -``` -$ /bin/su - $USERNAME -c _command_ -``` -
-Yet, if a user have they shell disabled, it wouldn't work. To solve this issue, we have added command: -
- -``` -$ /sbin/cagefs_enter_user [--root] [--no-fork] $USERNAME _command_ -``` -
- -**Options**: - -* `--root` – tells the utility not to reset UID and GID to user ones. It might be dangerous to call untrusted commands. -* `--no-fork` – do not create a child process for a called command. The called command will replace the cagefs_enter process with exec. -* `--no-cpu-limit`- remove all CPU limits (requires `kmod-lve` >= 2.0.36) -* `--no-io-and-memory-limit` - remove all limits of IO and Memory (requires `kmod-lve` >= 2.0.36) - -If you disable CageFS for a user, then `cagefs_enter` will be executed without `proxyexec` . - -You can forcibly disable `cagefs_enter` start via `proxyexec` for all users (regardless if CageFS is enabled or disabled) by specifying the parameter _cagefs_enter_proxied=0_ in _/etc/sysconfig/cloudlinux_ . - - _/bin/cagefs_enter.proxied_ can be executed instead of _/bin/cagefs_enter_ to enter CageFS without `proxyexec` . Note that starting `cagefs_enter` via `proxyexec` is necessary to enable sending local notification messages to users with enabled CageFS. `cagefs_enter` is executed via `proxyexec` by default. - - -#### Sanity check - - -:::tip Note -CageFS 6.0-34+ -::: - -CageFS `--sanity-check` utility allows to check CageFS configuration consistency, so that an administrator can save the time investigating issues with CageFS and ensure that custom configuration is correct. - -To start, run the command: -
- -``` -cagefsctl --sanity-check -``` -
-At the moment 7 types of check are implemented: - -1. _Check cagefs mount points exists_ - reads _cagefs.mp_ file and verifies if the directories specified in it really exist on the disk. To learn more, visit [Mount points](/cloudlinux_os_components/#mount-points) and [Split by username](/cloudlinux_os_components/#split-by-username) - -2. _Check cagefs `users.enabled` is a directory_ - ensures that if _/etc/cagefs/users.enabled_ exists, then it is a directory, not a file (if it is recognized as a file, then it would cause a breakdown). - -3. _Check cagefs `users.disabled` is a directory_ - ensures that if _/etc/cagefs/users.disabled_ exists, then it is a directory, not a file (if it is recognized as a file, then it would cause a breakdown). - -4. _Check cagefs `disable.etcfs` exists_ - checks if _/etc/cagefs/etc.safe/disable.etcfs_ exists. - -5. _Check cagefs users can enter cagefs_ - chooses two users in the system with enabled CageFS (the first and the second ones in the unsorted list) and tries to log in to CageFS under their credentials and see what happens. It runs `su -l "$USER" -s /bin/bash -c "whoami"` and compares the output with the $USER and su command retcode estimation. - -::: tip Note -If a login fails, it can be due to various reasons, that can only be determined in manual mode. The checker only gives the output of the command. -::: - -6. _Check cagefs proxy commands configs are parsable_ - tries to load _/etc/cagefs/*.proxy.commands_ files and parse them to check the syntax. In case of any parsing error the test will fail. To learn more, visit [Executing by proxy](/cloudlinux_os_components/#executing-by-proxy). - -7. _Check cagefs virt.mp files syntax_ - reads all _/var/cagefs///virt.mp_ files (if any) and checks their syntax validity. At the moment there are only two checks of the syntax: the file is not empty if it exists, and the file is not starting with the sub directory definitions (with @). To learn more, visit [Per-user virtual mount points](/cloudlinux_os_components/#per-user-virtual-mount-points) - -8. _Check MultiPHP system default PHP version_ – checks that MultiPHP system default PHP version is **NOT** Alt-PHP. That means PHP Selector should work properly. If MultiPHP system default PHP version is Alt-PHP, PHP Selector does not work and should be disabled. To learn more on how to disable PHP Selector, visit [cPanel LVE Manager](/cloudlinux_os_components/#php-selector) - -Possible results of the checks: - -* OK - the check succeeded. - -* FAILED - the check revealed a problem. - -* SKIPPED - the check was skipped as it made no sense in such environment (e.g. wrong control panel) or can not be performed for some reason (e.g no users with enabled CageFS found). The actual result does not mean that a problem exists and can be considered as positive. - -* INTERNAL_TEST_ERROR - the check failed because of a problem inside the checker itself. Must be reported to the developers. - -In case if at least one of the checks resulted neither OK nor SKIPPED then the checker will end with ret code >0. - - -## LVE-stats 2 - -* [lveinfo](/command-line_tools/#lveinfo) -* [lvechart](/command-line_tools/#lvechart) -* [dbgovchart](/command-line_tools/#dbgovchart) -* [lve-read-snapshot](/command-line_tools/#lve-read-snapshot) -* [lve-create-db](/command-line_tools/#lve-create-db) -* [cloudlinux-top](/command-line_tools/#cloudlinux-top) - * [Usage](/command-line_tools/#usage) - * [Output format](/command-line_tools/#output-format) - * [Units of measurement](/command-line_tools/#units-of-measurement) - * [Errors handling](/command-line_tools/#errors-handling) - * [Examples](/command-line_tools/#examples) -* [cloudlinux-statistics](/command-line_tools/#cloudlinux-statistics) - * [Usage](/command-line_tools/#usage-2) - * [Output format](/command-line_tools/#output-format-2) - * [Units of measurement](/command-line_tools/#units-of-measurement-2) - * [Errors handling](/command-line_tools/#errors-handling-2) - * [Examples](/command-line_tools/#examples-2) - -| | | -|-|-| -| `/usr/sbin/lveinfo` |utility to display historical information about LVE usage.| -| `/usr/sbin/lvechart` |creates a chart representing LVE usage for user.| -| `/usr/sbin/dbgovchart` |creates a chart representing MySQL usage for user.| -| `/usr/sbin/lve-read-snapshot` |displays information from system state (snapshots) for user.| -| `/usr/sbin/lve-create-db` |creates/recreates database for lve-stats.| -| `/usr/sbin/cloudlinux-top` |utility provides information about current MySQL and LVE usage of a running system in JSON format.| -| `/usr/sbin/cloudlinux-statistics` |utility provides historical information about resource usage.| - -
- -#### lveinfo - -
- -:::tip Note -lve-stats-2.2-2 -::: - -**Usage** - -
- -``` -lveinfo [-h] [-v] [--dbgov DBGOV] [-f YYYY-MM-DD[HH:MM]] - - [-t YYYY-MM-DD[HH:MM]] [--period PERIOD] [-u USER | --id ID] - - [-d] [-o ALIAS] [-b ALIAS [ALIAS ...]] [-p 0..100] - - [--by-fault ALIAS [ALIAS ...]] [-r FAULTS] - - [--style {user,admin}] [-l LIMIT] [-c [PATH] | -j] - - [--server_id SERVER_ID] [--servers-info] - - [--show-all | --show-columns COLUMN_NAME [COLUMN_NAME ...]] - - [--time-unit TIME_UNIT] [-m {v1,v2}] - - [--blank-value [BLANK_VALUE]] -``` -
- -`lveinfo` is an utility to display historical information about LVE usage. - -**Optional arguments** - -* `-h, --help` – show this help message and exit -* `-v, --version` – show program's version number and exit -* `--dbgov DBGOV` – show MySql Governor statistic -* `-u USER, --user USER` – use username instead of LVE id, and show only record for that user -* `--id ID` – will display record only for that LVE id -* `-d, --display-username` – try to convert LVE id into username when possible -* `-o ALIAS, --order-by ALIAS` – orders results by one of the following: - | | | | - |-|-|-| - |ALIAS|ALIAS|DESCRIPTION| - |`cpu_avg`|`aCPU`|average CPU usage| - |`cpu_max`|`mCPU`|max CPU usage| - |`total_cpu_faults`|`CPUf`|total number of max CPU usage faults| - |`vmem_avg`|`aVMem`|average virtual memory usage||`vmem_max`|`mVMem`|average virtual memory usage||`total_vmem_faults`|`VMemF`|total number of out of virtual memory faults| - |`mep_avg`|`aEP`|average number of entry processes (concurrent connections)| - |`mep_max`|`mEP`|max number of entry processes (concurrent connections)| - |`total_ep_faults`|`EPf`|total number of max entry processes faults| - |`pmem_avg`|`aPMem`|average physical memory usage (LVE version >= 6)| - |`pmem_max`|`mPMem`|max physical memory usage (LVE version >= 6)| - |`nproc_avg`|`aNproc`|average number of processes (LVE version >= 6)| - |`nproc_max`|`mNproc`|max number of processes (LVE version >= 6)| - |`io_avg`|`aIO`|average io usage (LVE version >= 6)| - |`io_max`|`mIO`|max io usage (LVE version >= 6)| - |`total_pmem_faults`|`PMemF`|total number of out of physical memory faults (LVE version >= 6)| - |`total_nproc_faults`|`NprocF`|total number of max processes faults (LVE version >= 6)| - |`total_io_faults`|`IOf`|total number of max io faults (LVE version >= 6)| - |`iops_avg`|`aIOPS`|average io operations (LVE version >= 8)| - |`iops_max`|`mIOPS`|max io operations (LVE version >= 8)| - |`total_iops_faults`|`IOPSf`|total number of max io operations faults (LVE version >= 8)| - |`any_faults`|`anyF`|total number of faults of all types| -* `-b ALIAS [ALIAS ...]` `--by-usage ALIAS [ALIAS ...]` – show LVEs with usage (averaged) within 90 percent of the limit available values: - - | | | | | - |-|-|-|-| - |ALIAS|ALIAS|ALIAS|DESCRIPTION| - |`cpu_avg`|`cpu`|`aCPU`|average CPU usage| - |`cpu_max`|`cpu_max`|`mCPU`|max CPU usage| - |`vmem_avg`|`vmem`|`aVMem`|average virtual memory usage| - |`vmem_max`|`vmem_max`|`mVMem`|max virtual memory usage| - |`mep_avg`|`mep`|`aEP`|average number of entry processes (concurrent connections)| - |`mep_max`|`mep_max`|`mEP`|max number of entry processes (concurrent connections)| - |`pmem_avg`|`pmem`|`aPMem`|average physical memory usage (LVE version >= 6)| - |`pmem_max`|`pmem_max`|`mPMem`|max physical memory usage (LVE version >= 6)| - |`nproc_avg`|`nproc`|`aNproc`|average number of processes (LVE version >= 6)| - |`nproc_max`|`nproc_max`|`mNproc`|max number of processes (LVE version >= 6)| - |`io_avg`|`io`|`aIO`|average io usage (LVE version >= 6)| - |`io_max`|`io_max`|`mIO`|max io usage (LVE version >= 6)| - |`iops_avg`|`iops`|`aIOPS`|average io operations (LVE version >= 8)| - |`iops_max`|`iops_max`|`mIOPS`|max io operations (LVE version >= 8)| - -* `-p 0..100`, `--percentage 0..100` – defines percentage for `--by-usage` option; default `90` -* `--style {user,admin}` – deprecated, not used. -* `-l LIMIT`, `--limit LIMIT` – max number of results to display, `10` by default, if `0` no limit -* `-c [PATH]`, `--csv [PATH]` – save statistics in CSV format; `-` by default (output to screen) -* `-j`, `--json` – display output in JSON format -* `--server_id SERVER_ID` – used with central database for multiple servers, default `localhost` -* `--servers-info` – show servers LVE versions -* `--show-all` – full output (show all limits); brief output is default; equivalent `--show-columns all` -* `-show-columns COLUMN_NAME [COLUMN_NAME ...]` – show only the listed columns; `all` for all supported columns - - | | | - |-|-| - |COLUMN_NAME |DESCRIPTION| - | `From ` |Show start period statistics| - | `To ` |Show end period statistics| - | `ID ` |LVE Id or username| - | `aCPU` |Average CPU usage| - | `uCPU` |The percentage of user-allocated resource CPU| - | `mCPU` |deprecated| - | `lCPU` |CPU limit| - |`CPUf` |Out Of CPU usage Faults| - |`aEP` | Average Entry Processes| - |`uEP` |The percentage of user-allocated resource Entry processes| - |`mEP` |deprecated| - |`lEP` |maxEntryProc limit| - |`aVMem` |Average Virtual Memory Usage| - |`uVMem ` |The percentage of user-allocated resource Virtual Memory| - |`mVMem` |deprecated| - |`lVMem` |Virtual Memory Limit| - |`VMemF` |Out Of Memory Faults| - |`EPf` |Entry processes faults| - |`aPMem` |Average Physical Memory Usage (LVE version >= 6)| - |`uPMem` |The percentage of user-allocated resource Physical Memory (LVE version >= 6)| - |`mPMem` |deprecated (LVE version >= 6)| - |`lPMem` |Physical Memory Limit (LVE version >= 6)| - |`aNproc` |Average Number of processes (LVE version >= 6)| - |`uNproc` |The percentage of user-allocated resource Number of processes (LVE version >= 6)| - |`mNproc` |deprecated (LVE version >= 6)| - |`lNproc` |Limit of Number of processes (LVE version >= 6)| - |`PMemF` |Out Of Physical Memory Faults (LVE version >= 6)| - |`NprocF` |Number of processes faults (LVE version >= 6)| - |`aIO` |Average I/O (LVE version >= 6)| - |`uIO` |The percentage of user-allocated resource I/O (LVE version >= 6)| - |`mIO` |deprecated (LVE version >= 6)| - |`lIO` |I/O Limit (LVE version >= 6)| - |`IOf` |Out Of I/O usage Faults (LVE version >= 6)| - |`aIOPS` |Average I/O Operations (LVE version >= 8)| - |`mIOPS` |deprecated (LVE version >= 8)| - |`uIOPS` |The percentage of user-allocated resource I/O Operations (LVE version >= 8)| - |`lIOPS` |I/O Operations Limit (LVE version >= 8) | - |`IOPSf` |Out Of I/O Operations Faults (LVE version >= 8)| - -* `--time-unit TIME_UNIT` – time step for grouping statistic in minutes; 1 min., by default; can use `m\|h\|d` suffixes; for example: `1h or 1h30m or 1d12h` -* `-m {v1,v2}`, `--compat {v1,v2}` – `v1` - return old output mode; `v2` - new mode; default `v1`; you can change default in config -* `--blank-value [BLANK_VALUE]` – Use to fill unsupported limits; default `-` -* `-f YYYY-MM-DD[ HH:MM]`, `--from YYYY-MM-DD[ HH:MM]` – run report from date and time in `[YY]YY-MM-DD[ HH:MM]` format; if not present last 10 minutes are assumed -* `-t YYYY-MM-DD[ HH:MM]`, `--to YYYY-MM-DD[ HH:MM]` – run report up to date and time in `[YY]YY-MM-DD[ HH:MM]` format; if not present, reports results up to now -* `--period PERIOD` – time period; specify minutes with `m`, `h` - hours, days with `d`, and values: `today`, `yesterday`; `5m` - last 5 minutes, `4h` - last four hours, `2d` - last 2 days, as well as `today` -* `--by-fault ALIAS [ALIAS ...]` – show LVEs which failed on max processes limit or memory limit - - | | | | | - |-|-|-|-| - |ALIAS|ALIAS|ALIAS|DESCRIPTION| - |`mcpu`|`cpu`|`CPUf`|total number of max CPU usage faults| - |`mem`|`vmem`|`VMemF`|total number of out of virtual memory faults| - |`mep`|`ep`|`EPf`|total number of max entry processes faults| - |`pmem`|`pmem`|`PMemF`|total number of out of physical memory faults (LVE version >= 6)| - |`nproc`|`nproc`|`NprocF`|total number of max processes faults (LVE version >= 6)| - |`io`|`io`|`IOf`|total number of max io faults (LVE version >= 6)| - |`iops`|`iops`|`IOPSf`|total number of max io operations faults (LVE version >= 8)| - |`any_faults`|`any`|`anyF`|total number of faults of all types| -* `-r FAULTS, --threshold FAULTS` – in combination with `--by-fault`, shows only LVEs with number of faults above; default `1` - -Prefixes `Kb`, `Mb` and `Gb` indicates powers of 1024. - -:::tip Note -All ALIAS options are not case sensitive. -::: - -
- -#### lvechart - -
- -`/usr/sbin/lvechart` - creates a chart representing LVE usage for user. - -**Usage** - -
- -``` -/usr/sbin/lvechart [OPTIONS] -``` -
- -**Acceptable options** - -| | | -|-|-| -| `--help ` |This help screen| -| `--version` |Version number| -| `--from` |Run report from date and time in `YYYY-MM-DD HH:MM` format (if not present, last 10 minutes are assumed)| -| `--to=` |Run report up to date and time in `YYYY-MM-DD HH:MM` format (if not present, reports results up to now)| -| `--period=` |Time period: specify minutes with `m`, `h` - hours, days with `d`, and values: `today`, `yesterday`; `5m` - last 5 minutes, `4h` - last four hours, `2d` - last 2 days, as well as today| -| `--id= ` |`LVE id` will display record only for that LVE id| -| `--user=` |Use username instead of LVE id , and show only record for that user| -| `--server= ` |`Server id` will display record for that server, instead of default (current)| -| `--output= ` |Filename to save chart as, if not present, output will be sent to STDOUT| -| `--show-all` |Show all graphs (by default shows graphs for which limits are set)| -| `--style=` |`admin`, `user` set chart style, CPU limits are normalized to 100% in user’s style| -| `--format=` |`svg`, `png` set chart output format| - -
- -#### dbgovchart - -
- - -`/usr/sbin/dbgovchart` - creates a chart representing MySQL usage for user.` - -**Usage** - -
- -``` -/usr/sbin/dbgovchart [OPTIONS] -``` -
- -**Acceptable options** - -| | | -|-|-| -| `--help ` |This help screen| -| `--version` |Version number| -| `--from=` |Run report from date and time in `YYYY-MM-DD HH:MM` format (if not present, last 10 minutes are assumed)| -| `--to=` |Run report up to date and time in `YYYY-MM-DD HH:MM` format (if not present, reports results up to now)| -| `--period=` |Time period: specify minutes with `m`, `h` - hours, days with `d`, and values: `today`, `yesterday`; `5m` - last 5 minutes, `4h` - last four hours, `2d` - last 2 days, as well as today`| -| `--user=` |mysql username| -| `--output= ` |Filename to save chart as, if not present, output will be sent to STDOUT| -| `--show-all` |Show all graphs (by default shows graphs for which limits are set)| -| `--server=` | `Server id` will display record for that server, instead of default (current)| -| `--style=` | `admin`, `user` set chart style, CPU limits are normalized to 100% in user’s style| -| `--format=` | `svg`, `png` set chart output format| - -
- -#### lve-read-snapshot - -
- -**Usage** - -
- -``` -lve-read-snapshot [-h] [--version] [-f FROM [FROM ...]] [-t TO [TO ...] - [ -p PERIOD | --timestamp TIMESTAMP] - [-i ID | -u USER] [-l] [-o file] [-j] [--stats] - [--unit unit] -``` -
- -Reads LVE system state snapshots for LVE/user. - -**Optional arguments** - -* `-h, --help` – show this help message and exit -* `--version` – version number -* `-f FROM [FROM ...]`, `--from FROM [FROM ...]` – run report from date and time in `YYYY-MM-DD HH:MM` format, if not present last 10 minutes are assumed (default: `2016-10-24 19:28`) -* `-t TO [TO ...]`, `--to TO [TO ...]` – run report up to date and time in `YYYY-MM-DD HH:MM` format, if not present, reports results up to now (default: `2016-10-24 19:38`) -* `-p PERIOD`, `--period PERIOD` – time period specify minutes with `m`, `h` - hours, days with `d`, and values: `today`, `yesterday`, `5m` - last 5 minutes, `4h` - last four hours, `2d` - last 2 days, as well as today (default: `10m`) -* `--timestamp TIMESTAMP` – time stamp in unix format for get one snapshot (default: `None`) -* `-i ID, --id ID` – LVE id to show records for (default: `None`) -* `-u USER`, `--user USER` – user account to show records for (default: `None`) -* `-l`, `--list` – show timestamp list only (default: `False`) -* `-o file`, `--output file` – filename to save snaphots report to, if not present,output will be sent to STDOUT (default: `None`) -* `-j`, `--json` – output in json format (default: `False`) -* `--stats` – output stats, instead of snapshots (default: `False`) -* `--unit unit` – group stats by time unit. Example values `3h`, `24h`, `1d`, `1w`. Other possible value is `auto` for grouping by each incident (default: `1d`) - -One of `-u --user` or `-i --id` should be specified. - -
- -#### lve-create-db - -
- -**Usage** - -
- -``` -lve-create-db [-h] [--recreate] [--print-sql] - [--update-serverid-prompt] [--update-serverid-auto] - [--validate] -``` -
- -Creates a database for lve-stats. - -**Optional arguments** - -* `-h`, `--help` – show this help message and exit -* `--recreate` – drops and recreates database even if tables exists (default: `False`) -* `--print-sql` – prints sql and exits, without creating db (default: `False`) -* `--update-serverid-prompt` – update exist server ID or create new one (default: `False`) -* `--update-serverid-auto` – update exist server ID with uuid (default: `False`) -* `--validate` – check the correctness of the database structure (default: `False`) - -#### cloudlinux-top - -Utility provides information about current MySQL and LVE usage of a running system in JSON format. - -#### **Usage** - -
- -``` -cloudlinux_top [-h] [-v] [-j] [--hide-mysql] - [-u USERNAME | -r FOR_RESELLER] [-d DOMAIN] [-m MAX] - [-o ORDER_BY] -``` -
- -**Optional arguments** - -* `-h, --help` – show this help message and exit -* `-v, --version` – show program version number and exit -* `-j, --json` – return data in JSON format -* `--hide-mysql` | `don't show MySQL related info -* `-u USERNAME`, `--username USERNAME` – show data only for a specific user. Can be used to filter the output; returns users with username `%USERNAME%` -* `-r FOR_RESELLER`, `--for-reseller FOR_RESELLER` – get information only about specified reseller and his users -* `-d DOMAIN`, `--domain DOMAIN` – show data only for a specific domain. Can be used to filter the output; returns users with domain `%DOMAIN%` -* `-m MAX`, `--max MAX` – show up to `N` records. If `--max` key is omitted. By default will show top 25 users -* `-o ORDER_BY`, `--order-by ORDER_BY` – sort output by resource usage; available options: `cpu`, `mysql_cpu`, `io`, `mysql_io`, `iops`, `ep`, `nproc`, `pmem` - -#### **Output format** - -
- -``` -{ - "mySqlGov": "enabled", # possible values: enabled, error - "mySqlGovMode": "abusers", # see “MySQL Governor > Modes Of Operation” - # if MySQL Governor is not enabled, value is "none" - - "resellers": [ # list of resellers (available only with - # reseller limits feature) - { - "id": 1000020005, # internal record id - "limit": , # current limits (last 5 seconds) - "name": "reseller_name", # reseller’s login in control panel - "usage": # current usage (last 5 seconds) - } - ], - "result": "success", # see the ‘errors handling’ section - "timestamp": 1522858537.337549, - "users": [ - { - "domain": "domain.com", # user’s primary domain (from control panel) - "id": 20005, # lve_id, same as user id in /etc/passwd file - "limit": , # limits for last 5 seconds - "reseller": "reseler1", # user’s reseller (from control panel) - "usage": , # usage for last 5 seconds - "username": "user" # username from /etc/passwd file or “N/A” if user - # with such id does not exist - } - ] - } -``` -
- -The structure * of ``: - -
- -``` -{ -"cpu": { - "all": 50.0, # CPU usage or limit (LVE only) - "mysql": 0.0* # CPU usage or limit (MySQL Governor only) -}, -"ep": 1.0, # number of entry processes -"io": { - "all": 0.0, # IO usage or limit (LVE only) - "mysql": 0.0** # IO usage or limit (MySQL Governor only) -}, -"iops": 0.0, # IO operations per second -"mem": 258048, # memory usage or limit -"pno": 1.0 # number of processes -} -``` -
- - -:::tip Note -* you can modify this structure using `--show` option, see [usage examples](/command-line_tools/#examples) for details. -* MySQL values are only present when MySQL Governor statistics is available and `--hide-mysql` options is not used. -::: - -#### **Units of measurement** - -For `limits` and `usage` sections we use the following units of measurement. - -| | | -|-|-| -|**Value** | **Units of measurement**| -| cpu (lve and mysql) | percentage of one CPU core| -| io (lve and mysql) | bytes per second| -| iops | number of IO operations per second| -| mem | bytes| -| ep | number of entry processes| -| pno | number of processes| - - -#### **Errors handling** - -The format of the error message is the same as in the other `cloudlinux- *` utilities. When everything is ok, the `result` value is `success`. Otherwise, it contains error message. In case of unexpected errors, the output will be as follows. - -
- -``` -# cloudlinux-top --json -{ - "context": { - "error_text": "Very bad error" - }, - "result": "An error occured: \"%(error_text)s\"", - "timestamp": 1523871939.639394 -} -``` -
- - -#### **Examples** - - -* get 100 users ordered by CPU usage - -
- - ``` - # cloudlinux-top --json --order-by cpu --max=100 - ``` -
- -* get information about one user - -
- - ``` - # cloudlinux-top --json -u username - ``` -
- -* get information about reseller and his users - -
- - ``` - # cloudlinux-top --json --for-reseller=reseller_name - ``` -
- -* show only IO limits and usage - -
- - ``` - # cloudlinux-top --json --show=io - ``` -
- -
- -#### cloudlinux-statistics - -
- -cloudlinux-statistics is a CLI utility that provides historical information about resource usage. - -#### **Usage** - -
- -``` -cloudlinux-statistics [-h] [-j] [-v] [--by-usage BY_USAGE] - [--percentage 0..100] [--by-fault BY_FAULT] - [--threshold THRESHOLD] [--server_id SERVER_ID] - [-f FROM] [-t TO] [--period PERIOD] - [--limit LIMIT] - [--show COLUMN_NAME [COLUMN_NAME ...]] - [-o ORDER_BY] [--id ID] [--time-unit TIME_UNIT] - [-r FOR_RESELLER] -``` -
- -**Optional arguments** - -* `-h`, `--help` – show this help message and exit -* `-j`, `--json` – return data in JSON format -* `-v`, `--version` – show program version number and exit -* `--server_id SERVER_ID`, `--server-id SERVER_ID` – can be used with the central database for multiple servers; default `...` -* `--limit LIMIT` – limit the number of results to display, `0` is unlimited -* `--show COLUMN_NAME [COLUMN_NAME ...]` – show only listed columns; `all` for all supported columns (fields) - | | | - |-|-| - |Key|Fields to show| - |`all`|all available fields| - |`cpu`|CPU field| - |`io`|IO field| - |`iops`|IOPS field| - |`ep`|entry processes (concurrent connections) field| - |`nproc`|number of processes field| - |`pmem`|physical memory field| - |`vmem`|virtual memory field| - |`mysql`|`mysql_cpu` & `mysql_io` field| - -* `-o ORDER_BY`, `--order-by ORDER_BY` – order results by one of the following keys (fields): - | | | - |-|-| - |FIELD|DESCRIPTION| - |`any_faults`|total number of faults of all types| - |`cpu`|average CPU usage`| - |`mysql_cpu`|average MySQL CPU usage`| - |`io`|average IO usage`| - |`mysql_io`|average MySQL IO usage`| - |`iops`|average IO operations; (LVE version >= 8)`| - |`ep`|average number of entry processes (concurrent connections)`| - |`nproc`|average number of processes`| - |`pmem`|average physical memory usage`| - |`vmem`|average virtual memory usage`| - |`cpu_faults`|total number of CPU usage faults`| - |`io_faults`|total number of max IO faults`| - |`iops_fault`|total number of max IO operations faults; (LVE version >= 8)`| - |`ep_faults`|total number of max entry processes faults`| - |`nproc_faults`|total number of max processes faults`| - |`pmem_faults`|total number of out of physical memory faults`| - |`vmem_faults`|total number of out of virtual memory faults`| - -* `-r FOR_RESELLER`, `--for-reseller FOR_RESELLER` – show statistics only for given reseller and his users - -Filter items by resource usage. - -* `--by-usage BY_USAGE` – show LVEs with usage (averaged) within 90 percent of the limit available values - | | | - |-|-| - |FIELD|DESCRIPTION| - |`cpu`|average CPU usage| - |`mysql_cpu`|average MySQL CPU usage| - |`io`|average IO usage| - |`mysql_io`|average MySQL IO usage| - |`iops`|average IO operations; (LVE version >= 8)| - |`ep`|average number of entry processes (concurrent connections)| - |`nproc`|average number of processes| - |`pmem`|average physical memory usage| - |`vmem`|average virtual memory usage| - -* `-percentage 0..100` – define percentage for `--by-usage` option; default `90` - -Filter items by the number of faults. - -* `--by-fault BY_FAULT` – show only accounts that have some faults for the given limit - | | | - |-|-| - |FIELD|DESCRIPTION| - |`any`|faults of all types| - |`cpu`|CPU usage faults| - |`io`|max IO usage faults| - |`iops`|max IO operations faults; (LVE version >= 8)| - |`ep`|max entry processes faults| - |`nproc`|max processes faults| - |`pmem`|out of physical memory faults| - |`vmem`|out of virtual memory faults| - -* `--threshold THRESHOLD` – in combination with `--by-fault` shows only accounts with the number of faults more than given; default `1` - -Filter items by a time interval. - -Allows to get information for the given period of time; you can either set `--from` and `--to` options, or just get information for the recent time period using `--period option`. - -:::tip Note -`--from` and `--to` values are ignored when `--period` is set. -::: - -* `-f FROM`, `--from FROM` – run report from date and time in `[YY]YY-MM-DD[ HH:MM]` format; if not present, last 10 minutes are assumed -* `-t TO`, `--to TO` – run report up to date and time in `[YY]YY-MM-DD[ HH:MM]` format; if not present, reports results up to now -* `--period PERIOD` – time period; specify minutes with `m`, hours with `h`, days with `d`, and values: `today`, `yesterday`; `5m` - last 5 minutes, `4h` - last four hours, `2d` - last 2 days, and `today` - -Get detailed statistics. - -* `--id ID` – get detailed statistics for database record with the given id -* `--time-unit TIME_UNIT` – group statistics using the given time; 1 minute by default. For example: `1h` or `1h30m` or `dynamic`; available only in pair with `--id` - - -#### **Output format** - -There are two different JSON formats used for **summary statistics** and **detailed statistics**. - -**Summary statistics** - -
- -``` -# cloudlinux-statistics --json - { - "resellers": [ - { - "usage": , - "faults": , - "name": "reseller", - "limits": , - "id": 1000020005 - } - ], - "timestamp": 1522920637, - "mySqlGov": "enabled", # possible values: ”enabled”, “error” - "result": "success", - "users": [ - { - "username": "username", - "domain": "example.com", - "reseller": "reseller", - "limits": , - "faults": , - "usage": , - "id": 20005 - } - ] - } -``` -
- -**Detailed statistics** - -
- -``` -# cloudlinux-statistics --json --id=20001 - { - "timestamp": 1523011550, - "mySqlGov": "enabled", # possible values: ”enabled”, “error” - "result": "success", - "user": [ - { - "usage": , - "faults": , - "from": 1523011144, - "limits": , - "to": 1523011143 - }, - ... - { - "usage": , - "faults": , - "from": 1523011204, - "limits": , - "to": 1523011203 - } - ] - } -``` -
- -For both, **summary statistics** and **detailed statistics**, `` is the same and looks like following *. - -
- -``` -{ - "ep": { - "lve": 1 # number of entry processes - }, - "vmem": { - "lve": 2428928 # virtual memory usage or limit (deprecated) - }, - "iops": { - "lve": 0 # io operations per second - }, - "io": { - "lve": 0.0, # io usage or limit (lve only) - "mysql": 0.0** # io usage or limit (mysql only) - }, - "nproc": { - "lve": 1 # number of processes in lve - }, - "cpu": { - "lve": 25.6, # cpu usage (lve only) - "mysql": 0.0* # cpu usage (mysql governor only) - }, - "pmem": { - "lve": 360448 # physical memory usage or limit - } - } -``` -
- -:::tip Note -* you can specify only required fields using `--show` option; -* `mysql` fields are only available with [MySQL Governor](/cloudlinux_os_components/#installation-and-update-3) installed. -::: - -#### **Units of measurement** - -For `limits` and `usage` sections we use the following units of measurement. - -| | | -|-|-| -|Value|Units of measurement| -|`cpu` (LVE and MySQL) | percentage of one CPU core| -|`io` (LVE and MySQL) | bytes per second| -|`iops` | number of IO operations per second| -|`pmem` and `vmem` | bytes| -|`ep` | number of entry processes| -|`nproc` | number of processes in LVE| - -#### **Errors handling** - -The format of the error message is the same as in the other `cloudlinux- *` utilities. When everything is ok, the `result` value is `success`. Otherwise, it contains error message. - -
- -``` -# cloudlinux-statistics --json -{ - "context": { - "error_text": "Very bad error" - }, - "result": "An error occured: \"%(error_text)s\"", - "timestamp": 1523871939.639394 -} -``` -
- -#### **Examples** - - -* get top 10 users ordered by CPU usage for today - -
- -``` -# cloudlinux-statistics --json --order-by=cpu --period=today --limit=10 -``` -
- -* get users that hit IO limit more than 10 times for today - -
- -``` -# cloudlinux-statistics --json --period=today --by-fault=io --threshold=10 -``` -
- -* get users that used more than 80% of CPU in last 24 hours - -
- -``` -# cloudlinux-statistics --json --by-usage=cpu --percentage=80 --period=24h -``` -
- -* get information only about reseller and his users - -
- -``` -# cloudlinux-statistics --json --for-reseller=reseller_name -``` -
- -* get information only about CPU and IO usage - -
- -``` -# cloudlinux-statistics --json --show=cpu,io -``` -
- - -## MySQL Governor - -* [dbtop](/command-line_tools/#dbtop) -* [dbctl](/command-line_tools/#dbctl) -* [lveinfo --dbgov](/command-line_tools/#lveinfo-dbgov) -* [dbgovchart](/command-line_tools/#dbgovchart-2) - -* `dbtop` monitors MySQL usage on per user bases. -* `dbctl` is a command line tool to manage DB Governor configuration. -* `lveinfo --dbgov` provides historical information about usage and customer restrictions. -* `dbgovchart` generates charts for MySQL usage. - - -#### dbtop - -Utility to monitor MySQL usage. Requires `db_governor` to be running. It shows usage for the current, mid and long intervals. - -**Options:** - -| | | -|-|-| -| -c |show one time user list (no interactive mode) | -| -r interval |refresh interval for interactive mode (in seconds)| - -**Control keys** - -| | | -|-|-| -| z |toggle color mode and two-color mode | -| q | F10, Ctrl-c - quit program | -| u |sort table by username | -| c |sort table by cpu column | -| r |sort table by read column | -| w |sort table by write column | -| l |sort by restriction level | -| t |sort by time before restrictions will be lifted.| - -Control keys, that sort table, displays into header of table bold and underlined symbol. -Sorted field will be highlighted by *. - CAUSE field shows current stage, reason for restriction and number of seconds before restriction will be lifted: -Values of column ' CAUSE ' - cause of restriction or freezing: -Possible stages: -* `-` OK -* `1` - Restriction 1 -* `2` - Restriction 2 -* `3` - Restriction 3 -* `4` - Restriction level 4 - -| | | -|-|-| -| c - current |(current value of parameter)| -| s - short |(average value of 5 last values of parameter)| -| m - middle |(average value of 15 last values of parameter)| -| l - long |(average value of 30 last values of parameter)| -| |and parameter which is cause of restriction| -| 1/s:busy_time/12 | first level restricted account with short average restriction by busy_time with 12 seconds left before re-enabled.| - -**Display fields:** - -* cpu - number in %, shows cpu usage by user - * read - number of bytes (kbytes, mbytes, gbytes) which user reads per second - * write - number of bytes (kbytes, mbytes, gbytes) write user reads per second - - -Accounts highlighted in _red_ color means that the account is restricted. -Accounts highlighted in _blue_ color are in cool down period - -Command line parameters of dbtop utility: - -r - dbtop refresh period in seconds ( dbtop -r12 ) - -#### dbctl - - -usage: dbctl command [parameter] [options] - -**Commands:** - -| | | -|-|-| -| set |set parameters for a db_governor | -| list |list users & their limits. It will list all users who had been active since Governor restart, as well as those for who explicit limits were set| -| list-restricted |list restricted customers, with their limits, restriction reason, and time period they will still be restricted| -| ignore |ignore particular user| -| watch |start observing particular user again| -| delete |remove limits for user/use defaults| -| restrict |restrict user using lowest level (or if --level specified, using the specified level)| -| unrestrict |unrestrict username (configuration file remains unchanged)| -| unrestrict-all |unrestrict all restricted users (configuration file remains unchanged)| -| --help |show this message| -| --version |version number| -| --lve-mode |set DB Governor mode of operation. Available values: off/abusers/all/single/on | -| | off - monitor only, don't throttle| -| | abusers - when user reaches the limit, put user's queries into LVE for that user (experimental)| -| | all - user's queries always run inside LVE for that user (experimental)| -| | single - single LVE for all abusers.| -| | on - same as single (deprecated)| - -**Parameters** - -| | | -|-|-| -| default |set default parameter| -| usrename |set parameter for user| - -**Options** - -| | | -|-|-| -| --cpu=N |limit CPU (pct) usage| -| --read=N |limit READ (MB/s) usage| -| --write=N |limit WRITE (MB/s) usage| -| --level=N |level (1,2,3 or 4) specified (deprecated) - this option is available only for period mode:| - - (see [Configuration](/cloudlinux_os_components/#configuration-and-operation)) - -The default mode is " limit " - when a user hits limits, the account will be marked as restricted and if the user does not hit the limit again during " unlimit=1m " account will be unrestricted. This mode doesn't have any additional levels/penalties. - - -Changing the "unlimit" can be done only via the configuration file (see [Configuration](/cloudlinux_os_components/#configuration-and-operation)). - - --slow=N: limit time (in seconds) for long running SELECT queries - -Options for parameter `list`: - -| | | -|-|-| -| `--kb` |show limits in Kbytes no pretty print| -| `--bb` |show limits in bytes no pretty print| -| `--mb` |show limits in Mbytes no pretty print| - -Examples: -
- -``` -$ dbctl set test2 --cpu=150,100,70,50 --read=2048,1500,1000,800 -``` -
- -sets individual limits for cpu (current, short, middle period) and read (current, short, middle, long periods) for user test2 -
- -``` -$ dbctl set default --cpu=70,60,50,40 -``` -
- -changes default cpu limits. - -All new limits will be applied immediately - -To unrestrict user: -
- -``` -$ dbctl unrestrict username -``` -
- -To unrestrict all users: -
- -``` -$ dbctl unrestrict-all -``` -
- -To restrict user: -
- -``` -$ dbctl restrict dbgov -``` -
- -To restrict user to level 2 restriction: -
- -``` -$ dbctl restrict dbgov --level=2 -``` -
- -To make Governor to ignore user: -
- -``` -$ dbctl ignore username -``` -
- -Delete user's limits, and use defaults instead: -
- -``` -$ dbctl delete username -``` -
- -Show limits as bytes: -
- -``` -$dbctl list --bb -``` -
- -#### lveinfo --dbgov - -
- -``` -$ lveinfo --dbgov --help -``` -
- -Displays information about DB Governor historical usage - -**Usage**: - -
- -``` -lveinfo [OPTIONS] -``` -
- -**Optional arguments**: - -| | | -|-|-| -|`-h`, `--help`|show this help message and exit| -|`-u USER`, `--user USER`|system user name| -|`--id ID`|user id| -|`-l LIMIT`, `--limit LIMIT`|max number of results to display, if 0 – no limit| -|`--by-usage ALIAS [ALIAS ...]`|show LVEs with usage (averaged) within 90 percent of the limit;
available values:
`COLUMN_NAME`–`ALIAS`–DESCRIPTION
`cpu`–`CPU`–`average CPU usage`
`io`–`IO`–`average IO usage`| -|`-p 0..100`, `--percentage 0..100`|defines percentage for the `--by-usage` option; default is 90| -|`-o ALIAS`, `--order-by ALIAS`|orders results by one of the following:
`ALIAS` – DESCRIPTION
`con` – average connections (deprecated)
`cpu` – average CPU usage
`read` – average READ usage
`write` – average WRITE usage
`io` – average READ+WRITE usage| -|`-b ALIAS [ALIAS ...]`, `--format ALIAS [ALIAS ...]`|show only specific fields into output:
COLUMN_NAME – `ALIAS` – DESCRIPTION
`ts``TS` – timestamp records
`username``USER` – user name
`id``ID`user id
`cpu``CPU` – average CPU usage
`read``READ` – average READ usage
`write``WRITE` – average WRITE usage
`con``CON` – average connections (deprecated)
`lcpu``lCPU` – CPU limit
`lread``lREAD` – READ limit
`lwrite``lWRITE` – WRITE limit
`-``RESTRICT``C` - CPU restrict, `R` - read restrict, `W` - write restrict | -|`--show-all`|full output (show all limits); brief output is default| -|`--server_id SERVER_ID`, `--server-id SERVER_ID`|used with central database for multiple servers, default is `2d823047-a`| -|`--time-unit TIME_UNIT`|time step for grouping statistic in minutes; 1 min. by default; can use `m`,`h`,`d` suffixes or can use `dyn[amic]` for using in the `v1` mode; for example: `1h` or `1h30m` or `1d12h`| -|`-c [PATH]`, `--csv [PATH]`|save statistics in CSV format; `-` by default (output to screen)| -|`-j`, `--json`|display output in JSON format| -|`-f FROM`, `--from FROM`|run report from date and time in the `[YY]YY-MM-DD[ HH:MM]` format; if not present, the last 10 minutes are assumed| -|`-t TO`, `--to TO`|run a report up to date and time in the `[YY]YY-MM-DD[ HH:MM]` format; if not present, reports results up to now| -|`--period PERIOD`|time period; specify minutes with `m`, hours with `h`, days with `d` and values: `today`, `yesterday`; `5m` - last 5 minutes, `4h` - last four hours, `2d` - last 2 days, as well as `today`| - - -#### dbgovchart - - - dbgovchart is analog of lvechart tool to create charts representing customer's to MySQL usage - -Usage: `/usr/sbin/dbgovchart [OPTIONS]` - -Acceptable options are: -
- -``` ---help This help screen ---version Version number ---from= Run report from date and time in YYYY-MM-DD HH:MM format - if not present last 10 minutes are assumed ---to= Run report up to date and time in YYYY-MM-DD HH:MM format - if not present, reports results up to now ---period= Time period - specify minutes with m, h - hours, days with d, and values: - today, yesterday - 5m - last 5 minutes, 4h - last four hours, 2d - last 2 days, - as well as today ---user= mysql username ---output= Filename to save chart as, if not present, output will be sent to STDOUT ---show-all Show all graphs (by default shows graphs for which limits are set) -``` -
- -Charts examples: - -![](/images/1111_2.png) - - -## PHP Selector - -* [selectorctl](/command-line_tools/#selectorctl) - -| | | -|-|-| -| /usr/bin/alt-php-mysql-reconfigure.py | Reconfigures alt-php extensions to use correct MySQL library, based on the one installed in the system.| - -#### selectorctl - -`selectorctl` is a new tool that replaces `cl-selector` (which is deprecated and should not be used anymore) and `piniset`. It is available starting with **CageFS 5.1.3**. - -All new features will be implemented as part of `selectorctl`. - -**Common options** - -| | | -|-|-| -| --interpreter (-i) : | chooses the interpreter to work with. Currently only PHP is supported. If omitted, --interpreter=php is implied.| -| --version (-v) : | specifies alternatives version to work with| -| --user (-u) : | specifies user to take action upon.| -| --show-native-version (-V) : | prints the version of native interpreter| - -**Global options** - -The global options modify settings in /etc/cl.selector/defaults.cfg file. - -| | | -|-|-| -| --list (-l) : | lists all available alternatives for an interpreter. For instance on server with Alt-PHP installed, it produces the following output. Columns are: short alternative version, full alternative version and path to php-cgi binary. | -| | $ selectorctl --list
5.2 5.2.17 /opt/alt/php52/usr/bin/php-cgi
5.3 5.3.28 /opt/alt/php53/usr/bin/php-cgi
5.4 5.4.23 /opt/alt/php54/usr/bin/php-cgi
5.5 5.5.7 /opt/alt/php55/usr/bin/php-cgi
| -| --summary (-S) : | prints alternatives state summary. Output format: alternative version, state ('e' for 'enabled', '-' otherwise), chosen as default one or not ('d' for 'default', '-' otherwise). For example:| -| | $ selectorctl --summary
5.2 e -
5.3 e -
5.4 e -
5.5 e -
native e d
| -| |if used with `--show-native-version` displays version for native interpreter:| -| | $ selectorctl --summary --show-native-version
5.2 e -
5.3 e -
5.4 e -
5.5 e -
native(5.3) e d
| -| --current (-C) : | prints currently globally selected default version (it is stored in _/etc/cl.selector/defaults.cfg_ file):| -| | $ selectorctl --current
native native /usr/bin/php
| -| |If used with `--show-native-version` , native interpreter version is displayed as well:| -| | --current --show-native-version
native(5.3) native(5.3.19) /usr/bin/php
| -| --set-current (-B): | sets specified version as globally default one (in _/etc/cl.selector/defaults.cfg_ file). For example, to set current default version of PHP to 5.4, use:| -| | $ selectorctl --set-current=5.4 | -| --disable-alternative (-N): | adds state=disabled option to alternative section. With it a corresponding alternative gets removed from user alternatives selection list. For instance to disable PHP 5.2, run:| -| | $ selectorctl --disable-alternative=5.2 | -| --enable-alternative (-Y): | Enables alternative version, removes state=disabled option, if present, from alternative section. For example to enable PHP 5.2:| -| | $ selectorctl --enable-alternative=5.2 | -| --enable-extensions (-E): | enables extensions for particular PHP version by adding comma-separated list of extensions of modules for alternative in _/etc/cl.selector/defaults.cfg_ . Requires --version option. For example:| -| | $ selectorctl --enable-extensions=pdo,phar --version=5.2 | -| --disable-extensions (-D): | removes extensions for a particular PHP version. Comma-separated list of extensions will be removed from /etc/cl.selector/defaults.cfg . Requires --version . Example:| -| | $ selectorctl --disable-extensions=pdo,phar --version=5.2 | -| --replace-extensions (-R): | replaces all extensions for particular PHP version to the list of comma separated extensions. Requires `--version` option . Example:| -| | $ selectorctl --replace-extensions=pdo,phar --version=5.2 | -| --list-extensions (-G): | lists extensions for an alternative for a particular version. Requires --version . Example:| -| | $ selectorctl --list-extensions --version=5.3
~ xml
- xmlreader
- xmlrpc
- xmlwriter
- xrange
+ xsl
| -| |Plus sign (+) stands for 'enabled', minus (–) for 'disabled', tilde (~) means compiled into interpreter or enabled in php global config file _/opt/alt/phpXX/etc/php.ini_. Enabled and disabled state relates to presence in _/etc/cl.selector/defaults.cfg_ file.| - -**End user options** - -All end user settings are contained in individual user's alt_php.ini files and controlled using selectorctl command. - -| | | -|-|-| -| --user-summary (-s): | prints user alternatives state summary. Example:| -| | $ selectorctl --user-summary --user=user1
5.2 e - -
5.3 e - -
5.4 e - -
5.5 e - -
native e d s
| -| |Columns are: alternative version, state ('e' for 'enabled', '-' otherwise), chosen as default one or not('d' for 'default', '-' otherwise), selected as user default one or not ('s' for 'selected', '-' otherwise). If used with `--show-native-version` , version for native interpreter is shown in parenthesis:| -| | $ selectorctl --user-summary --user=user1 --show-native-version
5.2 e - -
5.3 e - -
5.4 e - -
5.5 e - -
native(5.3) e d s
| -| | `--user` option is required. | -| --current (-c): | prints currently globally selected default version (in _/etc/cl.selector/defaults.cfg_ file):| -| | $ selectorctl --current
5.3 5.3.28 /opt/alt/php53/usr/bin/php-cgi
| -| |If used with `--show-native-version` to display native version:| -| | $ selectorctl --user-current --user=user1
5.3 5.3.28 /opt/alt/php53/usr/bin/php-cgi
| -| | `--user` option is required.| -| --set-user-current (-b): | sets specified version as the one to use for this end user:| -| | $ selectorctl --set-user-current=5.4 --user=user1 | -| |changes user symlinks for the PHP interpreter to point to alternative 5.4.| -| | --user option is required.| -| --enable-user-extensions (-e): | Enables comma-separated list of extensions for the user user. Information is saved to _alt_php.ini_ file. Requires `--version` and `--user` options.| -| | $ selectorctl --enable-user-extensions=pdo,phar --version=5.2 --user=user1 | -| --disable-user-extensions (-d): | Disables extensions provided as comma-separated list. Requires `--version` and `--user` options.| -| | $ selectorctl --disable-user-extensions=pdo,phar --version=5.2 --user=user1 | -|--for-all-users: | Allows to enable/disable extensions for all users with the required PHP version. Works only with `--enable-user-extensions` or `--disable-user-extensions` option.| -| |`$ selectorctl --enable-user-extensions=gd --version=5.3 --for-all-users`

`$ selectorctl --disable-user-extensions=gd --version=5.3 --for-all-users`| -| --replace-user-extensions (-r): | Replaces extensions with a provided comma-separated list of extensions Requires `--version` and `--user` options:| -| | $ selectorctl --replace-user-extensions=pdo,phar --version=5.2 --user=user1 | -| --reset-user-extensions (-t): | Resets extensions for end user to default list of extensions as defined in default.cfg . Requires `--version` and `--user` options.| -| | $ selectorctl --reset-user-extensions --version=5.2 --user=user1 | -| --list-user-extensions (-g): | lists enabled user extensions for an alternative. Requires `--version` and `--user` options.| -| | $ selectorctl --list-user-extensions --version=5.3 --user=user1
xml
xmlreader
xmlrpc
| -| |if `--all` option present, command will list all alternatives extensions marked enabled or disabled for given user. For example:| -| | $ selectorctl --list-user-extensions --version=5.3 --user=user1 --all
- xmlreader
- xmlrpc
- xmlwriter
- xrange
+ xsl
| -| |Plus sign (+) stands for 'enabled', minus (–) stands for 'disabled'. Enabled and disabled state relates to presence or absence of corresponding extensions in user _alt_php.ini_ file.| -| --add-options (-k): | adds options (as in _php.ini_ ) to user _alt_php.ini_ file. For example:| -| | $ selectorctl --add-options=log_errors:on,display_errors:on --version=5.2 --user=user1 -| |adds `log_error` and `display_errors` options with values 'on' to user _alt_php.ini_ file overwriting default values for a user. Requires `--version` and `--user` options.| -| --replace-options (-m): | replaces all options in user _alt_php.ini_ file with specified ones. Requires `--version` and `--user` options.| -| | $ selectorctl --replace-options=log_errors:on,display_errors:on --version=5.2 --user=user1 | -| --delete-options (-x): | removes custom options from user _alt_php.ini_ file. Requires `--version` and `--user` options.| -| | $ selectorctl --delete-options=log_errors,display_errors --version=5.2 --user=user1 | -| --print-options (-P): | print options from _/etc/cl.selector/php.conf_ file with default values or ones overwritten in user's _alt_php.ini_ file.| -| | $ selectorctl --print-options --version=5.2 --user=user1
TITLE:allow_url_fopen
DEFAULT:On
COMMENT:Allows PHP file functions to retrieve data from remote
locations over FTP or HTTP. This option is a great security risk,
thus do not turn it on without necessity.
TYPE:bool
...
| -| |Requires `--user` option. `--version` option is optional. When `--version` is omitted, options for current selected version will be printed. By default outputs as plain test. If `--json` , `--csv` , `--perl` is specified, outputs data in corresponding format. For example, with `--perl` option, the output is perl hash structure that can be evaluated. | -| --reset-options (-z): | removes custom options from _alt_php.ini_ files for ALL users and versions. Backup files in home folders are cleared.| -| | $ selectorctl --reset-options | -| |The ranges of affected customers or versions can be narrowed with `--version` or `--user` options :| -| | $ selectorctl --reset-options --user=user1,user2 --version=5.3,5.4 | -| --list-users (-L): | list users that use particular version of interpreter, specified with `--version` option. For example, to see all users that use PHP version 5.3:| -| | $ selectorctl --list-users --version=5.3 | -| --change-to-version (-T): | changes all (or particular user) from one interpreter version to another.| -| | $ selectorctl --change-to-version=5.2 --version=5.3 | - -**Additional options** - -| | | -|-|-| -| --base64 (-Q) | Sometimes PHP options values can contain commas and other symbols that break command line formatting. In such a case convert a key:value pair into base64 and pass it as value for option-related arguments. For example, to add disable_functions=exec,popen,system and display_errors=on to user options, do the following:| -| | $ selectorctl --add-options=`echo disable_functions:exec,popen,system|base64 -w 0`,`echo display_errors:on|base64 -w 0` --version=5.2 --user=user1 --base64 | -| |Option `-w 0` of base64 executable stands for 'disable wrapping of lines' . Without it base64 output will break the command. | -| --quiet | makes selectorctl continue when it encounter option not found in _php.conf_ . Without it selectorctl exits with error.| - - -## Python Selector - -### New Python Selector - -* [Hoster](/command-line_tools/#hoster) -* [Examples](/command-line_tools/#examples-3) -* [Examples](/command-line_tools/#examples-4) -* [End user](/command-line_tools/#end-user) - -:::warning Warning! -selectorctl command line tool is not supported in the new Python Selector. You can use cloudlinux-selector command line tool instead. -::: - -Below, there is a list of commands hoster and end user can run in a command line. - -#### Hoster - -:::tip Note -When running user command as root, please use `--user` option. -::: - -* Get all Python-related information: default version, a list of supported versions, status of Python Selector, a list of users, their applications, etc: - -
- - ``` - cloudlinux-selector [get] [--json] --interpreter python - ``` -
- - JSON output for `get` command: - -
- -``` -{ - "selector_enabled": true | false, - "default_version": "2.7.15", - "result": "success", - "timestamp": 1508667174.220027, - “cache_status”: “ready”, // or “updating” during automatic yum cache rebuild - "available_versions": { // begin of “versions” - "2.7.15" : { // begin of version "2.7.15" - "status": "enabled", // enabled, disabled, not_installed, installing, removing, locked - “base_dir”: “/opt/alt/alt-python27” // empty when version is not installed - “users”: { // begin of “users” - “user1”: { // begin of “user1” - “homedir”: “/home/user1”, - “applications”: { // begin of “applications” - “apps_dir/app1” : { // begin of application “apps_dir/app1” - “domain”: “cltest1.com”, - “app_uri”: “apps/my-app1”, - “startup_file” : “run.py”, - “entry_point” : “app”, - “app_status” : “started”, // ‘started’ or ‘stopped’ - “config_files” : [ - “requirements.txt”, - “requirements-migration.txt” - ], - “env_vars” : { - “var1” : “value1”, - “var2” : “value2” - }, - }, // end of application “apps_dir/app1” - “apps_dir/app2” : { // begin of application “apps_dir/app2” - << data for application “apps_dir/app2” (same structure as for application “apps_dir/app1” above) >> - }, // end of application “apps_dir/app2” - }, // end of “applications” - }, // end of “user1” - “user2”: { // begin of “user2” - << data for user “user2” (same structure as for “user1” above) >> - }, // end of “user2” - }, // end of “users” - }, // end of version “2.7.15” - "8.21.5" : { // begin of version "3.3.7" - << data for version "3.3.7" (same structure as for version “2.7.15” above) >> - }, // end of version “3.3.7” - }, // end of “versions” -} // end of json -``` -
- -* Set default version, supported versions, and status of Python Selector: - -
- - ``` - cloudlinux-selector set [--json] --interpreter python (--selector-status | --default-version | --supported-versions ) - ``` -
- -#### *Examples* - -1. Enable Python Selector: - -
- - ``` - cloudlinux-selector set --json --interpreter python --selector-status enabled - ``` -
-2. Set default Python Selector version as 3.3: - -
- - ``` - cloudlinux-selector set --json --interpreter python --default-version 3.3 - ``` -
- -3. Set supported Python Selector version as 3.3: - -
- - ``` - cloudlinux-selector set --json --interpreter python --supported-versions='{"2.7": false, "3.3": true}' - ``` -
- -4. Install a specific Python version: - -
- - ``` - cloudlinux-selector install-version --json --interpreter python --version 2.7 - ``` -
- -5. Uninstall a specific Python version: - -
- - ``` - cloudlinux-selector uninstall-version --json --interpreter python --version 2.7 - ``` -
- -6. Enable a specific Python version: - -
- - ``` - cloudlinux-selector enable-version --json --interpreter python --version 2.7 - ``` -
- -7. Disable a specific Python version: - -
- - ``` - cloudlinux-selector disable-version --json --interpreter python --version 2.7 - ``` -
- -* Change version for an application: - * For a specific application: - -
- - ``` - cloudlinux-selector set [--json] --interpreter python --user --app-root --new-version - ``` -
- - * For all applications that use specific Python version: - -
- - ``` - cloudlinux-selector change-version-multiple --json --interpreter python --from-version --new-version - ``` -
- - * For multiple applications: - -
- - ``` - cloudlinux-selector change-version-multiple --json --interpreter python --data --new-version - ``` -
- - -#### *Examples* - -1. Change version for a specific application: - -
- - ``` - cloudlinux-selector set --json --interpreter python --user user1 --app-root apps_dir/app1 --new-version 2.7 - ``` -
- -2. Change version for all applications that use version 2.7.15 to version 3.3.5: - -
- - ``` - cloudlinux-selector change-version-multiple --json --interpreter python --from-version 2.7 --new-version 3.3 - ``` -
- -3. Change version of multiple application(s) and/or multiple users: - -
- - ``` - cloudlinux-selector change-version-multiple --json --interpreter python --data --new-version - ``` -
- -**Example** - -
- -``` -cloudlinux-selector change-version-multiple --json --interpreter python --data [ {“user”: “user1”, “app_root”: “apps/app1”}, {“user”: “user2”, “app_root”: “apps/app1”} ] --new-version 2.7 -``` -
- -Common output for all `set` commands: - -**in case of success:** - -
- -``` -{ - "result": "success", - "timestamp": 1508666792.863358 -} -``` -
- -**in case of error:** - -
- -``` -{ - "result": "Some error message", - "details" : "Traceback: ..." , - "context": {}, - "timestamp": 1508666792.863358 -} -``` -
- -**in case of warning:** - -
- -``` -{ - "result": "success", - "warning" : "Some warning message" , - "context": {}, - "timestamp": 1508666792.863358 -} -``` -
- -#### End user - -:::tip Note -To start all users CLI commands use `cagefs_enter` command: - -
- -``` -/bin/cagefs_enter.proxied /usr/sbin/cloudlinux-selector --json -``` -
-::: - -* Get config file for the user application: - -
- - ``` - cloudlinux-selector read-config [--json] --interpreter python [--user | --domain ] --app-root --config-file - ``` -
- - **JSON output:** - -
- - ``` - { - "result": "success", - "timestamp": 1508666792.863358 - “data”: “content of config file as Base64 encoded string” - } - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector read-config --json --interpreter python --user user1 --app-root app_dir/app1 --config-file requirements.txt - ``` -
- -* Save config file for user application: - -
- - ``` - cloudlinux-selector save-config [--json] --interpreter python [--user | --domain ] --app-root --config-file --content - ``` -
- - **JSON output** (the same as for all `set` commands): - -
- - ``` - { - "result": "success", - "timestamp": 1508666792.863358 - } - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector save-config --json --interpreter python --user user1 --app-root app_dir/app1 --config-file requirements.txt --content VGh1ICAyIE5vdiAxMDo0MzoxMiBFRFQgMjAxNwo= - ``` -
- - :::tip Note - An output for all commands below is like in Hoster’s CLI, but filtered out by username. - ::: - -* Get a list of applications for a specific user: - -
- - ``` - cloudlinux-selector [get] [--json] --interpreter python [--user | --domain ] - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector get --json --interpreter python --user user1 - ``` -
- -* Create user application: - -
- - ``` - cloudlinux-selector create [--json] --interpreter python [--user | --domain ] --app-root --app-uri [--version ] [--startup-file ] [--entry-point ] [--env-vars ] - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector create --json --interpreter python --app-root my_apps/app1 --domain xyz.com --app-uri apps/app1 --version 2.7 --startup-file run.py --entry-point app - ``` -
- -* Start, restart, stop, and destroy user application: - -
- - ``` - cloudlinux-selector (start | restart | stop | destroy) [--json] --interpreter python [--user | --domain ] --app-root - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector start --json --interpreter python --user user1 --app-root my_apps/app1 - ``` -
- -* Set a custom path for Passenger log files: - - **Example:** - -
- - ``` - cloudlinux-selector --json create --interpreter=python --version=3.3 --user=cltest1 --app-root=p_app2 --app-uri=p_app2_uri --passenger-log-file=/home/cltest1/passenger.log - ``` -
- -* Remove a custom path for Passenger log files: - - **Example:** - -
- - ``` - cloudlinux-selector --json set --interpreter=python --user=cltest1 --app-root=p_app1 --passenger-log-file="" - ``` -
- -* Change properties for an application: - -
- - ``` - cloudlinux-selector set [--json] --interpreter python [--user | --domain ] --app-root [--app-mode ] [--new-app-root ] [--new-domain ] [--new-app-uri ] [--new-version ] [--startup-file ] [--entry-point ] [--env-vars ] [--config-files ] - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector set --json --interpreter python --user user1 --app-root my_apps/app1 --app-mode production --new-app-root new_apps/new_app1 --new-domain new.xyz.com --new-app-uri new_apps/app1 --new-version 8 --startup-file new_app.js --env-vars { “var1” : “value1”, “var2” : “value2” } --config-files requirements.txt,reqs.txt - ``` -
- -* Run `PIP install` for user application: - -
- - ``` - cloudlinux-selector install-modules [--json] --interpreter python [--user | --domain ] --app-root --requirements-file - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector install-modules --json --interpreter python --user user1 --app-root my_apps/app --requirements-file requirements.txt - ``` -
- -* Optional: install or uninstall Python packages for user application: - -
- - ``` - cloudlinux-selector (install-modules|uninstall-modules) [--json] --interpreter python [--user | --domain ] --app-root --modules - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector install-modules --json --interpreter python --user user1 --app-root my_apps/app --modules json-annotate,termcolor - ``` -
- -* Optional: run Python script in virtual environment of user application, arguments `` are passed to the script: - -
- - ``` - cloudlinux-selector run-script [--json] --interpreter python [--user >] --app-root --script-name [-- ...] - ``` -
- - **Example:** - -
- - ``` - cloudlinux-selector run-script --json --interpreter python --user user1 --app-root my_apps/app --script-name test_script -- --script_opt1 --script_opt2 script_arg1 script_arg2 - ``` -
- - **JSON output:** - -
- - ``` - { - "result": "success", - "timestamp": 1508666792.863358 - “data”: “script output as Base64 encoded string” - } - ``` -
- - -### Old Python Selector - -:::warning Warning! -selectorctl command line tool is not supported in the new Python Selector. You can use cloudlinux-selector command line tool instead. -::: - -To create application run: - -
- -``` -/usr/bin/selectorctl --interpreter=python --version=VERSION [--user=USER] [--print-summary] [--json] --create-webapp -``` -
- -To delete application: - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --destroy-webapp -``` -
- -To change application folder name: - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --relocate-webapp -``` -
- -To change application URI : - -
- -``` -/usr/bin/selectorctl --interpreter= [--user=USER] [--print-summary] [--json] --transit-webapp -``` -
- -To change application interpreter version: - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --set-user-current --version= -``` -
- -To set application WSGI handler ( Python only): - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --setup-wsgi= -``` -
- -To install modules to application environment: - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --enable-user-extensions= -``` -
- -To remove modules from application environment: - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --disable-user-extensions= -``` -
- -To list modules installed in application environment: - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--print-summary] [--json] --list-user-extensions -``` -
- -To print applications summary for a user: - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--json] --user-summary -``` -
- -To list available interpreters: - -
- -``` -/usr/bin/selectorctl --interpreter=python [--user=USER] [--json] --list -``` -
- - -## Ruby Selector - -To create application run: -
- -``` -/usr/bin/selectorctl --interpreter=ruby --version=VERSION [--user=USER] [--print-summary] [--json] --create-webapp -``` -
-To delete application: -
- -``` -/usr/bin/selectorctl --interpreter=ruby [--user=USER] [--print-summary] [--json] --destroy-webapp -``` -
-To change application folder name: -
- -``` -/usr/bin/selectorctl --interpreter=ruby [--user=USER] [--print-summary] [--json] --relocate-webapp -``` -
- -To change application URI : -
- -``` -/usr/bin/selectorctl --interpreter=ruby [--user=USER] [--print-summary] [--json] --transit-webapp -``` -
- -To change application interpreter version: -
- -``` -/usr/bin/selectorctl --interpreter=ruby [--user=USER] [--print-summary] [--json] --set-user-current --version= -``` -
- -To restart application: -
- -``` -selectorctl --interpreter ruby --user cltest1 --domain cltest1.com --restart-webapp testapp -``` -
-To choose Ruby version: -
- -``` -selectorctl --interpreter=ruby --user=$USER -v 2.0 -``` -
- -## Node.js Selector - -* [Hoster](/command-line_tools/#hoster-2) -* [End user](/command-line_tools/#end-user-2) - -Below is a list of commands hoster and end user can run in a command line. - -#### **Hoster** - -Get information related to Node.js: default version, list of supported versions, status of Node.js Selector , list of users, their applications, etc: -
- -``` -cloudlinux-selector [get] [--json] --interpreter nodejs -``` -
- - JSON output for _get_ command: -
- -``` -{ -"selector_enabled": true | false, -"default_version": "6.11.3", -"result": "success", -"timestamp": 1508667174.220027 -"cache_status": "ready" // or “updating” during automatic yum cache rebuild -"available_versions": { // begin of “versions” - "6.11.3" : { // begin of version "6.11.3" - "name_modifier": "", - "status": "enabled", // enabled, disabled, not_installed, installing, removing - “base_dir”: “/opt/alt/alt-nodejs6” // empty when version is not installed - “users”: { // begin of “users” - “user1”: { // begin of “user1” - “homedir”: “/home/user1”, - “applications”: { // begin of “applications” - “apps_dir/app1” : { // begin of application “apps_dir/app1” - “domain”: “cltest1.com”, - “app_uri”: “apps/my-app1”, - “app_mode” : “development”, - “startup_file” : “app.js”, - “app_status” : “started”, // ‘started’ or ‘stopped’ - “config_files” : [ - “package.json”, - “gruntfile.js” - ], - “env_vars” : { - “var1” : “value1”, - “var2” : “value2” - }, - }, // end of application “apps_dir/app1” - “apps_dir/app2” : { // begin of application “apps_dir/app2” - << data for application “apps_dir/app2” (same structure as for application “apps_dir/app1” above) >> - }, // end of application “apps_dir/app2” - }, // end of “applications” - }, // end of “user1” - “user2”: { // begin of “user2” - << data for user “user2” (same structure as for “user1” above) >> - }, // end of “user2” - }, // end of “users” - }, // end of version “6.11.3” - "8.21.5" : { // begin of version "8.21.5" - << data for version "8.21.5" (same structure as for version “6.11.3” above) >> - }, // end of version “8.21.5” -}, // end of “versions”} // end of json -``` -
- -Set default version, supported versions, and status of Node.js Selector : -
- -``` -cloudlinux-selector set [--json] --interpreter nodejs (--selector-status | --default-version | --supported-versions ) -``` -
- -::: tip Note - Node.js Selector is disabled by default. If an available Node.js version is not installed Node.js Selector is always disabled and it is impossible to enable it. -::: - -To set default Node.js version, please use the following command (note that required Node.js version should be enabled): -
- -``` -cloudlinux-selector set --json --interpreter=nodejs --default-version= -``` -
- -**Examples**: -This command enables Node.js Selector : - -
- -``` -cloudlinux-selector set --json --interpreter nodejs --selector-status enabled -``` -
- -This command sets default Node.js version as 6: -
- -``` -cloudlinux-selector set --json --interpreter nodejs --default-version 6 -``` -
- -This command sets supported Node.js version as 8: -
- -``` -cloudlinux-selector set --json --interpreter nodejs --supported-versions='{"6": false, "8": true}' -``` -
- -Install required Node.js version: -
- -``` -cloudlinux-selector install-version --json --interpreter nodejs --version 8 -``` -
- -Uninstall required Node.js version: -
- -``` -cloudlinux-selector uninstall-version --json --interpreter nodejs --version 8 -``` -
- -Enable required Node.js version: -
- -``` -cloudlinux-selector enable-version --json --interpreter nodejs --version 8 -``` -
- -Disable required Node.js version (note that it is impossible to disable default Node.js version): -
- -``` -cloudlinux-selector disable-version --json --interpreter nodejs --version 8 -``` -
- -Change version for application(s): -
- -``` -cloudlinux-selector set [--json] --interpreter nodejs ((--user | --domain ) --app-root | --from-version ) --new-version -``` -
- -**Examples** : -This command changes version for the specific application: -
- -``` -cloudlinux-selector set --json --interpreter nodejs --user user1 --app-root apps_dir/app1 --new-version 8 -``` -
- -Common output for all _set_ commands: - -**_in case of success_** : -
- -``` -{ "result": "success", "timestamp": 1508666792.863358} -``` -
- -**_in case of error:_** -
- -``` -{ "result": "Some error message", "details" : "Traceback: ..." , "context": {}, "timestamp": 1508666792.863358} -``` -
- -**_in case of warning:_** -
- -``` -{ "result": "success", "warning" : "Some warning message" , "context": {}, "timestamp": 1508666792.863358} -``` -
- -To resolve issues related to _install-version/uninstall-version_ commands (because they are running in the background) you may use this log file _/var/log/cl-nodejs-last-yum.log_ -It contains full _yum_ output from the **_latest_** performed operation (install or uninstall) and it will be rewritten with each operation. - -#### **End user** - -::: danger -options --user and --domain are mutually exclusive now. -::: - -Get config file for the user applications - -
- -``` -cloudlinux-selector read-config [--json] --interpreter nodejs [(--user | --domain )] --app-root --config-file -``` -
- -JSON output: - -
- -``` -{ - "result": "success", - "timestamp": 1508666792.863358 - "data": "content of config file as Base64 encoded string" -} -``` - -
- - -**Example**: - -This command gets config file for user1 ’s application app1 : - -
- -``` -cloudlinux-selector read-config --json --interpreter nodejs --user user1 --app-root app_dir/app1 --config-file package.json -``` -
-Save config file for the user applications -
- -``` -cloudlinux-selector save-config [--json] --interpreter nodejs [(--user | --domain )] --app-root --config-file --content -``` -
- - JSON output (the same as for all _set_ commands): - -
- -``` -{ - "result": "success", - "timestamp": 1508666792.863358 -} -``` -
- -**Example**: -This command saves config file for user1 ’s application app1 : - -
- -``` -cloudlinux-selector save-config --json --interpreter nodejs --user user1 --app-root app_dir/app1 --config-file package.json --content VGh1ICAyIE5vdiAxMDo0MzoxMiBFRFQgMjAxNwo= -``` -
-Get a list of applications for the specific user -
- -``` -cloudlinux-selector [get] [--json] --interpreter nodejs [(--user | --domain )] -``` -
- -**Example**: -This command gets a list of applications for the user1 : - -
- -``` -cloudlinux-selector get --json --interpreter nodejs --user user1 -``` -
-Create user application - -
- -``` -cloudlinux-selector create [--json] --interpreter nodejs [(--user | --domain )] --app-root --app-uri [--version ] [--app-mode ] [--startup-file ] [--env-vars ] -``` -
- -**Example**: -This command creates user1 's application for the domain xyz.com : -
- -``` -cloudlinux-selector create --json --interpreter nodejs --user user1 --app-root my_apps/app1 --app-uri apps/app1 -``` -
-or -
- -``` -cloudlinux-selector create --json --interpreter nodejs --app-root my_apps/app1 --domain xyz.com --app-uri apps/app1 -``` -
-Start, restart, stop, and destroy user application -
- -``` -cloudlinux-selector (start | restart | stop | destroy) [--json] --interpreter nodejs [(--user | --domain )] --app-root -``` -
- -**Example**: -This command starts user1 's application: -
- -``` -cloudlinux-selector start --json --interpreter nodejs --user user1 --app-root my_apps/app1 -``` -
-Change properties for an application -
- -``` -cloudlinux-selector set [--json] --interpreter nodejs [(--user | --domain )] --app-root [--app-mode ] [--new-app-root ] [--new-domain ] [--new-app-uri ] [--new-version ] [--startup-file ] [--env-vars ] -``` -
- -**Examples:** - -This command sets a custom path for Passenger log files: -
- -``` -cloudlinux-selector --json create --interpreter=nodejs --user=cltest1 --app-root=p_app2 --app-uri=p_app2_uri --passenger-log-file=/home/cltest1/passenger.log -``` -
- -This command removes a custom path for Passenger log files: -
- -``` -cloudlinux-selector --json set --interpreter=nodejs --user=cltest1 --app-root=p_app1 --passenger-log-file="" -``` -
- -**Example 1**: -This command sets a production mode, new domain new.xyz.com , new Node.js version 8, new URI , new application root directory and new startup file for user1 application located on the domain xyz.com : -
- -``` -cloudlinux-selector set --json --interpreter nodejs --user user1 --app-root my_apps/app1 --mode production --new-app-root new_apps/new_app1 --new-domain new.xyz.com --new-app-uri new_apps/app1 --new-version 8 --startup-file new_app.js --env-vars '{ "var1" : "value1", "var2" : "value2" }' -``` -
- -**Example 2**: - -
- -``` -cloudlinux-selector set --json --interpreter nodejs --domain xyz.com --app-root my_apps/app1 --mode production --new-app-root new_apps/new_app1 --new-domain new.xyz.com --new-app-uri new_apps/app1 --new-version 8 --startup-file new_app.js --env-vars '{ "var1" : "value1", "var2" : "value2" }' -``` -
- -::: tip Note -When changing Node.js version all replies from web application to get request will be checked in Node.js Selector (before and after version changing). HTTP response codes and MIME type are comparing. So, make sure application is available via http(s) at least locally. -::: - -Run _npm install_ command for the user application -
- -``` -cloudlinux-selector install-modules [--json] --interpreter nodejs [(--user | --domain )] --app-root -``` -
- -**Example**: -This command runs `npm install` for user1 application: - -
- -``` -cloudlinux-selector install-modules --json --interpreter nodejs --user user1 --app-root my_apps/app -``` -
- -::: tip Note -All replies from web application to get request will be checked in Node.js Selector (before and after modules installation). HTTP response codes and MIME type are comparing. So, make sure application is available via http(s) at least locally. -::: - -Run a script from package.json file of a user application, arguments _args_ are passed to the script -
- -``` -cloudlinux-selector run-script [--json] --interpreter nodejs [(--user | --domain )] --app-root --script-name [-- ...] -``` -
- -**Example**: -
- -``` -cloudlinux-selector run-script --json --interpreter nodejs --user user1 --app-root my_apps/app --script-name test_script -- --script_opt1 --script_opt2 script_arg1 script_arg2 -``` -
- - JSON output: - -
- -``` -{ - "result": "success", - "timestamp": 1508666792.863358 - "data": "script output as Base64 encoded string" -} -``` -
- -Activate virtual environment of NodeJS: -
- -``` -source /nodevenv///bin/activate -``` -
- -This command changes prompt to -**Example**: -
- -``` -[newusr@192-168-245-108 ~]$ source /home/newusr/nodevenv/newapp4/newapp3/8/bin/activate -[newapp4/newapp3 (8)] [newusr@192-168-245-108 ~]$ -``` -
- -After activation user can use `npm` and node from a virtual environment without full paths. - -## Apache mod_lsapi PRO - -switch_mod_lsapi is the command line tool used to manage mod_lsapi PRO. - -It has the following syntax: - -`/usr/bin/switch_mod_lsapi [OPTIONS]` - -`[OPTIONS]` can be the main and an additional (for usage together with any other main option). - -**Main options** - -| | | -|-|-| -|**Option** | **Description**| -|`--setup` | setup _mod_lsapi_ configurations for Apache, including PHP handlers setup; create native lsphp (if it doesn't exist) by doing: `cp /opt/alt/php56/usr/bin/lsphp /usr/local/bin/`
_* NOT supported for DirectAdmin_ | -|`--setup-light` | setup PHP handlers only
_* supported for cPanel EasyApache 4 only_| -|`--uninstall` | uninstall _mod_lsapi_ from Apache
_* supported for cPanel (EasyApache 3 and EasyApache 4), Plesk, and servers without control panel_| -|`--enable-domain` | enable _mod_lsapi_ for individual domain
_* supported for cPanel EasyApache 3 only_| -|`--disable-domain` | disable _mod_lsapi_ for individual domain
_* supported for cPanel EasyApache 3 only_| -|`--enable-global` | sets up _mod_lsapi_ as a default way to serve PHP, making it enabled for all domains. Once that mode is enabled, you cannot disable _mod_lsapi_ for an individual domain.
_* supported for cPanel only (EasyApache 3 and EasyApache 4)_| -|`--disable-global` | disable _mod_lsapi_ as a default way to serve PHP, disabling _mod_lsapi_ for all domains, including those selected earlier using
_--enable-domain_ _* supported for cPanel EasyApache 3 only_| -|`--build-native-lsphp` | build native _lsphp_ for cPanel EasyApache 3
_* supported for cPanel EasyApache 3 only_| -|`--build-native-lsphp-cust` | build native _lsphp_ for cPanel EasyApache 3 (with custom PHP source path)
_* supported for cPanel EasyApache 3 only_| -|`--check-php` | check PHP configuration
_* NOT supported for DirectAdmin_| -|`--stat` | return usage statistics in JSON format; the following statistics metrics are collected:
• control panel name;
• mod_lsapi version;
• liblsapi version;
• criu version and status;
• whether mod_lsapi is enabled;
• lsapi configuration options;
• number of domains, that use _mod_lsapi_, per each installed PHP version including those set in PHP Selector _(this metric is supported for cPanel EasyApache 4, Plesk and DirectAdmin)_ .| - -**Additional options** - -| | | -|-|-| -|**Option** | **Description**| -|`--verbose` | switch verbose level on| -|`--force` | switch force mode on| - - -The following table presents which `[OPTIONS]` are supported for various panels: - -| | | | | | | | | -|-|--|--|--|--|--|--|-| -| | No Control Panel | cPanel EA3 | cPanel EA4 | DirectAdmin | Plesk | InterWorx | ISPManager| -|`setup` | + | + | + | custombuild | + | + | +| -|`setup-light` | - | - | + | - | - | - | -| -|`uninstall` | + | + | + | custombuild | + | + | +| -|`enable-domain` | - | + | - | - | - | - | -| -|`disable-domain` | - | + | - | - | - | - | -| -|`enable-global` | - | + | + | custombuild | - | - | -| -|`disable-global` | - | + | - | custombuild | - | - | -| -|`build-native-lsphp` | - | + | - | - | - | - | -| -|`build-native-lsphp-cust` | - | + | - | - | - | - | -| -|`check-php` | + | + | + | - | + | + | +| -|`verbose` | + | + | + | - | + | + | +| -|`force` | + | + | + | - | + | + | +| -|`stat` | +
_*without domain info_ | +
_*without domain info_ | + | + | + | +
_*without domain info_ | +
_*without domain info_| - - -## Website Monitoring tool and Slow Site analyzer - -### The cloudlinux-ssa-manager utility - -The `cloudlinux-ssa-manager` utility allows to manage Slow Site analyzer via CLI. - -**Usage** - -``` -# /usr/sbin/cloudlinux-ssa-manager [command] [--optional arguments] -``` - -**Optional arguments**: - -| | | -|-|-| -|`-h`, `--help`|show help message and exit| - -**Commands**: - -| | | -|-|-| -|`set-config`|set the SSA configuration| -|`get-config`|get the SSA configuration| -|`get-ssa-status`|get a current status of SSA| -|`enable-ssa`|enable SSA| -|`disable-ssa`|disable SSA| -|`get-report`|get the latest report| - -You can use the `-h`, `--help` option with commands to get a full list of available optional arguments for each command. - -Example of the `/usr/sbin/cloudlinux-ssa-manager set-config --help` command output: - -``` -# /usr/sbin/cloudlinux-ssa-manager set-config --help -usage: cloudlinux-ssa-manager set-config [-h] - [--domains-number DOMAINS_NUMBER] - [--urls-number URLS_NUMBER] - [--requests-duration REQUESTS_DURATION] - [--request-number REQUEST_NUMBER] - [--time TIME] - [--correlation CORRELATION] - [--correlation-coefficient CORRELATION_COEFFICIENT] - [--ignore-list IGNORE_LIST] -optional arguments: - -h, --help show this help message and exit - --domains-number DOMAINS_NUMBER - Size of TOP list for slow domains - --urls-number URLS_NUMBER - Size of TOP list for slow urls - --requests-duration REQUESTS_DURATION - The threshold value of request duration in seconds - --request-number REQUEST_NUMBER - The threshold value of slow requests number in the - period of time to mark URL as a slow one - --time TIME Period of time in hours required to analyze these - requests - --correlation CORRELATION - Flag to enable or disable correlation - --correlation-coefficient CORRELATION_COEFFICIENT - The threshold value of correlation coefficient - --ignore-list IGNORE_LIST - List of URLs or domains that should not be included in - the daily report -``` - -### The wmt-api utility - -The `wmt-api` utility allows to manage Website Monitoring tool via CLI. - -**Usage** - -``` -# /usr/share/web-monitoring-tool/wmtbin/wmt-api [command] [--optional arguments] -``` - -**Optional arguments**: - -| | | -|-|-| -|`-h`, `--help`|show help message and exit| - -**Commands**: - -| | | -|-|-| -|`config-change`|set the WMT configuration using the JSON string that follows| -|`config-get`|get the WMT configuration as JSON| -|`email-get`|get WMT email from the config file| -|`report-generate`|Generate a report JSON file| -|`send-clickhouse`|Send the summary report to ClickHouse| -|`start`|Start the WMT system| -|`status`|Check the status of the WMT system| -|`stop`|Stop the WMT system| - -Example of the `/usr/share/web-monitoring-tool/wmtbin/wmt-api` command usage: - -``` -# /usr/share/web-monitoring-tool/wmtbin/wmt-api -config-change "{\"ping_connections\":8,\"report_top\":5,\"report_email\":\"user@example.com\"}" -``` - -This way you can set all or only certain parameters. - -## X-Ray Autotracing - -### The cloudlinux-autotracing utility - -The `cloudlinux-autotracing` utility allows to manage the X-Ray Autotracing via CLI. - -**Usage** - -``` -# /usr/sbin/cloudlinux-autotracing [command] [--optional arguments] -``` - -**Commands**: - -| | | -|-|-| -|`enable`|Enable X-Ray Autotracing| -|`disable`|Disable X-Ray Autotracing| -|`status`|Get current status of the X-Ray Autotracing| - -**Optional arguments**: - -| | | -|-|-| -|`-h`, `--help`|Show help message and exit| -|`--all`|Enable or disable for all users| -|`{username}`|Enable/disable the specified user| -|`--list-disabled`|Show list of disabled users| - -You can use the `-h`, `--help` option with commands to get a full list of available optional arguments for each command. - -**Example usage:** - -Disable user1: - -``` -# /usr/sbin/cloudlinux-autotracing disable user1 -{"result": "success"} -``` - -Show list of disabled users: - -``` -# /usr/sbin/cloudlinux-autotracing status --list-disabled -{"result": "success", "disabled_users": ["user1"]} -``` - -Enable all: - -``` -# /usr/sbin/cloudlinux-autotracing enable --all -{"result": "success"} -``` - -## Other CLI tools - - -* [cldeploy](/command-line_tools/#cldeploy) -* [lvectl](/command-line_tools/#lvectl) -* [lveps](/command-line_tools/#lveps) -* [lvetop](/command-line_tools/#lvetop) -* [cldetect](/command-line_tools/#cldetect) -* [cldiag](/command-line_tools/#cldiag) -* [cloudlinux-config](/command-line_tools/#cloudlinux-config) -* [cl-quota](/command-line_tools/#cl-quota) -* [cloudlinux-limits](/command-line_tools/#cloudlinux-limits) - - -### cldeploy - -`sh cldeploy --help` - -Usage: - -| | | -|--|--| -|`-h, --help`|Print this message| -|`-k, --key <key>`|Update your system to CloudLinux OS Shared with activation key| -|`-i, --byip`|Update your system to CloudLinux OS Shared and register by IP| -|`-c, --uninstall`|Convert CloudLinux OS Shared back to CentOS| -|`--serverurl`|Use non-default registration server (default is `https://xmlrpc.cln.cloudlinux.com/XMLRPC`)| -|`--components-only`|Install control panel components only| -|`--conversion-only`|Do not install control panel components after converting| -|`--hostinglimits`|Install mod_hostinglimits rpm| -|`--skip-kmod-check`|Skip check for unsupported kmods| -|`--skip-version-check`|Do not check for script updates| -|`--skip-registration`|Don't register on CLN if already have access to CL repository| -|`--force-hybridize`|Option allows to convert CloudLinux OS Shared 7 to CloudLinux OS Shared 7 Hybrid which has a newer kernel (from v1.61)| -|`--no-force-hybridize `|Don't hybridize machine from CloudLinux 7 to CloudLinux 7 Hybrid automatically, even though machine has a new hardware| -|`--to-solo-edition `|Convert to CloudLinux Solo edition (only allowed with --skip-registration option)| -|`--to-admin-edition `|Convert to CloudLinux Admin edition (only allowed with --skip-registration option)| -|`--to-container-environment `|Convert to CloudLinux which supports working inside containers| -|`--force-packages-installation `|Automatically resolve dependencies and remove conflicting packages| -|`--allow-lower-version `|Convert to lower minor version (Almalinux x.y to CL x.y-1) if current version (CL x.y) is not available| - -The script will perform the following actions: - -1. Register server with CLN. -2. Install CloudLinux OS Shared kernel, lve libraries, lve-utils, lve-stats and pam_lve packages. -3. Attempt to detect control panel and do the following actions: -* _For cPanel_: - * install mod_hostinglimits; - * install LVE Manager. - -* _For DirectAdmin_: - * recompile Apache to install mod_hostinglimits; - * install LVE Manager. - -* _For Plesk, ISPManager & InterWorx_: - * update httpd and install mod_hostinglimits; - * install LVE Manager. - -* To disable installation of LVE Manager and mod_hostinglimits, please use `--conversion-only` option. - -* To disable installation of kernel & CLN registration, please use `--components-only` option. - -* To install **mod_hostinglimits** only, use `--hostinglimits` option. - -Examples: - -
- -``` -$ cldeploy --key xx-xxxxxx # convert RHEL/CentOS to CL by using activation key, install control panel components -$ cldeploy --key xx-xxxxxx --force-hybridize # convert RHEL/CentOS 7 to CL7h by using activation key, install control panel components (from v1.61) -$ cldeploy --byip --conversion-only # convert RHEL/CentOS to CL by ip, don't install control panel components -$ cldeploy --components-only # install control panel components on already converted system -$ cldeploy --hostinglimits # update httpd and install mod_hostinglimits -``` -
- - -### lvectl - -`lvectl` is the primary tool for LVE management. To use it, you have to have administrator access. lvectl is a part of lve-utils package. - -**lvectl syntax** - -**Usage**: `lvectl command [lveid] [options]` - -**Commands** - -| | | -|--|--| -| `apply` |apply config settings to specified LVE| -| `apply all` |apply config settings to all the LVEs| -| `apply-many` |to apply LVE limits to multiple distinct LVEs (uids of users are read from stdin)| -| `set` |set parameters for a LVE and/or create a LVE| -| `set-user` |set parameters for a LVE and/or create a LVE using username instead of ID| -| `list` |list loaded LVEs| -| `list-user` |list loaded LVEs, display username instead of user id| -| `limits` |show limits for loaded LVEs| -| `delete` |delete LVE and set configuration for that LVE to defaults| -| `delete-user` |delete LVE and set configuration for that user to defaults| -| `destroy` |destroy LVE (configuration file remains unchanged)| -| `destroy all` |destroy all LVE (configuration file remains unchanged)| -| `destroy-many` |to destroy LVE limits to multiple distinct LVEs (uids of users are read from stdin)| -| `package-set` | set LVE parameters for a package| -| `package-list` |list LVE parameters for packages| -| `package-delete` |delete LVE parameters for a package| -| `paneluserslimits` |show current user's limits for control panel| -| `limit` |limit PID into specified LVE. Parameters PID LVE_ID| -| `release` |release PID from LVE. Parameters PID| -| `set-binary` |add binary to be run inside LVE on execution| -| `del-binary` |remove binary from being run inside LVE on execution| -| `list-binaries` |list all binaries to be run inside LVE on execution| -| `load-binaries` |load binaries (used on startup) from config file| -| `reload-binaries` |re-load list of binaries from config file| -| `help (-h)` |show this message| -| `version (-v)` |version number| -| `lve-version` |LVE version number| -| `set-reseller` |create LVE container and set LVE parameters for a reseller| -| `set-reseller-default` |set default limits for resellers users| -| `remove-reseller` |delete LVE container and the record in the config, move LVE containers to the host container| - -**Options** - -| | | -|--|--| -| `--enter-count` |enable limit for enters count (by default disabled), use only with command "limit". Supported in lve-utils-6.1.2-1 or later. | -| `--io-and-memory` |enable limit for IO and memory (by default disabled), use only with command "limit". Supported in lve-utils-6.1.2-1 or later. | -| `--cpu=N` |limit `CPU` usage; (deprecated. Use `--speed`)| -| `--speed=N%` |limit `CPU` usage in percentage; 100% is one core| -| `--speed=Nmhz\ghz` |limit `CPU` usage in mhz\ghz| -| `--ncpu=N` |limit VCPU usage (deprecated)| -| `--io=N` |define io limits (KB/s)| -| `--nproc=N` |limit number of processes| -| `--pmem=N` |limit physical memory usage for applications inside LVE| -| `--iops=N` |limit io per second| -| `--mem=N` | mem alias for vmem (deprecated)| -| `--vmem=N` |limit virtual memory for applications inside LVE| -| `--maxEntryProcs=N` |limit number of entry processes| -| `--save` |save configuration settings (use with set) (deprecated)| -| `--save-all-parameters` |save all parameters even if they match with defaults settings| -| `--json` |returns result of command json formatted| -| `--unlimited` |set all limits to unlimited| -| `--save-username` |save username in the config file. This parameter is used in conjunction with `set-user`| - -**Examples** - -* Reset all LVEs settings based on configuration in `/etc/container/ve.cfg`: - -
- - ``` - $ lvectl apply all - ``` -
- -* Set new default CPU & Physical memory limit: - -
- - ``` - $ lvectl set default --speed=100% --pmem=256m - ``` -
- -* Reset all LVE's killing processes inside them: - -
- - ``` - $ lvectl destroy all - ``` -
- -* Show list of LVEs and their limits: - -
- - ``` - $ lvectl list - ``` -
- -### lveps - -**lveps** tool shows information about running LVEs, processes and threads belonging to them, CPU/memory/IO usage consumed by LVEs and their individual processes/threads. LVE is only reported if it is considered active (at least one thread belongs to that LVE or was running during measurement in dynamic mode). - -**Usage**: - -
- -``` -lveps [-p] [-n] [-o ] [-d] [-c