本文主要介绍Docker搭建Nginx镜像服务器的方法,非常详细的为大家介绍,对大家的学习或者工作有一定的参考价值。有需要的朋友可以参考一下。
简介
一般在开发中,图片上传到一个目录,然后将目录和文件名进行拼接,存储到数据库中。但是,这种方法如果做得不好,可能会有一些缺陷。
如果项目搬迁,即使服务器本身还在使用,服务器中存储的与项目相关的图片也会搬迁,同时修改代码,这样会带来更多的麻烦。如果你设置了一个专门存储图片的服务器,并通过ftp传输,你的代码就不需要修改了。
Docker和Nginx的介绍和优势这里就不展开了,网上的博客和教程也很多。
环境建设
环境的某些模块可能不够详细。如果想了解更多,可以查其他资料。下面只是一个简单的 *** 作。
1.安装Docker
yum安装docker
2.拉动Nginx镜子
码头工人拉nginx:1.16.0
1.16.0是版本号,可以通过docker搜索nginx查询图片;拿其他图片比如tomcat,mysql等等。
3.创建docker安装的主文件。
mkdir-p/home/nginx/www/home/nginx/logs/home/nginx/conf
4.创建并运行Nginx容器
dockerrun-d-p80:80-p443:443--namenginx-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/nginxnginx5.在主机上创建Nginx的配置文件。
在/home/nginx/conf中创建一个新文件nginx.conf,并编写以下配置:
userroot; worker_processes1; error_log/var/log/nginx/error.logwarn; pid/var/run/nginx.pid; events{ worker_connections1024; } http{ include/etc/nginx/mime.types; default_typeapplication/octet-stream; log_formatmain'$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.logmain; sendfileon; #tcp_nopushon; keepalive_timeout65; #gzipon; include/etc/nginx/conf.d/*.conf; server{ listen443ssl; server_name你的ip地址或域名; root/usr/share/nginx/html; ssl_certificate你的密钥.pem; ssl_certificate_key你的密钥.key; ssl_session_timeout5m; ssl_session_cacheshared:SSL:1m; ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:aNULL:!MD5:!ADH:!RC4; ssl_protocolsTLSv1TLSv1.1TLSv1.2; ssl_prefer_server_cipherson; #跳转到8080端口,即我的tomcat容器,如果浏览器输入https://ip/则跳转到tomcat容器(已经运行并映射端口号) location/{ root/usr/share/nginx/html; proxy_passhttp://ip:8080/; indexindex.htmlindex.htm; } #如果浏览器输入https://ip/images/则对应宿主机上的/home/nginx/www/images/因为前面已经挂载了,即宿主机某个目录和docker容器内的某个文件夹共享数据 #要先在宿主机的/home/nginx/www/中创建images目录 location~/images/{ root/usr/share/nginx/html/; } } server{ listen80; server_name你的ip地址或域名; rewrite^https://$host$1permanent; } }还有ssl的配置。你需要先申请一个域名,然后获取一个ssl证书,再进行配置。这里就不详细介绍了。
环境的配置几乎已经完成。接下来,安装vsftpd来构建ftp。
设置FTP
安装vsftpd
yum-y安装vsftpd
添加用户
用户添加自定义用户名
Passwd自定义密码
vi/etc/vsftpd/vsftpd.conf
修改如下:
#默认配置文件是YES,表示支持匿名访问,设置为
anonymous_enable=no
#在末尾加上这两行
pasv_min_port=30000[/]
保存后设置用户访问权限。
chownFTPadmin/home/nginx/www/image
chmod777-R/home/nginx/www/image
事后测试一波,通过ftp上传后,通过浏览器的https请求得到以下结果:
*补充一点:记得给阿里云服务器配置安全组,开放端口21,端口443和80,端口30000-30009。
用Java实现FTP传输
首先,在Resource中创建ftpResource.properties文件,并编写参数。
FTP_ADDRESS=您的IP
FTP_port=21
FTP_username=username
FTP_PASSWORD=用户密码
FTP
然后写一个FTP传输的工具类。
importorg.apache.commons.net.ftp.FTP; importorg.apache.commons.net.ftp.FTPClient; importorg.springframework.beans.factory.annotation.Value; importorg.springframework.context.annotation.PropertySource; importorg.springframework.stereotype.Component; importjava.io.*; /** *@authorMax */ @Component @PropertySource("classpath:ftpResource.properties") publicclassFtpUtil{ /** *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}") privateStringFTP_ADDRESS; @Value("${FTP_PORT}") privateIntegerFTP_PORT; @Value("${FTP_USERNAME}") privateStringFTP_USERNAME; @Value("${FTP_PASSWORD}") privateStringFTP_PASSWORD; @Value("${FTP_BASE_PATH}") privateStringFTP_BASE_PATH; @Value("${IMAGE_BASE_URL}") privateStringIMAGE_BASE_URL; /** *上传图片 *@paraminputStream输入流 *@paramname文件名 *@return图片url *@throwsIOExceptionIO异常 */ publicStringuploadImage(InputStreaminputStream,Stringname)throwsIOException{ FTPClientftpClient=newFTPClient(); 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); booleanisSucceed=ftpClient.storeFile(name,inputStream); if(isSucceed){ returnIMAGE_BASE_URL+name; } }catch(Exceptione){ e.printStackTrace(); }finally{ ftpClient.logout(); } returnIMAGE_BASE_URL+"error"; } }然后在服务处理逻辑中,这里只显示了部分代码。
@Autowired privateFtpUtilftpUtil; @Override publicintinsertImg(MultipartFilefile)throwsIOException{ /* 1、获取上传的文件流inputStream以及文件名getOriginalFilename 2、调用FtpUtil中的函数,将图片上传到图片服务器并返回https地址 3、若返回的是图片地址,则将其插入数据库 */ InputStreaminputStream=file.getInputStream(); Stringfilename=file.getOriginalFilename(); StringpicUrl=ftpUtil.uploadImage(inputStream,filename); }就是这样。客户端请求后,通过FTP传输到服务器,然后将地址保存到数据库中。前端只要得到图片网址,就会显示出来。
摘要
关于Docker构建Nginx镜像服务器的这篇文章到此为止。关于DockerbuildingNginximageserver的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)