【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]
1 起因
在公共高性能服务器上运行Ollama+DeepSeek,如果按照默认配置启动Ollama程序,则自己在远程无法连接你启动的Ollama服务。
如果修改掉默认的配置,则会遇到你的Ollama被他人完全控制的安全风险。
不过,我们可以使用一个方向代理,并增加一些限制的方式,让我们从远程来访问。同时可以阻止未授权的人的访问。
现在的问题是,我们使用的高性能服务器是公共的,我们没有root权限。意味着我们很多软件我们不能安装。
不过,Nginx可以以普通用户的身份编译、安装和运行。然后使用这个Nginx做反向代理,添加安全验证。
- 安装Nginx时,需要加载SSL模块,方可启用HTTPS。
- 编译SSL模块时,需要 IPC::Cmd
- 编译IPC::Cmd时,需要Perl
- 为了使用Perl,则需要安装perlbrew
这里共有四项内容。
2 安装perlbrew
要使用这个工具来安装perl。
项目
https://github.com/gugod/App-perlbrew
用途:
Manage perl installations in your $HOME
最终文件
https://raw.githubusercontent.com/gugod/App-perlbrew/master/perlbrew-install
安装指令
curl -kL https://install.perlbrew.pl | bash
perlbrew --notest install perl-5.34.0
source ~/perl5/perlbrew/etc/bashrc
安装Perl
安装Perl,下面这一句执行的时间比较长。
perlbrew switch perl-5.34.0
可以再打开一个窗口执行如下指令,观察执行日志
tail -f ~/perl5/perlbrew/build.perl-5.34.0.log
cpanm
curl -L https://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/App-cpanminus-1.7048.tar.gz -o App-cpanminus-1.7048.tar.gz
tar -xzf App-cpanminus-1.7048.tar.gz
cd App-cpanminus-1.7048
perl Makefile.PL INSTALL_BASE=~/perl5
make
make install
参数
export PATH=$HOME/perl5/bin:$PATH
echo 'export PERL5LIB=$PERL5LIB:~/perl5/lib/perl5/' >> ~/.bashrc
echo 'eval "$(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)"' >> ~/.bashrc
source ~/.bashrc
IPC::Cmd
打开网站 https://metacpan.org/pod/IPC::Cmd
下载 https://cpan.metacpan.org/authors/id/B/BI/BINGOS/IPC-Cmd-1.04.tar.gz
解压
tar zxvf IPC-Cmd-1.04.tar.gz
配置
cd IPC-Cmd-1.04/
编译
perl Makefile.PL INSTALL_BASE=~/perl5
make
make install
发布
export PERL5LIB=$PERL5LIB:~/perl5/lib/perl5/
测试
$ cpan IPC::Cmd
Loading internal logger. Log::Log4perl recommended for better logging
Reading '/public/home/xxxxxx/.cpan/Metadata'Database was generated on Sat, 15 Mar 2025 00:17:01 GMT
IPC::Cmd is up to date (1.04).
下载编译OpenSSL。、
下载
这里打开 https://openssl-library.org/source/
选择下载 openssl-3.4.1.tar.gz
解压
tar zxvf openssl-3.4.1.tar.gz
配置
cd openssl-3.4.1/
./config
[000000@gpu04 openssl-3.4.1]$ ./config
Configuring OpenSSL version 3.4.1 for target linux-x86_64
Using os-specific seed configuration
Created configdata.pm
Running configdata.pm
Created Makefile.in
Created Makefile
Created include/openssl/configuration.h**********************************************************************
*** ***
*** OpenSSL has been successfully configured ***
*** ***
*** If you encounter a problem while building, please open an ***
*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
*** and include the output from the following command: ***
*** ***
*** perl configdata.pm --dump ***
*** ***
*** (If you are new to OpenSSL, you might want to consult the ***
*** 'Troubleshooting' section in the INSTALL.md file first) ***
*** ***
**********************************************************************
2 安装Nginx
首先下载Nginx源码
https://nginx.org/en/download.html
注意,不要选版本太高的。公共服务器一般操作系统比较老,如果版本太高,可能编译不了(编译器版本太低)。
这里,我选择 https://nginx.org/download/nginx-1.27.4.tar.gz
如果你喜欢高版本的话,可以试试高版本的,基本流程都一样。
一般情况下高性能服务器只能在内网使用,不通外网,如果通外网的话,需要使用内网的代理服务器。
下载好源码后,将其上载到服务器。
解压
tar zxvf nginx-1.27.4.tar.gz
配置
这里一定要加上参数–prefix,否则就是系统目录,没权限写。接下来配置失败。
cd nginx-1.27.4/
./configure --prefix=$HOME/nginx
执行结果如下:
......
Configuration summary+ using system PCRE library+ OpenSSL library is not used+ using system zlib library
......
可以看到没使用OpenSSL,那么 将来就不能使用https代理了。安全性不足。接下来还需加上OpenSSL库
添加 --with-http_ssl_module 模块。
这里可以用系统的ssl模块。我们也可以用自己编译的。这里我们用自己编译的。
./configure --prefix=$HOME/nginx --with-http_ssl_module --with-openssl=$HOME/openssl-3.4.1
编译
这里基本上不会出错,稍等一会儿即可完成。
make
安装
这一步也没啥。
make install
运行Nginx
[000000@gpu04 sbin]$ ./nginx -V
nginx version: nginx/1.27.4
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 3.4.1 11 Feb 2025
TLS SNI support enabled
configure arguments: --prefix=/public/home/000000/nginx --with-http_ssl_module --with-openssl=/public/home/000000/openssl-3.4.1
直接运行如下命令,一般会出错。80端口,没权限用。
$HOME/nginx/sbin/nginxnginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
结束进程
执行如下指令,找到自己运行的nginx程序
ps aux | grep nginx
根据进程号,全部杀掉
kill -9 12345
kill -9 12121
修改配置
vi $HOME/nginx/conf/nginx.conf
做如下修改,将监听的80端口改成8088或其他高于1024的端口号。
erver {listen 8088; # 改为 8080 或其他高于 1024 的端口server_name localhost;location / {root html;index index.html index.htm;}
}
再次运行
$HOME/nginx/sbin/nginx
然后,没啥结果
测试
执行如下指令,有结果输出,说明Nginx运行成功。
curl http://127.0.0.1:8088
设置反向代理
编辑配置文件1
vi $HOME/nginx/conf/nginx.conf
在http节中,添加如下内容:
map $http_authorization $is_authorized {default 0; # 默认未授权"Bearer YOUR_FIXED_TOKEN_HERE" 1; # 替换为你的固定 Bearer Token}
添加PATH
export PATH=$HOME/nginx/sbin:$PATH
vi $HOME/nginx/conf/deepseek.0x99.top.conf
server
{listen 8088;listen 8443 ssl http2 ;server_name deepseek.0x99.top;index index.php index.html index.htm default.php default.htm default.html;root /www/wwwroot/deepseek.0x99.top;#CERT-APPLY-CHECK--START# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除include /www/server/panel/vhost/nginx/well-known/ds.0x88.top.conf;#CERT-APPLY-CHECK--END#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则#error_page 404/404.html;#HTTP_TO_HTTPS_STARTif ($server_port !~ 8443){rewrite ^(/.*)$ https://$host$1 permanent;}#HTTP_TO_HTTPS_ENDssl_certificate /www/server/panel/vhost/cert/deepseek.0x99.top/fullchain.pem;ssl_certificate_key /www/server/panel/vhost/cert/deepseek.0x99.top/privkey.pem;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;ssl_prefer_server_ciphers on;ssl_session_tickets on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;add_header Strict-Transport-Security "max-age=31536000";error_page 497 https://$host$request_uri;#SSL-END#ERROR-PAGE-START 错误页配置,可以注释、删除或修改error_page 404 /404.html;#error_page 502 /502.html;#ERROR-PAGE-END#PHP-INFO-START PHP引用配置,可以注释或修改#清理缓存规则location ~ /purge(/.*) {proxy_cache_purge cache_one $host$1$is_args$args;#access_log /www/wwwlogs/ds.0x88.top_purge_cache.log;}# 检查是否授权if ($is_authorized != 1) {return 401 "Unauthorized: Invalid Bearer Token"; # 返回 401 错误}#引用反向代理规则,注释后配置的反向代理将无效include /www/server/panel/vhost/nginx/proxy/deepseek.0x99.top/*.conf;include enable-php-00.conf;#PHP-INFO-END#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效include /www/server/panel/vhost/rewrite/deepseek.0x99.top.conf;#REWRITE-END#禁止访问的文件或目录location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md){return 404;}#一键申请SSL证书验证目录相关设置location ~ \.well-known{allow all;}#禁止在证书验证目录放入敏感文件if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {return 403;}access_log /www/wwwlogs/deepseek.0x99.top.log;error_log /www/wwwlogs/deepseek.0x99.top.log;
}