Nignx 反向代理

时间:2023-02-09 18:00:57

编译源码包

准备安装编译所用的依赖和工具

$ sudo yum -y install make zlib zlib-devel gcc gcc-c++ libtool openssl openssl-devel wget pcre pcre-devel git

解压并安装

$ ls -l nginx-1.20.2.tar.gz 
$ tar -zxvf nginx-1.20.2.tar.gz
$ cd nginx-1.20.2/
# 这里开始编译指定功能,--help可以查看开启或关闭哪些模块
# 这里开启了https需要的ssl模块和nginx 状态查看模块
$ ./configure --with-http_ssl_module --with-http_stub_status_module
# 编译成文件 并且 拷贝到指定目录,默认拷贝到/usr/local/nginx
$ make && make install
$ ls /usr/local/nginx
# 执行并测试
$ /usr/local/nginx/sbin/nginx
# 查看nginx端口
$ sudo lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 907 root 6u IPv4 30218 0t0 TCP *:http (LISTEN)
nginx 908 nobody 6u IPv4 30218 0t0 TCP *:http (LISTEN)
$ ss -tnl | awk '/80\>/'
LISTEN 0 128 *:80 *:*
$ curl 127.0.0.1
# 关闭nginx服务
$ killall -9 nginx

注意:这里 nginx服务暂通过命令启动和通过kill杀进程来关闭。因此需要一个.service文件来注册成系统服务才便于管理。

配置注册成系统服务

$ vim /etc/systemd/system/nginx.service  
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 然后使用systemd来管理
# 启动服务
$ systemd start nginx
# 查看系统状态
$ ssytemd status nginx
# 关闭服务
$ systemd stop nginx
# 设置开启自动启动
$ systemd enable nginx
# 取消开启自动启动
$ systemd disable nginx

启动一个filebrowser网盘服务

注:一个golang语言编写的http协议的web应用。

#  解压并安装
sudo tar zxvf linux-amd64-filebrowser.tar.gz
sudo cp filebrowser /usr/sbin/
ls -l /usr/sbin/filebrowser
# 使用--help可以查看使用
# 查看选项命和命令
$ /usr/sbin/filebrowser --help
# 查看子命令config的使用
$ /usr/sbin/filebrowser config --help

# 开始配置,写成sh脚本
$ vim setup-fb.sh
# 初始化数据库,-d指定数据库路径
filebrowser -d /data/fb/filebrowser.db config init
# 设定开启路由监听的地址
filebrowser -d /data/fb/filebrowser.db config set --address 0.0.0.0
# 设定开启的端口
filebrowser -d /data/fb/filebrowser.db config set --port 8088
# 语言支持及日志文件指定
filebrowser -d /data/fb/filebrowser.db config set --locale zh-cn
filebrowser -d /data/fb/filebrowser.db config set --log /var/log/filebrowser.log
# 添加网盘的用户及密码
filebrowser -d /data/fb/filebrowser.db users add admin abc123456 --perm.admin
# 设定网盘的上传文件存储路径
filebrowser -d /data/fb/filebrowser.db config set --root /data1/fb

同样注册filebrowser为一个系统服务

$ cat /etc/systemd/system/fb.service  
[Unit]
Description=The fileborwser Process Manager
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/filebrowser -d /data/fb/filebrowser.db
ExecStop=/bin/killall filebrowser
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 然后使用systemd来管理
# 启动服务
$ sudo systemd start fb
# 查看8088端口是否开启
$ ss -tnl | awk '/8088\>/'
LISTEN 0 128 [::]:8088 [::]:*

浏览器访问8088

登录,使用脚本命令里配置的用户密码

Nignx 反向代理

上传文件

Nignx 反向代理

Nignx 反向代理


配置http protocol反向代理filebrowser

注意:在http中的server段里配置,location /表示访问网站根目录代理到8088端口,也就是fb服务。

$ sudo vim /usr/local/nginx/conf/nginx.conf
.....
http {
...
server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

# location / {
# root html;
# index index.html index.htm;
# }
location / {
proxy_pass http://127.0.0.1:8088;
# 代理时 添加/改写 请求头部
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
...
}

重启或重载nginx服务

$ sudo systemctl restart nginx

$ sudo systemctl reload nginx

再次访问80端口

Nignx 反向代理

再次上传文件测试

上传一个小文件

Nignx 反向代理

再上传一个大文件

Nignx 反向代理

Nignx 反向代理

这里上传文件出现错误, 查看nginx日志

$ tail -n 1 /usr/local/nginx/logs/error.log  
2023/02/09 13:42:14 [error] 15737#0: *15 client intended to send too large body: 32233760 bytes, client: 10.0.2.2, server: localhost, request: "POST /api/resources/scrt_sfx801-x64.exe?override=false HTTP/1.1", host: "127.0.0.1", referrer: "http://127.0.0.1/files/"

注:client intended to send too large body: 32233760 bytes,这个提示请求过大,也就是上传的文件过大,在未配置nginx代理通过fb 8088访问是默认无限制,但经过nginx代理却有显示。


在http配置段,server段之前配置最大请求体的大小,这里配置500m:

   client_max_body_size 500m;


$ sudo vim /usr/local/nginx/conf/nginx.conf
..........
http {

include 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 logs/access.log main;

sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;

keepalive_timeout 65;
#gzip on;

# 在http配置段,server段之前配置最大请求体的大小,这里配置500m
client_max_body_size 500m;

server {
listen 80;
......

配置nginx后重启再测试

$ systemd restart nginx

Nignx 反向代理

这里发现上传成功了,可以查看 /data1/fb 中是否有文件。

$ ls /data1/fb/
scrt_sfx801-x64.exe scrt_sfx801-x86.exe test.txt

配置ssl自签证书,https协议、域名访问

CA

# 自建CA
cd /etc/pki/CA
# 生成密钥
openssl genrsa -out private/cakey.pem 2048
# 生成CA证书
openssl req -new -x509 -nodes -key private/cakey.pem -days 730 -out cacert.pem
# 增量序号,新认证一个会自增
touch index.index
echo 01 > serial

nginx 申请证书

openssl genrsa -out server.pem 2048
openssl req -new -nodes -key server.pem -out server.csr

这里是同一机器,如果不是同一台,把.csr拷到CA所在服务器

openssl ca -in server.csr -days 365 -out server.crt

然后server.pem(私钥), server.crt证书放到nginx的conf目录,进行配置

$ cd /usr/local/nginx/conf/
$ ls server.*
server.crt server.pem

# 配置nginx https协议,http中添加一个server 段
$ vim nginx.conf
...
server {
listen 443 ssl;
server_name www.test.com;
ssl_certificate server.crt;
ssl_certificate_key server.pem;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-Xss-Protection 1;

location / {
# 代理到指定域名
proxy_pass http://www.test.com:8088;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
...

使用/etc/hosts来进行域名测试,添加本机执行127.0.0.1,也可以设定指定ip

$ tail /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 www.test.com

给firefox浏览器添加CA证书为信任的根证书。也就是cacert.pem文件

Nignx 反向代理

启动服务,通过https:// sheme访问,会代理到8088

Nignx 反向代理