第四部笔记
php
---私人文章html
- 在性能上占用的系统资源少;支持更多的并发链接(特别是静态小文件场景下)达到更高的访问效率;
- 在功能上Nginx不可是一个优秀的Web服务软件,还能够做为反向代理负载均衡及缓存服务使用;
- 在安装配置上Nginx更为方便,简单,灵活;
- Nginx是一个开源的,支持高性能高并发的www服务和代理服务软件
- Nginx因具备高并发(特别是静态资源)占用系统资源少等特性且功能丰富逐渐流行起来
- Nginx不可是一个优秀Web服务软件,还具备反响代理负载均衡功能和缓存服务功能,与LVS负载均衡及Haoroxy等专业代理软件相比Nginx部署起来更为简单,方便;在缓存功能方便它又相似Squid等专业的缓存服务软件
- 支持高并发:能支持几万并发链接(特别是静态小文件业务环境)
- 资源消耗少:在3万并发连接下,开启10个Nginx线程小号的内存不到200MB
- 能够作HTTP反向代理及加速缓存,即都在均衡功能,内置对RS节点服务器健康的检查功能,至关于专业的Haproxy软件或LVS的功能
- 具有Squid等专业缓存软件等的缓存功能
- 支持异步网络I/O事件模型epoll(linux2.6+) #跟据epoll实现的Web服务
(1)做为Web服务软件前端
Nginx是一个支持高性能高并发的Web服务软件,它具备不少优秀的特性,做为Web服务器与Apache相比Nginx可以支持哼多的并发链接访问,但因占用的资源更少效率更高,在功能上也强大了不少,几乎不逊色与Apache(动态文件支持更好一些)linux
(2)反向代理或负载均衡服务nginx
在反向代理或负载均衡服务方面,Nginx能够做为Web服务,PHP等动态服务及Memcached混村的代理服务器,它具备相似专业反响代理软件的功能(如Haproxy),同时也是一个宿友的邮件代理服务软件,但Nginx的代理功能仍是相对简单了一些,特别不知此话TOP的代理(Nginx1.9.0版本已经开始支持TCP代理了)web
(3)前端业务数据缓存服务---->Web缓存面试
在Web缓存服务方面,Nginx可经过自身的proxy_cache模块实现类Squid等专业花奴才你软件的功能正则表达式
###3.3为何Nginx整体性能比Apache高apache
- Nginx使用最新的epoll(Linux2.6内核)和kqueue(freebsd)异步网络I/O模型,而Apache使用的是传统的select模型。目前Linux下可以承受高并发访问的Squid,Memcached软件采用的都是epoll模型
- 处理大量链接的读写是,Apache所采用的slect(同步I/O网络模型)I/O模型比较低效!
###如何正确选择Web服务器vim
- 静态业务:高并发场景尽可能采用Nginx或Lighttpd,两者首选Nginx
- 动态业务:理论上采用Nginx和Apache都可,为了不相同业务的服务软件多样化增长额外维护成本,建议现有Nginx兼作前端代理在根据页面元素的类型或目录转发到后端相应的服务器进行处理
- 既有静态业务又有动态业务:采用Nginx
- 若是并发不是很大,又对Apache很熟悉,采用Apache也是能够的。
mount /dev/sr0 /media/cdrom/
yum -y install pcre-devel openssl-devel
tar xf nginx-1.10.3.tar.gz -C /usr/src
useradd -s /sbin/nologin -M yinuo
cd /usr/src/nginx-1.10.3 ./configure --user=yinuo --group=yinuo --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
--user=yinuo --group=yinuo --->告诉它用户和用户组是谁
--prefix=/usr/local/nginx --->安装到哪去叫什么
--with-http_stub_status_module --with-http_ssl_module --->定制模块
make && make install
conf(配置) html(网页) logs(日志) sbin
nginx.conf--->配置文件 nginx-conf--->配置文件备份 mime.types--->媒体类型 mime.typel.default--->媒体类型备份
egrep -v "#|^$" nginx.conf.default > nginx.conf ---> 去掉#号去掉空号从备份配置文件里写回到配置文件
vim nginx.conf
worker_processes 1; ----> Nginx工做的进程个数,CPU几核就配几
events { ----> 事件函数(进程里的线程个数)
worker_connections 1024; ----> 工做中通常写20倍,20480
}
http { ----> Web服务函数
include mime.types; ----> include--->导入某个文件
default_type application/octet-stream;
sendfile on; ----> 文件的高效传输功能,默认为开
keepalive_timeout 65; ----> 链接保持功能,持续65秒server { ---->一个Server表明一个虚拟网站
listen 80; ----> socket进程的监听端口
server_name localhost; ----> 域名,网站首页名
location / {
root html; ----> 网页的根目录路径
index index.html index.htm; ----> 首页,索引
}
}
}
备注:咱们本身修改换一个域名就行了 server_name 后改本身的域名
绝对路径启动 /usr/local/nginx/sbin/nginx 没提示不要紧,查看端口号看是否启动 ss -antup | grep 80
1.第一步:进入/usr/local/nginx/html下删除里面全部文件
cd /usr/local/nginx/html rm -rf *
2.写一个文件
echo "`hostname -I` www.yunjisuan.com" > index.html
3.给本地作映射
echo "`hostname -I` www.yunjisuan.com" >> /etc/hosts(映射文件位置)
4.模拟浏览器访 curl--->模拟浏览器访问命令
curl www.yunjisuan.com 出现: 192.168.200.156 www.yunjisuan.com 证实访问成功
1.修改Windows映射文件
C盘-->windows-->system32-->drivers-->etc-->hosts
2.用原始浏览器登陆
www.yunjisuan.com 便可
1. 配置文件中 若是 root html 后加 /XXX 那xxx为根,加几个 /xxx,最后一个 /xxx 为根,根之上的东西不管怎么操做都看不了
2. /usr/local/nginx/sbin/nginx -s reload 平滑重启Nginx
3.nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
报错?
解决办法:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
1.vim 配置文件增长server函数---> vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 80;
server_name blog.yunjisuan.com;
location / {
root html/blog;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root html/www;
index index.html index.htm;
}
}
2.进入 /usr/local/nginx/html 目录里建立它的网页目录。目录和域名名称尽可能同样
[root@LianXiJi html]# mkdir bbs blog [root@LianXiJi html]# echo "`hostname -I` bbs.yunjisuan.com" > bbs/index.html [root@LianXiJi html]# echo "`hostname -I` blog.yunjisuan.com" > blog/index.html
3.修改映射文件
vim /etc/hosts 192.168.200.156 www.yunjisuan.com bbs.yunjisuan.com blog.yunjisuan.com ---> 添加其余网站域名便可
4.模拟浏览器访 curl--->模拟浏览器访问命令
curl www.yunjisuan.com 出现: 92.168.200.156 www.yunjisuan.com curl bbs.yunjisuan.com 出现: 92.168.200.156 bbs.yunjisuan.com curl blog.yunjisuan.com 出现: 92.168.200.156 blog.yunjisuan.com 证实访问成功
而输入IP却只得出 192.168.200.156 bbs.yunjisuan.com
[root@LianXiJi html]# curl 192.168.200.156 192.168.200.156 bbs.yunjisuan.com
答:当它可以区分你是谁的时候你想看谁就看谁,当它区分不了你是谁的时候默认给第一个。
1.1 经过域名访问 :curl -v www.yunjisuan.com (-v 看内容和报头)
答:Web服务器能够经过报头来查看你具体想看的域名的名字
1.2 经过IP访问 : curl -v 192.168.200.156
答:用户发给Web服务器的报文的报头里面只有IP地址,因此Web服务器不知道我想看的域名,所以它默认第一个
1.配置文件修改端口号-->vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 81;
server_name blog.yunjisuan.com;
location / {
root html/blog;
index index.html index.htm;
}
}
server {
listen 82;
server_name www.yunjisuan.com;
location / {
root html/www;
index index.html index.htm;
}
}
2.重启服务 /usr/local/nginx/sbin/nginx -s reload
3.浏览器输入 IP:端口号
总结:
1.一个Web服务器搭建多个网站有三种方法
1.1基于不一样域名的虚拟网站 1.2基于不一样监听端口的虚拟网站 1.3基于不一样IP的虚拟网站 ---> 本地须要多个网卡
2.通常工做中都是用域名搭建不一样网站
3.修改配置文件必须重启服务
问题1.怎样让非法访问个人用户一概都不能看到个人网站的信息?非法指的就是直接拿IP地址过来访问个人
答:1.vim 修改配置文件
listen 80 后加 default_server --> 让用IP地址访问的用户强制进入本Server
一般加一个server,咱们这里直接修改了一个server
2.location / {}函数里加入直接犯错错误码让其直接跳出错误页面
1.在配置文件目录下在建立目录
cd /usr/local/nginx/conf mkdir extra
2.把配置文件里的Server都写到 extra 目录下
vim extra/bbs.conf server { listen 80; server_name bbs.yunjisuan.com; location / { root html/blog; index index.html index.htm; } } vim extra/www.conf server { listen 80; server_name www.yunjisuan.com; location / { root html/blog; index index.html index.htm; } }
3.修改配置文件
vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include extra/bbs.conf;
include extra/www.conf;
server {
listen 80 default_server;
server_name blog.yunjisuan.com;
location / {
return 403;
}
}
}
--with-http_stub_status_module ---> 状态信息检测模块,通常编译时都会安装
1.在extra里设定状态信息配置 vim status.conf
erver {
listen 80;
server_name status.yunjisuan.com;
location / {
stub_status on; ----> 打开这个功能
access_log off; ----> 不记录日志
allow 192.168.200.156; ---->只容许我本身访问(能够制定用户)
deny all; ----> 其余一概拒绝
}
}
2.重启服务 /usr/local/nginx/sbin/nginx -s reload
3.修改映射文件,把状态信息配置添加进去 vim /etc/hosts
192.168.200.156 www.yunjisuan.com bbs.yunjisuan.com blog.yunjisuan.com status.yunjisuan.com
3.Nginx status 显示结果详解
curl status.yunjisuan.com`
Active connections: 1` ---> 表示Nginx正在处理的活动链接数1个
server accepts handled requests
19 19 19
Reading: 0 Writing: 1 Waiting: 0
- 一个server表示Nginx启动到如今1共处理了19次握手
- 第二个accepts表示Nginx启动到如今共成功建立了19次握手
- 请求丢失数=(握手数-链接数),能够看出本次状态显示没有丢失请求
- 第三个handled requests表示总共处理了19次请求
- Reading为Nginx读取到客户端的Header信息数,这个数永远是0
- waiting为Nginx返回给客户端的Header信息数
- Waiting为Nginx已经处理完正在等候一下次请求指令的驻留链接。在开启k- eep-alive的状况下这个值等于active-(reading+writing)
测试:
修改Windows配置文件 C盘-->windows-->system32-->drivers-->etc-->hosts
在原配置文件后加如stauts.yunjisuan.com bbs.yunjisuan.com
浏览器登录status.yunjisuan.com
常见的日志级别【debug|info|notice|warn|error|crit|alert|emerg】
生产场景通常是warn|error|crit这三个级别之一,注意不要配置info等较低级别,会带来巨大磁盘I/O消耗
error_log的默认值为: default:error_log logs/error.log error
在配置文件里增长内容,写在全局里
写在函数体里面函数生效,写在函数体外面全局生效 vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
error_log logs/error.log; ----> 添加此行便可
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
默认状况下Nginx会把全部的访问日志生成到一个指定的访问日志文件access.log里,可是这样时间长了就会致使日志个头数很大,不利于日志的分析和处理,所以有必要对Nginx日志按天或按小时进行切割,使其分红不一样的文件保存
6.5.1 写一个日志切割脚本--->本质来讲就是某个时间给它移动更名
#!/bin/bash
#日志切割脚本可挂定时任务,天天00点整执行
Dateformat=`data +%Y%m%d` ----> 时间
Basedir="/usr/local/nginx" ----> 路径
Nginxlogdir="$Basedir/logs" ---->
Logname="access" ----> 名字
[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1
[ -f ${Logname}.log ] || exit 1
/bin/mv ${logname}.log ${Dateformat}_${Logname}.log
$Basedir/sbin/nginx -s reload1 ----> 把日志名在重新刷出来
6.5.2将脚本放在定时任务里 crontab -e
00 00 * * * /bin/bash /root/cut_nginx_log.sh >/dev/null 2>&1
location是Nginx很是重要的过滤函数,能够经过正则表达式来匹配过滤不一样URL里的URI部分,匹配到不一样的URI进入到不一样的location也就能够进到不一样的网页目录。
例:修改/usr/local/nginx/conf/extra目录里的www.conf文件
server {
listen 80;
server_name www.yunjisuan.com;
location / {
return 401;
}
location = /images/ {
return 402;
}
location ~/images/ {
return 502;
}
location = / {
return 403;
}
location /documents/ {
return 404;
}
location ^~/images/ {
return 501;
}
location ~*\.(gif|jpg|jpeg)$ {
return 500;
}
}
字符串前缀型模糊匹配:必须是从根开始,在URI的起始部分出现,后面能够任意
- 精确匹配 (=)
- 前缀型正则匹配 (特殊正则--->^~)
- 普通正则 (~或~*,~*为bu'q,~为区分大小写)
- 字符串前缀型匹配 (/images/)默认匹配 ( / )
和Apache等Web服务软件同样,Nginx rewrite的只要功能也是实现URL地址重写。
Nginx的rewrite规则须要PCRE软件的支持即经过Perl兼容正则表达式语法进行规则匹配。
没骗人参数编译时,Nginx就会安装支持rewrite的模块,可是,也必需要有PCRE软件的支持。
(1) rewrite指令语法
指令语法:rewrite regex replacement 【结尾标记:flag】;
默认值:none
应用位置:server,location,if
replacement是实现URL重写的关键指令,根据regex(正则表达式)部分的内容重定向到replacement部分,结尾是flag标记。
例:rewrite ^/(.*) http://www.baidu.com/$1 permanent; ---> ()小括号至关于sed里的分组,这里$1值相等
(2)regex经常使用的正则表达式说明
- \ ---> 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。
- ^ --->匹配输入字符串的起始位置,若是设置了RegExp 对象的 Multiline 属性,^也匹配 “\n” 或 “r” 以后的位置。
- $ ---> 匹配输入字符串的结束为止,
,若是设置了RegExp 对象的 Multiline 属性,^也匹配 “\n” 或 “r” 以前的位置。- ( * ) ---> 匹配前面的字符零次或屡次, 例如:Ol* 能够匹配 “o”及 “oll”,*等价于{o,}
- (+) ---> 匹配前面的字符一次或屡次,例如:ol+ 能匹配 ol 及 oll 但不能匹配 o 。+等价于{l.}
- ? ---> 匹配前面的字符零次或一次。
- . ---> 匹配除 “\n”以外的任何单个字符,要匹配包括 “\n”在内的任何字符,请使用想“[.\n]”这样的模式。
(3) rewrite 指令的最后一项参数fiag标记说明
注:redirect是不会显示跳转后的URL地址
- 在以上flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变但在服务器端访问的程序及路径发生了变化。
- redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后idURL地址。
last和break标记的实现功能相似,但而这之间有细微的差异,使用alias指令时必须用last标记,使用proxy_pass指令时要只用bredk标记,last标记在本条rewrite规则执行完毕后吗会对其多有的server{...}标签从新发起请求,而bradk标记则会在本条规则匹配完成后终止匹配再也不匹配后面的规则。
- 能够调整用户浏览的URL,使其看起来更规范,合乎开发及产品人员的需求。
- 为了让搜索引擎收录网站内容并让用户体验更好,企业会将动态URL地址假装成静态地址提供服务。
- 网站换新域名后,让旧网址的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com
- 根据特殊变量,目录,客户端的信息进行URL跳转等。
以往咱们是经过别名方式实现yunjisuan.com和www.yunjisuan.com访问同一个地址的,事实上除了这个方式外还可使用nginx rewrite 301 跳转的方式来实现,配置以下:
server{
listen 80;
server_name yunjisaun.com;
rewrite ^/(.*) http://www.yunjisuan.com/$1 permanent;
# 当用户访问yunjisuan.com及下面的任意内容是,都会经过这条rewrite跳转到www.yunjisuan.com对应的地址
}
示例:实现访问http://mail.yunjisuan.com跳转到http://www.yunjisuan.com/mail/yunjisuan.html
外部跳转时,使用这种方法可让浏览器地址变为跳转后的地址,另外,要实现这只http://www.yunjisuan.com/nail/yunjisuan.html有结果输出否则会出现401等权限错误。
(1) 配置Nginx rewrite 规则
server {
listen 80;
server_namen mail.yunjisuan.com;
location / {
root /var/www/html/mailcom;
index index.html index.htm;
}
if ( $http_host ~* "^(.*)\.yunjisuan\.com$") {
set $domain $1;
rewrite ^(.*) http://www.yunjisuan.com/$domain/yunjisuan.html break;
}
}
注:
1. http_host ---> 存放域名的变量
2. if 和 location 是并列的,若是后面成立就执行小括号里的东西
3. $1,只能重复一次,再出现它的值就会发生变化,要想不让它变化就得把值付给一个别的变量。 (set为设置的意思 set 变量=值)
在实际工做中企业要求咱们为网站设置访问帐号和密码权限,这样操做后只有拥有帐号密码的用户才能够访问网站内容。这样使用帐号密码才能够访问网站的功能,汉族要用用在企业内部人员访问的地址上。
例如:企业网站后台,MySQL客户端phpmyadmin,企业内部的CRM,WIK网站平台。
咱们能够借用apache和htpasswd软件来建立加密的帐号和密码
先查看有没有这个命令 : which htpasswd
没有就yum安装一个: yum -y install httpd
htpasswd -bc /usr/local/nginx/conf/htpasswd yunjisuan “123456”
提示:Adding password for user yunjisuan
看一下里面内容,加密的: cat /usr/local/nginx/conf/htoasswd
yunjisuan:I8e2m4n9mbxDQ
vim /usr/local/nginx/conf/exyra/status.conf server { listen 80; server_name status.yunjisuan.com; location / { stub_status on; access_log off; auth_basic "Welcome to 167"; ---> 增长的文件 auth_basic_user_file /usr/local/nginx/conf/htpasswd --->增长的文件 } }
配置解释:
auth_basic :验证的基本信息选项(后面跟着的双引号里就是验证窗口的名字)
auth_basic_user_file : 验证的用户文件(后面跟帐号密码文件的绝对路径)
答:Tengine是淘宝开源Nginx的分支,官方站点为http://tengine.taobao.org/
答:
(1)Nginx配置文件里没有配置默认首页参数,或者首页文件在站点目录下没有如下内容:index index.php index.html index.htm;
(2)站点目录或内部的程序文件没有Nginx用户访问权限
(3)Nginx配置文件中设置了allow,deny等权限控制致使客户端没有访问权限