官方安装教程:https://nginx.org/en/linux_packages.html#Ubuntu
sudo apt-get update
sudo apt-get install nginx
配置示范
配置文件/etc/nginx/nginx.conf
server {
listen 80;
server_name g.3kj.xyz;
location / {
proxy_pass http://127.0.0.1:5280; # 将请求转发到 Gin 服务器
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标签放置在http标签中
根域名跳转到www,以及强制https
#根域名跳转
server {
listen 80;
server_name abc.com;
return 301 https://www.abc.com$request_uri;
}
server {
listen 443;
server_name btcmai.com;
return 301 https://www.abc.com$request_uri;
}
#http跳转到https
server {
listen 80;
server_name www.abc.com;
return 301 https://$host$request_uri;
}
静态文件下载
server {
listen 80; # 监听80端口
server_name yourdomain.com; # 绑定的域名,请替换成你的域名
location / {
root /home/ai/docker/markdown; # 设置静态文件根目录
#alias /home/flask/static/; #如果希望指定路由映射到这个目录则使用这条
autoindex on; # 开启目录浏览,方便下载文件
autoindex_exact_size off; # 文件大小显示采用易读格式(KB、MB等)
autoindex_localtime on; # 显示本地时间
}
}
常用命令
nginx -v 查看版本
sudo nginx -t 检查配置文件错误
sudo systemctl reload nginx 重载配置
sudo systemctl restart nginx 重启
sudo systemctl status nginx 查看运行状态
sudo systemctl disable nginx 禁止开机启动
sudo systemctl enable nginx 设置开机启动
sudo systemctl start nginx 启动
sudo systemctl stop nginx 停止
sudo tail -f /var/log/nginx/error.log 错误日志
sudo journalctl -u nginx.service -r 错误日志
nginx容器+acme.sh自动续签证书
创建好一个运行nginx服务的文件夹,并创建如下内容
nginx_ser/
├─ nginx/
│ ├─ nginx.conf # 主配置文件
│ ├─ conf.d/ # 网站配置文件
│ │ └─ default.conf # 默认服务
│ └─ html/ #静态文件目录
│ └─ static/
│ └─ index.html
└─ logs/
└─ acme/ 自动更新证书
nginx.conf:
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 日志位置映射到 /var/log/nginx(我们会把它挂到宿主机的 logs/ 目录)
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# 加载站点配置
include /etc/nginx/conf.d/*.conf;
}
default.conf:
#http跳转到https
server {
listen 80;
server_name cp.5210010.xyz;
location ^~ /.well-known/acme-challenge/ {
alias /acme-webroot/.well-known/acme-challenge/;
try_files $uri =404;
}
location / {
return 301 https://$host$request_uri; # 中文注释:其它全跳到 https
}
}
# 443端口,先只开上面的,等下载好证书再开下面的
server {
listen 443 ssl;
http2 on;
server_name cp.5210010.xyz;
# 证书路径(把证书文件挂载到容器的 /etc/nginx/certs/)
ssl_certificate /etc/nginx/certs/cp.5210010.xyz.cer; # 容器内证书路径
ssl_certificate_key /etc/nginx/certs/cp.5210010.xyz.key; # 容器内私钥路径
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /usr/share/nginx/html;
index index.html;
resolver 127.0.0.11 ipv6=off valid=30s; # Docker 内置 DNS,供容器间解析
set $backend_upstream "http://fastapi-app:8001"; # 指向后端服务名(与你后端 compose 的服务名一致)
# /api 反代(写前面)
location /api/ {
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;
# 如果都是在容器,直接使用网络名
proxy_pass $backend_upstream; # 这样写能让容器的nginx先启动而服务可以先不启动
}
# /static 静态目录
location ^~ /static/ {
alias /usr/share/nginx/html/static/;
access_log off;
expires 7d;
add_header Cache-Control "public";
try_files $uri =404;
}
# /admin* → admin.html
location ^~ /admin {
try_files $uri /admin.html;
}
# / → index.html
location = / {
try_files /index.html =404;
}
# /dashboard* → index.html
location ^~ /dashboard {
try_files $uri /index.html;
}
# 假设这里是其它注册登录路由
# 其他请求按文件/目录处理
location / {
try_files $uri $uri/ =404;
}
}
docker-compose.yml:
networks:
backend:
external: true # 告诉 compose:用已存在的网络
name: backend # 可省
services:
nginx:
image: nginx:1.27-alpine
container_name: cp-nginx
ports:
- "80:80"
- "443:443" # 如需启用 HTTPS,在 nginx.conf / conf.d 配好证书后再放开
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # 主配置
- ./nginx/conf.d:/etc/nginx/conf.d:ro # 站点配置(可多文件)
- ./nginx/html:/usr/share/nginx/html:ro # 静态根目录(含 html/static)
- ./logs:/var/log/nginx # 访问/错误日志
- /home/nginx_ser/acme:/acme-webroot:ro # 独立 webroot 时需要
- /home/nginx_ser/certs:/etc/nginx/certs:ro # 证书目录映射到容器
- /home/crowdpulse_lee/static/uploads:/usr/share/nginx/html/static/uploads:ro # 将fastapi的静态文件映射到nginx路由,这个文件要在宿主机的./nginx/html/staticz目录下真实存在
- /home/crowdpulse_lee/static/order_images:/usr/share/nginx/html/static/order_images:ro # 将fastapi的静态文件映射到nginx路由,这个文件要在宿主机的./nginx/html/staticz目录下真实存在
restart: unless-stopped
networks: [backend]
先创建域名证书:
安装acme.sh:curl https://get.acme.sh | sh -s email=dr.web@gmail.com
让acme生效:source ~/.bashrc 或root用户source /root/.bashrc
先使用nginx模式申请
acme.sh --issue --nginx -d agenappx.com -d www.agenappx.com
如果无法检测到nginx的域名配置则使用webroot模式,参考后面的webroot模式
如果连接不上可尝试修改ca服务商:
acme.sh --set-default-ca --server letsencrypt
然后将443服务的配置写进去
将证书安装到nginx容器映射的目录,并设置热重载命令
~/.acme.sh/acme.sh --install-cert -d cp.5210010.xyz --key-file /home/nginx_ser/certs/cp.5210010.xyz.key --fullchain-file /home/nginx_ser/certs/cp.5210010.xyz.cer --reloadcmd "docker exec cp-nginx sh -c 'nginx -t && nginx -s reload'"
这里成功但是容器内可能出现错误,如果出现错误,只需执行nginx容器内的命令就行,这条命令不需要重复执行
不是在容器中
注意nginx是否支持非sudo权限,如果需要sudo权限,那么acme也需要用root启动sudo -i
~/.acme.sh/acme.sh --install-cert -d agenmeta.com -d www.agenmeta.com --key-file /home/web/agenmeta/agenmeta.com.key --fullchain-file /home/web/agenmeta/agenmeta.com.cer --reloadcmd "nginx -t && systemctl reload nginx"
墙内安装acme(失败,无法连接CA)
# 克隆项目
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
# 给acme.sh执行权限后
# 安装
./acme.sh --install -m drweb.co@gmail.com
# 验证程序是否可用
./acme.sh --version
# 经过测试普通方法无法连接上ca服务器,因此最终采用DNS-01 验证,acme可支持使用阿里云api自动实现
export Ali_Key="你的阿里云AccessKeyId"
export Ali_Secret="你的阿里云AccessKeySecret"
nginx申请证书前临时配置示范
server {
listen 80;
listen [::]:80;
server_name unigogogo.com;
# acme.sh 会把临时 location 插到这里,优先级高于下面的 location / # 中文注释
location / {
return 301 https://www.unigogogo.com$request_uri;
}
}
server {
listen 80;
listen [::]:80;
server_name www.unigogogo.com;
location / {
return 301 https://$host$request_uri;
}
}
如果nginx模式申请证书失败可以使用 webroot 模式
示范
server {
listen 80;
listen [::]:80;
server_name admin.agenappx.com;
# 保留下面这段:
location /.well-known/acme-challenge/ {
root /var/www/acme;
try_files $uri =404;
}
location / {
return 301 https://admin.agenappx.com$request_uri;
}
}
然后使用webroot模式申请证书:
~/.acme.sh/acme.sh --issue -d admin.agenappx.com -d app.agenappx.com -w /var/www/acme --keylength ec-256 --debug
容器重启nginx配置
docker exec cp-nginx nginx -t # 在容器内校验配置语法
docker exec cp-nginx nginx -s reload # 发送 reload 指令,平滑生效配置