前言

Nginx UI 是一个全新的 Nginx 网络管理界面,旨在简化 Nginx 服务器的管理和配置。它提供实时服务器统计数据、ChatGPT 助手、一键部署、Let's Encrypt 证书的自动续签以及用户友好的网站配置编辑工具。此外,Nginx UI 还提供了在线访问 Nginx 日志、配置文件的自动测试和重载、网络终端、深色模式和自适应网页设计等功能。Nginx UI 采用 Go 和 Vue 构建,确保在管理 Nginx 服务器时提供无缝高效的体验。

官网:https://nginxui.com/zh_CN/

项目地址:https://github.com/0xJacky/nginx-ui

本教程仅针对家庭NAS用户做个简单配置使用教程。

一、安装

1.1 通过Docker Compose安装

创建docker-compose.yaml文件

0102030405060708091011121314151617version: '3.3'
services:
    nginx-ui:
        stdin_open: true
        tty: true
        container_name: nginx-ui
        restart: always
        environment:
            - TZ=Asia/Shanghai
        volumes:
            - '/opt/docker/nginx-ui/nginx:/etc/nginx'
            - '/opt/docker/nginx-ui/ui:/etc/nginx-ui'
            - '/opt/docker/nginx-ui/logs:/var/log/nginx'
            - '/opt/docker/nginx-ui/www:/var/www'
        ports:
            - 8080:80
            - 8443:443
        image: 'uozi/nginx-ui:latest'

启动容器

docker compose up -d

docker命令安装

docker run -dit \
  --name=nginx-ui \
  --restart=always \
  -e TZ=Asia/Shanghai \
  -v /mnt/user/appdata/nginx:/etc/nginx \
  -v /mnt/user/appdata/nginx-ui:/etc/nginx-ui \
  -v /var/www:/var/www \
  -p 80:80 -p 443:443 \
  uozi/nginx-ui:latest

在这个示例中,容器的80端口和443端口分别映射到主机的8080端口和8443端口。 您需要访问http://<your_server_ip>:8080来访问 Nginx UI。通过docker方式安装的nginx-ui自带nginx,可以直接使用。

1.2 通过自动化脚本安装

此 shell 脚本仅适用于 Linux 系统。如果您使用的是其他操作系统,请参考官网快速入门指南进行手动安装或使用 Docker。

bash <(curl -L -s https://mirror.ghproxy.com/https://raw.githubusercontent.com/0xJacky/nginx-ui/master/install.sh) install -r https://mirror.ghproxy.com/

一键安装脚本默认设置的监听端口为 9000,HTTP Challenge 端口默认为 9180。如果有端口冲突,请手动修改 /usr/local/etc/nginx-ui/app.ini, 并使用 systemctl restart nginx-ui 重启 Nginx UI 服务。更多有关信息,请查看官网配置参考。

二、使用

2.1 初始化配置

通过http://<your_server_ip>:8080来访问 Nginx UI,首次访问,需要填写有效信息自助注册管理账号。

1、邮箱地址必须真实有效,后面申请SSL证书需要用到。

2、用户名和密码自定义,建议使用高强度密码。

3、数据库部分保持默认留空。

2.2 配置申请SSL证书信息

这里以域名托管在腾讯云DNSpod.cn为例,其他域名托管平台道理一样。

1、打开下面地址,登陆你的域名管理账号创建API访问密钥。

创建API访问密钥地址:

https://console.cloud.tencent.com/cam/capi

2、登陆后点击API密钥管理——新建密钥

3、拿个小本子记录好这个SecretIdSecretkey信息,只显示一次的。

4、回到Nginx-UI管理界面,点击证书——DNS凭证——添加——选择DNS 提供商(Tencent Cloud DNS)——填写刚刚创建的SecretIdSecretkey信息,其余部分内容不懂则保持默认留空,下滑到底部点击确定保存。

2.3 申请泛域名证书

如果您不需要申请泛域名证书,请跳过此步骤。

在Nginx-UI面板,点击证书——证书列表——签发通配符证书——填写你的域名——ACME 用户(System Initial User)——DNS 提供商(Tencent Cloud DNS)——DNS凭证(在2.2节创建的)

信息填写完成后,点击下一步程序将开始泛域名证书申请操作。

2.4 配置反向代理

1、点击网站管理——添加站点——配置名称(可以任意设置,方便管理就行)——输入server_name(你的域名)——然后点击下一步。只需要填写配置名称和server_name,其他地方保存默认。

2、点击启用TLS

3、然后删除server1,因为server1是http,这里我们不需要。

3、选择SSL证书

如果你使用的是泛域名证书,点击更改证书,然后选择前面提前申请好的泛域名证书就可以了。

如果不使用泛域名证书,则点击启用 Let's Encrypt 对网站进行加密。

在弹出的获取证书界面选择你的DNS凭证,点击下一步就可以了。

4、证书配置完成后,在配置项下滑找到反向代理配置,点击查看

下滑找到Locations,点击展开内容。修改下面两项内容:

client_max_body_size这项设置作用是限制上传到服务器的文件大小,如果反代的服务是文件存储服务,比如群晖的DSM,那么这项值就建议设置大一点,或者设置为0m,0表示不限制。如果反代的服务不需要上传任何文件到服务器的,比如emby影视服务,则可以设置小一点,设置16m。所以日常建议就是在两个值之间设置,0m或16m。

client_max_body_size 1000m;

proxy_pass填写需要反代的服务地址。比如emby影视服务,这里就设置为proxy_pass http://127.0.0.1:8096/;

proxy_pass http://127.0.0.1:9000/;

其余选项保持默认,修改完成后点击添加即可完成反向代理设置,之后点击下一步,完成全部设置。

至此你已经成功设置一个服务的反向代理操作。只需要配置好第一个服务,后面需要增加反代其他服务,可以直接通过站点列表复制反代配置,然后修改被反代服务的内网地址就可以了。

三、自定义优化(可选)

因知识水平有限,自定义优化配置只代表个人观点,仅供参考。如有更好的优化意见,欢迎反馈。

自定义优化配置主要侧重安全防护,能提高一点点安全性吧。

3.1、nginx.conf配置文件优化

此部分无需修改任何内容,直接复制粘贴替换原有的nginx.conf配置内容即可。替换前记得先备份原始配置文件,防止出错需要回退。

nginx.conf配置文件

001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197# 设置Nginx工作进程的用户为nginx
user nginx;

# 定义错误日志文件路径,日志级别为notice
error_log /var/log/nginx/error.log notice;
# 定义本地错误日志文件路径,日志级别为notice
error_log /var/log/nginx/error.local.log notice;

# 设置保存Nginx进程ID的文件路径
pid /run/nginx.pid;

# 设置工作进程数量为自动,根据CPU核心数动态调整
worker_processes auto;

# 设置每个工作进程的最大打开文件数为65535
worker_rlimit_nofile 65535;

events {
    # 启用multi_accept,允许一个事件循环中同时接受多个新连接
    multi_accept on;
    
    # 设置每个工作进程的最大并发连接数为1024
    worker_connections 1024;
}

http {
    # 设置默认字符集为UTF-8
    charset utf-8;

    # 启用sendfile系统调用,提高文件传输效率
    sendfile on;

    # 启用TCP_NOPUSH选项,减少网络包的发送数量
    tcp_nopush on;

    # 启用TCP_NODELAY选项,避免Nagle算法延迟小数据包的发送
    tcp_nodelay on;

    # 隐藏Nginx版本信息,增强安全性
    server_tokens off;

    # 禁用记录404错误日志
    log_not_found off;

    # 设置MIME类型哈希表的最大大小为2048
    types_hash_max_size 2048;

    # 设置MIME类型哈希表的桶大小为64
    types_hash_bucket_size 64;

    # 禁用代理请求缓冲
    proxy_request_buffering off;

    # 禁用FastCGI请求缓冲
    fastcgi_request_buffering off;

    # 禁用SCGI请求缓冲
    scgi_request_buffering off;

    # 禁用代理响应缓冲
    proxy_buffering off;

    # 禁用FastCGI响应缓冲
    fastcgi_buffering off;

    # 禁用SCGI响应缓冲
    scgi_buffering off;

    # 设置DNS解析超时时间为5秒
    resolver_timeout 5s;

    # 设置客户端请求头的超时时间为10秒
    client_header_timeout 10s;

    # 设置客户端请求体的超时时间为60秒
    client_body_timeout 60s;

    # 设置响应发送超时时间为60秒
    send_timeout 60s;

    # 设置长连接超时时间,65秒后断开客户端,20秒后断开代理服务器
    keepalive_timeout 65s 20s;

    # 设置客户端请求体的最大大小为16MB
    client_max_body_size 16m;

    # 设置服务器名称哈希表的最大大小为8192
    server_names_hash_max_size 8192;

    # 设置服务器名称哈希表的桶大小为128
    server_names_hash_bucket_size 128;

    # 包含MIME类型定义文件
    include /etc/nginx/mime.types;

    # 设置默认的MIME类型为application/octet-stream
    default_type application/octet-stream;

    # 定义日志格式为main
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

    # 定义访问日志文件路径,使用main格式
    access_log /var/log/nginx/access.log main;

    # 定义本地访问日志文件路径,使用main格式
    access_log /var/log/nginx/access.local.log main;

    # 设置SSL会话超时时间为3600秒
    ssl_session_timeout 3600s;

    # 设置SSL会话缓存大小为1MB
    ssl_session_cache shared:SSL:1m;

    # 禁用SSL会话票据
    ssl_session_tickets off;

    # 设置获取真实客户端IP的头部字段为X-Forwarded-For
    real_ip_header X-Forwarded-For;

    # 启用递归解析X-Forwarded-For头部,获取最后一个IP
    real_ip_recursive on;

    # 设置信任的IP地址来源为127.0.0.1
    set_real_ip_from 127.0.0.1;

    # 仅启用TLS 1.2和TLS 1.3协议
    ssl_protocols TLSv1.2 TLSv1.3;

    # 设置SSL加密套件
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
                 ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
                 ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:
                 DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    # 启用SSL证书OCSP Stapling
    ssl_stapling on;

    # 启用OCSP响应验证
    ssl_stapling_verify on;

    # 默认情况下,设置Connection头部为upgrade
    map $http_upgrade $connection_upgrade {
        default upgrade;
        # 如果没有升级请求,则关闭连接
        "" close;
    }

    # 对IPv4地址设置X-Forwarded-For头部格式
    map $remote_addr $proxy_forwarded_elem {
        ~^[0-9.]+$ "for=$remote_addr";
        # 对IPv6地址设置X-Forwarded-For头部格式
        ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\"";
        # 默认设置X-Forwarded-For头部为unknown
        default "for=unknown";
    }

    # 根据现有Forwarded头部内容添加自定义Forwarded头部信息
    map $http_forwarded $proxy_add_forwarded {
        "~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*([ \\t]*,([ \\t]*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*)?)*$" "$http_forwarded, $proxy_forwarded_elem";
        # 默认情况下仅使用proxy_forwarded_elem
        default "$proxy_forwarded_elem";
    }

    # 禁用对MSIE 6浏览器的Gzip压缩
    gzip_disable "msie6";

    # 设置启用Gzip压缩的最小响应体大小为1000字节
    gzip_min_length 1000;

    # 定义启用Gzip压缩的MIME类型
    gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

    # 启用Vary: Accept-Encoding头部,以便根据客户端支持情况发送Gzip压缩内容
    gzip_vary on;

    # 启用静态Gzip压缩文件支持
    gzip_static on;

    # 设置打开文件缓存,最多缓存1000个文件,60秒不活动后移除缓存
    open_file_cache max=1000 inactive=60s;

    # 设置缓存文件的有效期为3秒
    open_file_cache_valid 3s;

    # 设置文件至少被使用2次才会被缓存
    open_file_cache_min_uses 2;

    # 缓存打开文件时发生的错误
    open_file_cache_errors on;

    # 包含conf.d目录下的所有配置文件
    include /etc/nginx/conf.d/*.conf;

    # 包含sites-enabled目录下的所有配置文件
    include /etc/nginx/sites-enabled/*;
}

点击配置管理——找到nginx.conf,点击修改,复制粘贴替换原有的配置内容即可。

3.2、server模块配置优化

使用此server模块配置内容替换原有的,需要修改的地方有以下四个位置。

1、修改server_nameserver_name是定义你外网访问域名的设置。

01    # 定义服务器名称为jellyfin.baidu.com
    server_name jellyfin.baidu.com;

2、修改SSL证书文件路径。证书可以通过面板的基本模式——修改证书进行路径设置。

010203    # 指定SSL证书文件路径
    ssl_certificate /etc/nginx/ssl/*.baidu.com_2048/fullchain.cer;
    # 指定SSL证书密钥文件路径
    ssl_certificate_key /etc/nginx/ssl/*.baidu.com_2048/private.key;

还可以在面板的证书——证书列表——选中需要查询的证书——点击修改——下滑即可找到证书路径。

3、设置客户端请求体的最大大小。client_max_body_size的作用前面2.4小节已经描述过,如果你还是无法判断该设置多少,就先保持默认,如果后续访问出现问题,再调整为0即可。

01        # 设置客户端请求体的最大大小为16MB
        client_max_body_size 16m;

4、设置内网需要反向代理的服务地址。比如需要反代Emby服务,就修改IP地址为Emby的,如下所示。其他服务也是如此。

01        # 设置内网需要反向代理的服务地址
        proxy_pass http://192.168.8.11:8096/;

5、其他部分内容无需修改,完成保持默认值即可。

server模块配置文件

0102030405060708091011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495server {
    # 监听443端口,启用SSL
    listen 443 ssl;
    # 监听IPv6地址的443端口,启用SSL
    listen [::]:443 ssl;
    # 定义服务器名称为jellyfin.baidu.com
    server_name jellyfin.baidu.com;
    # 指定SSL证书文件路径
    ssl_certificate /etc/nginx/ssl/*.baidu.com_2048/fullchain.cer;
    # 指定SSL证书密钥文件路径
    ssl_certificate_key /etc/nginx/ssl/*.baidu.com_2048/private.key;
    
    # 允许无效的HTTP头部
    ignore_invalid_headers off;

    # 添加严格传输安全头部,启用子域名,缓存期限为1年
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    # 添加XSS保护头部,启用阻止模式
    add_header X-XSS-Protection "1; mode=block" always;
    
    # 添加内容类型选项头部,防止MIME类型嗅探
    add_header X-Content-Type-Options "nosniff" always;
    
    # 添加引用者策略头部,设置为在降级时不发送引荐来源
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
    
    # 添加内容安全策略头部,限制资源加载来源
    add_header Content-Security-Policy "default-src 'self' http: https: ws: wss: data: blob: 'unsafe-inline'; frame-ancestors 'self';" always;
    
    # 添加权限策略头部,禁用兴趣小组(如FLoC)
    add_header Permissions-Policy "interest-cohort=()" always;
    
    # 添加X-Frame-Options头部,防止点击劫持,设置为同源
    add_header X-Frame-Options "SAMEORIGIN";

    location /.well-known/acme-challenge {
        # 设置Host头部为请求的主机名
        proxy_set_header Host $host;
        # 设置X-Real-IP头部为客户端的真实IP地址
        proxy_set_header X-Real-IP $remote_addr;
        # 设置X-Forwarded-For头部为客户端的真实IP和端口
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
        # 将请求代理到本地127.0.0.1:9180
        proxy_pass http://127.0.0.1:9180;
    }

    location ~ ((^|/)\.|^.*\.yml$|^/sites/.*/private/|^/sites/[^/]+/[^/]*settings.*\.php$) {
        # 匹配隐藏文件、YAML文件、私有目录、以及某些PHP文件,返回444状态码
        return 444;
    }

    location ~ ^/sites/[^/]+/files/.*\.php$ {
        # 匹配特定目录下的PHP文件,返回444状态码
        return 444;
    }

    location ~ /vendor/.*\.php$ {
        # 匹配vendor目录下的PHP文件,返回444状态码
        return 444;
    }

    location ~* /(images|cache|media|logs|tmp)/.*\.(gz|tar|bzip2|7z|php|php5|php7|log|error|py|pl|kid|love|cgi|shtml|phps|pht|jsp|asp|sh|bash)$ {
        # 匹配特定目录下的危险文件类型,返回444状态码
        return 444;
    }

    location / {
        # 检查请求的Host头部是否与服务器名称匹配,如果不匹配则返回404状态码
        if ($host != $server_name) {
            return 404;
        }

        # 设置代理使用的HTTP版本为1.1
        proxy_http_version 1.1;
        # 设置Upgrade头部为客户端请求的Upgrade头部
        proxy_set_header Upgrade $http_upgrade;
        # 设置Connection头部为客户端请求的Connection头部
        proxy_set_header Connection $connection_upgrade;
        # 设置客户端请求体的最大大小为16MB
        client_max_body_size 16m;
        # 禁用代理重定向
        proxy_redirect off;
        # 设置Host头部为请求的主机名
        proxy_set_header Host $host;
        # 设置X-Real-IP头部为客户端的真实IP地址
        proxy_set_header X-Real-IP $remote_addr;
        # 设置X-Forwarded-For头部为客户端的转发链
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 设置X-Forwarded-Proto头部为请求的协议(HTTP或HTTPS)
        proxy_set_header X-Forwarded-Proto $scheme;
        # 设置内网需要反向代理的服务地址
        proxy_pass http://192.168.8.11:8096/;
    }
}

教程到此结束。

本文转载自:东方末明