Chapter 10: Dynamic Website Hosting (PHP, Python, Node.js with MySQL)
10.6 Reverse proxy to the Python/Node app
Students in my class always ask: "Sir, my app runs on port 3000, so why not just open 3000 in the security group?" Look – the reverse proxy gives you port 80/443, TLS, logging and protection, and keeps the app private on 127.0.0.1. That is how it is done in real companies.
माझ्या क्लासमध्ये स्टुडंट्स नेहमी विचारतात: "सर, माझा ॲप पोर्ट 3000 वर चालतो, मग सिक्युरिटी ग्रुपमध्ये 3000 का ओपन करायचा नाही?" बघा – रिव्हर्स प्रॉक्सी तुम्हाला पोर्ट 80/443, TLS, लॉगिंग आणि संरक्षण देतो, आणि ॲप 127.0.0.1 वर प्रायव्हेट ठेवतो. खऱ्या कंपन्यांमध्ये असंच केलं जातं.
मेरी क्लास में स्टूडेंट्स हमेशा पूछते हैं: "सर, मेरा ऐप पोर्ट 3000 पर चलता है, तो सिक्योरिटी ग्रुप में 3000 क्यों नहीं ओपन करें?" देखो – रिवर्स प्रॉक्सी आपको पोर्ट 80/443, TLS, लॉगिंग और सुरक्षा देता है, और ऐप को 127.0.0.1 पर प्राइवेट रखता है. असली कंपनियों में ऐसे ही किया जाता है.
Nginx reverse proxy (all OSes)
Save as /etc/nginx/conf.d/app.conf on AL2023/CentOS, or /etc/nginx/sites-available/app (plus symlink into sites-enabled and remove default) on Ubuntu. Use port 5000 for Flask or 3000 for Node.
server {
listen 80;
server_name YOUR_SERVER_NAME; # public IP / domain (Ubuntu: use "listen 80 default_server;" and "server_name _;")
location / {
proxy_pass http://127.0.0.1:3000; # 5000 for Flask/Gunicorn
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade; # WebSocket support
proxy_set_header Connection "upgrade";
}
}
sudo nginx -t && sudo service nginx reload
sudo setsebool -P httpd_can_network_connect 1 # CentOS Stream 9 only - otherwise 502 Bad Gateway
Apache reverse proxy
<VirtualHost *:80>
ServerName mysite.local
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
ErrorLog logs/app_error.log
CustomLog logs/app_access.log combined
</VirtualHost>
- AL2023 / CentOS: save as
/etc/httpd/conf.d/app.conf(mod_proxyandmod_proxy_httpare loaded by default), thensudo apachectl configtest && sudo service httpd reload. On CentOS also runsudo setsebool -P httpd_can_network_connect 1. - Ubuntu: save as
/etc/apache2/sites-available/app.conf, change the log lines to${APACHE_LOG_DIR}/app_error.logand${APACHE_LOG_DIR}/app_access.log, thensudo a2enmod proxy proxy_http && sudo a2ensite app.conf && sudo a2dissite 000-default.conf && sudo service apache2 reload.
Ravindra Bagale's Tip
When you see 502 Bad Gateway, don't touch Nginx first. Run curl -I http://127.0.0.1:3000 (or 5000) on the server. If the app itself doesn't answer, the problem is in the app – check pm2 logs or journalctl -u <service>. Fix the backend, and the 502 goes away by itself.
Ravindra Bagale's Tip – मराठी
502 Bad Gateway दिसला की आधी Nginx ला हात लावू नका. Server वरcurl -I http://127.0.0.1:3000 (किंवा 5000) चालवा. App स्वतः उत्तर देत नसेल तर problem app मध्ये आहे – pm2 logs किंवा journalctl -u <service> बघा. Backend ठीक करा, आणि 502 आपोआप जातो.
Ravindra Bagale's Tip – हिंदी
502 Bad Gateway दिखे तो पहले Nginx को हाथ मत लगाओ. Server परcurl -I http://127.0.0.1:3000 (या 5000) चलाओ. App ख़ुद जवाब न दे तो problem app में है – pm2 logs या journalctl -u <service> देखो. Backend ठीक करो, और 502 अपने आप चला जाता है.
Lab
Chala, Node app sathi Nginx reverse proxy lava aani http://<PUBLIC_IP>/ ughda. Mag pm2 stop nodeapp karun page refresh kara aani 502 disto ka te bagha, curl -I http://127.0.0.1:3000 ne karan confirm kara, aani pm2 restart nodeapp ne app parat chalu kara.