亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當 NGINX 無法訪問應用程序文件時的 NGINX 配置,以及 php-fpm 和 docker

當 NGINX 無法訪問應用程序文件時的 NGINX 配置,以及 php-fpm 和 docker

PHP
互換的青春 2023-05-12 14:29:05
所以我的 docker 設置如下:我有一個接受 HTTP 請求的 Nginx 容器,還有另一個容器(我的自定義容器),其中有 php-fpm 和我的應用程序代碼。應用程序代碼不在主機上,只在 Web 容器中。我想將 Nginx 配置為代理,以獲取請求并將它們路由到 php-fpm。我的 nginx confiration 如下(我刪除了一些在這里不重要的部分):upstream phpserver {    server web:9000;}server {    listen 443 ssl http2;    server_name app;    root /app/web;    ssl_certificate       /ssl.crt;    ssl_certificate_key  /ssl.key;    location ~ ^/index\.php(/|$) {        fastcgi_pass phpserver;        fastcgi_split_path_info ^(.+\.php)(/.*)$;        include fastcgi_params;        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;        fastcgi_param DOCUMENT_ROOT $realpath_root;        fastcgi_read_timeout 160;        internal;        http2_push_preload on;    }}還有我的 docker 配置(同樣,我刪除了一些不重要的部分)nginx:  ports:  - 443:443/tcp  - 80:80/tcp  image: nginx  links:  - web:webweb:  image: custom_image  container_name: web使用此配置,我得到以下 Nginx 錯誤:“open() “/app/web”失?。?:沒有此類文件或目錄)”,因為 Nginx 無權訪問該文件夾(該文件夾位于 Web 容器中) php-fpm 是)。有沒有一種方法可以配置 Nginx 來路由 HTTP 請求,即使它無權訪問應用程序代碼?我知道解決這個問題的方法之一是將應用程序代碼掛載到 Nginx 容器,但我想盡可能避免這種情況。這樣做的原因是在 swarm 模式下,如果兩個容器不共享主機,那將無法工作。
查看完整描述

1 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

我設法解決了這個問題,所以我在下面為有類似問題的人發布我自己的解決方案。


解決方案是在 nginx 配置中使用 'alias' 指令而不使用 'root' 指令(我已經刪除了一些在這里不重要的部分):


upstream phpserver {

  server web:9000;

}


server {

    listen 443 http2;

    ssl on;

    server_name app;


    ssl_certificate       /ssl.crt;

    ssl_certificate_key  /ssl.key;


    location ~ ^/index\.php(/|$) {

        alias /app/web;


        fastcgi_pass phpserver;

        fastcgi_split_path_info ^(.+\.php)(/.*)$;

        fastcgi_index index.php;

        include fastcgi_params;


        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name$fastcgi_script_name;

        fastcgi_param SCRIPT_NAME $fastcgi_script_name;


        internal;

        http2_push_preload on;

    }

}

現在請求已正確路由到端口 9000 上的 phpserver,并由 php fpm 在那里處理。Php fpm 通過查看“別名”指令知道要執行哪個腳本。


現在的問題是如何提供靜態文件。一種解決方案是也通過 php fpm 為它們提供服務,但根據我在網上閱讀的內容,不推薦這樣做,因為開銷會更大。所以我的解決方案是與 nginx docker 容器共享所有靜態文件,以便 ngnix 可以訪問它們并可以直接為它們提供服務。如果有人對如何在這種情況下提供靜態文件有更好的解決方案,請告訴我。


# Cache Control for Static Files

location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {

    #access_log        on;

    #log_not_found     off;

    expires           360d;

}


查看完整回答
反對 回復 2023-05-12
  • 1 回答
  • 0 關注
  • 175 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號