jquery bind 事件支持部分压缩吗

输入关键字或相关内容进行搜索
前言\n这只是个人的经验总结和分享,并不是,也没时间做一个完整的教程。
分享的是我在实际项目开发中碰到的杂七杂八的问题,仅供参考。一个简单的图片压缩工具\n在线地址: 在工作过程中,难免会碰到需要为同一个图片生成多种分辨率的情形,比如打包app之前需要准备好的各类图标,虽然简单,但是费点时间在所难免,就自己做了一个小工具,主要功能如下:
1. 可以自定义处理后的图片的分辨率和压缩方式等,自定义的样式自动保存,下次可以重复使用。
2. 一键上传图片,根据预设的样式批量生成处理结果,根据需要再自行下载
开发环境\n
vue+mui+webpack+npm+macos
后台服务: 七牛云存储
\n运行环境\n在线服务,可在支持h5的浏览器上运行,电脑,手机平板理论上都可以在线地址: 实现原理\n其实很简单,就是先上传图片到七牛云服务
然后在页面上提供配置页面,保存用户配置的格式,然后把每个格式都转化成七牛的图片转化服务的格式化字符串,最后把这个字符串和图片的原地址合并成图片下载链接,就可以在点击链接时调用七牛的图片处理服务,按照我们设定的格式下载转化后的图片。项目目录结构\n** 详细目录结构介绍和开发环境部署参考 主要代码\n引入vue,mui等库\nimport LContext from 'lui/context.js'
import Vue from 'vue'
import 'babel-polyfill'
import Vuex from 'vuex'
import $ from './mui/mui.min'
require('../css/mui.min.css')
require('../css/icons-extra.css')
//require('../css/iconfont.css')
//require('../css/app.css')
require('../css/app.less')
window.Vue = Vue
window.Vuex = Vuex
window.$ = $
window.mui = $
require('./mui/mui.pullToRefresh')
require('./mui/mui.pullToRefresh.material')
//加载BASE64
require('exports-loader!./util/base64.js')
Vue.use(Vuex)
//import LoginDialog from 'app/Login'
if(process.env.NODE_ENV === 'production') {
Vue.config.productionTip = false
\n*** 有点偷懒,部分变量其实是可以在环境配置时引入的,这里就先忽略了,反正效果也一样***其中的库可根据需要引入,因为是从我自己的架构上COPY下来的,有些文件和库在这个项目中是可以不用引入的。引用的路径和webpack环境配置有关,以下是我的配置
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: { //定义别名,简易方式,可以在require调用时缩短路径
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
&page$&: resolve('src/js/page.js'),
'app': resolve('src/components/'),
'lui': resolve('src/js/lui/'),
'mui': resolve('src/js/mui/'),
'util': resolve('src/js/util/')
\noutput.js代码\nimport Page from 'page'
import Uploader from 'lui/upload.js'
var formVue = new Vue({
el: '.mui-content',
formats: [],
formatBuff: {
scaleType: '按指定宽高值强行缩略,可能导致目标图片变形,width和height取值范围1-9999'
}, //当前正在编辑的图片类型
collapsePanels: {
scale: false
logined: false
computed: {
showScale: function() {
switch(this.formatBuff.facs) {
showHeight: function() {
switch(this.formatBuff.facs) {
showWidth: function() {
switch(this.formatBuff.facs) {
return false
showArea: function() {
switch(this.formatBuff.facs) {
showInput: function() {
if(this.formatBuff.facs & 0) {
return true
return false
srcUri: function() {
if(this.src) {
return LContext.fileServer + this.src + LContext.image.Thumbnail
srcThumbnail: function() {
if(this.src) {
return LContext.fileServer + this.src +
LContext.image.Thumbnail
isEdit: function() {
if(this.formatBuff.uid) {
return true
return false
saveBtnText: function() {
console.log(this.isEdit + '
if(this.isEdit) {
return '保存修改'
return '保存新建样式'
methods: {
downLoad: function(format) {
var _format = this.decodeFormat(format)
if(_format.length & 2) {
lpage.open(LContext.fileServer + this.src + '?imageMogr2' + _format, undefined, 'new')
lpage.alert('下载格式无效!')
downUrl: function(format) {
var _format = this.decodeFormat(format)
if(_format.length & 2) {
return LContext.fileServer + this.src + '?imageMogr2' + _format
return false
deleteFormat: function(format) {
for(var i = 0; i & this.formats. i++) {
if(this.formats[i].uid === format.uid) {
this.formats.splice(i, 1)
lpage.saveFormats()
setFacs: function(facs, event) {
this.formatBuff.facs = parseInt(facs, 10)
Vue.set(this.formatBuff, 'facs', parseInt(facs, 10))
Vue.set(this.formatBuff, 'scaleType', event.currentTarget.innerText)
Vue.nextTick(function() {
this.closePanel('scale')
}.bind(this))
console.log(JSON.stringify(this.formatBuff))
decodeFormat: function(format) {
var formatStr = '/thumbnail/'
switch(format.facs) {
formatStr += '!' + format.scale + 'p'
formatStr += '!' + format.scale + 'px'
formatStr += '!x' + format.scale + 'p'
formatStr += format.width + 'x'
formatStr += 'x' + format.height
formatStr += format.width + 'x' + format.height
formatStr += '!' + format.width + 'x' + format.height
formatStr += format.width + 'x' + format.height + '!'
formatStr += format.width + 'x' + format.height + '&'
formatStr += format.width + 'x' + format.height + '&'
formatStr += format.area + '@'
formatStr = ''
//格式转换
if(format.suffix !== 'auto') {
formatStr += '/format/' + format.suffix
return formatStr
isActiveFacs: function(facs) {
if(this.formatBuff.facs === facs) {
return true
return false
panelActive: function(collapseList) {
return this.collapsePanels[collapseList]
togglePanel: function(collapseList) {
Vue.set(this.collapsePanels, collapseList, !this.collapsePanels[collapseList])
closePanel: function(collapseList) {
Vue.set(this.collapsePanels, collapseList, false)
submitNewFormat: function() {
var newFormat = {
uid: 'format_' + new Date().getTime(),
height: this.formatBuff.height,
width: this.formatBuff.width,
scale: this.formatBuff.scale,
area: this.formatBuff.area,
facs: this.formatBuff.facs,
desc: this.formatBuff.desc,
scaleType: this.formatBuff.scaleType,
suffix: this.formatBuff.suffix ? this.formatBuff.suffix : 'auto', //图片类型
quality: this.formatBuff.quality ? this.formatBuff.quality : 75 //图片质量
var change = false
if(this.formatBuff.uid) {
for(var i = 0; i & this.formats. i++) {
if(this.formats[i].uid === this.formatBuff.uid) {
newFormat.uid = this.formatBuff.uid
this.formatBuff.uid = undefined
Vue.set(this.formats, i, newFormat)
change = true
}!change && this.formats.push(newFormat)
lpage.saveFormats()
editFormat: function(format) {
Vue.set(this.formatBuff, 'uid', format.uid)
Vue.set(this.formatBuff, 'height', format.height)
Vue.set(this.formatBuff, 'width', format.width)
Vue.set(this.formatBuff, 'scale', format.scale)
Vue.set(this.formatBuff, 'area', format.area)
Vue.set(this.formatBuff, 'facs', format.facs)
Vue.set(this.formatBuff, 'desc', format.desc)
Vue.set(this.formatBuff, 'scaleType', format.scaleType)
Vue.set(this.formatBuff, 'suffix', format.suffix === 'auto' ? undefined : format.suffix)
Vue.set(this.formatBuff, 'quality', format.quality ? format.quality : 75)
var pcPage = {
initUI: function() {
this.initUploader()
initData: function() {
this.user.isLogin(function(logined) {
if(logined) {
formVue.logined = true
lpage.getFormats()
formVue.logined = false
lpage.user.login()
initUploader: function() {
new Uploader({
selector: 'image_uploader',
mode: 'imagescale',
image: { //图片
prefix: '/utils/imagescale/'
success: function(data) {
formVue.src = data.key
lpage.saveFormats()
saveFormats: function() {
lpage.setItem('_myFormats', JSON.stringify(formVue.formats))
lpage.setItem('_lastSrc', formVue.src)
getFormats: function() {
var _fmt = lpage.getItem('_myFormats')
if(!_fmt) {
'uid': 'format_8',
'height': '2208',
'width': '1242',
'scale': '50',
'facs': 9,
'desc': '苹果IphoneApp审核用的截屏图片',
'scaleType': '按指定宽高值强行缩略,可能导致目标图片变形,width和height取值范围1-9999\n',
'suffix': 'auto',
'quality': '100'
'uid': 'format_1',
'height': '2732',
'width': '2048',
'scale': '50',
'facs': 9,
'desc': '苹果IpadApp审核用的截屏图片',
'scaleType': '按指定宽高值强行缩略,可能导致目标图片变形,width和height取值范围1-9999\n',
'suffix': 'auto',
'quality': '100'
Vue.set(formVue, 'formats', _fmt)
if(_fmt) {
_fmt = JSON.parse(_fmt)
Vue.set(formVue, 'formats', _fmt)
} catch(e) {
//TODO handle the exception
console.log('err')
_fmt = lpage.getItem('_lastSrc')
if(_fmt) {
formVue.src = _fmt
Page.init({
pc: pcPage
\noutput.html源码\n&!DOCTYPE html&
&html class=&feedback&&
&meta charset=&utf-8&&
&meta name=&viewport& content=&width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no&&
&meta name=&apple-mobile-web-app-capable& content=&yes&&
&meta name=&apple-mobile-web-app-status-bar-style& content=&black&&
&title&友间共享-图片处理&/title&
.mui-content .mui-table-view-radio .mui-table-view-cell&a:not(.mui-btn) {
text-align:
white-space:
&header class=&mui-bar mui-bar-nav&&
&a class=&mui-action-back mui-btn
mui-btn-link mui-btn-nav mui-pull-left&&&span class=& mui-icon mui-icon-left-nav &&&/span& &/a&
&h1 class=&mui-title&&友间共享-图片处理&/h1&
&div class=&mui-content&&
&p class=&mui-content-padded&&可将上传的图片一次性转化输出成多个指定高度/宽度的图片,每次上传文件会扣除一定数额的积分,积分可通过多种方式获取
&a l-href=&https://www.betweenfriends.cn/view/mine/bonusrule.html&&积分获取/使用规则&/a&
&div class=&mui-content-padded &&
&img :src=&srcUri& style=&max-width: 250& /&
&div class=&image-list&&
&div class=&image-item space&&
&button type=&button& class=&mui-btn mui-btn-blue&&点击上传&/button&
&div class=&file&&
&form id=&image_uploader&&&/form&
&p class=&mui-content-padded&&转换后的图片下载&/p&
&ul class=&mui-table-view&&
&li v-for=&format in formats& class=&mui-table-view-cell mui-media&&
&img class=&mui-media-object mui-pull-left& :src=&srcThumbnail&&
&div class=&mui-media-body&&
&p&{{format.desc}}&/p&
&button type=&button& class=&mui-btn mui-btn-link& @tap=&deleteFormat(format)&&删除样式&/button&
&button type=&button& class=&mui-btn mui-btn-link& @tap=&editFormat(format)&&编辑样式&/button&
&a class=&mui-btn mui-btn-blue& :href=&downUrl(format)& download=&格式化图片&&下载图片&/a&
&p class=&mui-content-padded& style=&margin-top: 20&&图片处理参数配置,可在此处新增图片样式&/p&
&ul class=&mui-table-view&&
&li class=&mui-table-view-cell mui-collapse& :class=&{'mui-active':panelActive('scale')}& @tap=&togglePanel('scale')&&
&a class=&mui-navigate-right&&
缩放模式&/a&
&ul class=&mui-table-view mui-table-view-radio&&
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(9)}& @tap=&setFacs(9,$event)&&
&a class=&mui-navigate-right&&
按指定宽高值强行缩略,可能导致目标图片变形,width和height取值范围1-9999
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(1)}& @tap=&setFacs(1,$event)&&
&a class=&mui-navigate-right&&
基于原图大小,按指定百分比缩放。Scale取值范围1-999
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(2)}& @tap=&setFacs(2,$event)&&
&a class=&mui-navigate-right&&
以百分比形式指定目标图片宽度,高度不变。Scale取值范围1-999
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(3)}& @tap=&setFacs(3,$event)&&
&a class=&mui-navigate-right&&
以百分比形式指定目标图片高度,宽度不变。Scale取值范围1-999
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(4)}& @tap=&setFacs(4,$event)&&
&a class=&mui-navigate-right&&
指定目标图片宽度,高度等比缩放,Width取值范围1-9999
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(5)}& @tap=&setFacs(5,$event)&&
&a class=&mui-navigate-right&&
指定目标图片高度,宽度等比缩放,Height取值范围1-9999
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(7)}& @tap=&setFacs(7,$event)&&
&a class=&mui-navigate-right&&
等比缩放,比例值为宽缩放比和高缩放比的较小值,Width 和 Height 取值范围1-9999。 注意:宽缩放比:目标宽/原图宽
高缩放比:目标高/原图高
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(8)}& @tap=&setFacs(8,$event)&&
&a class=&mui-navigate-right&&
等比缩放,比例值为宽缩放比和高缩放比的较大值,Width 和 Height 取值范围1-9999。 注意:宽缩放比:目标宽/原图宽
高缩放比:目标高/原图高
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(10)}& @tap=&setFacs(10,$event)&&
&a class=&mui-navigate-right&&
等比缩小,比例值为宽缩放比和高缩放比的较小值。如果目标宽和高都大于原图宽和高,则不变,Width 和 Height 取值范围1-9999。 注意:宽缩放比:目标宽/原图宽
高缩放比:目标高/原图高;
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(11)}& @tap=&setFacs(11,$event)&&
&a class=&mui-navigate-right&&
等比放大,比例值为宽缩放比和高缩放比的较小值。如果目标宽(高)小于原图宽(高),则不变,Width 和 Height 取值范围1-9999。 注意: 宽缩放比:目标宽/原图宽
高缩放比:目标高/原图高
&li class=&mui-table-view-cell& :class=&{'mui-selected':isActiveFacs(12)}& @tap=&setFacs(12,$event)&&
&a class=&mui-navigate-right&&
按原图高宽比例等比缩放,缩放后的像素数量不超过指定值,Area取值范围1-
&p class=&mui-content-padded& v-show=&showInput&&{{formatBuff.scaleType}}&/p&
&form class=&mui-input-group&&
&div class=&mui-input-row& v-show=&showScale&&
&label&缩放百分比&/label&
&input type=&number& v-model=&formatBuff.scale& class=&mui-input-clear& min=&1& max=&999& step=&1& placeholder=&取值1到999&&
&div class=&mui-input-row& v-show=&showHeight&&
&label&高度&/label&
&input type=&number& v-model=&formatBuff.height& class=&mui-input-clear& placeholder=&高度,0表示根据宽度等比例缩放&&
&div class=&mui-input-row& v-show=&showWidth&&
&label&宽度&/label&
&input type=&number& v-model=&formatBuff.width& class=&mui-input-clear& placeholder=&宽度,0表示根据高度等比例缩放&&
&div class=&mui-input-row& v-show=&showArea&&
&label&像素限制&/label&
&input type=&number& v-model=&formatBuff.area& class=&mui-input-clear& placeholder=&只对jpg有效&&
&div class=&mui-input-row& v-show=&showInput&&
&label&图片质量&/label&
&input type=&number& v-model=&formatBuff.quality& class=&mui-input-clear& min=&1& max=&100& placeholder=&从1到100,默认75&&
&div class=&mui-input-row& v-show=&showInput&&
&label&输出文件格式&/label&
&input type=&text& class=&mui-input-clear& v-model=&formatBuff.suffix& placeholder=&默认为原图格式,如jpg,非法格式可能导致出错&&
&div class=&mui-input-row& v-show=&showInput&&
&label&格式说明&/label&
&input type=&text& class=&mui-input-clear& v-model=&formatBuff.desc& placeholder=&格式说明,用途说明等,将作为该格式的备注显示&&
&div class=&mui-button-row&&
&button type=&button& class=&mui-btn mui-btn-link & v-show=&showInput&&isEdit& @tap=&submitNewFormat&&放弃修改&/button&
&button type=&button& class=&mui-btn mui-btn-blue & v-show=&showInput& @tap=&submitNewFormat&&{{saveBtnText}}&/button&
&div class=&mui-text-center& style=&margin-top: 30 bottom: 0width: 100%;&&
(C) 2017 -
&a l-href=&https://www.betweenfriends.cn&& 友间共享 &/a&
&a l-href=&https://blog.betweenfriends.cn/about&& 关于我们 &/a& - 闽ICP备号-1
\n代码解读\n
利用mui控制UI的布局和渲染展示
vue负责绑定ui和后台数据,并跟踪数据变化
Page是我自己定义的框架,源码就不方便分享了,简单的实现参考
\n原文地址:https://blog.betweenfriends.cn/post/crossdomaindev.html
后台七牛的接口地址错了,已修复
在线demo提示未知错误
要回复文章请先或
(window.slotbydup=window.slotbydup || []).push({
id: '5513626',
container: s,
size: '960,90',
display: 'inlay-fix'51CTO旗下网站
压缩和归档
《学习Nginx HTTP Server(中文版)》第1章准备工作环境,在这一章中,我们将指导你通过这些步骤来准备工作环境,包括计算机和网站服务器。要想建立一个功能齐全的Nginx,需要理解许多事情,尤其是使用Windows操作系统的读者。本节为大家介绍压缩和归档。
作者:陶利军 译来源:清华大学出版社| 11:30
压缩和归档
虽然ZIP和RAR压缩格式很流行并且广泛应用于互联网,它们都是专利技术软件,所以并非Linux世界的主流选择,其他格式,例如 Gzip 和 bzip2是幸运的。当然,对于Linux,ZIP和RAR解决方案都有。但是你会发现在Linux系统下,多数项目下载的归档文件都是.tar.gz 或 .tar.bz2文件。
正确读取文件名,这里有两个扩展名--tar 和 gz (或 bz2),第一部分指出将文件组成到一起的方法,第二部分显示使用的压缩算法,Tar(是 Tape archive,磁带归档之意),它是一个把多个文件连接为单个文件的工具,被压缩的单个文件称为tarball,一旦这个tarball建立,就可以给定一个压缩选项,提供各种各样的压缩算法。该工具在大多数Linux发布版本中都有,然而在一些很小的系统中,可能必须用系统中的包管理器手动安装(后面有介绍)它。
使用gzip 和 bz2建立tarball的压缩包的语法各自如下:tar&czvf&archive.tar.gz&[file1&file2…] &tar&cjvf&archive.tar.bz2&[file1&file2…]&
习惯上,Linux用户不会把多个文件归档在一起,而是首先将文件收集到一个唯一的目录中,然后再归档该目录。因此,在用户解压归档文件时,只有一个条目出现在目录列表中。设想一下解压ZIP文件,将一个ZIP文件解压到Windows桌面,你愿意所有的文件单独出现在桌面上还是整洁优美地收集到一个单独的目录中?无论哪种方式,语法是一样的,就看要归档文件还是目录。
命令tar当然也能够执行相反的操作--解压文件,然而,由于在压缩时使用的算法不同,命令的参数也稍有不同:
tar&xzvf&archive.tar.gz &tar&xjvf&archive.tar.bz2&
注意,tar.gz文件也可创建为.tgz,tar.bz2也可创建为.tbz。其他能够tar压缩格式有:LZMA (.tar.lzma)和compress (.tar.z),但是它们都已经废弃不用了。
如果偶然发现RAR或ZIP,也可以解压缩这种文件,下载和安装Linux版的unrar 或unzip即可。它们的语法很简单:unrar&x&file.rar &unzip&file.zip&
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:227290人学习过
讲师:30675人学习过
讲师:269884人学习过
精选博文论坛热帖下载排行
本书面向企业网络应用需求,详细介绍了Windows网络互联解决方案、中小企业共享上网解决方案、基于ISA Server 2006的代理服务器与防火墙解决...
订阅51CTO邮刊今天看啥 热点:
前言:了解named 如果说我们安装的rpm包不符合我们的要求怎么办、比如说我们想起用named的线程模式、比如说我想让他禁用IPv6、比如说我们想启用某种特性、而rpm在编译时没有提供、那这时我们只能去手动编译安装了,那如何去编译安装named: 编译安装named有一个麻烦之处、所有的配置文件你都得自己去建立、像/var/named/这个目录、编译安装时连这个目录都不会存在、得自己去创建这个目录、里面的各种配置文件、区域文件、像根的、localhost的、以及localhost的反向的、都得手动去做、连我们service启动脚本都没、所以不到万不得以最好别去编译他、因为很麻烦、但对于我们学习来讲、我们应该是变得法的去折腾自己、活着就是折腾嘛、那我们各种方法都去摸索一遍、将来我们真要用得着了也好应对。 首先上来就同步一下我们的时间: # hwclock -s 然后检查一下安装环境所需要的开发包组、确保所依赖的开发包组都装有了、我这里没有装、那我就用yum来装一下吧: # yum -y groupinstall &Development Tools& # yum -y groupinstall &Server Platform Development& # yum grouplist 装好后查看一下、最主要两项:Development tools和Server Platform Development 然后我们就去下载源码包了、这里我就去www.isc.org/donloads/官方网站下载了、支持使用的版本是9.9.5、当前使用的稳定版、这个版本中已经自带dlz了、以前的版本没有自带的、安装时要装这个dlz的、如果我们将来人希望指资源记录基于数据库的方式存放的话、而且要能够现场检索、现场响应的话、则自定义启用dlz功能即可、下载好我们就去解压缩: # tar xf bind-9.9.5.tar.gz
这里注意一下:我们要去编译安装一个服务、首先要去看他的README、然后看他的INSTALL、大体了解一下有没有我们所需要的信息、当然我们这里就不多说了、直接往下走: # ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot --prefix=/usr/local/bind9:指定编译存放的路径 --sysconfdir=/etc/named:指定配置文件存放路径 --enable-threads:启用了多线程的功能 然后make和make install就OK了、安装完成就可以去配置了 # make && make install
我们前面说过、编译安装named什么都得自己创建、用户也没有的、所以我们得给他创建一个用户先、而且用户是系统用户、要加-r、系统用户不会给他创建家目录的: 先创建用户组: # groupadd -g 53 -r named # useradd -g named -r named
这里我们先去创建named的工作目录、然后创建named.ca这个文件: # mkdir /var/named 这里@后面的IP是能访问互联网的服务器、生成的数据存在到/var/named/named.ca中去 # dig -t NS . @172.16.0.1 & /var/named/named.ca
然后再去编辑/etc/named/named.conf的配置文件、这个文件也没有、需要自己去编写的: # vim /etc/named/named.conf options {directory&/var/named&;};zone&.&IN {typefile&named.ca&;};zone&localhost&IN {typefile&named.localhost&;allow-transfer { };};zone&0.0.127.in-addr.arpa&IN {typefile&named.loopback&;allow-transfer { };}; 配置文件中的三个文件named.ca、named.localhost、named.loopback上面已经提供有一个了named.ca了、还有这两个named.localhost、named.loopback、同样我们也得提供、也是在/var/named目录下创建: # vim /var/named/named.localhost$TTL 86400 ;定义宏@ IN SOA localhost admin.localhost. ( ;序列号2H ;刷新时间10M ;失败时重试间隔时间7D ;过期时间1D) ;否定答案的时间IN NS localhost.localhost. IN A 172.0.0.1
然后复制一份改写named.loopback的文件: # cp /var/named/named.localhost /var/named/named.loopback # vim named.loopback$TTL 86400@ IN SOA localhost admin.localhost. (2H10M7D1D )IN NS localhost.1 IN PTR localhost. 如果想用rndc远程登录可以生成一个/etc/named/rndc.conf的配置文件: # /usr/local/bind9/sbin/rndc-confgen -r /dev/urandom & /etc/named/rndc.conf 到这里我们别忘了给named.conf和rndc.conf修改属主属组和权限: # chown root:named /etc/named/named.conf # chown root:named /etc/named/rndc.conf # chown root:named /var/named/* # chmod 640 /etc/named/named.conf # chmod 640 /etc/named/rndc.conf # chmod 640 /var/named/*
为了方便、我们在PATH下加个的路径、/etc/profile.d/named.sh: # vim /etc/profile.d/named.sh export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH 在我们的终端重新登录一下就可以生效了 好的、检查一下我们的区域文件有没有语法错误、然后就可以启动了: # named-checkzone &localhost& /var/named/named.localhost # named-checkzone &0.0.127.in-addr.arpa& /var/named/named.loopback # named -u named
#这个表示以named用户启动named # ss -tunl | grep &\&53\&& 然后再查看一下有没有监听53号端口
最后、因为他是一个服务、所以我们要为他提供一个服务脚本、以后可以利用脚本启动、编辑/etc/rc.d/init.d/named:pidFile=/usr/local/bind9/var/run/named.pidlockFile=/var/lock/subsys/namedconfFile=/etc/named/named.conf[ -r/etc/rc.d/init.d/functions] && ./etc/rc.d/init.d/functionsstart() {if[ -e $lockFile ];thenecho&named is already running...&exit0fiecho-n&Starting named:&daemon --pidfile&$pidFile&/usr/local/bind9/sbin/named-u named -c&$confFile&RETVAL=$?echoif[ $RETVAL -eq0 ];thentouch$lockFilereturn$RETVALelserm-f $lockFile $pidFilereturn1fi}stop() {if[ ! -e $lockFile ];thenecho&named is stopped.&fiecho-n&Stopping named:&killproc namedRETVAL=$?echoif[ $RETVAL -eq0 ];thenrm-f $lockFile $pidFilereturn0elseecho&Cannot stop named.&failurereturn1fi}restart() {stopsleep2start}reload() {echo-n&Reloading named: &killproc named -HUPRETVAL=$?echoreturn$RETVAL}status() {ifpidof named &&/dev/null;thenecho-n&named is running...&successechoelseecho-n&named is stopped...&successechofi}usage() {echo&Usage: named {start|stop|restart|status|reload}&}case$1instart);stop);restart);status);reload);*)usageexit4 ;;esac OK、到这里保存退出,给他个执行权限 # chmod +x /etc/rc.d/init.d/named 再加到chkconfig里面去: # chkconfig --add named # chkconfig --list named=============================我是分隔线========================================== DNS正反向解析 DNS(Domain Name Service)域名服务、就是域名解析服务器、所谓名称解析的过程就是某个应用程序基于某个搜索键在指定的数据库中查询、而后查询到某些对应的键以后与之对应的键导出来的过程。
NDS是互联网的基础设施类的服务、这是一种协议、协议最后是要实现的、协议实现的软件很多、我们前面安装配置好的就是其中一个、我们也是用这个BIND来实现DNS的、他运行时监听在UDP的53号端口上、同时监听TCP的53号端口、两种协议的53号端口都被监听了。 域名:如 http://tanxw.blog.51cto.com/ --& IP地址 一级域分为三类
组织域:.com、.org、.mil、.gov、.edu、.net、
国家域:.cn、.hk、.tw、.us、.jp、.ir、.uk
反向域:.in-addr.arpa DNS服务器类型:
主DNS服务器
辅助DNS服务器
缓存DNS服务器 全球有13组DNS根服务器、11台在美国、一组在挪威、一组在日本、DNS服务重兵把守、他的安全性有多重要、一旦被攻击全球都互联网中断、可想而知。 那DNS服务是怎么实现的呢、接下来我们就来说说他的实现过程及基本步骤,上一篇我们已经安装好了BIND这个软件包了、基于这个软件我们来实现DNS服务器: 先来个案例,假如我们注册了一个域名:tanxw.com、有域名了、解析IP地址就可以挂你的网站上去了、这里我们的网段为172.16.251.、在这个服务内我们 提供mail服务:172.16.251.128 提供web服务:172.16.251.176 提供pop服务:是mail的别名,指向mail 提供ftp服务:是www的别名,指向www 还有一台DNS服务器:当前服务器地址 172.16.251.171 看看我们怎么解析:正向解析 首先配置主配置文件,定义区域、配置文件在/etc/named.confg下、有哪些区域需要定义的、一般主配置文件中通常有三个区域、一个是根、还有本地localhost、以及127.0.0.1的反向区域。 其次我们每个区域要完成解析要有区域数据文件、所以还要定义区域数据库文件、而区域数据文件一般都在/var/named/中、运行named的进程还是named这个用户、组也是、这些区域文件或配置文件都不允许额外的其他用户访问、所以他们的权限通常都为640的。 查看全球13个根节点的服务: # dig -t NS . 于是我们就来配置一下以上案例的相关配置信息了、定义我们的区域 # vim /etc/named/named.conf 在后定义我们注册的那个域 zone &tanxw.com.& IN {
file &tanxw.com.zone&; };再切换到/var/named/下创建tanxe.com.zone数据文件、根据我们上规划好的: # vim /var/named/tanxe.com.zone 然后修改一下权限和属主属组: # chown root:named /var/named/tanxe.com.zone # chmod 640 /var/named/tanxe.com.zone 检查主配置文件和区域数据文件有没有语法错误: # named-checkconf
这个是检查主配置文件语法的 这个是检查区域数据文件语法的、指定区域和指定文件 # named-checkzone &tanxe.com& /var/named/tanxw.com.zone 即检查区域、又检查主配置文件的 # service named configtest 重启服务后、解析域名: # service named restart # dig -t A www.tanxw.com @172.16.251.171 反向解析 好了、这样我们就可以解析域名了,这个是正向解析、正向解析就是把域名解析成IP地下、而反向的则是把IP地址解析成域名、那我们再来看看反向的怎么解析呢: 第一步:在我们的named的配置文件中定义一个反向的区域、把我们的网络地址反过来写:如下 # vim /etc/named/named.conf zone &251.16.172.in-addr.arpa& IN {
file &251.16.172.zone&; }; 再切换到/var/named/目录下创建区域数据文件、这里我们复制正向的那个区域数据文件进行修改: # cp /var/named/tanxw.com.zone /var/named/251.16.172.zone # vim /var/named/251.16.172.zone $TTL 43200 @
dns.tanxw.com. admin.tanxw.com. (
dns.tanxw.com. 171
dns.tanxw.com. 128
mail.tanxw.com. 176
www.tanxw.com.这两个配置好之后还要改一下你的NDS服务器的指向、编辑/etc/resolv.conf: # vim /etc/resolv.conf 检查主配置文件和区域数据文件有没有语法错误: # named-checkconf
这个是检查主配置文件语法的 这个是检查区域数据文件语法的、指定区域和指定文件 # named-checkzone &tanxe.com& /var/named/tanxw.com.zone 重启服务后、解析域名: # service named restart 然后我们就可以来测试一下看了: # dig -x 172.16.251.176 OK、到此为止我们的正反向域名解析也都算是完也了、那接下来我们再来说说DNS服务器的主从复制关系DNS服务器的主从复制关系 首先我们要有两台NDS服务器、我这里就启动了两台虚拟机了、要想为域内的DNS服务器必须要在上级获得授权的前提下、添加从服务器的关键的一步:那就是在你主服务器的区域文件中为从服务器添加一条ND记录和对应的A记录。 启动我们另一台虚拟机后、安装上BIND、安装过程上一篇文章我们已经说过了、你也可以用yum来安装、安装完后我们查看一下他的版本:
版本为9.9的、跟我们前面安装的的主服务器的版本一致、这里要注意的是、从服务器的版本一定要高于主服务器的版本、如果主服务器的版本高于从服务器的、那么主服务器的一些新功能可以在从服务器上不兼容了。 安装好后根据我们上面说的、切换去我们的主服务器的区域文件目录下、注意、这里是主服务器的区域文件、编辑tanxw.com.zone这个文件加一条新的NS记录、两台DNS服务都可以互相成为主从: # cd /var/named/ # vim /var/named/tanxw.com.zone
切换到从服务器这里、首先保证从服务器可以跟我们的主服务器可以通信、那我们ping一下: # ping 172.16.251.171
好了、没问题、那我们就去配置一下从服务器的主配置文件了、我们注释掉一些我们不要的项: # vim /etc/named.conf 然后再定义我们的区域数据文件、在最后定义一个区域: # vim /etc/named.rfc1912.zones
再改一下你的从NDS服务器地址、编辑/etc/resolv.conf: # vim /etc/resolv.conf
然后启用named服务、同时查看一下监听的端口是否有了: # service named start # ss -tnul |grep &53&
服务启动后都要看一下日志、这个是一个好习惯、不管有没有问题都要看一眼、下面说明数据已经开始传输了:
再去看一下/var/named/salves/目录下有没有生成一个tanxw.com.zone的文件: # ls /var/named/salves/ # vim /var/named/salves/tanxw.com.zone
然后我们再用从服务器解析一下看、完全没问题、是不是: # dig -t NS tanxw.com @172.16.251.127
好了、一切OK了、到这里我们的主从复制也完成了!=======================================我是分隔线、我又出来了============================子区域授权和转发机制 BIND子域授权的实现:假我们一家公司获得了某一个域的使用权、而我们想在这个域下分出几个子域来分别分给一些部门使用、这样也方便管理、举个例子:tanxw.com下有两个子域、分别是tech.tanxw.com、fin.tanxw.com、而他们两个下面也他别有自己的www和mail等主机、而每一个域内最主要的一台主机就是dns主机、所谓子域授权就是在父域的配置文件中添加如下项: 1、要授权给谁要明确说明、也就是授权的子区域名称 2、指定子区域的名称服务器 3、子区域的名称服务器的IP地址 首先找到你的父域名称服务器、我这里就是主服务器了、再找到正向解析区域数据配置文件、添加一项: # vim /var/named/tanxw.com.zone
然后我们再找一台服务器、我这里再启用一个虚拟机(IP为172.16.251.134)、当然、可以设置在不同的网段、用作子域的服务器、同样安装好BIND、配置好匹配数据文件等相关的配置、这个我们前面都做了很多了、轻车熟路了: # vim /etc/named.conf
# vim /etc/named.rfc1912.zones zone &tech.tanxw.com& IN {
file &tech.tanxw.com.zone& }; # vim /var/named/tech.tanxw.com.zone $TTL 600 @
dns.tech.tanxw.com.
admin.tech.tanxw.com. (
172.16.251.134 www
172.16.251.121 mail
172.16.251.120 修改他的属主和属组、还有权限: # chown root:named /var/named/tech.tanxw.com.zone # chmod 640 /var/named/tech.tanxw.com.zone 启动服务:
测试一下、看看可不可以解析: # dig -t A www.tech.tanxw.com @172.16.251.134
在父域的服务器上解析看: # dig -t NS tech.tanxw.com @172.16.251.171 在此、我们的子域授权功能也能够顺利完了、你可以了吗? 当然、我们@172.16.251.134这台子域服务器当接收到不负责的区域请求时都会转发给根、比如: # dig -t A www.tanxw.com @172.12.251.134 他不负责解析父域名、所以他会转发给根、那如果我们不想转发给根、我们想转发给指定的DNS服务器、如果指定的服务器也不响应我们的转发请求、那不是再得去找根呢、这里我们配置他如果转发的那个服务器不响应我们就不去找根了、那要怎么完全区域转发呢; 这里我们以@172.12.251.134这台服务为转发不解析的区域: # vim /etc/named.rfc1912.zones
这里注意一个、编辑/etc/named.conf配置文件、把最后一行注释了、因为转了时要递归、递归时要验证信息的合法性、可能不会通过。 保存退、重启服务、测试一下:
OK、服务器转发的我们也完成了、接下来我们还是DNS服务的功能、视图的性能压力测试! 接下篇:总结之:CentOS6.5 DNS服务BIND配置、正反向解析、主从及压力测试(4)本文出自 &我拿青春换酒钱& 博客,请务必保留此出处http://tanxw.blog.51cto.com/6091
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Linux最近更新

我要回帖

更多关于 js bind 的文章

 

随机推荐