Nginx部署 | ||
1. | 上传nginx安装包 | |
2. | [root@centos ~]# yum -y install pcre-devel openssl-devel //安装支持包 | |
3. | [root@centos ~]# useradd -s /sbin/nologin -M www //创建程序用户 | |
4. | [root@centos ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src //解压压缩包 [root@centos ~]# cd /usr/src/nginx-1.10.2/ //进入nginx目录 [root@centos nginx-1.10.2]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module && make && make install //源码编译 [root@centos nginx-1.10.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin //优化命令路径 [root@centos nginx-1.10.2]# /usr/local/nginx/sbin/nginx //启动nginx | |
5. | [root@centos nginx-1.10.2]# cd /usr/local/nginx/ //进入安装目录 [root@centos nginx]# cd conf/ //进入配置目录 [root@centos conf]# egrep -v "#|^$" nginx.conf.default > nginx.conf //过滤nginx.conf.default中注释和空行,将最终结果输出到nginx.conf文件中。
| |
6. | [root@centos conf]# vim nginx.conf //进入配置文件,删除内容 | |
一个网站可以有很多网页,但是首页只有一个。当我们输入域名www.baidu.com时,浏览器会自动帮我们补全输入的URL,而网站接收到/以后,会自动跳转到用户想要浏览的首页。也就是输入:www.baidu.com会自动识别成http://www/baidu.com/index.html。 | ||
Nginx实验部署 | ||
1. | [root@centos ~]# cd /usr/local/nginx/conf/ //进入nginx配置目录 [root@centos conf]# vim nginx.conf //进入主配置文件进行修改 修改线程和域名 [root@centos conf]# /usr/local/nginx/sbin/nginx //启动服务 错误处理: 此类错误为nginx已经启动,所以重启即可。如果还是出现这种提示,那么使用pkill -9 nginx杀死nginx后重新启动即可。 [root@centos conf]# ps -ef | grep nginx //看看服务端口号 master:守护进程用于监听端口,用户来了后,转发给worker进程处理,每个worker进程有多个线程。 //查看监听端口 四个零表示本地服务器所有网卡IP都被监听 | |
2. | [root@centos conf]# curl 192.169.200.4 //通过curl命令访问服务器IP | |
3. | IP访问: 在客户机上使用浏览器进行测试: 如果不能访问,先检查网络连通性,使用ping命令ping服务器,然后检查防火墙。 | |
4. | 域名访问: 找到C盘中的hosts文件,路径为:C:/Windows/System32/drivers/etc/hosts
将hosts文件拖到桌面上,使用记事本打开 添加服务器的IP和域名 然后再将hosts文件拖回原位置。 使用浏览器访问 此过程就是DNS解析后将记录记在hosts文件的最终步骤。 | |
5. | 此处有两个网页,也就是如果index.html不能用,系统将默认将50x.html使用。 当然,对于index.html中的内容是可以修改的,里面的内容就是网页被访问后所呈现的内容。 | |
多虚拟网站的访问 | ||
类型 |
| |
不同端口访问不同网站 | ||
1 | [root@centos ~]#cd /usr/local/nginx [root@centos ~]#vim conf/nginx.conf //进入配置文件 复制10-17行的内容,在17行后插入空白行,粘贴两份内容。 注意不要漏掉标点,自习检查语法结构。 修改其中的网页目录和端口,让他们处于相同域名,不同网页目录,不同端口状态。 保存退出 | |
2 | [root@centos nginx]# cd html //进入网页目录 [root@centos html]# mkdir -p www bbs org news //创建四个目录 [root@centos html]# echo "`hostname -I` www.xiaofa.com" > www/index.html [root@centos html]# echo "`hostname -I` bbs.xiaofa.com" > bbs/index.html [root@centos html]# echo "`hostname -I` org.xiaofa.com" > org/index.html [root@centos html]# echo "`hostname -I` news.xiaofa.com" > news/index.html //在每个目录中,创建一个index.html文件,将主机IP和相应域名导入到其中 [root@centos html]# /usr/local/nginx/sbin/nginx -s reload //平滑重启nginx服务 | |
测试 | 80端口,www网站 81端口,bbs网站 82端口,org网站 83端口,news网站 | |
同一个端口,不同域名来访问不同网站 | ||
1 | [root@centos nginx]# vim conf/nginx.conf //进入配置文件进行修改 端口改为80,域名分别改为bbs.xiaofa.com org.xiaofa.com news.xiaofa.com | |
2. | [root@centos nginx]# /usr/local/nginx/sbin/nginx -s reload //平滑重启nginx服务 | |
测试 | 找到C:\Windows\System32\drivers\etc下的hosts文件,移动到桌面,使用记事本打开,添加内容。保存后重新将其放入C:\Windows\System32\drivers\etc下。 www.xiaofa.com bbs.xiaofa.com org.xiaofa.com news.xiaofa.com | |
在企业中一般不适用以上的更改方法,太过于麻烦,以下的方法是对上面步骤的简化。 | ||
1. | [root@centos nginx]# cd conf/ //进入配置目录 [root@centos conf]# mkdir conf.d //创建目录 [root@centos conf]# cd conf.d/ //进入目录 [root@centos conf.d]# touch www.cnf bbs.cnf org.cnf news.cnf //创建四个网页文件 | |
2. | [root@centos conf.d]# vim www.cnf //进入配置文件进行编辑 [root@centos conf.d]# vim bbs.cnf //进入配置文件进行编辑 [root@centos conf.d]# vim org.cnf //进入配置文件进行编辑 [root@centos conf.d]# vim news.cnf //进入配置文件进行编辑 | |
3. | //conf.d中存放的是子配置文件,nginx.conf是著配置文件,我们只需要将子配置文件include到主配置文件,就可以避免主配置文件有许多不必要的参数。 | |
4. | [root@centos conf]# vim nginx.conf //进入主配置文件,修改内容 //include就是导入的意思 [root@centos conf]# /usr/local/nginx/sbin/nginx -s reload //平滑重启nginx服务 | |
测试 | www.xiaofa.com bbs.xiaofa.com org.xiaofa.com news.xiaofa.com 因为可能存在浏览器缓存情况,所以此处换了个浏览器进行访问,以便更清晰地看到效果。也可以在本地使用curl命令进行测试 | |
状态信息模块 | 在工作中,可以添加一个状态信息模块,是给运维看的 * access_log access.log;访问日志 * error_log error.log;错误日志 [root@centos conf]# /usr/local/nginx/sbin/nginx -s reload //平滑重启 [root@centos conf]# vim /etc/hosts //做个映射
//保存退出 [root@centos conf]# curl status.xiaofa.com | |
禁止通过IP访问域名 | 当使用ip进行访问的时候,默认会将主配置文件里第一条的域名进行显示 在工作中禁止用户通过IP来访问网站,一般来说用户都是域名访问,只有黑客才使用IP访问,所以要禁止IP直接访问网站。 [root@centos conf]# vim nginx.conf //进入主配置文件添加内容 default_server只要用户通过IP访问,服务端就会回馈404。 [root@centos conf]# /usr/local/nginx/sbin/nginx -s reload //平滑重启nginx服务 [root@centos conf]# curl 192.168.200.4 //通过IP访问域名 通过IP访问网页回馈404,通过域名访问网页并无影响。 通过DNS解析会被记录位置信息,所以黑客不走DNS而是使用IP访问域名。 | |
日志 | ||
[root@centos nginx]# cd logs/ //进入日志目录 查看访问日志的内容: 本机访问: 200表示访问成功,30表示本次访问造成了30字节的流量; curl/7.19.7(x86_64-redhat-linus-gnu)为用户使用的工具,所在的平台; 浏览器访问: 因为是网关转发的,所以记录的是网关IP 平台是windows NT,读请求,返回码304成功 | ||
出现如此内容表示:网站标题识别错误 | ||
Nginx访问日志切割 | ||
[root@centos ~]# vim nginx.sh #! /bin/bash Datetime=`date +%Y%m%d` //当前时间值 Basedir="/usr/local/nginx" //路径值 Nginxlogdir="$Basedir/logs" //路径下的日志目录 Logname="access" //访问日志 [ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1 //判断是否有logs目录,有的话进入,没有返回值为1 [ -f ${Logname}.log ] || exit 1 //判断是否有访问日志文件,没有返回值为1 /bin/mv ${Logname}.log ${Dateformat}_${Logname}.log //讲访问日志文件改名,名称为系统当前日志_访问日志.log $Basedir/sbin/nginx -s reload //平滑重启服务,刷新日志 [root@centos ~]# cat >>/var/spool/cron/root <<KOF > #cut nginx access log by Mr.chen > 00 00 * * * /bin/bash /server/scripts/cut_nginx_log.sh >/dev/null 2>&1 > KOF //将服务添加到计划任务中 | ||
Nginx location | ||
[root@centos conf.d]# vim www.cnf //修改配置文件 这些是location的过滤条件,过滤的是用户的URL的RUI部分。 [root@centos conf.d]# /usr/local/nginx/sbin/nginx -s reload //重启服务 | ||
匹配标识的location | 匹配说明 | |
location / | 所有location都不能匹配后的默认匹配 | |
location =/images/ | 精确匹配images | |
location /documents/ | 过滤URI部分是否含有这个东西,但是注意的是,所有字符串匹配其实都叫前缀型字符串匹配 | |
location ^~ /images/ | ^~特殊的正则匹配,让字符串的优先级临时高于正则 | |
location ~* \. (gif|jpg|jpeg)$ | ~正则表达式,~*不区分大小写,\转译符,匹配以.gif,.jpg,.jpeg结尾的URI部分 | |
优先级测试 | 1.正则,字符串优先级比较 结论:精确匹配>默认匹配 正则匹配>字符串匹配 2.正则,特殊正则,字符串匹配 结论:特殊正则>正则>字符串匹配 3.特殊正则,精确匹配 结论:精确匹配>特殊正则 | |
总结 | 精确匹配>特殊正则匹配>正则匹配>字符串匹配>默认匹配 | |
Nginx rewrite重写 | ||
环境为上面的环境 | [root@centos conf.d]# vim org.cnf //进入org.cnf网页主页修改配置文件 //将用户输入的.*值,放到www.baidu.com后执行跳转。 [root@centos conf.d]# /usr/local/nginx/sbin/nginx -s reload //平滑重启nginx服务 在服务器上测试,显示永久跳转,301表示连接成功但是跳转页面了。 在浏览器上测试,直接跳转页面。 | |
应用场景 | 原来有个旧域名,现在换成了新的域名,但是老用户不知道新域名,就可以通过这个方式,让旧域名在访问时跳转到新域名的网页,这样久而久之用户便可熟悉新域名,避免了广为通知,大费周章的情况。 | |
判断 | 解释: if(条件)为真,才进入;条件是$http_host里就是访问域名,通过HTTP协议,默 认环境变量;~*进行正则匹配,如果用户访问的,只要是(.*) \.yunjisuan\.com$; 如果条件为真,进入判断:将上面小括号的值赋给$domain;无论用户怎么访问,一率跳转到新域名,取之前小括号的值,放到后面就是:http://www.yunjisuan.com/$domain/$1(前面小括号的值) break; | |
实验 | [root@centos conf.d]# vim bbs.cnf | |
关闭安全机制 | [root@centos conf.d]# vim news.cnf Ps:注意,这里的网页路径为:html/www,网页匹配项有:index,index.html, index.htm,如果有不在其中的网页,那么是不能别调用的。 [root@centos conf.d]# cd /usr/local/nginx/html/www/ //进入www目录中 [root@centos www]# mv index.html index.h //为网页改名,让模块匹配不到 浏览器访问 如果将autoindex删除,那么就会回馈 讲解: Nigxin接收到用户请求,URI部分其实就是一个符号,他的意思是,用户想看整个html目录的所有内容,nginx给/进行跳转到index.html或index.htm才变成了一个页面。但是,前提是必须跳成功,如果跳转不成功,那么用过户访问的还是所有网页目录,所以再跳转时,如果找不到首页,就相当于向用户呈现了所有的网页内容。这是非常不安全的,于是触发了nginx的安全机制,将用户的请求拒绝了,最终显示403。 | |
Nginx原理 | ||
主流Web服务: | Nginx:本质上使用线程来接待用户,每个进程里由多个线程,每个线程接待一个用户,所以nginx是多线程模式 Apache:本质上利用进程来接待用户。每个进程里,只有一个线程再做事情。所以接待十个用户,就需要启动十个进程。因此apache是多进程模式 每个进程就是个资源池,里面要占用资源的进程越多,资源就占用越多;而线程是共享一个资源池的,线程并不额外多占用资源,多个线程可以共享一个资源池里的资源。 因此,apache接待用户要消耗许多的内存资源,并不能支持非常高的并发量。Nginx用线程接待用户,多个线程共享一份资源,因此,在高并发情况下,服务器的资源消耗对于apache来说,比较少。 又因为apache是select接待模式,中文名同步阻塞I/O模型,nginx是epoll模式,中文名:异步非阻塞I/O模型。因此nginx在CPU的利用效率也远大于apache。 综上所述,Nginx和apache在高并发的情况下,Nginx对CPU和内存资源的占用非常小,可以承受更高的用户的并发访问,而apache不行。 | |
工作流程 | 单线程:在QQ运行时,碰到了I/O读写,CPU将处于挂起状态,然后携带用户进程,从用户态转化成内核态;当I/O读写完毕,再程序继续运行,触发I/O继续挂起,直到运行结束;QQ运行完成才会继续下个程序,以此类推。 此模型为同步阻塞I/O模型(select):同步(CPU和程序同步),阻塞(碰到I/O程序无法继续执行) 多线程:CPU一旦挂起,就结束运行了,此时再浪费CPU的处理资源。 异步线程:当执行第一件事过程中,碰到I/O读写,CPU不挂起,而是做一个标记,然后CPU就走了,去做第二件事,微信遇到I/O读写,就再打一个标记,然后查看QQ读写书否结束,如果读写结束,继续运行QQ,当再次碰到I/O读写,就会去查看微信的I/O读写是否结束,如果前两个都没结束,那么他就会去处理第三件事,一次类推,谁的I/O读写结束,就会去运行谁。此模型对CPU的利用率最高。 异步非阻塞I/O模型(epoll):异步(CPU和程序不同步),非阻塞(I/O读写,CPU不挂起) | |
相互优缺 | 进程接待用户的资源耗费很大, 但是用户和用户之间的资源是不共享的,相对独立。他们可以读写同一个文件,资源却并不冲突,变量也不会冲突。因此在高并发的情况下,功能非常稳定,不会出现服务崩溃问题。 但,nginx虽然对资源占用率低,却是多个线程使用同一份资源,那么就会发生冲突现象,在高并发场景下,容易出现服务崩溃的问题。 | |
线程的死锁现象 | 两个线程分别为A和B,都在运行由于他们利用的是同一份内存空间,所以在内存中,A访问了C文件,B访问了D文件。但是在C中有一行代码为:includeD,D中有行代码为:inlcludeC。A在执行C的时候需要去D文件进行导入,但是却发现D文件被占用了,因为B在用D的时候,就给文件上锁了(为了避免文件占用冲突,线程会给文件上锁);A发现D上锁了,于是C就会处于wait状态,B在使用D的时候,发现D需要找但是此时C也是处于上锁状态。于是D也处于wait状态,此时就处于线程的死锁现象。 这种情况如果越来越多,就会占用越来越多的资源,由于线程一致处于wait,线程就没办法被收尸,最终导致CPU使用率一直上涨,直到CPU累死,也就是服务器崩溃。 | |
2021-1-31 | ||
Linux基础——Web(二)Nginx
最新推荐文章于 2024-11-08 14:34:47 发布