#NGINX

2026-03-06

Finally got goacces to do proper GeoIP reporting on my webserver logs to help show where in the world my traffic is coming from for the last 14 days.

It's also doing ASN breakdowns so I can try and see who is pulling the data.

#homelab #nginx #GeoIP

Map of the world with different countries shaded at different levels of darkness showing relative volume of traffic
mastodon.raddemo.hostadmin@mastodon.raddemo.host
2026-03-06

How to Setup a Reverse #Proxy with HTTPS Using #Nginx and #Certbot (5 Minute Quick-Start Guide)

This article outlines how to setup a reverse proxy with HTTPS using Nginx and Certbot.
What is a Reverse Proxy?
A reverse proxy is a server that sits between client devices and a backend server, forwarding client requests to the backend server and returning the server's response to the clients. Unlike a forward proxy, ...
Continued 👉 blog.radwebhosting.com/setup-a #proxyserver #letsencrypt #reverseproxy

:apa: スプリットショックウイルス †splitshockvirus@mstdn.starnix.network
2026-03-06

@eric This is what I look like when doing #maintenance on my #fediverse #instance and definately not #crashing #out about why

proxy_set_header X-Forwarded-Proto $scheme;

needs to 🐝 changed to

proxy_set_header X-Forwarded-Proto https;

in my #nginx config

2026-03-06
Esto solo es un script bash para tener una idea de cuantos lectores RSS se tienen.

Introducción

Esto es solo un proyecto rápido originado por la curiosidad que me dio el post de Manuel Moreale sobre cuantos le leen por lectores RSS, el cual también es una reacción a un post de Kev sobre como los lectores leen sus contenidos. Ambos han recurrido a formularios y han obtenido sus resultados, siendo que Manuel Moreale incluso añadió datos técnicos sacados de sus Logs, con lo que tuve la idea de evitar los formularios e ir directo a los Logs.
Entiendo que hago esto desde una posición de privilegio del conocimiento. Después de todo, tengo acceso a mis logs y puedo procesarlos a gusto. Compartiré el código con el fin de que otros puedan usarlo y si asi lo desean, contribuir con ideas para mejorarlo, pero eso también beneficiaria solo a los que tengan acceso a sus Logs. Tampoco es para tanto. Si sale bien, se me podría ocurrir una idea para que sea mas fácil de utilizar.
Los logs de nginx/apache son abrumadores. Ya antes tuve que segmentarlos para no perderme entre tanta cosa, separando los logs por subdominios. Aun así, la cantidad de trafico kk es abrumadora. Hay demasiados bots, crawlers y personas con intenciones sospechosas, y leerlos da flojera. Es demasiado que analizar. Desde hace rato, he estado intentando de entender comandos de linux que ayuden a procesar texto. La verdad, las herramientas existentes, aunque cripticas, son asombrosas. Mira la velocidad en la que trabajan con grandes volúmenes de datos y el resultado siempre es excelente. Me salvé gracias a esto para segmentar archivos SQL y ahora lo aprovecharé para este breve experimento.

Descripción del Problema

En teoría, suena sencillo. Solo necesito recopilar los datos de la URL /feed que es donde publica mi blog de WordPress los Feeds RSS. En teoría, solo los lectores RSS deberían visitar esa URL pero ya sabes, ahi estan metidos los bots y crawlers todo el tiempo, asi que es muy fácil inflar las estadísticas con datos que no queremos. También, aunque se ejecute el script de forma regular, corre el riesgo de captar datos repetidos inflando aun mas las estadísticas, así que, es necesario evitar datos repetidos. Para saber cuantos lectores RSS unicos visitan el sitio, lo mejor es hacer una asociacion entre la direccion IP y su User Agent de esta manera puedo generar un UID que permitiria sumar la estadistica de cuantos lectores RSS estan cargando mi contenido desde el Feed. Esto por supuesto, no es infalible. especialmente los Feeds que cambian la version en el nombre del User Agent, quedarian sumados como un lector adicional en lugar de ser unico. Otra cosa es que es difícil saber cual es un lector RSS y cual no. Como criterio de búsqueda, he determinado que este tenga las palabras RSS, Feed, Reader, SimplePie, W3C_Validator, TinyPRSS y NewsBlur en su user agent. Iré sumando ideas, pero hay demasiados. a veces pienso que hay mas lectores de RSS que blogs. Como curiosidad, también agregué patrones para identificar lectores del fediverso (teóricamente algunas plataformas como friendica, pueden seguir un sitio mediante los RSS) así que agregue los patrones de Mastodon, Pleroma, Friendica, PixelFed, Lemmy y ActivityPub. Por ultimo, bots. Todo lo que parezca bot (asumiendo que son honestos y dicen ser bots) con los patrones bot, googlebot, bingbot, slurp, duckduckbot, yandexbot, spider, crawl. Para este proceso hay que hacer algunos archivos temporales que serviran para el procesamiento de los datos.

Control-RSS

El script es sencillo en teoria. Tiene un monton de Regex, pero solo eso es lo unico intimidante. De hecho te animo a ayudarme a mejorarlo, aunque no se tampoco que interes habria en mejorarlo. Igual, Siguiendo el patrón que he aprendido al hacer el bot de Channel2RSS en el que se separa la configuración del programa, tengo un archivo de configuración, el cual debe llamarse config.conf, pero que dejo un ejemplo que añade la extensión .example.
# --- Configuración del Script ---LOG_FILE="/var/log/nginx/access.log" # Ruta a tu archivo de log principal# Si usas Apache, podría ser /var/log/apache2/access.log o similarURL_A_MONITORIZAR="/feed" # El script es principalmente para ver datos de RSS, pero lo puedes modificar tu gustoOUTPUT_FILE="visitantes_unicos.json" # Archivo JSON de salida# --- Fin de Configuración ---
Antes de ejecutar el programa, debes asegurarte de que tienes instalado JQ, GnuPlot y AWK. JQ sirve para procesar JSON en la consola, GnuPlot para los graficos y AWK para el procesamiento de texto plano en los logs.
#!/bin/bash# 1. Cargar configuraciónif [ ! -f config.conf ]; then echo "Error: config.conf no encontrado"; exit 1; fisource ./config.conf

# Inicializar JSON si no existeif [ ! -f "$OUTPUT_FILE" ]; then
    echo '{"datos": [], "resumen": {}}' > "$OUTPUT_FILE"fiecho "Procesando logs de $LOG_FILE..."# 2. Extracción rápida con AWK
awk -v url="$URL_A_MONITORIZAR" '$7 == url || $7 ~ url {    split($4, t, /[:/]/);    fecha=t[1]"/"t[2]"/"t[3];    hora=t[4]":"t[5];    ua=""; for(i=12; i<=NF; i++) ua=(ua=="" ? $i : ua" "$i);    gsub(/"/, "", ua);    print $1 "|" fecha "|" hora "|" ua}' "$LOG_FILE" | sort -u > temp_data.txt

# 3. Actualización Incremental del JSONecho "Actualizando base de datos (evitando duplicados)..."while IFS="|" read -r ip fecha hora ua; do
    # ID Único: Asociación IP + Agente
    ID_UNICO=$(echo "${ip}${ua}" | md5sum | cut -d' ' -f1)
    
    # Clasificación de Agentes
    IS_RSS=$([[ "$ua" =~ (RSS|Feed|Reader|SimplePie|W3C_Validator|TinyPRSS|NewsBlur) ]] && echo "true" || echo "false")
    IS_FEDIVERSE=$([[ "$ua" =~ (Mastodon|Pleroma|Friendica|PixelFed|Lemmy|ActivityPub) ]] && echo "true" || echo "false")
    IS_BOT=$([[ "$ua" =~ (bot|googlebot|bingbot|slurp|duckduckbot|yandexbot|spider|crawl) ]] && echo "true" || echo "false")

    # Inserción segura con JQ (Solo si el UID no existe)
    jq --arg id "$ID_UNICO" --arg ip "$ip" --arg f "$fecha" --arg h "$hora" --arg ua "$ua" \
       --arg rss "$IS_RSS" --arg fedi "$IS_FEDIVERSE" --arg bot "$IS_BOT" \
    'if .datos | any(.[]; .uid == $id) then .      else .datos += [{"uid": $id, "ip": $ip, "fecha": $f, "hora": $h, "agente": $ua,           "es_rss": ($rss=="true"), "es_fedi": ($fedi=="true"), "es_bot": ($bot=="true")}] end' \
    "$OUTPUT_FILE" > "$OUTPUT_FILE.tmp" && mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE"done < temp_data.txt

# 4. Cálculo del Resumen (Corregido error de sintaxis)AHORA=$(date +"%Y-%m-%d %H:%M:%S")
jq --arg fecha_act "$AHORA" '.resumen = {    "total_visitantes_unicos": (.datos | length),    "usuarios_rss": ([.datos[] | select(.es_rss == true)] | length),    "usuarios_fediverso": ([.datos[] | select(.es_fedi == true)] | length),    "bots_crawlers": ([.datos[] | select(.es_bot == true)] | length),    "usuarios_estandar": ([.datos[] | select(.es_rss == false and .es_fedi == false and .es_bot == false)] | length),    "ultima_actualizacion": $fecha_act}' "$OUTPUT_FILE" > "$OUTPUT_FILE.tmp" && mv "$OUTPUT_FILE.tmp" "$OUTPUT_FILE"# 5. Generar Gráfica de Frecuencia
jq -r '.datos[].fecha' "$OUTPUT_FILE" | sort | uniq -c | awk '{print $2, $1}' > freq.dat
gnuplot <<EOFset terminal pngcairo size 800,400set output 'grafica_semanal.png'set title "Evolución de Visitantes Únicos"set xtics rotate by -45set style fill solidplot 'freq.dat' using 2:xtic(1) with boxes title "Visitas"EOF# 6. Generar Informe HTML
cat <<HTML > informe.html<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Análisis de Audiencia 2026</title>    <style>body{font-family:sans-serif; margin:40px; background:#f4f4f9;} .card{background:white; padding:20px; border-radius:8px; box-shadow:0 2px 5px rgba(0,0,0,0.1);}</style></head><body>    <div class="card">        <h1>Informe: $URL_A_MONITORIZAR</h1>        <p><b>Actualizado:</b> $(jq -r '.resumen.ultima_actualizacion' "$OUTPUT_FILE")</p>        <hr>        <ul>            <li>👤 <b>Visitantes Únicos:</b> $(jq '.resumen.total_visitantes_unicos' "$OUTPUT_FILE")</li>            <li>rss <b>Lectores RSS:</b> $(jq '.resumen.usuarios_rss' "$OUTPUT_FILE")</li>            <li>🌐 <b>Fediverso (Mastodon/Etc):</b> $(jq '.resumen.usuarios_fediverso' "$OUTPUT_FILE")</li>            <li>🤖 <b>Bots y Crawlers:</b> $(jq '.resumen.bots_crawlers' "$OUTPUT_FILE")</li>            <li>🖥️ <b>Navegadores Estándar:</b> $(jq '.resumen.usuarios_estandar' "$OUTPUT_FILE")</li>        </ul>        <img src="grafica_semanal.png" style="max-width:100%;">    </div></body></html>HTML

rm temp_data.txt freq.dat
echo "Proceso completado. Revisa informe.html y $OUTPUT_FILE"
De forma muy resumida, este código permite ir creando un archivo JSON que puedes usar a tu gusto de manera privada. Recuerda tener cuidado con esto pues contiene las IP de las personas que te siguen y probablemente ni ti ni ellos querrán que se divulgue esa información. Basado en este archivo JSON se genera una imagen con GNUPlot mediante simplemente contar las entradas por fechas. Por ultimo, Genera un archivo HTML que te permitirá ver de forma resumida visitantes unicos, lectores de RSS, Fediverso, Bots y Crawlers y Navegadores Estandares. Puedes poner estos dos últimos, la imagen y el archivo HTML, en un directorio publico de tu servidor, en mi caso como hice en el post de NextCloud y Aria2 usando NGinx para tener un directorio que puedo usar de forma publica sin que WordPress lo neutralice. En mi caso, estoy pensando en hacer una página para mostrar esta información, pero a modo de ejemplo, la dejaré aquí, incrustada como iframe como hice en la entrada de las galerías especiales. 

Conclusiones

El experimento es interesante. RSS es solo un archivo y no se le suele prestar mucha atención, así que en las estadísticas no suele contar cuantos lo utilizan y visto lo visto, es relativamente difícil sacar resultados apreciables a la hora de saber cuantos individuos lo usan para acceder al sitio. Para este ejercicio he intentado asociar la dirección IP con el user agent, con lo que se puede hacer una idea, pero la misma persona puede usar diferentes lectores en diferentes dispositivos, así sea la misma IP. He dejado este código en publico por si le interesa a alguien. Por supuesto, le he creado una entrada en mi repo git para poder clonarlo y usarlo por cualquiera que así lo desee. https://git.interlan.ec/Drk0027/control-rss ¿Deseas hacer algun comentario? Aqui hay una caja de comentarios que puedes utilizar. ¿Quieres contactarte conmigo? Por correo electronico por supuesto en drk0027@interlan.ec ¿Quieres profundizar en este tema? Vamos pal foro en forum.interlan.ec https://interlan.ec/blog/2026/03/06/proyecto-control-rss/ #Código #DIY #experimentos #linux #logs #nginx #programacion #proyecto #recursos #selfhosting #servidores
rss logo
mastodon.raddemo.hostadmin@mastodon.raddemo.host
2026-03-06

🚀 How to Deploy #Keycloak on #Ubuntu #VPS (5 Minute Quick-Start Guide)

Here’s a clear and detailed how-to guide for how to deploy Keycloak on Ubuntu VPS. This guide uses Keycloak in standalone mode with #PostgreSQL as the database and #NGINX as a reverse proxy with SSL.
What is Keycloak?
Keycloak is an open-source identity and access management (IAM) ...
Continued 👉 blog.radwebhosting.com/deploy- #opensource #reverseproxy #openjdk #letsencrypt #selfhosted #selfhosting #identitymanagement

mastodon.raddemo.hostadmin@mastodon.raddemo.host
2026-03-05

🚀 How to Deploy Open edX on #Ubuntu #VPS (1 Hour Quick-Start Guide)

This article provides a start-to-finish, production-ready guide demonstrating how to deploy Open edX on Ubuntu VPS. This follows the official Tutor-based deployment, which is the recommended, supported, and upgrade-safe method.
Overview
Open edX is a large, microservice-based ...
Continued 👉 blog.radwebhosting.com/deploy- #elearning #django #opensource #openedx #nginx #education #learningmanagementsystem #mongodb #letsencrypt

liilliilꙮ🏡:OrangePi:i@liilliil.ru
2026-03-04
поднимаю #WebDAV на #nginx

когда-то на #apache без проблем бегал, но мы жа захотели быть модными…
а ебаный nginx локи не делает искаропки, а макос такие сервера монтирует read only…
2026-03-03

I’m offering a “cheat sheet” of sorts to make it easy for potential Flarum testers/developers to quickly install a working #Flarum:
https://owleyes.blue/posts/debian13_flarum_2.0.0_beta7_install_w_postgresql/
#debian #OpenSource #Linux #Postgresql #nginx #SelfHosting #DevOps #forum #DataSovereignty

2026-03-03

Funnull Resurfaces: Exposing RingH23 Arsenal and MacCMS Supply Chain Attacks

The report details the resurgence of the Funnull cybercriminal group, now utilizing a new arsenal called RingH23. It exposes their tactics, including compromising GoEdge CDN nodes, poisoning the MacCMS supply chain, and deploying sophisticated malware components like Badredis2s, Badnginx2s, and Badhide2s. The group has expanded its operations to inject malicious JavaScript, hijack cryptocurrency transactions, and redirect traffic to fraudulent sites. The campaign's impact is estimated to affect millions of users daily. The report also highlights Funnull's use of a suspicious new CDN infrastructure, CDN1.AI, likely created to evade detection.

Pulse ID: 69a5cb4a6a4e3817035f5326
Pulse Link: otx.alienvault.com/pulse/69a5c
Pulse Author: AlienVault
Created: 2026-03-02 17:39:22

Be advised, this data is unverified and should be considered preliminary. Always do further verification.

#CDN #CyberSecurity #Edge #ICS #InfoSec #Java #JavaScript #Mac #Malware #Nginx #OTX #OpenThreatExchange #RAT #Redis #SupplyChain #bot #cryptocurrency #AlienVault

Fox Ritch :fjoxicon:🇩🇪fox@hostnetwork.xyz
2026-03-03

I need to clean up my nginx config. Theres so much old shit in there. Also the shitass ammount of goofy ahh comments i left in it is absurd.

#nginx #selfhosting

2026-03-03

Защита от DoS-атак в Angie (дополнительные средства)

В этой статье мы продолжаем разбирать возможности веб‑сервера Angie по борьбе с DoS (и немного DDoS) атаками. В предыдущей части мы разобрали стандартные средства, а в этой обсудим возможности сторонних модулей и системы Fail2Ban.

habr.com/ru/articles/1004388/

#angie #nginx #ddosзащита

2026-03-03

Почему я выкинул Nginx Proxy Manager и написал 5 скриптов: Nginx на стероидах

🚀 Nginx на автопилоте: Как я перестал тратить время на конфиги и SSL Бывает так: у тебя есть крутая идея для проекта, ты быстро кодишь бэкенд, но когда дело доходит до деплоя... Вечер превращается в бесконечную настройку Nginx, борьбу с Certbot, прописывание HSTS-заголовков и попытки вспомнить, как там правильно настраивается кеширование. Знакомо? Мне — да. Именно поэтому я собрал nginx-template — инструмент, который превращает администрирование сервера в удовольствие. 🛠 Это не просто набор файлов, это полноценный пульт управления вашим сервером через один скрипт — manage.sh . Почему вам стоит это попробовать: 🔹 Скорость деплоя: Добавление нового домена с автоматической выдачей Let's Encrypt занимает ровно одну команду. Без правок конфигов руками и перезагрузок. 🔹 Image Proxy из коробки: Хотите ресайзить аватарки на лету прямо через Nginx? Теперь это делается одной командой без сторонних микросервисов. 🔹 Умный CDN: Поднимайте кеширующие узлы для статики за секунды. Разгружайте основной сервер и радуйте пользователей мгновенной загрузкой. 🔹 Профессиональная безопасность: Конфиги уже оптимизированы под требования SSL Labs (рейтинг A+), включают защиту от эксплойтов и автообновление IP Cloudflare. Никаких тяжелых интерфейсов и лишних абстракций. Только чистый, производительный Nginx в Docker и удобная автоматизация на Bash. Вы сохраняете полный контроль над каждым байтом конфига, но избавляетесь от всей рутины. Пора тратить время на код, а не на настройку прокси. ⚡ 🔗 Забирайте готовый стек здесь: github.com/Arlandaren/nginx-template Понравился подход? Ставьте ⭐ на GitHub — это лучший способ сказать «спасибо» и поддержать развитие Open Source! Узнать больше

habr.com/ru/articles/1005816/

#nginx #docker #devops #ssl #automation #bash #reverse_proxy #cdn #security #vps

2026-03-01

Webinoly has been a stable part of the LEMP ecosystem since 2017. 🛠️

We’re opening a Partnership Program for creators with active, organic audiences. If you build high-quality #DevOps or #SelfHosted content, we want to support your work with full access and brand visibility.

High-performance stacks meet high-quality content. Let's grow together.

#Webinoly #Nginx #PHP #SysAdmin #Linux #OpenSource

2026-03-01

épisode 4 du TP #serveur #web Linux, édition 2026, spécial débutants en #sysadmin, aujourd'hui on cause de #conteneur #docker et de #reverseproxy tout de suite sur twitch.tv/ahp_nils #twitchfr #twitchstreamer #TwitchStreamers #debian #ubuntu #virtualisation #nginx

2026-03-01

Works great with #Unifi and #nginx and if you are interested, I rotated my IP after creating the screenshot. 😇

Client Info

Server: https://mastodon.social
Version: 2025.07
Repository: https://github.com/cyevgeniy/lmst