ais05
@ais05

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

fcgiwrap並列処理をしたい

nginx/1.26.1 + fcgiwrap + python でフレームワークなどは使わずに(勉強になるため)webアプリを作っています。
OSはUbuntu 22.04.4 LTS,CPUはCeleron CPU G1840 2コア2スレッドです

そこで、画像をアップロードしてリサイズし、webpに変換するまでの機能をつけました。リサイズ&変換処理に1分ほど時間がかかるのですが、その処理中ほかすべてのpythonで出力しているページにアクセスできなくなってしまいます。そこで色々調べてみたらfcgiwrapの起動スクリプトにFCGI_CHILDRENという設定項目を増やすことで解決できそうだったので、デフォルトの1から2に増やしたのですが、解決できず

他のcgiサーバーを使うだったり、そもそもpythonのcgiで並列処理できるのか、もし解決方法がわかる方いれば初心者質問で恐縮なのですが教えていただきたいです。

0

2Answer

FCGI_CHILDREN="1" → "2" に変更後に、fcgiwrap を再起動していますか?

"2" を "5" とかに変更しても変化がないとすると、cgi で起動している python コードで、シリアル処理になっている可能性があります。

0Like

Comments

  1. @ais05

    Questioner

    一応毎度systemdで再起動しているんですよね、、、

とりあえずdockerを使った再現スクリプトを書いてみました。
1だと待たされましたが、2は待たされませんでしたよ。

cat >Dockerfile <<EOF
FROM nginx:1.17.9

RUN apt-get update && apt-get install -y spawn-fcgi fcgiwrap python3 \\
 && apt-get clean \\
 && rm -rf /var/lib/apt/lists/*

EXPOSE 80

STOPSIGNAL SIGTERM

COPY docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
EOF
cat >docker-entrypoint.sh <<EOF
#!/bin/bash

/etc/init.d/fcgiwrap start
chmod 766 /var/run/fcgiwrap.socket
nginx -g "daemon off;"
EOF
cat >hoge.html <<EOF
<p>hoge</p>
EOF
cat >hoge.py <<EOF
#!/usr/bin/env python3
print("""\\
Content-Type: text/html

<p>Hello, world</p>""")
EOF
cat >hoge_30sec.py <<EOF
#!/usr/bin/env python3
import time
print("""\\
Content-Type: text/html

<p>Hello, world</p>""")
for _ in range(30):
    time.sleep(1)
    print('<p>sleep(1)</p>')
EOF
chmod a+x *.py
docker build -t nginx-fcgiwrap .
docker run -d --rm --name nginx-fcgiwrap -p 80:80 -v $(pwd):/usr/share/nginx/html nginx-fcgiwrap
docker cp nginx-fcgiwrap:/etc/nginx/conf.d/default.conf .
docker cp nginx-fcgiwrap:/etc/init.d/fcgiwrap .
docker stop nginx-fcgiwrap
patch -p0 <<EOF
--- Dockerfile  2024-07-10 01:29:21.363789330 +0900
+++ Dockerfile.new      2024-07-10 01:29:30.543789058 +0900
@@ -8,6 +8,8 @@ EXPOSE 80
 
 STOPSIGNAL SIGTERM
 
+COPY default.conf /etc/nginx/conf.d/
+COPY fcgiwrap /etc/init.d/
 COPY docker-entrypoint.sh /
 RUN chmod +x /docker-entrypoint.sh
 ENTRYPOINT ["/docker-entrypoint.sh"]
--- default.conf        2020-03-03 23:32:47.000000000 +0900
+++ default.conf.new    2024-07-10 00:53:59.563852244 +0900
@@ -34,6 +34,13 @@ server {
     #    fastcgi_param  SCRIPT_FILENAME  /scripts\$fastcgi_script_name;
     #    include        fastcgi_params;
     #}
+    location ~ \.(py|cgi)\$ {
+        root   /usr/share/nginx/html;
+        include        fastcgi_params;
+        fastcgi_pass   unix:/var/run/fcgiwrap.socket;
+        fastcgi_param  DOCUMENT_ROOT \$document_root;
+        fastcgi_param  SCRIPT_NAME   \$fastcgi_script_name;
+    }
 
     # deny access to .htaccess files, if Apache's document root
     # concurs with nginx's one
--- fcgiwrap    2016-07-10 07:42:26.000000000 +0900
+++ fcgiwrap.new        2024-07-10 01:18:23.547808835 +0900
@@ -24,7 +24,7 @@ test -x \$SPAWN_FCGI || exit 0
 test -x \$DAEMON || exit 0
 
 # FCGI_APP Variables
-FCGI_CHILDREN="1"
+FCGI_CHILDREN="2"
 FCGI_SOCKET="/var/run/\$NAME.socket"
 FCGI_USER="www-data"
 FCGI_GROUP="www-data"
EOF
docker build -t nginx-fcgiwrap .
docker run -d --rm --name nginx-fcgiwrap -p 80:80 -v $(pwd):/usr/share/nginx/html nginx-fcgiwrap
wget -O - --retry-connrefused 'http://localhost/hoge.html'
wget -O - 'http://localhost/hoge.py'
wget -O - 'http://localhost/hoge_30sec.py'&
wget -O - 'http://localhost/hoge.py'
wait
docker stop nginx-fcgiwrap
0Like

Your answer might help someone💌