使用 nginx-proxy 找不到 nginx return 文件并且不加载静态文件
nginx return file not found with nginx-proxy and doesn't load static files
我正在使用 nginx-proxy-automation 到 运行 我的 php 应用程序,它是使用 CodeIgniter 4
编写的,应用程序结构如下:
php-application
docker
php-fpm
config
php.ini
Dockerfile
src
node_modules
app
public
tests
vendor
writable
.env
composer.json
package.json
spark
docker-comopse.yml
index.php
文件位于 public
文件夹中。
php-application
的 docker-compose.yml
包含以下内容:
nginx
nginx-proxy
docker-compose.yml
php-application
docker-compose.yml
在 php-application/docker-compose.yml
我有这个:
version: '3.7'
services:
php-fpm:
container_name: boilerplate_app
restart: always
build:
context: .
dockerfile: ./docker/php-fpm/Dockerfile
volumes:
- ./src:/var/www/html
environment:
# NGINX-PROXY ENVIRONMENT VARIABLES: UPDATE ME
- VIRTUAL_HOST=mysite.com
- VIRTUAL_ROOT=/var/www/html/public
- VIRTUAL_PORT=9000
- VIRTUAL_PROTO=fastcgi
- LETSENCRYPT_HOST=mysite.com
- LETSENCRYPT_EMAIL=info@mysite.com
- NETWORK=proxy
# /END NGINX-PROXY ENVIRONMENT VARIABLES
ports:
- '9000:80'
expose:
- 9000
networks:
- proxy
database:
container_name: boilerplate_db
restart: always
build:
context: ./docker/database
environment:
- MYSQL_DATABASE=boilerplate
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=secret
volumes:
- ./docker/database/data.sql:/docker-entrypoint-initdb.d/data.sql
phpmyadmin:
container_name: boilerplate_phpmyadmin
image: phpmyadmin/phpmyadmin
restart: always
ports:
- 8088:80
environment:
- PMA_HOST=database
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=secret
depends_on:
- database
networks:
proxy:
external:
name: proxy
基本上我有三个服务:
- php-fpm:将应用程序文件安装在
/var/www/html
文件夹中,在 environment
部分,我将 VIRTUAL_PORT
指定为 9000 'cause php-fpm
运行 秒 fastcgi
。然后我链接了 proxy
网络,这是你图像的网络。
- 数据库:运行在应用程序网络中
- phpmyadmin:运行在应用程序网络中
php-fpm
的 Dockerfile
内容包含以下内容:
FROM php:8.0.2-fpm-alpine
WORKDIR /var/www/html
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install mysqli
RUN apk add icu-dev
# Install intl
RUN docker-php-ext-configure intl && docker-php-ext-install intl
# Install curl
RUN apk add --update libzip-dev curl-dev &&\
docker-php-ext-install curl && \
apk del gcc g++ &&\
rm -rf /var/cache/apk/*
COPY docker/php-fpm/config/php.ini /usr/local/etc/php/
# Install composer
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
# Install nodejs
RUN apk add --update nodejs nodejs-npm
RUN npm install gulp-cli -g
RUN npm install
COPY src src/
CMD ["php-fpm"]
EXPOSE 9000
当我使用 docker-compose up --build -d
启动容器时,我在访问 mysite.com
时收到此消息(出于隐私考虑,我隐藏了真实域):
File not found.
使用 sudo docker logs -f nginx
检查 nginx
日志,我得到:
[error] 30#30: *39 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 2.38.140.109, server: mysite.com, request: "GET / HTTP/2.0", upstream: "fastcgi://172.28.0.7:9000", host: "mysite.com"
mysite.com 2.38.140.109 - - [29/Mar/2021:17:52:31 +0000] "GET / HTTP/2.0" 404 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63"
为了解决这个问题,我已经将 nginx.tmpl
更新为 this。
现在的问题是,当我加载我的站点时,所有静态文件如 js / image / css return 404.
我该怎么做才能解决这个问题?
为了使用 nginx 代理从容器提供静态文件,nginx 代理必须静态访问文件...它不会 'proxy' 但 'read' 并提供文件...这意味着您必须将应用程序文件装载到代理中...
我建议您在 nginx 代理后面安装一个新的、轻便且干净的 nginx 以及您的 php-fpm 服务,这样您就可以完全管理您的 routes/locations、
首先,我在我的应用程序中创建了一个 docker-compose.yml
,其中包含以下内容:
version: '3.9'
services:
php-fpm:
container_name: boilerplate_app
restart: always
build:
context: .
dockerfile: ./docker/php-fpm/Dockerfile
volumes:
- ./src:/var/www/html
nginx:
image: nginx:stable-alpine
container_name: boilerplate_nginx
restart: always
volumes:
- ./src:/var/www/html
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/sites/:/etc/nginx/sites-available
- ./docker/nginx/conf.d/:/etc/nginx/conf.d
depends_on:
- php-fpm
environment:
VIRTUAL_HOST: example.com
LETSENCRYPT_HOST: example.com
LETSENCRYPT_EMAIL: info@example.com
database:
container_name: boilerplate_db
restart: always
build:
context: ./docker/database
environment:
- MYSQL_DATABASE=boilerplate
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=secret
volumes:
- ./docker/database/data.sql:/docker-entrypoint-initdb.d/data.sql
phpmyadmin:
container_name: boilerplate_phpmyadmin
image: phpmyadmin/phpmyadmin
restart: always
ports:
- 8088:80
environment:
- PMA_HOST=database
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=secret
depends_on:
- database
networks:
default:
external:
name: proxy
然后,在我的应用程序目录中,我创建了 nginx 配置结构:
app
docker
nginx
conf.d
default.conf
sites
default.conf
nginx.conf
我有 conf.d
:
upstream php-upstream {
server php-fpm:9000;
}
那么我有 sites
:
server {
root /var/www/html/public;
index index.php;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_pass php-upstream;
fastcgi_index index.php;
}
}
和nginx.conf
:
user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
# Switch logging to console out to view via Docker
#access_log /dev/stdout;
#error_log /dev/stderr;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-available/*.conf;
}
网站现在加载,但存在一些问题:
- 性能问题:我们这里有两个nginx层,加载时间增加了很多
- 如果我浏览一些 url 比如示例。com/admin 我从 nginx 得到 404,我猜这是我自己的配置问题
我正在使用 nginx-proxy-automation 到 运行 我的 php 应用程序,它是使用 CodeIgniter 4
编写的,应用程序结构如下:
php-application
docker
php-fpm
config
php.ini
Dockerfile
src
node_modules
app
public
tests
vendor
writable
.env
composer.json
package.json
spark
docker-comopse.yml
index.php
文件位于 public
文件夹中。
php-application
的 docker-compose.yml
包含以下内容:
nginx
nginx-proxy
docker-compose.yml
php-application
docker-compose.yml
在 php-application/docker-compose.yml
我有这个:
version: '3.7'
services:
php-fpm:
container_name: boilerplate_app
restart: always
build:
context: .
dockerfile: ./docker/php-fpm/Dockerfile
volumes:
- ./src:/var/www/html
environment:
# NGINX-PROXY ENVIRONMENT VARIABLES: UPDATE ME
- VIRTUAL_HOST=mysite.com
- VIRTUAL_ROOT=/var/www/html/public
- VIRTUAL_PORT=9000
- VIRTUAL_PROTO=fastcgi
- LETSENCRYPT_HOST=mysite.com
- LETSENCRYPT_EMAIL=info@mysite.com
- NETWORK=proxy
# /END NGINX-PROXY ENVIRONMENT VARIABLES
ports:
- '9000:80'
expose:
- 9000
networks:
- proxy
database:
container_name: boilerplate_db
restart: always
build:
context: ./docker/database
environment:
- MYSQL_DATABASE=boilerplate
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=secret
volumes:
- ./docker/database/data.sql:/docker-entrypoint-initdb.d/data.sql
phpmyadmin:
container_name: boilerplate_phpmyadmin
image: phpmyadmin/phpmyadmin
restart: always
ports:
- 8088:80
environment:
- PMA_HOST=database
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=secret
depends_on:
- database
networks:
proxy:
external:
name: proxy
基本上我有三个服务:
- php-fpm:将应用程序文件安装在
/var/www/html
文件夹中,在environment
部分,我将VIRTUAL_PORT
指定为 9000 'causephp-fpm
运行 秒fastcgi
。然后我链接了proxy
网络,这是你图像的网络。 - 数据库:运行在应用程序网络中
- phpmyadmin:运行在应用程序网络中
php-fpm
的 Dockerfile
内容包含以下内容:
FROM php:8.0.2-fpm-alpine
WORKDIR /var/www/html
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-install mysqli
RUN apk add icu-dev
# Install intl
RUN docker-php-ext-configure intl && docker-php-ext-install intl
# Install curl
RUN apk add --update libzip-dev curl-dev &&\
docker-php-ext-install curl && \
apk del gcc g++ &&\
rm -rf /var/cache/apk/*
COPY docker/php-fpm/config/php.ini /usr/local/etc/php/
# Install composer
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
# Install nodejs
RUN apk add --update nodejs nodejs-npm
RUN npm install gulp-cli -g
RUN npm install
COPY src src/
CMD ["php-fpm"]
EXPOSE 9000
当我使用 docker-compose up --build -d
启动容器时,我在访问 mysite.com
时收到此消息(出于隐私考虑,我隐藏了真实域):
File not found.
使用 sudo docker logs -f nginx
检查 nginx
日志,我得到:
[error] 30#30: *39 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 2.38.140.109, server: mysite.com, request: "GET / HTTP/2.0", upstream: "fastcgi://172.28.0.7:9000", host: "mysite.com"
mysite.com 2.38.140.109 - - [29/Mar/2021:17:52:31 +0000] "GET / HTTP/2.0" 404 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63"
为了解决这个问题,我已经将 nginx.tmpl
更新为 this。
现在的问题是,当我加载我的站点时,所有静态文件如 js / image / css return 404.
我该怎么做才能解决这个问题?
为了使用 nginx 代理从容器提供静态文件,nginx 代理必须静态访问文件...它不会 'proxy' 但 'read' 并提供文件...这意味着您必须将应用程序文件装载到代理中...
我建议您在 nginx 代理后面安装一个新的、轻便且干净的 nginx 以及您的 php-fpm 服务,这样您就可以完全管理您的 routes/locations、
首先,我在我的应用程序中创建了一个 docker-compose.yml
,其中包含以下内容:
version: '3.9'
services:
php-fpm:
container_name: boilerplate_app
restart: always
build:
context: .
dockerfile: ./docker/php-fpm/Dockerfile
volumes:
- ./src:/var/www/html
nginx:
image: nginx:stable-alpine
container_name: boilerplate_nginx
restart: always
volumes:
- ./src:/var/www/html
- ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./docker/nginx/sites/:/etc/nginx/sites-available
- ./docker/nginx/conf.d/:/etc/nginx/conf.d
depends_on:
- php-fpm
environment:
VIRTUAL_HOST: example.com
LETSENCRYPT_HOST: example.com
LETSENCRYPT_EMAIL: info@example.com
database:
container_name: boilerplate_db
restart: always
build:
context: ./docker/database
environment:
- MYSQL_DATABASE=boilerplate
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=secret
volumes:
- ./docker/database/data.sql:/docker-entrypoint-initdb.d/data.sql
phpmyadmin:
container_name: boilerplate_phpmyadmin
image: phpmyadmin/phpmyadmin
restart: always
ports:
- 8088:80
environment:
- PMA_HOST=database
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=secret
depends_on:
- database
networks:
default:
external:
name: proxy
然后,在我的应用程序目录中,我创建了 nginx 配置结构:
app
docker
nginx
conf.d
default.conf
sites
default.conf
nginx.conf
我有 conf.d
:
upstream php-upstream {
server php-fpm:9000;
}
那么我有 sites
:
server {
root /var/www/html/public;
index index.php;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_pass php-upstream;
fastcgi_index index.php;
}
}
和nginx.conf
:
user nginx;
worker_processes 4;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
# Switch logging to console out to view via Docker
#access_log /dev/stdout;
#error_log /dev/stderr;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-available/*.conf;
}
网站现在加载,但存在一些问题:
- 性能问题:我们这里有两个nginx层,加载时间增加了很多
- 如果我浏览一些 url 比如示例。com/admin 我从 nginx 得到 404,我猜这是我自己的配置问题