File size: 5,276 Bytes
e48ff69
 
3ef791f
e48ff69
f84728a
e48ff69
f84728a
3ef791f
 
 
f84728a
e48ff69
f84728a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e48ff69
904b7f9
3ef791f
f84728a
3ef791f
 
904b7f9
1073da8
f84728a
 
 
 
 
 
1073da8
 
904b7f9
e48ff69
f84728a
e48ff69
 
3ef791f
 
 
 
e48ff69
 
 
 
 
 
f84728a
 
 
 
 
 
 
 
e48ff69
f84728a
 
 
 
 
 
 
 
 
 
e48ff69
 
 
 
 
 
3ef791f
5d369bb
3ef791f
 
 
 
e48ff69
904b7f9
 
e48ff69
 
 
 
 
 
 
 
 
 
 
 
 
 
1073da8
 
904b7f9
 
1073da8
 
 
 
e48ff69
3e88f9b
f84728a
3e88f9b
 
 
 
 
 
 
 
904b7f9
3ef791f
904b7f9
3ef791f
 
 
 
 
904b7f9
3ef791f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
904b7f9
3ef791f
 
 
 
 
 
 
e48ff69
904b7f9
e48ff69
 
 
 
 
3ef791f
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
worker_processes auto;

events {
    worker_connections  1024;
    use epoll;
    accept_mutex on;
    multi_accept on;    
}

http {
    # 基础配置
    include mime.types;
    default_type application/octet-stream;
    
    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;
    
    # 性能优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    client_max_body_size 100M;
    
    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript 
               application/json application/javascript application/xml+rss 
               application/atom+xml image/svg+xml;    

    upstream appfast {
        server localhost:8000;
        keepalive 32;
    }

    upstream appflask {
        server localhost:5000;
        keepalive 32;
    }

    upstream supervisor {
        server localhost:9001;
        keepalive 32;
    }

    upstream appdjango {
        server localhost:8001;
        keepalive 32;
    }

    server {
        listen 7860;
        server_name localhost;

        location /root {
            alias "/app";
            charset utf-8;
            autoindex on;
        }

        # 健康检查端点
        location /health {
            access_log off;
            add_header Content-Type application/json;
            return 200 '{"status": "healthy", "timestamp": "$time_iso8601", "services": ["nginx", "fastapi", "flask"]}';
        }
        
        # 服务状态端点
        location /status {
            proxy_pass http://supervisor;
            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;
            allow 127.0.0.1;
            deny all;
        }        

        location /status2 {
            # nginx status
            stub_status on;
            access_log off;
        }

        # 静态文件
        location /static/ {
            alias /app/static/;
            expires 30d;
            add_header Cache-Control "public, immutable";
        }

         # API 路由
        location /appfast/ {
            proxy_pass http://appfast/;
            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;
            
            # WebSocket 支持
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            
            # 超时设置
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
        }
        
        location /appflask/ {
            proxy_pass http://appflask/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location /supervisor/ {
            proxy_pass http://supervisor/;
            proxy_set_header Host $host:$proxy_port;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        # appdjango 媒体文件
        location /media/ {
            alias /app/app_django/media/;
            expires 30d;
        }

        # API 路由
        location /api/ {
            proxy_pass http://appdjango;
            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;
            
            # WebSocket 支持
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            
            # 超时设置
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
        }

        # 管理后台
        location /admin/ {
            proxy_pass http://appdjango;
            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;
        }

        # 根路径
        #location / {
        #    proxy_pass http://appdjango;
        #    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;
        #}
    }
}