Linux运维常见问题 --Web服务

1、如果服务器负载过大,你会怎么处理?

top命令查看CPU是否负载过大,负载过大就看是哪个程序占用CPU资源过多,kill掉程序,不能kill就看看是不是程序本省的问题。如果CPU负载正常就查看内存的负载情况,如果负载过大,就查看是不是进程开启的太多了,将不必要的进程kill掉。如果内存负载正常就用iostat查看磁盘的I/O情况,如果磁盘I/O高居不下,就查看是哪个进程在大量的I/O,将其kill掉。

2、Linux如何调优

开机、内核、内存、CPU、文件系统、磁盘、网络等方面调优

开机调优:关闭不必要的服务,如networkManager,atd,ip6tables等,具体的情况看是否需要。

内核调优:裁剪内核,裁剪的好处有两点:第一减少kernel的尺寸,这也就响应的减少了加载kernel image的时间,第二也减少了不必要的初始化。

文件系统调优:disk相关参数调优,如cache mode,deadline,readahead等;文件系统本身参数调优,如block size,inode size等;
文件系统挂载(mount)参数调优,如async,data=writeback等

磁盘调优: /,swap,/var,/home,/usr这种经常使用的分区首先要使用单独的分区等。

网络调优:增大系统套接字缓冲区,增大TCP接收和发送缓冲区,启用有选择的应答。

CPU调优:设置程序执行的优先级,可以使用nice和renice设置程序执行的优先级。

内存调优:释放缓存,echo 1 > /proc/sys/vm/drop_caches,1,2,3三个级别,释放前最好sync一下,防止丢数据

3、网站访问慢怎么排查?

首先假设我们的网站是源站+CDN架构,那么先排查我们自己的源站,通过内部hosts访问源站,如果访问有问题,则一层一层的排查web服务器,负载均衡,如果没有问题,则怀疑是CDN的问题,如果是整个地区都访问慢,则是该地区CDN节点出问题,如果只是客户端访问慢,那么自己写一个检测脚本获得客户端,将我们的域名解析到哪去了,有可能是DNS解析出现了问题。

4、存储引擎InnoDB和MyISAM有什么区别?

主要差别:两种类型最主要的差别就是InnoDB支持事务处理与外键和行级锁,而MyISAM不支持。所以MyISAM往往就容易被人认为只适合在小项目中使用。

MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率高,能加载更多索引,而InnoDB是索引和数据是紧密捆绑的,没有压缩,体积比MyISAM大。

5、NGINX代理负载均衡的调度算法有哪些?具体实现时的现象是什么?

1.轮询(默认):每个请求按时间顺序逐一分配到不同的后端,如果后台某台服务器宕机,自动剔除故障系统,使用户访问不受影响,这种方式简便,成本低,但是可靠性低,负载均衡不均衡,适用于图片服务器集群和纯静态页面服务器集群。

2.weight(权重):weight的值越大分配到访问概率越高,主要用于后端每台服务器性能不均衡的情况下,或者仅仅为在主从的情况下设置不同的权值,达到合理有效的利用主机资源。

3.IP_HASH(访问IP):每个请求按访问的哈希结果分配,使来自同一个IP的访问固定一台后端服务器,并且可以有效解决动态网页存在的session的共享问题。

4.FAIR(第三方):比weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能的进行均衡负载,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。nginx本身不支持fair,如果需要这种调度算法,则需要安装upstream_fair模块。
5.URL_HASH(第三方):按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。这种调度算法需要安装nginx的hash软件包

6、MySQL为什么是四层的负载均衡,而不是其他层

在四层模式下,仅仅只是流量转发或者是TCP的porxy。七层是full proxy,需要分析协议。显然四层的转发效率更快,但功能少了许多。MySQL的负载均衡仅仅只是发生在网络层,所以选四层代理。

7、keepalived的工作原理是什么,使用的是什么协议?

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据vrrp的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

8、nginx的七层代理有什么好处?

请求如果直接发到同步处理的后端,那么从收到请求到把响应发出去的这段时间中,一个进程的资源就被占用了。在慢链接的情况下,这个进程除了处理之外,大多数时间基本耗费在等待上,而nginx有异步非阻塞模型,它可以通过基于事件的方式同时处理和维护多个请求而不会导致CPU的大量耗费,而后端只需要做逻辑计算,节约了等待时间去处理更多的请求。

动态页面的IO性能不好,nginx可以将请求缓存下来,再将完整的请求转发给后端服务器做处理,减少后端服务器的等待时间。

扩展:
在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write

9、nginx upstream的容错机制是怎么样的(有台机器挂掉了,nginx怎么处理的)

nginx收到客户端的请求,将请求根据调度算法转发给后台服务器,后台服务器防问被拒接或者返回错误信息。nginx将其暂停一段时间,在这段时间内不再将请求转发给该服务器,并将请求转发给后台的其他服务器响应。

10、浏览器中输入域名回车后HTTP的请求是怎么进行的?

http将请求发送给nginx代理,nginx将请求转发给后台服务器,后台服务器接收请求,并返回信息给nginx,nginx收到后台服务器的信息后返回给http。

11、nginx如何配置多域名,防盗链

server {
       listen    80;
       server_name www.xxx.com mall.xxx.com img.xxx.com;
}

location / {
     valid_referers nono blocked mall.xxx.com;
     if ($invalid_referer){
     return 403;}
}

12、Apache、Nginx、Lighttpd都有哪些优缺点

Apache特点:1)几乎可以运行在所有的计算机平台上;2)支持最新的http/1.1协议;3)简单而且强有力的基于文件的配置(httpd.conf);4)支持通用网关接口(cgi);5)支持虚拟主机;6)支持http认证,7)集成perl;8)集成的代理服务器;9)可以通过web浏览器监视服务器的状态,可以自定义日志;10)支持服务器端包含命令(ssi);11)支持安全socket层(ssl);12)具有用户绘画过程的跟踪能力;13)支持fastcgi;14)支持java servlets

Nginx特点:nginx是一个高性能的十分轻量级的HTTP服务器和反向代理服务器,同时也是一个IMAP/POP3/SMTP代理服务器,处理静态文件,索引文件以及自动索引,无缓存的反向代理加速,简单的负载均衡和容错,具有很高的稳定性,支持热部署。
Nginx 强化版

Tengine

Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。当然,现在很多公司应已经开始跳过原生 Nginx 直接使用 Tengine 了。

Dengine

Dengine新美大(原大众点评)基于 Tengine 开发的 Web 服务器。在 Tengine 的基础上,添加了降级等功能。Dengine 的使用范围教少,主要是新美大在使用。

Lighttpd特点:是一个具有非常低的内存开销,CPU占用率低,效能好,以及丰富的模块,Lighttpd是众多opensource轻量级的webserver中较为优秀的一个,支持fastcgi,cgi,auth,输出压缩,url重写,alias等重要功能。
建议使用:
Apache 后台服务器(主要处理php及一些功能请求 如:中文url)
Nginx 能提供多种角色,包括但不限于:

Web服务器

应用程序服务器

代理服务器

CDN缓存(利用它占用系统资源少得优势来处理静态页面大量请求)

Lighttpd 图片服务器

13、什么是七层的负载均衡和4层的负载均衡,我们的访问请求经过这两种负载均衡都做了些什么处理?

七层负载均衡是基于URL等应用层的负载均衡;请求经过七层时,七层负载均衡接受虚拟url请求,根据调度算法转发请求到后台服务器

四层负载均衡是基于IP+端口的负载均衡;请求经过四层时,四层负载均衡根据请求的IP和端口,根据调度算法将请求转发到后台。

14、LVS的三种工作模式是什么?分别是如何工作的

NAT模式(VS-NAT):LVS将客户端发来的数据包的IP头的目的地址转换成其中一台RS(real server)的IP地址,由RS处理数据并返回给LVS,LVS再把数据包的源IP改为自己的IP,目的地址IP改为客户端的IP地址发送给客户端。

IP隧道模式(VS-TUN):将客户端发来的数据包封装一个新的目的IP头标记,通过IP隧道转发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后直接返回给客户端,不需要再经过LVS。

DR模式(VS-DR):客户端发送请求到VIP,LVS将请求报文的目标MAC地址改为RS的MAC地址,将请求转发给RS,而RS响应后的处理结果直接返回给客户端。

15、LVS、NGINX、HAPROXY的优缺点

  1. LVS优点:具有很好的可伸缩性、可靠性、可管理性。抗负载能力强、对内存和CPU资源消耗比较低。工作在四层上,仅作分发,所以它几乎可以对所有的应用做负载均衡,且没有流量的产生,不会受到大流量的影响。

    缺点:软件不支持正则表达式处理,不能做动静分离,如果web应用比较庞大,LVS/DR+KEEPALIVED实施和管理比较复杂。相对而言,nginx和haproxy就简单得多。

  2. nginx优点:工作在七层之上,可以针对http应用做一些分流的策略。比如针对域名、目录结构。它的正则规则比haproxy更为强大和灵活。对网络稳定性依赖非常小。理论上能PING就能进行负载均衡。配置和测试简单,可以承担高负载压力且稳定。nginx可以通过端口检测到服务器内部的故障。比如根据服务器处理网页返回的状态码、超时等。并且可以将返回错误的请求重新发送给另一个节点,同时nginx不仅仅是负载均衡器/反向代理软件。同时也是功能强大的web服务器,可以作为中层反向代理、静态网页和图片服务器使用。

    缺点:不支持URL检测,仅支持HTTP和EMAIL,对session的保持,cookie的引导能力相对欠缺。

  3. Haproxy优点:支持虚拟主机、session的保持、cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。支持TCP协议的负载均衡;单纯从效率上讲比nginx更出色,且负载策略非常多。

    缺点:扩展性能差;添加新功能很费劲,对不断扩展的新业务很难对付。

16、DNS/智能DNS/CDN原理是什么?

DNS正向解析将客户端请求的域名转换成IP地址、反向解析将IP转换成域名。

智能DNS在DNS的基础上通过匹配客户端的IP将请求分流到最近的服务器上,达到负载均衡。

CDN在DNS和智能DNS的基础上,将客户端的请求转给后台真实服务器,返回给客户端的同时,缓存到本地服务器上,下次客户端再次访问该页面时直接将缓存返回给客户端。

17、将本机80端口请求转发到另外一台主机的8080端口

iptables -t nat -A PREROUTING -d 192.168.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:8080 

iptables -t nat -A POSTROUTING -d 192.168.1.2 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1

20、如何将本地80端口的请求转发到8080端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

18、Tomcat优化

1、为什么我们要使用tomcat,类似的软件有哪些?

因为Apache仅支持静态网站,不能解析Java、Jsp,它们服务端口也不同Apache端口80  tomcat端口8080

类似的软件有Weblogic (收费)Jboss(免费)Resin、Jetty

2、tomcat优化

内存优化:JAVA_OPTS='-Xms=256m -Xmx=1024m -Xmn=512m'

并发优化:maxProcessors=2000,最大处理线程数

maxSpareThreads=2000,tomcat连接器的最大空闲socket线程数

缓存优化:compressionMinSize=2048,启动压缩的输出内容大小,默认2048

19、Nginx 优化

Nginx常见问题处理
对Nginx服务器进行适当优化,解决如下问题,以提升服务器的处理性能:

如何自定义返回给客户端的404错误页面
如何查看服务器状态信息
如果客户端访问服务器提示“Too many open files”如何解决
如何解决客户端访问头部信息过长的问题
如何让客户端浏览器缓存数据
客户机访问此Web服务器验证效果:
使用ab压力测试软件测试并发量
编写测试脚本生成长头部信息的访问请求
客户端访问不存在的页面,测试404错误页面是否重定向

实现此优化需要按照如下步骤进行:

步骤一:自定义报错页面

1)优化前,客户端使用浏览器访问不存在的页面,会提示404文件未找到

[root@client ~]# firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
2)修改Nginx配置文件,自定义报错页面

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..
        charset utf-8;                    //仅在需要中文时修改该选项
error_page   404  /404.html;    //自定义错误页面
.. ..

[root@proxy ~]# vim /usr/local/nginx/html/404.html //生成错误页面

Oops,No NO no page …

[root@proxy ~]# nginx -s reload

#请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

3)优化后,客户端使用浏览器访问不存在的页面,会提示自己定义的40x.html页面

[root@client ~]# firefox http://192.168.4.5/xxxxx //访问一个不存在的页面
4)常见http状态码

常见http状态码可用参考表-1所示。

步骤二:如何查看服务器状态信息(非常重要的功能)

1)编译安装时使用–with-http_stub_status_module开启状态页面模块

[root@proxy ~]# tar -zxvf nginx-1.12.2.tar.gz
[root@proxy ~]# cd nginx-1.12.2
[root@proxy nginx-1.12.2]# ./configure \

–with-http_ssl_module //开启SSL加密功能
–with-stream //开启TCP/UDP代理模块
–with-http_stub_status_module //开启status状态页面

[root@proxy nginx-1.12.2]# make && make install //编译并安装
2)启用Nginx服务并查看监听端口状态

ss命令可以查看系统中启动的端口信息,该命令常用选项如下:

-a显示所有端口的信息

-n以数字格式显示端口号

-t显示TCP连接的端口

-u显示UDP连接的端口

-l显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口

-p显示监听端口的服务名称是什么(也就是程序名称)

注意:在RHEL7系统中可以使用ss命令替代netstat命令,功能一样,选项一样。

[root@proxy ~]# /usr/local/nginx/sbin/nginx
[root@proxy ~]# netstat -anptu | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10441/nginx
[root@proxy ~]# ss -anptu | grep nginx
3)修改Nginx配置文件,定义状态页面

[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf

… …
location /status {
                stub_status on;
                 #allow IP地址;
                 #deny IP地址;
        }
… …

[root@proxy ~]# nginx
4)优化后,查看状态页面信息

[root@proxy ~]# curl http://192.168.4.5/status

Active connections: 1 
server accepts handled requests
 10 10 3 
Reading: 0 Writing: 1 Waiting: 0
Active connections:当前活动的连接数量。

Accepts:已经接受客户端的连接总数量。

Handled:已经处理客户端的连接总数量。

(一般与accepts一致,除非服务器限制了连接数量)。

Requests:客户端发送的请求数量。

Reading:当前服务器正在读取客户端请求头的数量。

Writing:当前服务器正在写响应信息的数量。

Waiting:当前多少客户端在等待服务器的响应。

步骤三:优化Nginx并发量

1)优化前使用ab高并发测试

[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.4.5/
-n 总访问量 -c 访问人数

Benchmarking 192.168.4.5 (be patient)
socket: Too many open files (24)                //提示打开文件数量过多

2)修改Nginx配置文件,增加并发量

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..
worker_processes  2;                    //与CPU核心数量一致
events {
worker_connections 65535;        //每个worker最大并发连接数
}
.. ..

[root@proxy ~]# nginx -s reload
3)优化Linux内核参数(最大文件数量)

[root@proxy ~]# ulimit -a //查看所有属性值
[root@proxy ~]# ulimit -Hn 100000 //设置硬限制(临时规则)
[root@proxy ~]# ulimit -Sn 100000 //设置软限制(临时规则)
[root@proxy ~]# vim /etc/security/limits.conf

    .. ..
*               soft    nofile            100000
*               hard    nofile            100000
用户或组			软/硬连接  需要限制的项目	  限制的值

#该配置文件分4列,分别如下:
#用户或组 硬限制或软限制 需要限制的项目 限制的值
4)优化后测试服务器并发量(因为客户端没调内核参数,所以在proxy测试)

[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.4.5/
步骤四:优化Nginx数据包头缓存

1)优化前,使用脚本测试长头部请求是否能获得响应

[root@proxy ~]# cat lnmp_soft/buffer.sh

#!/bin/bash
URL=http://192.168.4.5/index.html?
for i in {1..5000}
do
    URL=${URL}v$i=$i
done
curl $URL        //经过5000次循环后,生成一个长的URL地址栏

[root@proxy ~]# ./buffer.sh

.. ..
<center><h1>414 Request-URI Too Large</h1></center>   //提示头部信息过大

2)修改Nginx配置文件,增加数据包头部缓存大小

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

.. ..
http {
client_header_buffer_size    1k;        //默认请求包头信息的缓存    
large_client_header_buffers  4 4k;  //大请求包头部信息的缓存个数与容量(4x4k=16k)
.. ..
}

[root@proxy ~]# nginx -s reload
3)优化后,使用脚本测试长头部请求是否能获得响应

[root@proxy ~]# vim buffer.sh

#!/bin/bash
URL=http://192.168.4.5/index.html?
for i in {1..5000}
do
    URL=${URL}v$i=$i
done
curl $URL

[root@proxy ~]# ./buffer.sh
步骤五:浏览器本地缓存静态数据

1)使用Firefox浏览器查看缓存

以Firefox浏览器为例,在Firefox地址栏内输入about:cache将显示Firefox浏览器的缓存信息,如图所示,点击List Cache Entries可以查看详细信息。

在这里插入图片描述

2)清空firefox本地缓存数据,如图所示。
在这里插入图片描述
3)修改Nginx配置文件,定义对静态页面的缓存时间

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires        30d;            //定义客户端缓存时间为30}
}

[root@proxy ~]# cp /usr/share/backgrounds/day.jpg /usr/local/nginx/html
[root@proxy ~]# nginx -s reload

#请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

4)优化后,使用Firefox浏览器访问图片,再次查看缓存信息

[root@client ~]# firefox http://192.168.4.5/day.jpg
在firefox地址栏内输入about:cache,查看本地缓存数据,查看是否有图片以及过期时间是否正确。

server_tokens off;	#隐藏版本信息的优化

5).高效文件传输模式的

sendfile on;
tcp_nopush on;
tcp_nodelay on;

6).访问日志关闭的优化

access_log off;

7).超时时间的优化

keepalive_timeout 10;        //设置客户端保持活动状态的超时时间
client_header_timeout 10;    //客户端请求头读取超时时间
client_body_timeout 10;      //客户端请求体读取超时时间
reset_timedout_connection on; //在客户端停止响应之后,允许服务器关闭连接,释放socket关联的内存
send_timeout 10;        //指定客户端的超时时间,如果在10s内客户端没有任何响应,nginx会自动断开连接

8).gzip的优化
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

gzip on;//开启压缩
gzip_min_length 1000;//小文件不压缩
gzip_comp_level 6;//压缩比例
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;//对指定文件类型进行压缩

9).缓存静态页面的优化 (文件句柄是打开文件的唯一标示)
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

open_file_cache max=100000 inactive=20s; //设置服务器最大缓存10万个文件句柄,关闭20s内无请求的句柄
open_file_cache_valid 30s;//文件句柄的有效期为30s
open_file_cache_min_uses 2;//最少打开2次才会被缓存
open_file_cache_errors on;
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值