89608


conoha wingを契約しています。たまたまqiitaの記事を読んでいてflaskを構築できることを知りました。

[ConoHa WingでAPI公開 -
Qiita](https://qiita.com/SNQ-2001/items/a09320257621a6f39b08)

flaskを触ったことはないのですが、FastAPIを使ったことはあったのでできないかと思い、挑戦しました。  
試した方法は２通りで、flaskの記事をそのまままねたものとsshから直接起動する方法です。

どちらも起動までは行くのですが、アクセスができずにいます。  
あきらめきれないので、どなたかに教えていただけるとありがたいです。

### 試した方法

#### 1\. cgiファイルから起動

専用のサブドメインを作成しファイルを展開する。index.cgiは、パーミッションを755に変更。

[code]

    サブドメインフォルダ
    |-main.py
    |-index.cgi
    |-.htaccess
    
[/code]

main.py

[code]

    from fastapi import FastAPI
    
    app = FastAPI()
    
    
    @app.get("/")
    def read_root():
    
        return {"Hello": "World"}
    
[/code]

[Settings - Uvicorn](https://www.uvicorn.org/settings/)

上記を参考にしました。

index.cgi

[code]

    #!/opt/alt/python36/bin/python3.6
    
    import uvicorn
    
    if __name__ == "__main__":
        uvicorn.run("main:app", port=8080, reload=False, access_log=False, host="ドメインを指定")
    
[/code]

.htaccess

[code]

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]
    <Files ~ "\.py$">
      deny from all
    </Files>
    
[/code]

SSHからログインし、fastAPIとuvicornを導入。  
下記によるとpython3.6では最新版のunicornに対応していないのでバージョンを指定。  
<https://pypi.org/project/uvicorn/>

[code]

    pip install fastapi uvicorn==0.16.0 --user
    
[/code]

ブラウザからindex.cgiのパスにアクセスする。

`https://ドメイン/index.cgi`

[![internal server
error](https://i.stack.imgur.com/Xvz80.png)](https://i.stack.imgur.com/Xvz80.png)

error_log(関係ありそうなところを抜粋)

[code]

    INFO:     Started server process [314398]:
    INFO:     Waiting for application startup.: 
    INFO:     Application startup complete.:
    INFO:     Uvicorn running on http://ドメイン名:8000 (Press CTRL+C to quit): 
    
[/code]

２度目のアクセスからは、すでに起動しているから起動できないというエラーに変わります。  
プロセスをみるとfastAPIが起動しっぱなしになっています。

#### 2\. sshから起動

別な方法として、sshでログインしたターミナルからFastAPIを立ち上げる方法があります。  
pythonファイルがあるディレクトリで下記を実行できます。

[code]

    $　uvicorn main:app
    INFO:     Started server process [367777]
    INFO:     Waiting for application startup.
    INFO:     Application startup complete.
    INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
    
[/code]

どちらにしろWebAPIにアクセスできずにいます。  
なにかわかりますでしょうか？


CC BY-SA 4.0
2022-06-23T16:47:17.693
89559
2022-07-13T01:20:20.063
2022-06-26T09:43:33.610
3054
42878
question
python cgi conoha fastapi
Conoha WingにてFastAPIを実行したい


Wing というサービスの利用者でないと、詳細を回答することは出来ないでしょう。そこで、一般的な内容を少し書いておきます。

### CGI化

`FastAPI` は `ASGI` アプリケーションです。これと `CGI`
には大きな隔りがありますので、直接的なサポートは有りません。[`a2wsgi`](https://github.com/abersheeran/a2wsgi)
を用いて `FastAPI(ASGI)` -> `WSGI` -> `CGI` と変換するコードを示します。

`index.cgi`:

[code]

    #!/usr/bin/python
    
    import a2wsgi
    import wsgiref.handlers
    import os
    import main
    
    os.environ.setdefault("PATH_INFO", "")
    
    wsgi_app = a2wsgi.ASGIMiddleware(main.app)
    wsgiref.handlers.CGIHandler().run(wsgi_app)
    
[/code]

`main.py`(例):

[code]

    from fastapi import FastAPI
    
    app = FastAPI()
    
    @app.get("/")
    def read_root():
        return {"Hello": "World"}
    
[/code]

これで `FastAPI` による Web アプリケーションを `CGI` で動かすことができます。`.htaccess` で設定するのは、この `CGI`
の実行の許可などとなります。しかし、 **性能にはまったく期待できない** でしょう。

### Uvicorn の使用

`Uvicorn` などは、`ASGI`
アプリケーションを設計の目標通りに高速に実行しますが、それ自体がサーバーです。つまり、実行され続けるプロセスとなります。こういったプロセスの実行が Wing
というサービスで許可されているのか、まず問い合わせることをお勧めします。( **追記参照** )

許可されているのであれば、`.htaccess` で設定するのは、立ち上げた `Uvicorn`
が待ち受けるポートやUnixドメインソケットへのリバースプロキシとしてのアクセスになります。

* * *

### 追記

質問者さんによる問い合わせの結果、Wingというサービスでこのようなプロセスは許可されていないことが確認されました。昔ながらの共有サーバーと同じく、CGI
を使用するしか無さそうです。

>
> サポートに確認したところ、「共用サーバーとなり他のお客様への影響が懸念されるためFastAPIのプロセスの常時稼働は許可しておりません。」とのことでした。  
>  —— [コメント](https://ja.stackoverflow.com/questions/89559/conoha-
> wing%e3%81%ab%e3%81%a6fastapi%e3%82%92%e5%ae%9f%e8%a1%8c%e3%81%97%e3%81%9f%e3%81%84/89608)より


CC BY-SA 4.0
2022-06-26T09:42:39.757
89608
2022-07-13T01:20:20.063
2022-07-13T01:20:20.063
3054
3054
89559
answer