Docker搭建Nginx图片服务器的方法

2025-05-27 0 23

前言

一般开发中,都会把图片上传到一个目录,然后将目录和文件名拼接存储在数据库中,但是,这种方法如果没弄好的话可能有一定的缺陷。

若项目搬迁,即时这台服务器本身还在用,存放在服务器的跟项目相关的图片也要跟着搬迁,同时还要修改代码,会造成较多麻烦。如果搭建一个专门存放图片的服务器,而且通过ftp传输,那么你的代码就不用改了。

关于docker和nginx的介绍和优点在这里就不展开了,网上博客和教程也有很多。

环境搭建

环境搭建有些模块可能不够详细,如果想知道更多的话可以查看其他资料,这里只是简单操作。

1、安装docker

yum install docker

2、拉取nginx镜像

docker pull nginx:1.16.0

1.16.0 是版本号,可以通过 docker search nginx 查询镜像;拉取其他镜像比如 tomcat、mysql 等同理。

3、创建主要文件,用于docker挂载

mkdir -p /home/nginx/www /home/nginx/logs /home/nginx/conf

4、创建并运行nginx容器

?

1

2
docker run -d -p 80:80 -p 443:443 --name nginx-server -v /home/nginx/www:/usr/share/nginx/html

-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs:/var/log/nginx nginx

5、在宿主机上创建nginx的配置文件

/home/nginx/conf 中新建文件 nginx.conf,并写入如下配置:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48
user root;

worker_processes 1;

error_log /var/log/nginx/error.log warn;

pid /var/run/nginx.pid;

events {

worker_connections 1024;

}

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;

sendfile on;

#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;

server {

listen 443 ssl;

server_name 你的 ip 地址或域名;

root /usr/share/nginx/html;

ssl_certificate 你的密钥.pem;

ssl_certificate_key 你的密钥.key;

ssl_session_timeout 5m;

ssl_session_cache shared:ssl:1m;

ssl_ciphers ecdhe-rsa-aes128-gcm-sha256:ecdhe:ecdh:aes:high:!null:anull:!md5:!adh:!rc4;

ssl_protocols tlsv1 tlsv1.1 tlsv1.2;

ssl_prefer_server_ciphers on;

# 跳转到8080端口,即我的tomcat容器,如果浏览器输入 https://ip/ 则跳转到tomcat容器(已经运行并映射端口号)

location / {

root /usr/share/nginx/html;

proxy_pass http://ip:8080/;

index index.html index.htm;

}

     # 如果浏览器输入 https://ip/images/ 则对应宿主机上的 /home/nginx/www/images/ 因为前面已经挂载了,即宿主机某个目录和docker容器内的某个文件夹共享数据

     # 要先在宿主机的 /home/nginx/www/ 中创建 images 目录

location ~ /images/ {

root /usr/share/nginx/html/;

}

}

server {

listen 80;

server_name 你的 ip 地址或域名;

rewrite ^ https://$host$1 permanent;

}

}

这里面有关于ssl的配置,你需要先申请域名,然后搞个ssl证书,再进行配置,这里也不做详细介绍。

环境配置差不多完成,接下来安装 vsftpd 搭建 ftp

搭建ftp

安装vsftpd

yum -y install vsftpd

添加用户

useradd 自定义用户名

passwd 自定义密码

修改配置文件

vi /etc/vsftpd/vsftpd.conf

需要修改的地方如下:

# 配置文件默认为yes,即支持匿名访问,设置为不支持
anonymous_enable=no
# 在最后添加这两行
pasv_min_port=30000
pasv_max_port=30009

保存退出后设置用户访问权限

chown ftpadmin /home/nginx/www/image
chmod 777 -r /home/nginx/www/image

完事后测试一波,通过ftp上传后,通过浏览器https请求得到如下结果:

Docker搭建Nginx图片服务器的方法

*补充一点:阿里云服务器的话记得配置安全组,将21号端口打开,以及443、80端口,还有30000-30009端口

java实现ftp传输

先在resource中创建 ftpresource.properties 文件,并写入参数

ftp_address=你的ip
ftp_port=21
ftp_username=用户名
ftp_password=用户密码
ftp_base_path=/home/nginx/www/images
image_base_url=https://域名/images/

之后写一个工具类,用于ftp传输

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60
import org.apache.commons.net.ftp.ftp;

import org.apache.commons.net.ftp.ftpclient;

import org.springframework.beans.factory.annotation.value;

import org.springframework.context.annotation.propertysource;

import org.springframework.stereotype.component;

import java.io.*;

/**

* @author max

*/

@component

@propertysource("classpath:ftpresource.properties")

public class ftputil {

/**

* ftp_address: ftp 服务器ip地址

* ftp_port: ftp 服务器port,默认是21

* ftp_username: ftp 服务器用户名

* ftp_password: ftp 服务器密码

* ftp_base_path: ftp 服务器存储图片的绝对路径

* image_base_url: ftp 服务器外网访问图片路径

*/

@value("${ftp_address}")

private string ftp_address;

@value("${ftp_port}")

private integer ftp_port;

@value("${ftp_username}")

private string ftp_username;

@value("${ftp_password}")

private string ftp_password;

@value("${ftp_base_path}")

private string ftp_base_path;

@value("${image_base_url}")

private string image_base_url;

/**

* 上传图片

* @param inputstream 输入流

* @param name 文件名

* @return 图片 url

* @throws ioexception io异常

*/

public string uploadimage(inputstream inputstream, string name) throws ioexception {

ftpclient ftpclient = new ftpclient();

try {

system.out.println(ftp_address);

ftpclient.enterlocalpassivemode();

ftpclient.connect(ftp_address, ftp_port);

ftpclient.login(ftp_username, ftp_password);

ftpclient.changeworkingdirectory(ftp_base_path);

ftpclient.setfiletype(ftp.binary_file_type);

boolean issucceed = ftpclient.storefile(name, inputstream);

if (issucceed){

return image_base_url + name;

}

}catch (exception e){

e.printstacktrace();

}finally {

ftpclient.logout();

}

return image_base_url + "error";

}

}

然后在service处理逻辑,此处只展示部分代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
@autowired

private ftputil ftputil;

@override

public int insertimg(multipartfile file) throws ioexception {

/*

1、获取上传的文件流 inputstream 以及文件名 getoriginalfilename

2、调用 ftputil 中的函数,将图片上传到图片服务器并返回 https 地址

3、若返回的是图片地址,则将其插入数据库

*/

inputstream inputstream = file.getinputstream();

string filename = file.getoriginalfilename();

string picurl = ftputil.uploadimage(inputstream, filename);

}

就这样完事儿,以后客户端请求过来,通过ftp传输到服务器,然后将地址保存到数据库,前端只要获取了图片url就会显示。

总结

到此这篇关于docker搭建nginx图片服务器的文章就介绍到这了,更多相关docker搭建nginx图片服务器内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://www.cnblogs.com/lyuzt/p/12575390.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 行业资讯 Docker搭建Nginx图片服务器的方法 https://www.kuaiidc.com/67324.html

相关文章

发表评论
暂无评论