我有一个小的FastAPI测试Web应用程序,它提供一个简单的HTML页面,需要一个位于static文件夹中的css样式表。它安装在Linode服务器(Ubuntu 20.04 LTS)上,使用nginx、gunicorn、uvicorn工作进程和supervisorctl。我已经添加了一个证书,使用certbot进行管理。
该应用程序在http下工作正常,但在https下无法访问静态文件。在http访问时,所有基于静态文件的功能都有效,但在https访问时,缺少来自css样式表的所有样式。我需要使其工作,以便我可以加载一个需要css和其他静态文件夹存储功能的更复杂的应用程序。
文件结构如下:
/home/<user_name>/application
- main.py
- static
|_ css
|_ bootstrap
- templates
|_ index.html
main.py:
import fastapi
import uvicorn
from fastapi import Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
api = fastapi.FastAPI()
api.mount('/static', StaticFiles(directory='static'), name='static')
templates = Jinja2Templates(directory="templates")
@api.get('/')
@api.get('/index', response_class=HTMLResponse)
def index(request: Request):
message = None
return templates.TemplateResponse("index.html", {"request": request,
'message': message})
if __name__ == '__main__':
uvicorn.run(api, port=8000, host='127.0.0.1')
nginx位于/etc/nginx/sites-enabled/ <my_url>.nginx
server {
listen 80;
server_name www.<my_url>.com <my_url>.com;
server_tokens off;
charset utf-8;
location / {
try_files $uri @yourapplication;
}
location /static {
gzip on;
gzip_buffers 8 256k;
alias /home/<user_name>/application/static;
expires 365d;
}
location @yourapplication {
gzip on;
gzip_buffers 8 256k;
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Protocol $scheme;
}
}
server {
listen 443 ssl;
server_name www.<my_url>.com;
ssl_certificate /etc/letsencrypt/live/<my_url>.com/fullchain.pem; # mana>
ssl_certificate_key /etc/letsencrypt/live/<my_url>.com/privkey.pem; # ma>
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
try_files $uri @yourapplication;
}
location /static {
gzip on;
gzip_buffers 8 256k;
alias /home/<user_name>/application/static;
expires 365d;
}
location @yourapplication {
gzip on;
gzip_buffers 8 256k;
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Protocol $scheme;
}
}
我正在使用supervisor脚本进行服务:
[program:api]
directory=/home/<user_name>/application
command=gunicorn -b 127.0.0.1:8000 -w 4 -k uvicorn.workers.UvicornWorker main:api
environmentenvironment=PYTHONPATH=1
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/app/app.err.log
stdout_logfile=/var/log/app/app.out.log
CSS样式表可以通过在HTML页面中使用url_for来调用,如下所示:
<link href="{{ url_for('static', path='/css/ATB_style.css') }}" rel="stylesheet">
我尝试了许多修改Nginx中“location /static”块的方法,包括:
- 在任一行或两行后面添加斜杠
- 尝试添加https://static或https://www.<my_url>.com/home/<my_url>/application/static
- 在http和https行中添加和删除location static
- 将proxy_pass更改为https://127.0.0.1:8000;
- 在server部分中添加root /home/<user_name>/application
我已经加载了这个服务器两次,第一次是让certbot修改Nginx文件,第二次则是手动进行配置。但我完全不知道该怎么做。