One place for hosting & domains

      Collections

      How To Use the collections Module in Python 3


      The author selected the COVID-19 Relief Fund to receive a donation as part of the Write for DOnations program.

      Introduction

      Python 3 has a number of built-in data structures, including tuples, dictionaries, and lists. Data structures provide us with a way to organize and store data. The collections module helps us populate and manipulate data structures efficiently.

      In this tutorial, we’ll go through three classes in the collections module to help you work with tuples, dictionaries, and lists. We’ll use namedtuples to create tuples with named fields, defaultdict to concisely group information in dictionaries, and deque to efficiently add elements to either side of a list-like object.

      For this tutorial, we’ll be working primarily with an inventory of fish that we need to modify as fish are added to or removed from a fictional aquarium.

      Prerequisites

      To get the most out of this tutorial, it is recommended to have some familiarity with the tuple, dictionary, and list data types, both with their syntax, and how to retrieve data from them. You can review these tutorials for the necessary background information:

      Adding Named Fields to Tuples

      Python tuples are an immutable, or unchangeable, ordered sequence of elements. Tuples are frequently used to represent columnar data; for example, lines from a CSV file or rows from a SQL database. An aquarium might keep track of its inventory of fish as a series of tuples.

      An individual fish tuple:

      ("Sammy", "shark", "tank-a")
      

      This tuple is composed of three string elements.

      While useful in some ways, this tuple does not clearly indicate what each of its fields represents. In actuality, element 0 is a name, element 1 is a species, and element 2 is the holding tank.

      Explanation of fish tuple fields:

      name species tank
      Sammy shark tank-a

      This table makes it clear that each of the tuple’s three elements has a clear meaning.

      namedtuple from the collections module lets you add explicit names to each element of a tuple to make these meanings clear in your Python program.

      Let’s use namedtuple to generate a class that clearly names each element of the fish tuple:

      from collections import namedtuple
      
      Fish = namedtuple("Fish", ["name", "species", "tank"])
      

      from collections import namedtuple gives your Python program access to the namedtuple factory function. The namedtuple() function call returns a class that is bound to the name Fish. The namedtuple() function has two arguments: the desired name of our new class "Fish" and a list of named elements ["name", "species", "tank"].

      We can use the Fish class to represent the fish tuple from earlier:

      sammy = Fish("Sammy", "shark", "tank-a")
      
      print(sammy)
      

      If we run this code, we’ll see the following output:

      Output

      Fish(name='Sammy', species='shark', tank='tank-a')

      sammy is instantiated using the Fish class. sammy is a tuple with three clearly named elements.

      sammy’s fields can be accessed by their name or with a traditional tuple index:

      print(sammy.species)
      print(sammy[1])
      

      If we run these two print calls, we’ll see the following output:

      Output

      shark shark

      Accessing .species returns the same value as accessing the second element of sammy using [1].

      Using namedtuple from the collections module makes your program more readable while maintaining the important properties of a tuple (that they’re immutable and ordered).

      In addition, the namedtuple factory function adds several extra methods to instances of Fish.

      Use ._asdict() to convert an instance to a dictionary:

      print(sammy._asdict())
      

      If we run print, you’ll see output like the following:

      Output

      {'name': 'Sammy', 'species': 'shark', 'tank': 'tank-a'}

      Calling .asdict() on sammy returns a dictionary mapping each of the three field names to their corresponding values.

      Python versions older than 3.8 might output this line slightly differently. You might, for example, see an OrderedDict instead of the plain dictionary shown here.

      Note: In Python, methods with leading underscores are usually considered “private.” Additional methods provided by namedtuple (like _asdict(), ._make(), ._replace(), etc.), however, are public.

      Collecting Data in a Dictionary

      It is often useful to collect data in Python dictionaries. defaultdict from the collections module can help us assemble information in dictionaries quickly and concisely.

      defaultdict never raises a KeyError. If a key isn’t present, defaultdict just inserts and returns a placeholder value instead:

      from collections import defaultdict
      
      my_defaultdict = defaultdict(list)
      
      print(my_defaultdict["missing"])
      

      If we run this code, we’ll see output like the following:

      Output

      []

      defaultdict inserts and returns a placeholder value instead of throwing a KeyError. In this case we specified the placeholder value as a list.

      Regular dictionaries, in contrast, will throw a KeyError on missing keys:

      my_regular_dict = {}
      
      my_regular_dict["missing"]
      

      If we run this code, we’ll see output like the following:

      Output

      Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'missing'

      The regular dictionary my_regular_dict raises a KeyError when we try to access a key that is not present.

      defaultdict behaves differently than a regular dictionary. Instead of raising a KeyError on a missing key, defaultdict calls the placeholder value with no arguments to create a new object. In this case list() to create an empty list.

      Continuing with our fictional aquarium example, let’s say we have a list of fish tuples representing an aquarium’s inventory:

      fish_inventory = [
          ("Sammy", "shark", "tank-a"),
          ("Jamie", "cuttlefish", "tank-b"),
          ("Mary", "squid", "tank-a"),
      ]
      

      Three fish exist in the aquarium—their name, species, and holding tank are noted in these three tuples.

      Our goal is to organize our inventory by tank—we want to know the list of fish present in each tank. In other words, we want a dictionary that maps "tank-a" to ["Jamie", "Mary"] and "tank-b" to ["Jamie"].

      We can use defaultdict to group fish by tank:

      from collections import defaultdict
      
      fish_inventory = [
          ("Sammy", "shark", "tank-a"),
          ("Jamie", "cuttlefish", "tank-b"),
          ("Mary", "squid", "tank-a"),
      ]
      fish_names_by_tank = defaultdict(list)
      for name, species, tank in fish_inventory:
          fish_names_by_tank[tank].append(name)
      
      print(fish_names_by_tank)
      

      Running this code, we’ll see the following output:

      Output

      defaultdict(<class 'list'>, {'tank-a': ['Sammy', 'Mary'], 'tank-b': ['Jamie']})

      fish_names_by_tank is declared as a defaultdict that defaults to inserting list() instead of throwing a KeyError. Since this guarantees that every key in fish_names_by_tank will point to a list, we can freely call .append() to add names to each tank’s list.

      defaultdict helps you here because it reduces the chance of unexpected KeyErrors. Reducing the unexpected KeyErrors means your program can be written more clearly and with fewer lines. More concretely, the defaultdict idiom lets you avoid manually instantiating an empty list for every tank.

      Without defaultdict, the for loop body might have looked more like this:

      More Verbose Example Without defaultdict

      ...
      
      fish_names_by_tank = {}
      for name, species, tank in fish_inventory:
          if tank not in fish_names_by_tank:
            fish_names_by_tank[tank] = []
          fish_names_by_tank[tank].append(name)
      

      Using just a regular dictionary (instead of a defaultdict) means that the for loop body always has to check for the existence of the given tank in fish_names_by_tank. Only after we’ve verified that tank is already present in fish_names_by_tank, or has just been initialized with a [], can we append the fish name.

      defaultdict can help cut down on boilerplate code when filling up dictionaries because it never raises a KeyError.

      Using deque to Efficiently Add Elements to Either Side of a Collection

      Python lists are a mutable, or changeable, ordered sequence of elements. Python can append to lists in constant time (the length of the list has no effect on the time it takes to append), but inserting at the beginning of a list can be slower—the time it takes increases as the list gets bigger.

      In terms of Big O notation, appending to a list is a constant time O(1) operation. Inserting at the beginning of a list, in contrast, is slower with O(n) performance.

      Note: Software engineers often measure the performance of procedures using something called “Big O” notation. When the size of an input has no effect on the time it takes to perform a procedure, it is said to run in constant time or O(1) (“Big O of 1”). As you learned above, Python can append to lists with constant time performance, otherwise known as O(1).

      Sometimes, the size of an input directly affects the amount of time it takes to run a procedure. Inserting at the beginning of a Python list, for example, runs slower the more elements there are in the list. Big O notation uses the letter n to represent the size of the input. This means that adding items to the beginning of a Python list runs in “linear time” or O(n) (“Big O of n”).

      In general, O(1) procedures are faster than O(n) procedures.

      We can insert at the beginning of a Python list:

      favorite_fish_list = ["Sammy", "Jamie", "Mary"]
      
      # O(n) performance
      favorite_fish_list.insert(0, "Alice")
      
      print(favorite_fish_list)
      

      If we run the following, we will see output like the following:

      Output

      ['Alice', 'Sammy', 'Jamie', 'Mary']

      The .insert(index, object) method on list allows us to insert "Alice" at the beginning of favorite_fish_list. Notably, though, inserting at the beginning of a list has O(n) performance. As the length of favorite_fish_list grows, the time to insert a fish at the beginning of the list will grow proportionally and take longer and longer.

      deque (pronounced “deck”) from the collections module is a list-like object that allows us to insert items at the beginning or end of a sequence with constant time (O(1)) performance.

      Insert an item at the beginning of a deque:

      from collections import deque
      
      favorite_fish_deque = deque(["Sammy", "Jamie", "Mary"])
      
      # O(1) performance
      favorite_fish_deque.appendleft("Alice")
      
      print(favorite_fish_deque)
      

      Running this code, we will see the following output:

      Output

      deque(['Alice', 'Sammy', 'Jamie', 'Mary'])

      We can instantiate a deque using a preexisting collection of elements, in this case a list of three favorite fish names. Calling favorite_fish_deque’s appendleft method allows us to insert an item at the beginning of our collection with O(1) performance. O(1) performance means that the time it takes to add an item to the beginning of favorite_fish_deque will not grow even if favorite_fish_deque has thousands or millions of elements.

      Note: Although deque adds entries to the beginning of a sequence more efficiently than a list, deque does not perform all of its operations more efficiently than a list. For example, accessing a random item in a deque has O(n) performance, but accessing a random item in a list has O(1) performance. Use deque when it is important to insert or remove elements from either side of your collection quickly. A full comparison of time performance is available on Python’s wiki.

      Conclusion

      The collections module is a powerful part of the Python standard library that lets you work with data concisely and efficiently. This tutorial covered three of the classes provided by the collections module including namedtuple, defaultdict, and deque.

      From here, you can use the collection module’s documentation to learn more about other available classes and utilities. To learn more about Python in general, you can read our How To Code in Python 3 tutorial series.



      Source link

      Установка и настройка стека LEMP с помощью Software Collections в CentOS 7


      Автор выбрал Apache Software Foundation для получения пожертвования в размере $100 в рамках программы Write for DOnations.

      Введение

      Стек ПО LEMP — это группа программного обеспечения с открытым исходным кодом, которая обычно устанавливается вместе, чтобы на сервере могли размещаться динамические веб-сайты и веб-приложения. Этот термин представляет собой акроним, представляющий операционную систему Linux с веб-сервером ENginx (который заменяет Apache в стеке LAMP). Данные сайта хранятся в базе данных MySQL (используется MariaDB), а за динамическое содержание отвечает PHP.

      Компоненты стека LEMP иногда устанавливаются с помощью репозитория EPEL CentOS 7. Однако этот репозиторий содержит устаревшие пакеты. Например, вы не можете установить версию PHP старше 5.4.16 из EPEL, хотя этот релиз не поддерживается уже длительное время. Для получения новых версий программного обеспечения рекомендуется использовать набор Software Collections, также известный как SCL. SCL — это коллекции ресурсов для разработчиков, предоставленные RedHat, которые позволяют использовать различные версии программного обеспечения в одной и той же системе без какого-либо влияния на ранее установленные пакеты.

      В этом руководстве вы установите стек LEMP на сервер с CentOS 7. Операционная система CentOS отвечает за работу компонентов Linux. Вы установите остальные компоненты с помощью репозитория Software Collections, а затем настроите их для обслуживания простой веб-страницы.

      Предварительные требования

      Прежде чем приступить к выполнению данного обучающего руководства, у вас должен быть сервер CentOS 7, настроенный согласно руководству по начальной настройке сервера CentOS 7, а также пользователь sudo без прав root.

      Шаг 1 — Активация репозитория Software Collections

      Для получения доступа к SCL для CentOS установите release-файл для Software Collections в CentOS:

      • sudo yum install centos-release-scl

      Просмотрите список доступных пакетов SCL с помощью следующей команды:

      • yum --disablerepo='*' --enablerepo='centos-sclo-rh' --enablerepo='centos-sclo-sclo' list available

      Для предотвращения конфликтов в рамках всей системы пакеты SCL устанавливаются в директорию /opt/rh. Это позволяет установить, например, Python 3.5 на компьютере с CentOS 7 без удаления или вмешательства в работу Python 2.7.

      Все файлы конфигурации для пакетов SCL хранятся в соответствующей директории внутри директории /etc/opt/rh/. Пакеты SCL содержат скрипты, которые определяют переменные среды, необходимые для использования приложений внутри пакета, например, PATH, LD_LIBRARY_PATH и MANPATH. Эти скрипты хранятся в файловой системе в каталоге /opt/rh/package-name/enable.

      Теперь вы можете начать установку пакетов, описанных в этом руководстве.

      Шаг 2 — Установка сервера Web Nginx

      Для показа веб-страниц посетителям мы будем использовать Nginx, современный и эффективный веб-сервер.

      Установите Nginx с помощью следующей команды yum. Обязательно замените выделенное значение версией Nginx, которую вы хотите установить; самая последняя версия будет иметь самый большой номер в имени пакета (112 на момент написания статьи):

      • sudo yum install rh-nginx112

      После завершения установки запустите службу Nginx:

      • sudo systemctl start rh-nginx112-nginx

      Проверьте, что Nginx запущен с помощью команды systemctl status​​​:

      • sudo systemctl status rh-nginx112-nginx

      Output

      ● rh-nginx112-nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/rh-nginx112-nginx.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2018-03-19 15:15:43 UTC; 1min 17s ago Main PID: 10556 (nginx) CGroup: /system.slice/rh-nginx112-nginx.service ├─10556 nginx: master process /opt/rh/rh-nginx112/root/usr/sbin/nginx ├─10557 nginx: worker process └─10558 nginx: worker process Mar 19 15:15:43 lemp-centos-222 systemd[1]: Starting The nginx HTTP and reverse proxy server... Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: the configuration file /etc/opt/rh/rh-nginx... ok Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: configuration file /etc/opt/rh/rh-nginx112/...ful Mar 19 15:15:43 lemp-centos-222 systemd[1]: Started The nginx HTTP and reverse proxy server. Hint: Some lines were ellipsized, use -l to show in full.

      На данный момент ваш сервер может иметь уязвимость и позволять осуществлять несанкционированный доступ для неавторизованных пользователей. Чтобы устранить эту уязвимость, настройте брандмауэр с помощью firewalld. Возможно, вам потребуется сначала установить firewalld, воспользовавшись для этого следующей командой:

      • sudo yum install firewalld

      После этого вы сможете запустить службу firewalld:

      • sudo systemctl start firewalld

      Затем добавьте ряд правил брандмауэра, чтобы разрешить доступ SSH-доступ к вашему серверу и подключение через HTTP и HTTPS к Nginx:

      • sudo firewall-cmd --permanent --add-service=ssh
      • sudo firewall-cmd --zone=public --permanent --add-service=http
      • sudo firewall-cmd --zone=public --permanent --add-service=https

      Перезапустите firewalld для вступления в силу новых правил брандмауэра:

      • sudo firewall-cmd --reload

      Подробнее о firewalld см. в статье Настройка брандмауэра с помощью FirewallD в CentOS 7.

      После добавления этих новых правил брандмауэра вы можете проверить, запущен ли сервер, указав в браузере доменное имя вашего сервера или открытый IP-адрес.

      Если у вас нет доменного имени, указывающего на ваш сервер, и вы не знаете открытый IP-адрес вашего сервера, вы можете найти его, введя в терминал следующую команду:

      Введите полученный IP-адрес в адресную строку браузера, в результате чего вы должны увидеть используемую по умолчанию начальную страницу Nginx:

      http://server_domain_or_IP
      

      Страница Nginx по умолчанию

      Если вы видите эту страницу, это значит, что вы успешно установили Nginx. Перед продолжением активируйте запуск Nginx при загрузке сервера с помощью следующей команды:

      • sudo systemctl enable rh-nginx112-nginx

      Сервер Nginx установлен, и теперь вы можете перейти к установке программного обеспечения для работы с базами данных MariaDB.

      Шаг 3 — Установка MariaDB для управления данными сайта

      Теперь, когда у нас есть веб-сервер, пришло время установить MariaDB, упрощенную версию MySQL, используемую для хранения данных вашего сайта и управления ими.

      Установите MariaDB с помощью следующей команды. Снова замените выделенное значение номером версии, которую вы хотите установить, самый большой номер является номером самой последней версии (102 на момент написания):

      • sudo yum install rh-mariadb102

      После завершения установки запустите службу MariaDB с помощью следующей команды:

      • sudo systemctl start rh-mariadb102-mariadb

      После этого службу MariaDB можно считать установленной и запущенной. Однако ее настройка еще не завершена.

      Для обеспечения безопасности MariaDB устанавливается вместе с скриптом безопасности, который напоминает вам о необходимости изменения небезопасных настроек по умолчанию. Запустите скрипт, введя следующую команду:

      • source /opt/rh/rh-mariadb102/enable
      • mysql_secure_installation

      Вам потребуется ввести ваш текущий пароль root. Так как вы только что установили MySQL, у вас нет пароля, поэтому оставьте это поле пустым и нажмите ENTER. После этого вам будет предложено установить пароль root. Введите Y и следуйте этим инструкциям:

      . . .
      Enter current password for root (enter for none):
      OK, successfully used password, moving on...
      
      Setting the root password ensures that nobody can log into the MariaDB
      root user without the proper authorization.
      
      Set root password? [Y/n] Y
      New password: password
      Re-enter new password: password
      Password updated successfully!
      Reloading privilege tables..
       ... Success!
      . . .
      

      Для остальных вопросов нажмите клавишу ENTER для использования значения по умолчанию. В результате вы должны удалить ряд анонимных пользователей и тестовую базу данных, отключить возможность удаленного входя для root и загрузить эти новые правила, чтобы MariaDB немедленно использовала внесенные нами изменения.

      Последнее, что нужно сделать, — это активировать для MariaDB запуск при загрузке сервера. Для этого используйте следующую команду:

      • sudo systemctl enable rh-mariadb102-mariadb

      В данный момент ваша система базы данных настроена, и вы можете переходить к настройке PHP на своем сервере.

      Шаг 4 — Установка и настройка PHP

      Теперь у вас есть Nginx для обслуживания ваших страниц и MariaDB для хранения и управления данными, однако у вас до сих пор не установлено ПО, которое может генерировать динамическое содержание. Именно для этого и нужен PHP.

      Поскольку Nginx не поддерживает нативную обработку PHP, как некоторые другие веб-серверы, вам потребуется установить php-fpm, т.е. «менеджер процессов fastCGI». Затем вы должны будете настроить Nginx, чтобы передавать PHP-запросы этому программному продукту.

      Установите этот модуль, а также захватите пакет helper, который позволит PHP обмениваться информацией с ПО, отвечающим за работу базы данных. При установке будут загружены необходимые файлы ядра PHP. Введите следующее:

      • sudo yum install rh-php71-php-fpm rh-php71-php-mysqlnd

      Компоненты PHP теперь установлены, но вам нужно внести небольшое изменение в файлы конфигурации для укрепления безопасности вашей настройки.

      Откройте главный файл конфигурации php.ini с правами root:

      • sudo vi /etc/opt/rh/rh-php71/php.ini

      В этом файле вам нужно найти параметр, который устанавливает значение для cgi.fix_pathinfo. Он будет закомментирован с помощью точки с запятой (;) и имеет значение «1» по умолчанию.

      Это крайне небезопасная конфигурация, потому что данный параметр заставляет PHP выполнять самый ближайший файл, если PHP не удастся найти запрошенный файл. Это позволит пользователям создавать запросы PHP таким образом, чтобы они могли выполнять скрипты, которые они не имеют права выполнять.

      Измените оба эти условия, разкомментировав строку и установив значение «0»:

      71/php.ini’>/etc/opt/rh/rh-php71/php.ini

      cgi.fix_pathinfo=0
      

      Сохраните и закройте файл после завершения редактирования (нажмите ESC, введите :wq, а затем нажмите ENTER).“”

      Теперь откройте файл конфигурации php-fpm по адресу www.conf​​​​:

      • sudo vi /etc/opt/rh/rh-php71/php-fpm.d/www.conf

      По умолчанию этот файл настроен для работы с сервером Apache. Поскольку на вашем сервере установлен Nginx, найдите строки, которые устанавливают user и group и измените их значения с «apache» на «nginx»:

      71/php-fpm.d/www.conf’>/etc/opt/rh/rh-php71/php-fpm.d/www.conf

      user = nginx
      group = nginx
      

      Затем сохраните и закройте файл.

      Теперь запустите процессор PHP с помощью следующей команды:

      • sudo systemctl start rh-php71-php-fpm

      Активируйте запуск php-fpm при загрузке:

      • sudo systemctl enable rh-php71-php-fpm

      Поздравляем, вы успешно установили PHP на свой сервер. Однако он должен быть настроен для работы с другим ПО, которое вы установили, чтобы позволить вашему серверу корректно обслуживать содержание вашего сайта.

      Шаг 5 — Настройка Nginx для использования процессора PHP

      На данный момент у вас есть все необходимые компоненты стека LEMP. Вам осталось внести последнее изменение конфигурацию, чтобы сообщить Nginx о необходимости использовать процессор PHP для динамического содержания.

      Это изменение конфигурации выполняется уровне блока server (блоки сервера похожи на виртуальные хосты в Apache). Откройте файл конфигурации сервера Nginx по умолчанию, введя следующую команду:

      • sudo vi /etc/opt/rh/rh-nginx112/nginx/nginx.conf

      Раскомментируйте блок location ~ .php$ (сегмент файла, обрабатывающий запросы PHP и находящийся внутри блока server) и его содержимое, удалив символ решетки (#) в начале строки. Также вам нужно обновить параметр fastcgi_param и указать значение SCRIPT FILENAME $document_root$fastcgi_script_name. Это позволит PHP узнать местоположение документа root, где он сможет найти файлы для обработки.

      После внесения необходимых изменений блок server будет выглядеть следующим образом:

      /etc/nginx/sites-available/default

      ...
      server {
          listen       80 default_server;
          listen       [::]:80 default_server;
          server_name  _;
          root         /opt/rh/rh-nginx112/root/usr/share/nginx/html;
      
          # Load configuration files for the default server block.
          include      /etc/opt/rh/rh-nginx112/nginx/default.d/*.conf;
      
          location / {
          }
      
          error_page 404 /404.html;
          location = /40x.html {
          }
      
          error_page 500 502 503 504  /50x.html;
          location = /50x.html {
          }
      
          # proxy the PHP scripts to Apache listening on 127.0.0.1:80
          #
          #location ~ .php$ {
          #    proxy_pass   http://127.0.0.1;
          #}
      
          # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
          #
          location ~ .php$ {
              root           html;
              fastcgi_pass   127.0.0.1:9000;
              fastcgi_index  index.php;
              fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
              include        fastcgi_params;
          }
      
          # deny access to .htaccess files, if Apache's document root
          # concurs with nginx's one
          #
          #location ~ /.ht {
          #    deny  all;
          #}
      }
      ...
      

      После внесения необходимых изменений вы можете сохранить файл и закрыть редактор.

      Теперь проверьте файл конфигурации на ошибки синтаксиса, запустив следующую команду:

      • source /opt/rh/rh-nginx112/enable
      • sudo nginx -t

      При появлении сообщений о каких-либо ошибках, вернитесь и повторно проверьте ваш файл, прежде чем продолжать.

      После подтверждения корректности файла конфигурации перезагрузите Nginx, чтобы внесенные вами изменения вступили в силу:

      • sudo systemctl reload rh-nginx112-nginx

      Теперь, когда Nginx, PHP и MariaDB были установлены и настроены, осталось только подтвердить, что настройка стека LEMP способна корректно предоставлять содержание для посетителей вашего сайта.

      Шаг 6 — Создание файла PHP для тестовой конфигурации

      Ваш стек LEMP полностью настроен, и вы можете протестировать его, чтобы убедиться, что Nginx может корректно предоставлять файлы .php вашему процессору PHP. Для этого мы создадим тестовый файл PHP в корневой директории документа.

      Откройте новый файл с названием info.php внутри корневой директории документа:

      • sudo vi /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

      Добавьте в новый файл следующую строку. Это корректный код PHP, который будет возвращать информацию о вашем сервере:

      112/root/usr/share/nginx/html/info.php’>/opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

      <?php phpinfo(); ?>
      

      После завершения редактирования сохраните и закройте файл. Затем откройте эту страницу в браузере, указав в адресной строке доменное имя вашего сервера или открытый IP-адрес и добавив /info.php:

      http://server_domain_or_IP/info.php
      

      Вы увидите веб-страницу, сгенерированную PHP, с информацией о вашем сервере:

      Страница PHP с информацией

      Если ваша страница выглядит таким образом, вам удалось успешно реализовать обработку PHP с помощью Nginx.

      После подтверждения того, что Nginx корректно отображает страницу, рекомендуется удалить созданный вами файл, поскольку он может дать неавторизованным пользователям определенную информацию о вашей конфигурации, которая может быть использована при попытке взлома. При необходимости вы всегда сможете восстановить этот файл.

      Удалите файл, введя следующую команду:

      • sudo rm /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

      Вы успешно подтвердили, что все компоненты стека LEMP установлены и настроены корректно на вашем сервере.

      Заключение

      Теперь у вас в распоряжении есть полностью настроенный стек LEMP на вашем сервере с CentOS 7. Он будет служить гибкой основой для предоставления веб-контента вашим посетителям.

      SCL также используется для установки различных версий программного обеспечения и переключения между ними. Вы можете просмотреть список всех установленных в системе коллекций с помощью следующей команды:

      Дополнительную информацию о Software Collections вы можете найти на официальном сайте.



      Source link

      Cómo instalar y configurar una pila LEMP usando Software Collections en CentOS 7


      El autor seleccionó la Apache Software Foundation para recibir una donación de $100 como parte del programa Write for DOnations.

      Introducción

      Una pila de software LEMP es un grupo de software de código abierto que se instala normalmente en conjunto para permitir que un servidor hospede sitios web dinámicos y aplicaciones web. Este término es realmente un acrónimo que representa el sistema operativo de Linux y el servidor web de ENginx (que sustituye al componente Apache de una pila LAMP). Los datos del sitio se almacenan en una base de datos de MySQL (utilizando MariaDB) y el contenido dinámico se procesa mediante PHP.

      Los componentes de pilas LEMP a veces se instalan usando el repositorio de EPEL de CentOS 7. Sin embargo, este repositorio contiene paquetes obsoletos. Por ejemplo, no puede instalar ninguna versión de PHP superior a la 5.4.16 desde EPEL, aunque no exista soporte para esta versión desde hace mucho tiempo. Para obtener las versiones más recientes del software, se recomienda que utilice Software Collections, también conocido como “SCLs”. Las SCL son recopilaciones de recursos para desarrolladores proporcionadas por RedHat que le permiten usar varias versiones de software en el mismo sistema sin afectar paquetes previamente instalados.

      En esta guía, instalará una pila LEMP en un servidor de CentOS 7. El sistema operativo CentOS se ocupa del componente Linux. Instalará el resto de los componentes usando el repositorio de Software Collections y luego podrá configurarlos para una página web simple.

      Requisitos previos

      Antes de iniciar este tutorial, debe configurar el servidor de CentOS 7 siguiendo la guía de configuración inicial del servidor de CentOS 7 e incluir un usuario sudo no root.

      Paso 1: Habilitación del repositorio de Software Collections

      Si desea obtener acceso a SCLs para CentOS, instale el archivo de versión de Linux Software Collections de CentOS:

      • sudo yum install centos-release-scl

      Consulte la lista de paquetes SCL disponibles usando el siguiente comando:

      • yum --disablerepo='*' --enablerepo='centos-sclo-rh' --enablerepo='centos-sclo-sclo' list available

      Para evitar conflictos en todo el sistema, los paquetes SCL se instalan en el directorio /opt/rh. Esto le permite, por ejemplo, instalar Python 3.5 en una máquina con CentOS 7 sin eliminar Python 2.7 ni interferir con su funcionamiento.

      Todos los archivos de configuración para paquetes de SCLs se almacenan en el directorio correspondiente dentro del directorio /etc/opt/rh/. Los paquetes de SCLs proporcionan scripts de shell que definen las variables de entorno necesarias para usar las aplicaciones incluidas. Por ejemplo, PATH, LD_LIBRARY_PATH y MANPATH. Estos scripts se almacenan en el sistema de archivos como /opt/rh/nombre del paquete/enable.

      Con esto, estará listo para comenzar a instalar los paquetes indicados en esta guía.

      Paso 2: Instalación del servidor web Nginx

      Para mostrar páginas web a los visitantes vamos a emplear Nginx, un servidor web moderno y eficiente.

      Instale Nginx usando el siguiente comando yum. Asegúrese de sustituir el valor resaltado por la versión de Nginx que desee instalar; el número más alto en el nombre del paquete corresponderá a la versión más reciente (112 en el momento en que se redactó este artículo):

      • sudo yum install rh-nginx112

      Una vez terminada la instalación, inicie el servicio Nginx:

      • sudo systemctl start rh-nginx112-nginx

      Confirme que Nginx esté en ejecución ingresando el comando systemctl status:

      • sudo systemctl status rh-nginx112-nginx

      Output

      ● rh-nginx112-nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/rh-nginx112-nginx.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2018-03-19 15:15:43 UTC; 1min 17s ago Main PID: 10556 (nginx) CGroup: /system.slice/rh-nginx112-nginx.service ├─10556 nginx: master process /opt/rh/rh-nginx112/root/usr/sbin/nginx ├─10557 nginx: worker process └─10558 nginx: worker process Mar 19 15:15:43 lemp-centos-222 systemd[1]: Starting The nginx HTTP and reverse proxy server... Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: the configuration file /etc/opt/rh/rh-nginx... ok Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: configuration file /etc/opt/rh/rh-nginx112/...ful Mar 19 15:15:43 lemp-centos-222 systemd[1]: Started The nginx HTTP and reverse proxy server. Hint: Some lines were ellipsized, use -l to show in full.

      En este momento, su servidor podría estar expuesto a accesos por parte de usuarios no autorizados. Para corregir esto, configure un firewall usando firewalld. Quizá necesite instalar primero firewalld. Puede hacerlo con el siguiente comando:

      • sudo yum install firewalld

      Luego, inicie el servicio firewalld:

      • sudo systemctl start firewalld

      A continuación, añada algunas reglas de firewall para permitir el acceso de SSH a su servidor y conexiones HTTP y HTTPS con Nginx:

      • sudo firewall-cmd --permanent --add-service=ssh
      • sudo firewall-cmd --zone=public --permanent --add-service=http
      • sudo firewall-cmd --zone=public --permanent --add-service=https

      Vuelva a cargar firewalld para implementar las nuevas reglas de firewall:

      • sudo firewall-cmd --reload

      Encontrará más información sobre firewalld en la sección Cómo configurar un firewall usando FirewallD en CentOS 7.

      Una vez agregadas estas nuevas reglas, podrá probar si el servidor se encuentra en ejecución accediendo al nombre de dominio o a la dirección IP pública de su servidor en su navegador web.

      Si no tiene un nombre de dominio para su servidor y no conoce la dirección IP pública de este, puede encontrarla escribiendo lo siguiente en su terminal:

      Escriba la dirección IP resultante en la barra de dirección de su navegador web. Con esto, deberá poder ver la página de inicio predeterminada de Nginx:

      http://server_domain_or_IP
      

      Página predeterminada de Nginx

      Si ve esta página, significa que instaló Nginx correctamente. Antes de continuar, habilite Nginx para que comience a funcionar en el inicio usando el siguiente comando:

      • sudo systemctl enable rh-nginx112-nginx

      El servidor Nginx ya está instalado. Ahora puede proceder a instalar el software de base de datos MariaDB.

      Paso 3: Instalación de MariaDB para gestionar datos de sitios

      Ahora que contamos con un servidor web, es el momento de instalar MariaDB, un reemplazo a medida de MySQL, para almacenar y administrar los datos de su sitio.

      Instale MariaDB con el comando que se muestra a continuación. Una vez más, reemplace el valor señalado por el número de versión que desee instalar; el número más alto corresponde a la versión más reciente disponible (102, en el momento en que se redactó este artículo):

      • sudo yum install rh-mariadb102

      Una vez que se complete la instalación, inicie el servicio MariaDB con el siguiente comando:

      • sudo systemctl start rh-mariadb102-mariadb

      Con esto, MariaDB quedará instalado y en funcionamiento. No obstante, faltará completar su configuración.

      Para proteger la instalación, MariaDB incorpora un script de seguridad que solicita modificar algunos ajustes no seguros predeterminados. Ejecute el script escribiendo lo siguiente:

      • source /opt/rh/rh-mariadb102/enable
      • mysql_secure_installation

      El mensaje solicitará su contraseña root actual. Puesto que acaba de instalar MySQL, es probable que no disponga de una. Podrá dejar el campo en blanco presionando ENTER. Luego se le preguntará si desea configurar una contraseña root. Introduzca Y y siga las instrucciones:

      . . .
      Enter current password for root (enter for none):
      OK, successfully used password, moving on...
      
      Setting the root password ensures that nobody can log into the MariaDB
      root user without the proper authorization.
      
      Set root password? [Y/n] Y
      New password: password
      Re-enter new password: password
      Password updated successfully!
      Reloading privilege tables..
       ... Success!
      . . .
      

      Para el resto de las preguntas, presione la tecla ENTER en cada mensaje para aceptar los valores predeterminados. Con esto, se eliminarán algunos usuarios anónimos y la base de datos de prueba, se deshabilitarán las credenciales de inicio de sesión remoto de root y se cargarán estas nuevas reglas para que MariaDB aplique de inmediato los cambios que realizamos.

      Lo último que se debe hacer aquí es habilitar MariaDB para que se ejecute en el inicio. Utilice el siguiente comando para hacerlo:

      • sudo systemctl enable rh-mariadb102-mariadb

      En este punto, su sistema de base de datos estará configurado y podrá proceder a configurar PHP en su servidor.

      Paso 4: Instalación y configuración de PHP para procesamiento

      Ya tiene instalados Nginx para sus páginas y MariaDB para el almacenamiento y la administración de sus datos. Sin embargo, aún le falta instalar una herramienta que pueda generar contenido dinámico. Es el momento de PHP.

      Dado que Nginx no contiene procesamiento PHP nativo como otros servidores web, deberá instalar php-fpm, que significa “administrador de proceso de fastCGI”. Más adelante, configurará Nginx para que transmita solicitudes PHP a este software para su procesamiento.

      Instale este módulo y también use un paquete helper que permitirá la comunicación de PHP con el backend de su base de datos. La instalación extraerá los archivos principales de PHP necesarios. Podrá ejecutarla escribiendo lo siguiente:

      • sudo yum install rh-php71-php-fpm rh-php71-php-mysqlnd

      De esta manera, sus componentes PHP quedarán instalados. Sin embargo, existe un ligero cambio de configuración que debería realizar para reforzar la seguridad de su configuración.

      Abra el archivo de configuración de php.ini principal con privilegios root:

      • sudo vi /etc/opt/rh/rh-php71/php.ini

      En este archivo, busque el parámetro que configura cgi.fix_pathinfo. Este se comentará con un punto y coma (;) y se fijará en “1” por defecto.

      Este ajuste es extremadamente inseguro porque indica a PHP que intente ejecutar el archivo más cercano que pueda encontrar si no se puede hallar el archivo PHP solicitado. Básicamente, esto permitiría a los usuarios realizar solicitudes PHP de una forma que haría posible la ejecución scripts que no deberían poder ejecutar.

      Cambie ambas condiciones eliminando los comentarios de la línea y fijando su valor en “0”, como se muestra aquí:

      71/php.ini’>/etc/opt/rh/rh-php71/php.ini

      cgi.fix_pathinfo=0
      

      Guarde y cierre el archivo cuando termine (presione ESC, ingrese :wq y luego presione Enter).

      A continuación, abra el archivo de configuración de php-fpm www.conf:

      • sudo vi /etc/opt/rh/rh-php71/php-fpm.d/www.conf

      Por defecto, este archivo está configurado para usarse con el servidor Apache. Dado que su servidor tiene Nginx instalado, encuentre las líneas que configuran user y group y cambie sus valores de “apache” a “nginx”:

      71/php-fpm.d/www.conf’>/etc/opt/rh/rh-php71/php-fpm.d/www.conf

      user = nginx
      group = nginx
      

      Luego, guarde y cierre el archivo.

      A continuación, inicie su procesador PHP escribiendo lo siguiente:

      • sudo systemctl start rh-php71-php-fpm

      Luego habilite php-fpm para que se ejecute en el inicio:

      • sudo systemctl enable rh-php71-php-fpm

      Con esto, PHP quedará correctamente instalado en su servidor. Sin embargo, deberá configurarlo para complementarse con el otro software que instaló, de modo que su servidor funcione correctamente con el contenido de su sitio.

      Paso 5: Configuración de Nginx para usar el procesador PHP

      En este punto, ya tendrá instalados todos los componentes requeridos de una pila LEMP. En el nivel de la configuración, el único cambio que aún debe hacer es indicarle a Nginx que utilice su procesador PHP para contenido dinámico.

      Este cambio de configuración se realiza en el nivel de bloque del servidor (los bloques de servidor son similares a los hosts virtuales de Apache). Abra el archivo predeterminado de configuración de bloques del servidor Nginx escribiendo lo siguiente:

      • sudo vi /etc/opt/rh/rh-nginx112/nginx/nginx.conf

      Elimine los comentarios del bloque de ubicación ~ .php$ (el segmento del archivo que se ocupa de las solicitudes PHP, que se encuentra dentro del bloque del server) y su contenido borrando los símbolos de numeral (#) del principio de cada línea. También debe actualizar la opción fastcgi_param a SCRIPT FILENAME $document_root$fastcgi_script_name. Esto informa a PHP sobre la ubicación de la raíz del documento donde puede encontrar archivos para procesar.

      Una vez realizados los cambios necesarios, el bloque del server tendrá este aspecto:

      /etc/nginx/sites-available/default

      ...
      server {
          listen       80 default_server;
          listen       [::]:80 default_server;
          server_name  _;
          root         /opt/rh/rh-nginx112/root/usr/share/nginx/html;
      
          # Load configuration files for the default server block.
          include      /etc/opt/rh/rh-nginx112/nginx/default.d/*.conf;
      
          location / {
          }
      
          error_page 404 /404.html;
          location = /40x.html {
          }
      
          error_page 500 502 503 504  /50x.html;
          location = /50x.html {
          }
      
          # proxy the PHP scripts to Apache listening on 127.0.0.1:80
          #
          #location ~ .php$ {
          #    proxy_pass   http://127.0.0.1;
          #}
      
          # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
          #
          location ~ .php$ {
              root           html;
              fastcgi_pass   127.0.0.1:9000;
              fastcgi_index  index.php;
              fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
              include        fastcgi_params;
          }
      
          # deny access to .htaccess files, if Apache's document root
          # concurs with nginx's one
          #
          #location ~ /.ht {
          #    deny  all;
          #}
      }
      ...
      

      Cuando realice los cambios, podrá guardar el archivo y salir del editor.

      A continuación, pruebe someta a prueba su archivo de configuración en busca de errores de sintaxis ejecutando los siguientes comandos:

      • source /opt/rh/rh-nginx112/enable
      • sudo nginx -t

      Si se notifica algún error, vuelva a revisar su archivo antes de continuar.

      Una vez que su archivo de configuración sea válido, vuelva a cargar Nginx para implementar los cambios que realizó:

      • sudo systemctl reload rh-nginx112-nginx

      Ahora que Nginx, PHP y MariaDB se han instalado y configurado, solo queda confirmar que la configuración de pila LEMP pueda facilitar correctamente el contenido a los visitantes de su sitio.

      Paso 6: Creación de un archivo PHP para probar la configuración

      Su pila LEMP ahora está completamente configurada y puede probarla para validar que Nginx pueda proporcionar archivos .php a su procesador PHP correctamente. Esto se realiza creando un archivo PHP de prueba en la raíz de nuestro documento.

      Abra un nuevo archivo llamado info.php dentro de la raíz del documento:

      • sudo vi /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

      Añada al archivo la línea que se muestra a continuación. En ella se incluye código PHP válido que mostrará información sobre su servidor:

      112/root/usr/share/nginx/html/info.php’>/opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

      <?php phpinfo(); ?>
      

      Cuando termine, guarde y cierre el archivo. Luego, visite esta página en su navegador web usando el nombre de dominio o la dirección IP pública de su servidor seguidos de /info.php:

      http://server_domain_or_IP/info.php
      

      Verá una página web generada por PHP con información sobre su servidor:

      Información de página de PHP

      Si ve una página con este aspecto, significa que habrá configurado el procesamiento de PHP con Nginx de forma satisfactoria.

      Tras verificar que Nginx represente la página de forma correcta, la mejor opción será eliminar el archivo que creó porque puede dar indicios sobre su configuración que podrían ser útiles para que usuarios no autorizados intenten ingresar. Siempre puede regenerar este archivo si lo necesita más adelante.

      Elimine el archivo escribiendo lo siguiente:

      • sudo rm /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

      Con esto, confirmará que todos los componentes de la pila LEMP se instalaron y configuraron correctamente en su servidor.

      Conclusión

      Ahora contará con una pila LEMP totalmente segura en su servidor CentOS 7. Esto le proporcionará una base muy flexible para proporcionar contenido web a sus visitantes.

      Las SCLs también se utilizan para instalar varias versiones de software y alternar entre ellas. Puede ver la lista de todas las colecciones instaladas en el sistema ejecutando lo siguiente:

      Si le interesa, podrá encontrar más información sobre Software Collections en el sitio oficial.



      Source link