用 Docker 运行网站服务
Nginx
Nginx 是一款功能强大的开源反向代理服务器,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议。同时,它还可以作为负载均衡器、HTTP 缓存或 Web 服务器。
下载
可以放心使用官方最新版本镜像,不同版本没有兼容性问题:
[root@server4 ~]$ docker search --filter=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15698 [OK]
[root@server4 ~]$ docker pull nginx
Nginx 服务中主要使用的目录如下:
路径 | 说明 |
---|---|
/usr/share/nginx/html/ | 网页数据存放处。 |
/etc/nginx/ | 配置文件目录。 |
/var/log/nginx/ | 日志存放目录。 |
Nginx 作为 Web 服务使用的端口如下:
端口 | 说明 |
---|---|
80 | HTTP 端口 |
443 | HTTPS 端口 |
配置
启动一个临时的 Nginx 容器,将要挂载的目录复制出来:
[root@server4 ~]$ docker run -d --name tempn nginx
fb67cb1fce9f32b57729cb62c2a5d716edc1d42d39fcd1faae1bc57f6bab6a9d
[root@server4 ~]$ docker cp tempn:/etc/nginx/ ~/nginx/config
[root@server4 ~]$ docker rm -f tempn
Nginx 主配置文件 nginx.conf
参考如下:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
use epoll;
accept_mutex on;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
#上传文件相关参数
client_max_body_size 200M;
client_body_buffer_size 1024K;
client_header_timeout 1m;
client_body_timeout 1m;
proxy_connect_timeout 60s;
proxy_read_timeout 1m;
proxy_send_timeout 1m;
#gzip压缩参数
gzip on; # 开启gzip功能
gzip_min_length 1k; # 响应页数据上限
gzip_buffers 4 16k; # 缓存空间大小
gzip_comp_level 6; # 设置压缩级别为6
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json; # 压缩文件类型
gzip_disable "MSIE [1-6]\."; # IE 1-6关闭gzip压缩
gzip_vary on; # 启用压缩标识
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#在一次长连接上所允许请求的资源的最大数量
keepalive_requests 5;
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
include /etc/nginx/conf.d/*.conf;
}
个性化主机配置文件一般放在 config/conf.d
目录中。例如,本站配置文件 blog.x2b.net.conf
内容如下:
server {
listen 80;
listen 443 ssl;
server_name blog.x2b.net;
ssl_certificate /etc/nginx/certs/x2b.net.pem;
ssl_certificate_key /etc/nginx/certs/x2b.net.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3 SSLv3;
ssl_prefer_server_ciphers on;
location / {
root /usr/share/nginx/html/x2b.net-deploy/;
index index.html index.htm;
}
}
将 x2b.net
的 SSL 证书上传到服务器,并修改权限为只读:
[root@server4 ~]$ useradd nginx
[root@server4 ~]$ chown -R nginx:nginx cert
[root@server4 ~]$ chmod -R 400 cert
启动
修改好配置文件后,挂载目录和映射端口启动:
[root@server4 ~]$ docker run -d --name nginx -p 80:80 -p 443:443 -v /docker/nginx/html:/usr/share/nginx/html:ro -v /docker/nginx/conf.d:/etc/nginx/conf.d:ro nginx
220f821e4fed6e1cc421509bbfbaf6b36a71739b69c89c14d929a34e27ab0524
[root@server4 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
220f821e4fed nginx "/docker-entrypoint.…" 21 seconds ago Up 19 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp nginx
使用 Docker Compose 启动配置文件内容参考:
version: '2'
services:
nginx:
image: nginx:1.23.4
container_name: nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./config:/etc/nginx
- ./html:/usr/share/nginx/html
- ./logs:/var/log/nginx
- ./certs:/etc/nginx/certs
environment:
- TZ=Asia/Shanghai
- NGINX_WORKER_PROCESSES=auto
- NGINX_HTTP_KEEPALIVE_TIMEOUT=65
这里额外挂载了配置文件中指定的日志目录,因为有时需要对 Nginx 日志做分析。
隧道
本地环境可以配合 cloudflared 隧道来发布网站。使用 Docker Compose 启动配置参考:
version: '3.9'
services:
cloudflare:
image: cloudflare/cloudflared:2023.4.0
container_name: cloudflared
restart: always
network_mode: "host"
volumes:
- ./certs/cert.pem:/home/nonroot/.cloudflared/cert.pem
command: tunnel run --token "eyJhIjoiZWEyZjE2MTE4NjkyMzFlYmYzMWZjNDI0Zj1"
网络模式必须为 host 才可正常连接服务器。
WordPress
WordPress 是基于 PHP 和 MySQL 构建的一款开源内容管理系统 (CMS),用于创建和管理网站、博客和应用程序。
下载
WordPress 服务中主要使用的目录如下:
路径 | 说明 |
---|---|
/var/www/html/ | 网页数据存放处。 |
/etc/apache2/ | Apache 配置文件目录。 |
/usr/local/etc/php/conf.d/ | PHP 配置文件目录。 |
WordPress 默认使用的端口如下:
端口 | 说明 |
---|---|
80 | HTTP 端口 |
配置
由于 WordPress 配置文件太多,因此最好只挂载需要修改的文件,否则在升级 WordPress 版本后可能会出兼容性问题。
修改上传限制
修改默认文件上传限制,配置文件 uploads.ini
内容如下:
file_uploads = On
memory_limit = 300M
post_max_size = 200M
upload_max_filesize = 100M
max_execution_time = 600
获取访客真实地址
添加 remoteip.conf
和 remoteip.load
配置文件用于获取用户真实 IP 地址:
RemoteIPHeader HTTP-X-Forwarded-For
RemoteIPProxiesHeader X-Forwarded-By
载入模块配置:
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
Nginx 配置
在 Nginx 上新增配置文件 wordpress.x2b.net.conf
,参考内容如下:
server {
listen 80;
listen 443 ssl;
server_name wordpress.x2b.net;
ssl_certificate /etc/nginx/certs/x2b.net.pem;
ssl_certificate_key /etc/nginx/certs/x2b.net.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3 SSLv3;
ssl_prefer_server_ciphers off;
ssl_stapling on;
ssl_stapling_verify on;
location / {
proxy_pass http://192.168.2.204:8080;
proxy_redirect default;
proxy_read_timeout 86400;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 保证获取到真实IP
proxy_set_header X-Real-IP $remote_addr;
# 真实端口号
proxy_set_header X-Real-Port $remote_port;
# X-Forwarded-For 是一个 HTTP 扩展头部。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在多级代理的情况下,记录每次代理之前的客户端真实ip
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
# 获取到真实协议
proxy_set_header X-Forwarded-Proto $scheme;
# 真实主机名
proxy_set_header Host $host;
# 设置变量
proxy_set_header X-NginX-Proxy true;
}
}
主要是加入获取访客真实 IP 地址的相关配置。
启动
使用 Docker Compose 启动配置文件参考:
version: '3.9'
services:
wordpress:
image: wordpress:6.2.0
container_name: wordpress
restart: always
ports:
- "8080:80"
environment:
- WORDPRESS_DB_HOST=192.168.2.204
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=root密码
- WORDPRESS_DB_NAME=wordpress
- TZ=Asia/Shanghai
volumes:
- ./html:/var/www/html
- ./config/remoteip.conf:/etc/apache2/mods-enabled/remoteip.conf
- ./config/remoteip.load:/etc/apache2/mods-enabled/remoteip.load
- ./config/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
Tinyproxy
Tinyproxy 是一个轻量级的开源代理服务器,旨在提供快速、高效的代理服务。它主要用于在本地网络中转发 HTTP 和 HTTPS 请求,以便用户可以通过代理服务器访问互联网资源。
用 Docker Compose 启动的配置文件参考如下:
version: '3.9'
services:
tinyproxy:
image: monokal/tinyproxy:latest
container_name: tinyproxy
restart: always
network_mode: "host"
command: /bin/bash /opt/docker-tinyproxy/run.sh ANY
由于使用属主机网络,所以不需要配置端口。默认配置中对外监听的代理端口号为 8888。
FRP
frp(Fast Reverse Proxy)是一个快速、现代化的反向代理工具。通过使用 frp 可以方便地将内网服务暴露给外部网络,实现远程访问内网服务的需求。
服务端 frps 配置文件 config/frps.ini
极简化配置内容参考如下:
[common]
bind_addr = 0.0.0.0
bind_port = 7000
bind_udp_port = 7001
kcp_bind_port = 7000
dashboard_addr = 0.0.0.0
dashboard_port = 7002
dashboard_user = hxz393
dashboard_pwd = nopasswd
log_file = ./logs/frps.log
log_level = info
log_max_days = 3
token = #Zu1RY#uc@z::z.HA<N{^4F
max_pool_count = 10
max_ports_per_client = 0
tcp_mux = true
用 Docker Compose 启动 frp 服务器端的配置文件参考如下:
version: '2'
services:
nginx:
image: snowdreamtech/frps:0.48.0
container_name: frps
restart: always
ports:
- "7000:7000"
- "7001:7001"
- "7002:7002"
- "10101:10101"
- "10102:10102"
volumes:
- ./config/:/etc/frp/
- ./logs/:/logs/
其中 10101 和 10102 端口为预留给客户端连接的端口。