Skip to content

Instantly share code, notes, and snippets.

@reinaldons
Last active June 15, 2020 13:47
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reinaldons/df7d5bdef704200eb2dc to your computer and use it in GitHub Desktop.
Save reinaldons/df7d5bdef704200eb2dc to your computer and use it in GitHub Desktop.
Flask + uWSGI + Nginx
# -*- coding: utf-8 -*-
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/')
def index():
return jsonify(request.headers)

Compilar o Nginx:

./configure --prefix=$HOME/Server/nginx --add-module=$HOME/Projects/ngx_http_geoip2_module --add-module=$HOME/Projects/lua-nginx-module --with-debug --with-http_realip_module
make
make install

Start:

$HOME/Server/nginx/sbin/nginx

Stop:

$HOME/Server/nginx/sbin/nginx -s stop
PID_FILE = '/tmp/flask_test_uwsgi.pid'
LOG_FILE = '/tmp/flask_test_uwsgi.log'
up:
uwsgi --ini uwsgi.ini --wsgi-file app.py --pidfile $(PID_FILE) --logto $(LOG_FILE) &
down:
uwsgi --stop $(PID_FILE)
#user nobody;
worker_processes 1;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
upstream flask_test {
server unix:/tmp/flask_test.wsgi.sock;
}
include uwsgi_params;
geoip2 /home/reinaldo/Server/MaxMind/GeoLite2-Country.mmdb {
$geoip2_data_country_code default=US country iso_code;
$geoip2_data_country_name country names en;
}
server {
listen 8080 default;
charset utf-8;
root /home/reinaldo/Projects/flask_test;
location / {
uwsgi_pass flask_test;
uwsgi_param HTTP_X_ORIGIN $geoip2_data_country_code;
include uwsgi_params;
}
}
server {
listen 8181 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location = /lua_country {
default_type text/plain;
content_by_lua 'ngx.print("Country Code: ", ngx.var["geoip2_data_country_code"], " - ", ngx.var["REMOTE_ADDR"], " - ", ngx.var["HTTP_X_REAL_IP"]," - ", ngx.var["HTTP_X_FORWARDED_FOR"])';
}
}
}
# -*- coding: utf-8 -*-
import json
from pprint import pprint
import random
import socket
import struct
from geoip import open_database
import requests
def generate_ip():
return socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff)))
def app_request(headers):
response = requests.get('http://127.0.0.1:8080', headers=headers)
print(response.text)
def nginx_request(headers):
response = requests.get('http://127.0.0.1:8181/lua_country', headers=headers)
print(response.text)
def db_loohup(ip):
with open_database('/home/reinaldo/Server/MaxMind/GeoLite2-Country.mmdb') as db:
print(db.lookup(ip_addr=ip))
def telize_loohup(ip):
response = requests.get('http://www.telize.com/geoip/{}'.format(ip))
pprint(json.loads(response.text))
def do_request():
ip = generate_ip()
headers = {
'X-Forwarded-For': ', '.join([ip, generate_ip(), generate_ip()]),
'X-Real-IP': ip
}
print('\nuWSGI app GET response:')
app_request(headers)
print('\nnginx Lua script GET response (REMOTE_ADDR - HTTP_X_REAL_IP - HTTP_X_FORWARDED_FOR):')
nginx_request(headers)
print('\nlocal database lookup ({}):'.format(ip))
db_loohup(ip)
print('\ntelize service lookup:')
telize_loohup(ip)
do_request()
[uwsgi]
module = app
callable = app
master = true
processes = 1
harakiri = 60
post-buffering = 8192
vacuum = true
no-orphans = true
socket = /tmp/flask_test.wsgi.sock
chmod-socket = 644
single-interpreter = true
enable-threads = true
die-on-term = true
max-requests = 500
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment