传统项目中的图片管理
传统项目中,可以在web项目中添加一个文件夹,来存放上传的图片。例如在工程的根目录WebRoot下创建一个images文件夹。把图片存放在此文件夹中就可以直接使用在工程中引用。
**优点:**引用方便,便于管理
缺点:
1、如果是分布式环境图片引用会出现问题
2、图片的下载会给服务器增加额外的压力
传统图片管理方式在分布式环境中的问题:
分布式的情况下,把工程复制多份到多个tomcat,由于负载均衡,每次上传的图片不一定都在一个tomcat中,因此会出现图片访问不到的情况
分布式环境的图片管理
不把图片存放在工程下,而是单独建立一个图片服务器,图片的上传与请求至于这个图片服务器有关
分布式环境一般都有一个专门的图片服务器存放图片。
我们使用虚拟机搭建一个专门的服务器来存放图片。在此服务器上安装一个nginx来提供http服务,安装一个ftp服务器来提供图片上传服务。
搭建图片服务器
第一步:安装vsftpd提供ftp服务
安装vsftpd
// 1.检查是否安装了vsftpd(如果显示版本号,则说明已安装)
[root@localhost]# rpm -q vsftpd
// 2、安装vsftpd
[root@localhost]# yum install vsftpd -y
// 3、安装ftp命令
[root@localhost]# yum install ftp -y
配置vsftpd
vi /etc/vsftpd/vsftpd.conf ftp配置文件(重要、重要、重要)
# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
#anon_upload_enable=YES
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
#xferlog_file=/var/log/xferlog
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=YES
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode. The vsftpd.conf(5) man page explains
# the behaviour when these options are disabled.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
# You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
#chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
#
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
#ls_recurse_enable=YES
#
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=NO
#
# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
# Make sure, that one of the listen options is commented !!
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
启动vsftpd
// 4、启动vsftpd
[root@localhost]# systemctl start vsftpd
// 4、重启vsftpd服务(或者)
[root@localhost]# systemctl restart vsftpd
// 5、设置开机自动启动
[root@localhost]# systemctl enable vsftpd
Active: active (running) 说明安装已完成
创建FTP用户
// 1、创建用户
[root@localhost]# useradd -d /home/ftpuser/imgs -g ftp -s /sbin/nologin ftpbuser
// 2、设置用户密码
[root@localhost]# passwd ftpuser
测试
方法一:使用命令行
[root@hdp-0]# ftp hdp-0
[root@hdp-0 vsftpd]# ftp hdp-0
Connected to hdp-0 (192.168.183.132).
220 (vsFTPd 3.0.2)
Name (hdp-0:root): ftpbuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
方法二:使用浏览器
打开浏览器,输入ftp://服务器ip,如果能显示你的ftp目录,则说明登录成功
1…访问ftp://主机名 出现pub文件夹,因为默认配置允许匿名用户访问,所有人都能访问
2…设置成只有指定的人才能访问,vim /etc/vsftpd/vsftpd.conf 设置为:
anonymous_enable=NO 匿名用户不能访问
userlist_enable=YES userlist文件是要发挥作用的
添加
userlist_deny=NO userlist文件中的用户不能拒绝。。只有这些人能访问
userlist_file=/etc/vsftpd/user_list 指定userlist文件的地址
其他设置保持默认
上面的设置把user_list设置成了白名单;ftpusers中是ftp黑名单不能访问ftp;
3.为linux系统添加用户erha,test;并写入user_list文件中;
4.重启ftp服务 service vsftpd restart,访问:开始要用户名密码啦!
之后就可以在浏览器看到图片啦
(这里不是必要的:
安装完vsftpd后,默认情况下,CentOS的防火墙是不开放ftp服务的,需要添加模块和开放21端口才能提供ftp访问。
1.添加ip_conntrack_ftp 模块
[root@hexuweb101 ~] vi /etc/sysconfig/iptables-config
添加下面一行
IPTABLES_MODULES=“ip_conntrack_ftp”
)
注意:如果启动的时候显示:
vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Sat 2019-11-30 16:43:23 CST; 7s ago
Process: 1765 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=2)
Nov 30 16:43:23 hdp-0 systemd[1]: Starting Vsftpd ftp daemon...
Nov 30 16:43:23 hdp-0 vsftpd[1765]: 500 OOPS: bad bool value in co...e
Nov 30 16:43:23 hdp-0 systemd[1]: vsftpd.service: control process ...2
Nov 30 16:43:23 hdp-0 systemd[1]: Failed to start Vsftpd ftp daemon.
Nov 30 16:43:23 hdp-0 systemd[1]: Unit vsftpd.service entered fail....
Nov 30 16:43:23 hdp-0 systemd[1]: vsftpd.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
那么就证明vsftpd.conf配置文件有问题,注意不要有空格!!!或者将listen_ipv6=YES改为NO
如果实在解决不了就要卸载了
卸载vsftpd
[root@localhost ~]# yum remove vsftpd
[root@localhost ~]# find / -name "vsftpd*"
/etc/vsftpd
/etc/vsftpd/vsftpd.conf.bak
[root@localhost ~]# rm -fr /etc/vsftpd/
重新安装
[root@localhost home]#yum -y install vsftpd
[root@localhost home]# systemctl start vsftpd.service
[root@localhost home]# systemctl status vsftpd.service
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2017-11-09 21:15:18 EST; 8s ago
Process: 5716 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
Main PID: 5717 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─5717 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
Nov 09 21:15:18 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
Nov 09 21:15:18 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
Hint: Some lines were ellipsized, use -l to show in full.
Active: active (running) 说明安装已完成
第二步:安装nginx提供http服务
安装make:
yum -y install gcc automake autoconf libtool make
安装g++:
yum install gcc gcc-c++
安装openssl
yum -y install openssl openssl-devel
安装PCRE库
cd /apps
tar -zxvf pcre-8.39.tar.gz
cd pcre-8.39
./configure
make
make install
安装zlib库
cd /apps
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make
make install
安装nginx
cd /apps
tar -zxvf nginx-1.1.10.tar.gz
cd nginx-1.1.10
./configure
make
make install
启动nginx
cd /usr/local/nginx/sbin
./nginx
在浏览器中输入http://192.168.81.129/ 查看启动成功。http://192.168.81.129/:为nginx安装服务器地址
cd /usr/local/nginx/sbin/
./nginx
./nginx -s stop
./nginx -s quit
./nginx -s reload
./nginx -s quit:此方式停止步骤是待nginx进程处理任务完毕进行停止。
./nginx -s stop:此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。
查询nginx进程
ps aux|grep nginx
重启 nginx
1.先停止再启动(推荐):
对 nginx 进行重启相当于先停止再启动,即先执行停止命令再执行启动命令。如下:
./nginx -s quit
./nginx
2.重新加载配置文件:
当 ngin x的配置文件 nginx.conf 修改后,要想让配置生效需要重启 nginx,使用-s reload不用先停止 ngin x再启动 nginx 即可将配置信息在 nginx 中生效,如下:
./nginx -s reload
nginx配置文件结构:
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
几个常见配置项:
1.$remote_addr 与 KaTeX parse error: Double subscript at position 7: http_x_̲forwarded_for 用…remote_user :用来记录客户端用户名称;
3.
t
i
m
e
l
o
c
a
l
:
用
来
记
录
访
问
时
间
与
时
区
;
4.
time_local : 用来记录访问时间与时区; 4.
timelocal:用来记录访问时间与时区;4.request : 用来记录请求的url与http协议;
5.
s
t
a
t
u
s
:
用
来
记
录
请
求
状
态
;
成
功
是
200
;
6.
status : 用来记录请求状态;成功是200; 6.
status:用来记录请求状态;成功是200;6.body_bytes_s ent :记录发送给客户端文件主体内容大小;
7.
h
t
t
p
r
e
f
e
r
e
r
:
用
来
记
录
从
那
个
页
面
链
接
访
问
过
来
的
;
8.
http_referer :用来记录从那个页面链接访问过来的; 8.
httpreferer:用来记录从那个页面链接访问过来的;8.http_user_agent :记录客户端浏览器的相关信息;
惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。
注意:
每个指令必须有分号结束。
.[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf //配置文件 配置文件可根据需求进行配置(重要)此处我主要配置图片存 放的路径以及访问映射路径
修改完成后,进入到/usr/local/nginx/sbin 目录下
执行 ./nginx -s reload 从新启动nginx服务器
root是将图片映射到 /home/ftpuser/imgs 目录下 直接在浏览器输入(或服务器IP)127.0.0.1:8081/图片名称即可访问图片
说明
1)root则是将images映射到/home/ftpuser/www/images/
2)autoindex on便是打开浏览功能。
注意
1)ftpuser这个用户需要自己创建,在Linux安装ftp组件(8步完成)已经创建过,所以在这里不再创建,若没有,则需要自己创建,名字任意。
2)root /home/ftpuser/www/这后面是不带images的且root后面要有空格。www目录下有images目录,用于存放图片!!
也可以在hosts文件中加上域名解析(linux和windows都可以修改):
③修改用户访问权限
chown ftpuser /home/ftpuser
chmod 777 -R /home/ftpuser
在web页面访问:
<form>
<p>显示图片</p>
<img src="http://hdp-0/imgs/a.jpg">
<!--<!– <img src="ftp://test:1234@hdp-0:/home/ftpuser/imgs/a.jpg">–> 使用这种方式访问不到,必须使用nginx-->
</form>