Итак, цель - создать локальный HTTPS-прокси, который в дальнейшем можно было бы программировать.
Для начала я сделал просто HTTP-прокси (без ssl) и все работало, выглядит это примерно так:
services:
nginx:
image: nginx
ports:
- "8000:80"
- "4430:443"
volumes:
- ./:/var/www/app
- ./vhost.conf:/etc/nginx/conf.d/default.conf
php:
image: php:8.2-fpm
volumes:
- ./:/var/www/app
server {
listen 80;
server_name _;
root /var/www/app;
index index.php;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
internal;
}
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$_SERVER[REQUEST_SCHEME]://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, $_SERVER['REQUEST_METHOD'] == 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents('php://input'));
curl_setopt($ch, CURLOPT_HTTPHEADER, prepare_http_headers(get_http_headers()));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
function get_http_headers(): array
{
$headers = [];
foreach ($_SERVER as $key => $value) {
if (substr($key, 0, 5) == 'HTTP_') {
$headers[strtr(ucwords(strtolower(substr($key, 5)), '_'), '_', '-')] = $value;
}
}
return $headers;
}
function prepare_http_headers(array $headers): array
{
$result = [];
foreach ($headers as $key => $value) {
$result[] = "$key: $value";
}
return $result;
}
Но как только я хочу сделать https прокси, то запрос до php-fpm даже не доходит, а в логах nginx я вижу что-то такое:
nginx | 172.23.0.1 - - [03/Jul/2023:23:15:58 +0000] "CONNECT dynupdate.no-ip.com:443 HTTP/1.1" 400 157 "-" "-"
Сам конфиг nginx выглядит так:
server {
listen 443 ssl http2;
server_name _;
root /var/www/app;
index server.php;
ssl_certificate /var/www/app/localhost.pem;
ssl_certificate_key /var/www/app/localhost-key.pem;
location / {
try_files $uri /server.php$is_args$args;
}
location ~ ^/server\.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
internal;
}
}
Сертификаты сгенерены через mkcert.