Nginx PHP Bad Gateway Fix

User
version: '3.3'

services:
nginx:
image: nginx:latest
container_name: other-nginx
ports:
– "6500:80"
networks:
– other-app-network
volumes:
– ./nginx:/etc/nginx/conf.d
– ./applications/naa2023:/var/www/naa2023
depends_on:
– php

php:
build:
context: ./php
container_name: other-php
volumes:
– ./applications/naa2023:/var/www/naa2023
expose:
– "9095"
working_dir: /var/www
networks:
– other-app-network

otmysql:
image: mysql:8.0
container_name: other-mysql
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: site_db
MYSQL_USER: user
MYSQL_PASSWORD: userpassword
volumes:
– ./mysql/data:/var/lib/mysql
ports:
– "3307:3306"
networks:
– other-app-network

adminer:
image: adminer
container_name: other-adminer
restart: always
ports:
– '6501:8080'
networks:
– other-app-network
depends_on:
– otmysql

networks:
other-app-network:
driver: bridge
localhost:6500 bad gsteway

Assistant
The issue you're describing with "localhost:6500 bad gateway" suggests that your `nginx` container is unable to communicate with your `php` container. This usually happens when:

1. The `php` container is not properly up and running.
2. The `nginx` configuration is not correctly set to forward requests to the `php` container.
3. There are network issues between `nginx` and `php`.

Let's go through a few steps to resolve this.

### Step 1: Check if Containers Are Running
First, make sure all your containers are up and running:

docker-compose up -d
docker-compose ps

Ensure the `other-nginx` and `other-php` containers are in a healthy state.

### Step 2: Update `nginx` Configuration
Your `nginx` configuration file (e.g., `nginx.conf` in the `./nginx` directory) might not be correctly set up. Make sure it looks something like this:

#### Sample `nginx.conf`

server {
    listen 80;
    server_name localhost;

    root /var/www/naa2023;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ .php$ {
        include fastcgi_params;
        fastcgi_pass php:9095;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
}

### Step 3: Rebuild and Restart Containers
Make sure to rebuild your containers to apply any changes:

docker-compose down
docker-compose build
docker-compose up -d

### Step 4: Check Logs for Errors
If the problem persists, check the logs of your `nginx` and `php` containers:

docker logs other-nginx
docker logs other-php

Look for any errors related to "bad gateway" or "connection refused".

### Step 5: Verify `php` Container Network Configuration
Make sure your `php` container is exposing the correct port (`9095`). You can test the connection inside the `nginx` container by running:

docker exec -it other-nginx bash
curl http://php:9095

If this returns an error, the issue might be with your Docker network configuration.

### Step 6: Check `docker-compose.yml` Adjustments
Ensure that the `php` container uses the correct port in the `expose` section:

php:
  build:
    context: ./php
  container_name: other-php
  volumes:
    - ./applications/naa2023:/var/www/naa2023
  expose:
    - "9095"
  working_dir: /var/www
  networks:
    - other-app-network

With these changes, your Nginx should be able to connect to the PHP container on the specified port. Restart everything and check again.

User
admin1@PC-274:~/Docker-servers/others$ docker exec -it other-nginx sh
# curl http://php:9095
curl: (7) Failed to connect to php port 9095 after 1 ms: Couldn't connect to server
#
Assistant
The error message `curl: (7) Failed to connect to php port 9095` indicates that the `nginx` container is unable to reach the `php` container on port `9095`. This could be due to several reasons:

1. The `php` container might not be listening on the expected port.
2. The service name in your `nginx.conf` (i.e., `php`) might not be correctly resolving to the `php` container.
3. Networking issues between the containers.

Let's go through some troubleshooting steps to identify and resolve the issue.

### Step 1: Verify PHP Container Is Running and Listening on Port 9095
First, check if the `php` container is actually up and running:

docker-compose ps

Look for the `other-php` container and ensure it's running.

Next, confirm that your PHP container is listening on port `9095`:

docker exec -it other-php sh -c "netstat -tuln | grep 9095"

If nothing shows up, it means your PHP service is not listening on that port.

### Step 2: Test PHP-FPM Connectivity Within PHP Container
If you're using PHP-FPM, check if it's running properly:

docker exec -it other-php sh
ps aux | grep php-fpm

Also, confirm that PHP-FPM is configured to listen on port `9095`:

cat /usr/local/etc/php-fpm.d/www.conf | grep 'listen'

Make sure it includes:

listen = 0.0.0.0:9095

If it's not configured correctly, you'll need to adjust the `www.conf` file.

### Step 3: Restart the PHP Service
If you had to change the configuration, restart the PHP service:

docker-compose restart php

### Step 4: Verify Docker Network Connectivity
Check if both `nginx` and `php` containers are on the same network:

docker network inspect other-app-network

Ensure that both `other-nginx` and `other-php` are listed under the "Containers" section.

### Step 5: Update `nginx.conf` to Use Container Name
If your `nginx.conf` is using `fastcgi_pass php:9095;`, make sure that the service name `php` is correctly matching the container name defined in your `docker-compose.yml`.

You can also try using the full container name:

fastcgi_pass other-php:9095;

### Step 6: Rebuild and Restart Everything
If you made any changes, rebuild and restart your containers:

docker-compose down
docker-compose build
docker-compose up -d

Then test the connection again from within the `nginx` container:

docker exec -it other-nginx sh
curl http://other-php:9095

This should help you identify where the issue is and get your setup working. Let me know if you encounter any errors during these steps!

User
Problem 1
– league/geotools is locked to version 0.8.3 and an update of this package was not requested.
– league/geotools 0.8.3 requires ext-bcmath * -> it is missing from your system. Install or enable PHP's bcmath extension.

To enable extensions, verify that they are enabled in your .ini files:
– /usr/local/etc/php/php.ini
– /usr/local/etc/php/conf.d/docker-fpm.ini
– /usr/local/etc/php/conf.d/docker-php-ext-gd.ini
– /usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini
– /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
– /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
– /usr/local/etc/php/conf.d/docker-php-ext-zip.ini

Assistant
The error message indicates that the PHP extension `bcmath` is missing, which is required by the `league/geotools` package. To fix this, you'll need to enable the `bcmath` extension in your PHP Docker container.

### Step 1: Update Your PHP Dockerfile
To enable the `bcmath` extension, you should modify your `Dockerfile` for the PHP service. Locate your PHP Dockerfile (`./php/Dockerfile`) and add the following line:

#### Updated `Dockerfile`

FROM php:8.1-fpm

# Install bcmath extension
RUN docker-php-ext-install bcmath

# Install other necessary extensions if needed
RUN docker-php-ext-install pdo pdo_mysql

Make sure to replace `php:8.1-fpm` with the correct version of PHP you are using. This will install the `bcmath` extension inside your Docker container.

### Step 2: Rebuild the PHP Container
After updating the Dockerfile, you need to rebuild your PHP container:

docker-compose down
docker-compose build php
docker-compose up -d

### Step 3: Verify `bcmath` Installation
Once the PHP container is running, you can verify that the `bcmath` extension is installed correctly by running:

docker exec -it other-php php -m | grep bcmath

If it returns `bcmath`, the extension is successfully enabled.

### Step 4: Check PHP Configuration (Optional)
If you want to double-check that the `bcmath` extension is enabled in the PHP configuration, you can inspect the relevant `.ini` files:

docker exec -it other-php sh -c "php --ini"

Look for the line that says:

/usr/local/etc/php/conf.d/docker-php-ext-bcmath.ini

This indicates that the `bcmath` extension is enabled.

### Step 5: Clear Composer Cache and Install Again
If you still encounter the issue, you might need to clear your Composer cache and reinstall dependencies:

docker exec -it other-php sh -c "composer clear-cache"
docker exec -it other-php sh -c "composer install"

This should resolve the issue with `league/geotools` requiring the `bcmath` extension. Let me know if you run into any other issues!

User
add here
FROM php:8.1-fpm

# Install system dependencies and PHP extensions
RUN apt-get update && apt-get install -y
zip
unzip
git
curl
libpng-dev
libjpeg-dev
libfreetype6-dev
libzip-dev
&& docker-php-ext-install pdo pdo_mysql zip gd mysqli
&& apt-get clean && rm -rf /var/lib/apt/lists/*

# Install Node.js (version 20.x)
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash – &&
apt-get install -y nodejs &&
apt-get clean && rm -rf /var/lib/apt/lists/*

# Install Yarn 4.3.1 using Corepack
RUN corepack enable && corepack prepare yarn@4.3.1 –activate

# Verify Yarn installation
RUN yarn –version

# Copy Composer (from official Composer image)
COPY –from=composer:2.7 /usr/bin/composer /usr/bin/composer

# Copy custom php.ini
COPY php.ini /usr/local/etc/php/php.ini

# Set the working directory
WORKDIR /var/www

# Expose PHP-FPM port
EXPOSE 9000

Assistant
Given your current `Dockerfile`, we'll add the installation of the `bcmath` extension to resolve the missing requirement for `league/geotools`. I'll also make sure that it fits neatly with your existing setup.

### Updated Dockerfile with `bcmath`
Here's the updated `Dockerfile` with the necessary changes:

# Use the official PHP image
FROM php:8.1-fpm

# Install system dependencies and PHP extensions
RUN apt-get update && apt-get install -y 
    zip 
    unzip 
    git 
    curl 
    libpng-dev 
    libjpeg-dev 
    libfreetype6-dev 
    libzip-dev 
    && docker-php-ext-install pdo pdo_mysql zip gd mysqli bcmath 
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# Install Node.js (version 20.x)
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && 
    apt-get install -y nodejs && 
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Install Yarn 4.3.1 using Corepack
RUN corepack enable && corepack prepare yarn@4.3.1 --activate

# Verify Yarn installation
RUN yarn --version

# Copy Composer (from official Composer image)
COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer

# Copy custom php.ini
COPY php.ini /usr/local/etc/php/php.ini

# Set the working directory
WORKDIR /var/www

# Expose PHP-FPM port
EXPOSE 9000

### Explanation of Changes
1. **Added `bcmath` Extension**:

&& docker-php-ext-install pdo pdo_mysql zip gd mysqli bcmath 

This line now includes `bcmath`, which is required by the `league/geotools` package.

2. **No Changes to Node.js and Yarn Setup**:
Your existing configuration for Node.js and Yarn remains the same, ensuring compatibility with your front-end build tools.

### Step 1: Rebuild the PHP Container
After updating the `Dockerfile`, rebuild your PHP Docker container:

docker-compose down
docker-compose build php
docker-compose up -d

### Step 2: Verify the Installation
Once the container is running, confirm that `bcmath` is installed:

docker exec -it other-php php -m | grep bcmath

You should see `bcmath` in the output.

### Step 3: Clear Composer Cache and Reinstall (if needed)
Finally, clear Composer's cache and reinstall your dependencies to ensure everything is working correctly:

docker exec -it other-php composer clear-cache
docker exec -it other-php composer install

These changes should resolve the issue with the missing `bcmath` extension. Let me know if you encounter any other problems!

Leave a Comment

Your email address will not be published. Required fields are marked *