پیکربندی HTTPS برای WordPress در Docker با استفاده از NGINX به عنوان یک پروکسی معکوس – انجمن DEV
Summarize this content to 400 words in Persian Lang
اگر می خواهید وردپرس را در یک ظرف Docker میزبانی کنید اما در پیکربندی HTTPS مشکل دارید، مراحل زیر ممکن است به شما کمک کند!
آهنگسازی docker-compose.yml فایل
بیایید a ایجاد کنیم docker-compose.yml فایل برای تعریف خدماتی که به آن نیاز داریم.
ابتدا، ما قصد داریم تا را اضافه کنیم db به خدمات
db:
image: mysql:5.7
container_name: db
ports:
– “3306:3306”
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: notanotheruser
MYSQL_PASSWORD: 1234
MYSQL_ROOT_PASSWORD: root1234
volumes:
– db_data:/var/lib/mysql
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ما در حال افشای آن هستیم port 3306 در صورتی که بخواهیم با MySQL Workbench به پایگاه داده متصل شویم تا نگاه بهتری داشته باشیم.
ما در حال عبور از environment variables برای راه اندازی سرور MySQL طبق مستندات مورد نیاز است
ما در حال ایجاد یک volume برای حفظ وضعیت سرور MySQL حتی پس از اینکه کانتینر سرویس را خاموش کردیم.
بعد از اینکه db را تنظیم کردیم، می خواهیم اضافه کنیم wordpress به خدمات
wordpress:
depends_on:
– db
image: wordpress:latest
container_name: wordpress
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: notanotheruser
WORDPRESS_DB_PASSWORD: 1234
WORDPRESS_DB_NAME: wordpress
volumes:
– ./wordpress/wp-config.php:/var/www/html/wp-config.php
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ما در حال اضافه کردن هستیم depends_on: db زیرا می خواهیم سرویس db قبل از سرویس wordpress راه اندازی شود.
ما در حال عبور از environment variables برای راه اندازی وردپرس طبق مستندات مورد نیاز است
باید رونویسی کنیم wp-config.php فایل در نصب وردپرس با خودمان فقط برای اضافه کردن یک خط که به ما امکان استفاده از https را می دهد و آن این است: $_SERVER[‘HTTPS’] = ‘on’;
آ wp-config.php فایل محلی باید به شکل زیر باشد:
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don’t have to use the website, you can copy this file to “wp-config.php”
* and fill in the values.
*
* This file contains the following configurations:
*
* * Database settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* This has been slightly modified (to read environment variables) for use in Docker.
*
* @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/
*
* @package WordPress
*/
// IMPORTANT: this file needs to stay in-sync with https://github.com/WordPress/WordPress/blob/master/wp-config-sample.php
// (it gets parsed by the upstream wizard in https://github.com/WordPress/WordPress/blob/f27cb65e1ef25d11b535695a660e7282b98eb742/wp-admin/setup-config.php#L356-L392)
// a helper function to lookup “env_FILE”, “env”, then fallback
if (!function_exists(‘getenv_docker’)) {
// https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)
function getenv_docker($env, $default) {
if ($fileEnv = getenv($env . ‘_FILE’)) {
return rtrim(file_get_contents($fileEnv), “\r\n”);
}
else if (($val = getenv($env)) !== false) {
return $val;
}
else {
return $default;
}
}
}
// ** Database settings – You can get this info from your web host ** //
/** The name of the database for WordPress */
define( ‘DB_NAME’, getenv_docker(‘WORDPRESS_DB_NAME’, ‘wordpress’) );
/** Database username */
define( ‘DB_USER’, getenv_docker(‘WORDPRESS_DB_USER’, ‘example username’) );
/** Database password */
define( ‘DB_PASSWORD’, getenv_docker(‘WORDPRESS_DB_PASSWORD’, ‘example password’) );
/**
* Docker image fallback values above are sourced from the official WordPress installation wizard:
* https://github.com/WordPress/WordPress/blob/1356f6537220ffdc32b9dad2a6cdbe2d010b7a88/wp-admin/setup-config.php#L224-L238
* (However, using “example username” and “example password” in your database is strongly discouraged. Please use strong, random credentials!)
*/
/** Database hostname */
define( ‘DB_HOST’, getenv_docker(‘WORDPRESS_DB_HOST’, ‘mysql’) );
/** Database charset to use in creating database tables. */
define( ‘DB_CHARSET’, getenv_docker(‘WORDPRESS_DB_CHARSET’, ‘utf8’) );
/** The database collate type. Don’t change this if in doubt. */
define( ‘DB_COLLATE’, getenv_docker(‘WORDPRESS_DB_COLLATE’, ”) );
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( ‘AUTH_KEY’, getenv_docker(‘WORDPRESS_AUTH_KEY’, ‘a04e06eaef05d9dc187680cdccb8aae37d90bfcd’) );
define( ‘SECURE_AUTH_KEY’, getenv_docker(‘WORDPRESS_SECURE_AUTH_KEY’, ‘f1d35321ba3ff820430674efc877f53b64bdb50e’) );
define( ‘LOGGED_IN_KEY’, getenv_docker(‘WORDPRESS_LOGGED_IN_KEY’, ‘5d880df893cba59fed67def1acac2c61e46c4671’) );
define( ‘NONCE_KEY’, getenv_docker(‘WORDPRESS_NONCE_KEY’, ‘2fe4fdf4ff93153db924369eb7bbd823f446577c’) );
define( ‘AUTH_SALT’, getenv_docker(‘WORDPRESS_AUTH_SALT’, ‘326143348bb31e5451cf0e838048043ea39e5351’) );
define( ‘SECURE_AUTH_SALT’, getenv_docker(‘WORDPRESS_SECURE_AUTH_SALT’, ’33aa7ae0aa39497d0d13e84413061e0168eadea3′) );
define( ‘LOGGED_IN_SALT’, getenv_docker(‘WORDPRESS_LOGGED_IN_SALT’, ‘f032c820677ec84f4ef05a6d2e4c2547be1e7b1b’) );
define( ‘NONCE_SALT’, getenv_docker(‘WORDPRESS_NONCE_SALT’, ‘506e5adc0340e19f13b1018ecb7b7776e92b0a73’) );
// (See also https://wordpress.stackexchange.com/a/152905/199287)
/**#@-*/
/**
* WordPress database table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = getenv_docker(‘WORDPRESS_TABLE_PREFIX’, ‘wp_’);
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
*/
define( ‘WP_DEBUG’, !!getenv_docker(‘WORDPRESS_DEBUG’, ”) );
/* Add any custom values between this line and the “stop editing” line. */
// If we’re behind a proxy server and using HTTPS, we need to alert WordPress of that fact
// see also https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy
if (isset($_SERVER[‘HTTP_X_FORWARDED_PROTO’]) && strpos($_SERVER[‘HTTP_X_FORWARDED_PROTO’], ‘https’) !== false) {
$_SERVER[‘HTTPS’] = ‘on’;
}
// (we include this by default because reverse proxying is extremely common in container environments)
if ($configExtra = getenv_docker(‘WORDPRESS_CONFIG_EXTRA’, ”)) {
eval($configExtra);
}
/* That’s all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( ‘ABSPATH’ ) ) {
define( ‘ABSPATH’, __DIR__ . “https://dev.to/” );
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . ‘wp-settings.php’;
$_SERVER[‘HTTPS’] = ‘on’;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
به خاطر داشته باشید که تصویر وردپرس به خودی خود از HTTPS پشتیبانی نمی کند. بنابراین نیاز به یک پروکسی معکوس.
در نهایت باید اضافه کنیم webserver به خدمات
webserver:
depends_on:
– wordpress
image: nginx:latest
container_name: webserver
ports:
– “80:80”
– “443:443”
volumes:
– ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
– ./nginx/certs:/etc/nginx/certs
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ما در حال اضافه کردن هستیم depends_on: wordpress زیرا می خواهیم سرویس wordpress قبل از سرویس وب سرور راه اندازی شود.
ما هر دو را افشا می کنیم port 80 و 443.
باید a را پاس کنیم nginx.conf فایلی که امکان پراکسی معکوس را نیز فراهم می کند .crt و .key فایل های SSL
آ nginx.conf فایل محلی باید به شکل زیر باشد:
server {
listen 80;
location / {
proxy_pass http://wordpress;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
ssl_certificate /etc/nginx/certs/nginx.crt;
ssl_certificate_key /etc/nginx/certs/nginx.key;
location / {
proxy_pass http://wordpress;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
برای ارائه محتوای HTTPS، گواهی SSL مورد نیاز است.
برای اهداف توسعه، من از این ابزار آنلاین برای تولید گواهی امضا شده خودم استفاده کردم (.crt و .key فایل ها). با خیال راحت از certbot یا openssl استفاده کنید
در نهایت، با انگشت روی دست، آماده دویدن هستیم docker-compose up!
پس از مراحل نصب، اگر به تنظیمات بروید، خواهید دید که httpsبه اضافه شده است WordPress Address و Site Address
خودشه!
من برای راه اندازی https برای وردپرس مشکل داشتم، بنابراین فکر کردم وقتی فهمیدم باید آن را به اشتراک بگذارم. هر گونه بازخوردی را به اشتراک بگذارید! با تشکر و روز خوبی داشته باشید!
در اینجا مخزن GitHub با کد استفاده شده است.
اگر می خواهید وردپرس را در یک ظرف Docker میزبانی کنید اما در پیکربندی HTTPS مشکل دارید، مراحل زیر ممکن است به شما کمک کند!
آهنگسازی docker-compose.yml
فایل
بیایید a ایجاد کنیم docker-compose.yml
فایل برای تعریف خدماتی که به آن نیاز داریم.
ابتدا، ما قصد داریم تا را اضافه کنیم db
به خدمات
db:
image: mysql:5.7
container_name: db
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: notanotheruser
MYSQL_PASSWORD: 1234
MYSQL_ROOT_PASSWORD: root1234
volumes:
- db_data:/var/lib/mysql
- ما در حال افشای آن هستیم
port 3306
در صورتی که بخواهیم با MySQL Workbench به پایگاه داده متصل شویم تا نگاه بهتری داشته باشیم. - ما در حال عبور از
environment variables
برای راه اندازی سرور MySQL طبق مستندات مورد نیاز است - ما در حال ایجاد یک
volume
برای حفظ وضعیت سرور MySQL حتی پس از اینکه کانتینر سرویس را خاموش کردیم.
بعد از اینکه db را تنظیم کردیم، می خواهیم اضافه کنیم wordpress
به خدمات
wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wordpress
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: notanotheruser
WORDPRESS_DB_PASSWORD: 1234
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wordpress/wp-config.php:/var/www/html/wp-config.php
- ما در حال اضافه کردن هستیم
depends_on: db
زیرا می خواهیم سرویس db قبل از سرویس wordpress راه اندازی شود. - ما در حال عبور از
environment variables
برای راه اندازی وردپرس طبق مستندات مورد نیاز است - باید رونویسی کنیم
wp-config.php
فایل در نصب وردپرس با خودمان فقط برای اضافه کردن یک خط که به ما امکان استفاده از https را می دهد و آن این است:$_SERVER['HTTPS'] = 'on';
آ wp-config.php
فایل محلی باید به شکل زیر باشد:
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the installation.
* You don't have to use the website, you can copy this file to "wp-config.php"
* and fill in the values.
*
* This file contains the following configurations:
*
* * Database settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* This has been slightly modified (to read environment variables) for use in Docker.
*
* @link https://developer.wordpress.org/advanced-administration/wordpress/wp-config/
*
* @package WordPress
*/
// IMPORTANT: this file needs to stay in-sync with https://github.com/WordPress/WordPress/blob/master/wp-config-sample.php
// (it gets parsed by the upstream wizard in https://github.com/WordPress/WordPress/blob/f27cb65e1ef25d11b535695a660e7282b98eb742/wp-admin/setup-config.php#L356-L392)
// a helper function to lookup "env_FILE", "env", then fallback
if (!function_exists('getenv_docker')) {
// https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)
function getenv_docker($env, $default) {
if ($fileEnv = getenv($env . '_FILE')) {
return rtrim(file_get_contents($fileEnv), "\r\n");
}
else if (($val = getenv($env)) !== false) {
return $val;
}
else {
return $default;
}
}
}
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );
/** Database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );
/** Database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
/**
* Docker image fallback values above are sourced from the official WordPress installation wizard:
* https://github.com/WordPress/WordPress/blob/1356f6537220ffdc32b9dad2a6cdbe2d010b7a88/wp-admin/setup-config.php#L224-L238
* (However, using "example username" and "example password" in your database is strongly discouraged. Please use strong, random credentials!)
*/
/** Database hostname */
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8') );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define( 'AUTH_KEY', getenv_docker('WORDPRESS_AUTH_KEY', 'a04e06eaef05d9dc187680cdccb8aae37d90bfcd') );
define( 'SECURE_AUTH_KEY', getenv_docker('WORDPRESS_SECURE_AUTH_KEY', 'f1d35321ba3ff820430674efc877f53b64bdb50e') );
define( 'LOGGED_IN_KEY', getenv_docker('WORDPRESS_LOGGED_IN_KEY', '5d880df893cba59fed67def1acac2c61e46c4671') );
define( 'NONCE_KEY', getenv_docker('WORDPRESS_NONCE_KEY', '2fe4fdf4ff93153db924369eb7bbd823f446577c') );
define( 'AUTH_SALT', getenv_docker('WORDPRESS_AUTH_SALT', '326143348bb31e5451cf0e838048043ea39e5351') );
define( 'SECURE_AUTH_SALT', getenv_docker('WORDPRESS_SECURE_AUTH_SALT', '33aa7ae0aa39497d0d13e84413061e0168eadea3') );
define( 'LOGGED_IN_SALT', getenv_docker('WORDPRESS_LOGGED_IN_SALT', 'f032c820677ec84f4ef05a6d2e4c2547be1e7b1b') );
define( 'NONCE_SALT', getenv_docker('WORDPRESS_NONCE_SALT', '506e5adc0340e19f13b1018ecb7b7776e92b0a73') );
// (See also https://wordpress.stackexchange.com/a/152905/199287)
/**#@-*/
/**
* WordPress database table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = getenv_docker('WORDPRESS_TABLE_PREFIX', 'wp_');
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/
*/
define( 'WP_DEBUG', !!getenv_docker('WORDPRESS_DEBUG', '') );
/* Add any custom values between this line and the "stop editing" line. */
// If we're behind a proxy server and using HTTPS, we need to alert WordPress of that fact
// see also https://wordpress.org/support/article/administration-over-ssl/#using-a-reverse-proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
$_SERVER['HTTPS'] = 'on';
}
// (we include this by default because reverse proxying is extremely common in container environments)
if ($configExtra = getenv_docker('WORDPRESS_CONFIG_EXTRA', '')) {
eval($configExtra);
}
/* That's all, stop editing! Happy publishing. */
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . "https://dev.to/" );
}
/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
$_SERVER['HTTPS'] = 'on';
به خاطر داشته باشید که تصویر وردپرس به خودی خود از HTTPS پشتیبانی نمی کند. بنابراین نیاز به یک پروکسی معکوس.
در نهایت باید اضافه کنیم webserver
به خدمات
webserver:
depends_on:
- wordpress
image: nginx:latest
container_name: webserver
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- ./nginx/certs:/etc/nginx/certs
- ما در حال اضافه کردن هستیم
depends_on: wordpress
زیرا می خواهیم سرویس wordpress قبل از سرویس وب سرور راه اندازی شود. - ما هر دو را افشا می کنیم
port 80
و443
. - باید a را پاس کنیم
nginx.conf
فایلی که امکان پراکسی معکوس را نیز فراهم می کند.crt
و.key
فایل های SSL
آ nginx.conf
فایل محلی باید به شکل زیر باشد:
server {
listen 80;
location / {
proxy_pass http://wordpress;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443 ssl;
ssl_certificate /etc/nginx/certs/nginx.crt;
ssl_certificate_key /etc/nginx/certs/nginx.key;
location / {
proxy_pass http://wordpress;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
برای ارائه محتوای HTTPS، گواهی SSL مورد نیاز است.
برای اهداف توسعه، من از این ابزار آنلاین برای تولید گواهی امضا شده خودم استفاده کردم (.crt
و .key
فایل ها). با خیال راحت از certbot یا openssl استفاده کنید
در نهایت، با انگشت روی دست، آماده دویدن هستیم docker-compose up
!
پس از مراحل نصب، اگر به تنظیمات بروید، خواهید دید که https
به اضافه شده است WordPress Address
و Site Address
خودشه!
من برای راه اندازی https برای وردپرس مشکل داشتم، بنابراین فکر کردم وقتی فهمیدم باید آن را به اشتراک بگذارم. هر گونه بازخوردی را به اشتراک بگذارید! با تشکر و روز خوبی داشته باشید!
در اینجا مخزن GitHub با کد استفاده شده است.