Nginx的安装和优化1
一、nginx简介
1.1 概述
nginx:
- ngnx是一个高性能的HTTP反向代理服务器
- 是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件代理服务器
- 单台物理服务器可支持30 000~50 000并发请求
apache:
apache是以进程为基础的结构,进程比线程消耗更多的系统开支,不太适应于多处理器环境,因此,在一个apache web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。
1.2nginx和apache的优缺点比较
1.nginx相对于apache缺点
- 轻量级,同样web服务,比apache占用更少的内存资源
- 抗并发,nginx处理请求是异步非租塞的,而apache是阻塞型的高并发下,nginx能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简洁
2.aoache相对于nginx的优点 - rewrite比nginx的rewrite强大
- 模块多,基本想到的都可以找到
- bug少,nginx的bug相对较多
- 超稳定
存在的理由:一般来说,需要性能的web服务,用nginx。若不需要性能只求稳定,就选用apache
1.3nginx作为web服务器与apache比较
相比apache,nginx使用更少的资源,支持更多的并发连接,体现更高的效率
- nginx作为负载均衡服务器:nginx既可以在内部直接支持rails和php程序对外进行服务,也可以支持http代理服务器对外进行服务
- nginx 采用c进行编写:不论是系统资源开销还是cpu使用效率都比较好
- 作为邮件代理服务器:最早开发这个产品的目的之一也是作为邮件代理服务器
nginx配置简洁,apache较复杂
1.5nginx和apache最核心的区别
- apache是同步多进程模型,一个连接对应一个进程,nginx是异步的,多个连接可以对应一个进程
- nginx处理静态文件好,耗费内存少,只适合静态和反向
- apache在处理动态有优势
- nginx并发性比较好,cpu占用内存低,如果rewrite频繁,选用apache最佳
- 总的来说,apache依然是大部分公司的首选
二、linux中的i/o
i/o在计算机中指input/output,iops即每秒的输入输出量是衡量磁盘性能的主要指标之一。iops是指单位时间内系统能处理的i/o请求数量,一般以每秒处理的io请求数量为单位,i/o请求通常为读或写数据操作请求
一次万主任的i/o是用户空间的进程数据域内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy到用户空间的j进程内存当中,所以简单说i/o就是把数据从内核空间中的内存数据复制到用户空间中进程的内存中
- 磁盘i/o:
- 网络i/o:一切皆文件,本质为对socket文件的读取
1.获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3)
2.构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4)
3.返回数据,服务器将已构建好的响应再通过内核空间的网络I/0发还给客户端(5-7)
同步/异步:关注的是消息通信机制,即调者用在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
- 同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
- 异步:asynchronous,被调用者通过状态,通知或回调机制主动通知调用者被调用者的运行状态
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态
- 阻塞:blocking,指io操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情
- 非租塞:nonblocking,指io操作被调用后立即返回给用户一个状态值,而无需等到io操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情
异步非租塞i/o模型
三、nginx的编译安装步骤详解
3.1关闭防火墙,安装依赖关系包
3.2新建用户和组便于管理
3.3、将压缩包传入到/opt目录下,编译安装
//解释
--prefix=/usr/local/nginx \
#安装路径
--user=nginx \
#指定用户名
--group=nginx \
#指定用户组
--with-http_stub_status_module
#启用此模块支持状态统计
//
2.4、做软连接并启动nginx
2.5、停止nginx服务
注意:nginx有主进程和工作进程,一定要杀死主进程(即父进程)
2.6、重载nginx服务
2.7、日志分割(移走原有日志,重新打开日志文件)
2.8、升级nginx服务
三种方式升级nginx服务
#平滑升级:
kill -USR2 <PID号>
#新版本升级:
tar zxvf nginx-XX.XX.tar.gz #XX代表新版本号
cd nginx-XX.XX
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
#重新编译:
make #重新编译
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old #备份旧文件,方便回滚
cp objs/nginx /usr/local/nginx/sbin/nginx #将新的运行文件放入安装的运行目录
make upgrade #编译升级
#或者先 killall -3 nginx ,再 /usr/local/nginx/sbin/nginx
2.7、添加nginx系统服务
方法一:
[root@yuji ~]# vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20
#description:This is nginx control script
RUN="/usr/local/nginx/sbin/nginx"
PID=`cat /usr/local/nginx/logs/nginx.pid`
case "$1" in
start)
$RUN
;;
stop)
kill -3 $PID
;;
restart)
kill -3 $PID
$RUN
;;
reload)
kill -1 $PID
;;
*)
echo "正确用法为:$0 {start|stop|restart|reload}"
esac
[root@yuji ~]# chomod +x nginx //给nginx赋予权限
[root@yuji ~]# chkconfig --add nginx //将nginx加入chkconfig
[root@yuji ~]# chkconfig --list //查看chkconfig列表
[root@yuji ~]# service nginx start //开启服务,或 systemctl start nginx
[root@yuji ~]# ss -natp | grep nginx //查看服务
方法二:
将nginx命令加入服,编写/lib/systemd/system/nginx.service文件。
[root@yuji ~]# cd /lib/systemd/system/
[root@yuji system]# vim nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@yuji system]# systemctl daemon-reload //重载配置
[root@yuji system]# systemctl start nginx //启动服务
[root@yuji system]# netstat -natp | grep nginx //查看服务
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2154/nginx: master
#之后可以使用systemctl start|stop|restart|enable nginx 来管理服务
/lib/systemd/system/nginx.service文件注释:
[Unit] #服务的说明
Description #描述服务
After #依赖,当依赖的服务启动之后再启动自定义的服务
[Service] #服务运行参数的设置
Type=forking #是后台运行的形式,使用此启动类型应同时指定
PIDFile= #以便systemd能够跟踪服务的主进程
Execstart #为服务的具体运行命令
ExecReload #为重启命令
ExecStop #为停止命令
PrivateTmp=true #表示给服务分配独立的临时空间
#注意:启动、重启、停止命令全部要求使用绝对路径
[Install] #服务安装的相关设置,指定运行级别,可设置为多用户(即字符界面)
2.8、浏览器访问验证
使用浏览器输入本机IP地址,访问验证
默认首页文件位置在/usr/local/nginx/html/目录下
四、nginx服务的主配置文件
4.1、主配置文件位置:/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/目录下
- nginx.conf是主配置文件
- nginx.conf.default是主配置文件
主配置文件中有六个主要模块:
1.核心模块:是nginx服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析,事件驱动机制,进程管理等核心功能
2.标准HTTP模块:提供HTTP协议解析相关的功能,比如:端口配置、网页编码设置、HTTP响应头设置,等等
3.可选HTTP模块:主要用于扩展标准的HTTP功能,让nginx能处理一些特殊的服务,比如:flash多媒体传输,解析geolp请求,网络传输压缩,安全协议ssl支持等
4.s邮件服务模块:主要用于支持nginx的邮件服务,包括对pop3协议,imap协议和smtp协议支持
5.stream服务模块:实现反向代理功能,包括tcp协议代理
6.第三方模块:是为了扩展nginx服务器应用,完成开发者自定义功能,比如:json支持,lua支持等
4. 2、全局配置
#user nobody; ##运行用户
worker_processes 1; ##工作进程数,可配置成服务器内核数*2,如果网站访问量不大,一般设为1就够用了
#error_log logs/error.log; ####错误日志文件的位置
#pid logs/nginx.pid; ####PID文件的位置
4. 3、i/o事件配置
events {
use epoll; #使用 epoll 模型以提高性能,2.6 以上版本建议使用
worker_connections 4096; #每个进程处理4096个连接
}
epoll(socket描述符)是Linux内核]为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
若工作进程数为 8,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数 已超过 3 万个(4 096×8=32 768),当然具体还要看服务器硬件、网络带宽等物理条件的性 能表现。
1.如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
2.在Linux平台.上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
3.可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
epoll(socket描述符)是Linux内核]为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
若工作进程数为 8,每个进程处理 4 096 个连接,则允许 Nginx 正常提供服务的连接数 已超过 3 万个(4 096×8=32 768),当然具体还要看服务器硬件、网络带宽等物理条件的性 能表现。
如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
在Linux平台.上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
4.4、访问状态统计配置
-
nginx 内置了 HTTP_STUB_STATUS 状态统计模块,用来反馈当前的 Web 访问情况, 配置编译参数时可添加–with-http_stub_status_module 来启用此模块支持,可以使用命令
-
可以使用命令/usr/local/nginx/sbin/nginx –v 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块。
操作步骤:
1.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置(修改之前进行备份)
#先拷贝一份配置文件
[root@localhost conf]#cp /usr/local/nginx/conf/nginx.conf nginx.conf.bak
# 修改 nginx.conf 配置文件
[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf
events {
use epoll;
worker_connections 1024;
}
server {
listen 80;
server_name www.yxp.com;
charset utf-8;
location / {
root html;
index index.html index.htm;
}
location /status { ##访问位置为/status
stub_status on; ##打开状态统计功能
access_log off; ##关闭此位置的日志记录
}
2.在网页中输入 192.168.11.11/status 测试2.在网页中输入192.168.11.12/status 测试
Active connections: 2
server accepts handled requests
2 2 4
Reading: 0 Writing: 1 Waiting: 1
Active connections: 2
server accepts handled requests
2 2 4
Reading: 0 Writing: 1 Waiting: 1
3.结合awk来写shell脚本,如果链接数过高报警
#/bin/bash
a=$(curl 192.168.59.108/status)
b=$(echo $a|awk '{print $3}')
if [ $b -ge 1000 ]
then
echo "连接数过高"|mail -s test 1943466298@qq.com
else
echo "运行良好"
fi
4. 5、基于授权密码的访问控制
1.生成用户密码认证文件
#安装工具
[root@localhost conf]#yum install -y httpd-tools.x86_64
#如果没有密码则设置
[root@localhost conf]#htpasswd -c /usr/local/nginx/passwd.db zhangsan
#第二次不用加-c
[root@localhost conf]#htpasswd /usr/local/nginx/passwd.db lisi
[root@localhost conf]#chown nginx /usr/local/nginx/passwd.db
[root@localhost conf]#chmod 400 /usr/local/nginx/passwd.db
2.修改主配置文件相应的目录
location /status {
#添加密码认证
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
# stub_status on;
# access_log off;
root html;
index index.html index.htm;
}
3.重启服务
[root@localhost conf]#nginx -t
[root@localhost conf]#systemctl restart nginx.service
4.在网页测试
http://192.168.11.111需要输入账号和设置的密码才能登录