Введение

Захожу я как-то в админку своего интернет-магазина на OcStore (форк OpenCart) и вижу подобную картину.

Мда...
Мда...

Иду разбираться и вижу, что для загрузки валют ocStore обращается по адресу https://www.cbr.ru/scripts/XML_daily.asp. Открываю ссылку в браузере

Вот так показывается сайт ЦБ РФ в странах СНГ
Вот так показывается сайт ЦБ РФ в странах СНГ

Сервер, как и я, находится в Азербайджане. Дело – дрянь плохо. Искать нового поставщика подобных данных желания нет, да и не факт, что миграция пройдет без проблем. Вспомнил, что как-то для доступа на российские сайты после общеизвестных событий взял себе сервер в Королеве для OpenVPN. Захожу через него на сайт CBR – всё работает, а значит блокировка происходит по IP. Решил создать свой прокси-скрипт для доступа на сайт CBR на свободном домене. Собственно, об этом и пост.

Установка NGINX

Для начала направил A запись свободного домена (http://cbr.javidan.ru) на IP сервера. Далее, залогинился по SSH на сервер.

Обновил список репозиториев
sudo apt‑get update

Установил nginx
sudo apt-get install nginx

Проверил, работает ли nginx
sudo systemctl status nginx

Проверил правила для брандмауэра UFW
sudo ufw app list

Разрешил NGINX в UFW
sudo ufw allow ‘Nginx Full'

Перезагрузил UFW
sudo ufw reload

Открыл ссылку на домен в браузере и увидел приветствие NGINX:

Приветствие NGINX
Приветствие NGINX

Установка PHP 8.2

Для установки PHP 8.2 на Ubuntu 20.04 сначала надо добавить специальный репозиторий
sudo add-apt-repository ppa:ondrej/php
sudo apt update


Теперь можно установить PHP и нужные модули:
sudo apt install php8.2 php8.2-cli php8.2-curl php8.2-mbstring php8.2-xml

Для работы PHP с NGINX установил PHP-FPM
sudo apt install php8.2-fpm

Проверил работу php
php -v

Создание конфигурации для nginx

В папке /var/www создал директорию для поддомена /var/www/cbr
mkdir /var/www/cbr

Отключил defaultный сайт nginx:
rm /etc/nginx/sites-enabled/default

Создал конфиг для нового сайта
touch /etc/nginx/sites-available/cbr.conf

Отредактировал содержимое с помощью nano
nano /etc/nginx/sites-available/cbr.conf
и написал следующее содержимое:

server{   
  listen 80;  
  root /var/www/cbr;   
  index index.php;   
  autoindex off;   
  location ~ .php$ {     
    include snippets/fastcgi-php.conf;     
    fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;   
  }
}

Включил сайт:
ln /etc/nginx/sites-available/cbr.conf /etc/nginx/sites-enabled

Перезагрузил сервер nginx
sudo systemctl restart nginx

Создал папку /var/www/cbr/cache, в которую PHP будет сохранять кэшированную информацию с сайта ЦБ РФ:
mkdir /var/www/cbr/cache

Дал необходимые права для этой папки
sudo chown -R www-data:www-data /var/www/cbr/cache

Создание скрипта

Создал в папке /var/www/cbr файл index.php
touch /var/www/cbr/index.php


Ну и, написал подобный скрипт:
nano /var/www/cbr/index.php

<?php 
//узнаем дату
$today_date  = date("Y-m-d");
$cache_key = $_SERVER["DOCUMENT_ROOT"]."/cache/cache-$today_date.cache";
//проверим, существует ли у нас в кэше файл на эту дату,
//если информация закеширована - выдать её, если нет - запросить у ЦБ РФ.
if(!is_file($cache_key)){
    //С помощью CURL запросим информацию у ЦБ РФ
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'https://www.cbr.ru/scripts/XML_daily.asp');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($curl, CURLOPT_TIMEOUT, 30);
    $response = curl_exec($curl);
    curl_close($curl);
    //Закешируем
    file_put_contents($cache_key,$response);
}
//Прочитаем данные из кэша
$file_content = file_get_contents($cache_key);    
//Отправим заголовок с уточнением кодировки XML
header('Content-Type: text/xml; charset=windows-1251');
echo $file_content;

Осталось дело за малым - поменять в OcStore ссылку на ЦБ:

Ищу файл cbr.php в папке /admin/controller/extension/currency
Меняю https://www.cbr.ru/scripts/XML_daily.asp на адрес своего домена.

Ну вот и всё.