文章目录
- Nginx
- 编译安装Nginx
- 检查、启动、重启、停止nginx服务
- 添加Nginx系统服务
- Nginx配置
- 全局配置
- I/O事件配置
- HTTP配置
- Web服务的监听配置
- 日志格式设定
- location常见配置指令
- 访问状态统计配置
Nginx
-
一款高性能、轻量级Web服务软件
- 稳定性高
- 系统资源消耗低
- 对HTTP并发连接的处理能力高
- 单台物理服务器可支持30000 ~ 50000个并发请求
-
Nginx和Apache的差异
-
轻量级:Nginx比Apache占用更少的内存及资源
-
静态处理,Nginx静态处理性能比Apache高
-
Nginx可以实现无缓存的反向代理加速,提高网站运行速度
-
Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于硬件
-
Nginx支持热部署,启动速度迅速,可以在不间断服务的情况下,对软件版本或者配置进行升级
-
Nginx是异步进程,多个连接可以对应一个进程 ;Apache是同步多进程,一个连接对应一个进程
-
Nginx高度模块化,编写模块相对简单,且组件比Apache少,高并发下Nginx能保持低资源低消耗高性能
-
Nginx配置简洁,Apache配置复杂
-
Nginx使一款异步非阻塞工作模式的web应用,Apache是同步阻塞
-
编译安装Nginx
systemctl stop firewalld ##关闭防火墙
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
vim /etc/selinux/config
修改配置
SELINUX=disabled
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
cd /opt/
cd nginx-1.24.0/
./configure \
--prefix=/usr/local/nginx \ # 指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ # 指定组名
--with-http_stub_status_module
#启用http_stub_status_module模块以支持状态统计
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make -j2
make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
#让系统识别nginx的操作命令
检查、启动、重启、停止nginx服务
nginx -t ##检查配置文件是否正确
/usr/local/nginx/sbin/nginx ##启动nginx
##查看进程号
cat /usr/local/nginx/logs/nginx.pid ##查看服务进程号
netstat -lntp | grep nginx
ss -lntp | grep nginx
ps aux | grep nginx
##找其中的Master进程,用来管理work进程和读取配置文件,work进程处理用户请求
ps aux | grep -v grep | grep -c nginx
##在没配置系统服务前关闭进程
kill -3 pid ##停止服务
kill -3 -s QUIT pid
killall -3 nginx
killall -3 -s QUIT nginx
kill -1 pid ##根据PID重载服务
kill -s HUP pid
killall -1 nginx
killall -s HUP nginx
kill -0 pid ##检查服务是否运行
killall -0 nginx
kill -USR1 pid ##日志分割,重新生成新的空日志文件
##平滑升级Nginx版本
kill -USR2 pid ##平滑升级
tar -xf nginx-1.XXX ##解压高版本的Nginx软件包
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
##添加配置项
make -j2 ##编译安装
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak ##备份老的配置文件
cd /opt/nginx-1.XXX
cp objs/nginx /usr/local/nginx/sbin/nginx
##复制高版本的二进制配置文件到已安装的软件的配置文件目录中
make upgrade ##升级,在升级前先打开nginx的服务
nginx -V ##查看nginx版本
##查看Nginx是否运行
kill -0 pid
killall -0 nginx
echo $? ##为0 为开启
netstat -lntp | grep nginx
echo $? ##为0 为开启
ps -ef | grep -v "grep|$$" | grep -c "nginx"
添加Nginx系统服务
方法一:
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 22 88
#desc: this is nginx control script
CMD="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
COUNT=$(ps -ef | grep -v "service|grep|$$" | grep -c "nginx")
case "$1" in
start)
if [ $CONUT -ge 1 ]
then
echo "Nginx已经启动"
else
echo "Nginx正在启动"
$CMD
fi
;;
stop)
kill -s QUIT $(cat $PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PID)
;;
status)
if [ $CONUT -ge 1 ]
then
echo "Nginx在运行"
else
echo "Nginx关闭"
fi
*)
echo “Usage: $0 {start|stop|restart|reload|status}”
esac
chmod +x nginx
chkconfig --add nginx
systemctl daemon-reload
方法二:
vim /usr/lib/systemd/system/nginx.service
[Util]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod +x /usr/lib/systemd/system/nginx.service
systemctl daemon-reload
Nginx配置
/usr/local/nginx/conf
cat nginx.conf | egrep -v "^$|^\s*#"
##过滤配置中的有效行
- 全局块:全局配置,对全局生效
- events块:配置影响Nginx 服务器与用户的网络连接
- http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
- server块: 配置虚拟主机的相关参数,一个http块中可以有多个server块
- location块:用于配置匹配的url
- upstream:配置后端服务器具体地址,负栽均衡配置不可或缺的部分。
全局配置
#user nobody;
#运行用户,若编译时未指定则默认为nobody
worker_processes 1;
#工作进程数量,一般设置为和CPU核数一样;设置为auto,nginx将会自己获取这个数值
#error_log logs/error.log;
#错误日志文件的位置
#pid logs/nginx.pid;
#PID文件的位置
worker_rlimit_nofile 60000;
#设置所有worker进程最大可以打开的文件数,默认为1024
vim /etc/security/limits.conf
修改系统最大连接文件数
I/O事件配置
events {
use epoll;
##使用epoll模型, 2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 4096;
##每个进程处理4096个连接
multi_accept on;
##是否一次性将监听到的连接全接收进来,默认为off,关闭时一次接收一条连接
accept_mutex on;
##默认为on,开启时表示以串行方式接入新连接,否则将通报给所有worker.这可能会浪费资源并产生不可预计的后果,例如惊群问题
}
##如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
##在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
##可使用"ulimit -a"命令查看系统允许当前用户进程打开的文件数限制。
##epo11是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用I0接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
##worker_ processes的值和work_ connections的值决定了最大并发数量,最大并发数计算方式为: worker_ processes*worker_ connections.
但在反向代理场景中计算方法不同,因为nginx既要维持和客户端的连接,又要维持和后端服务器的连接,因此处理一次连接要占用2个连接,所以最大并发数计算方式为:
worker_ processes*worker_ .connections/2
HTTP配置
http {
##文件扩展名与文件类型映射表
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;
##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据) ,此选项仅在使用sendfile on 的时候使用,有助于解决网络阻塞,默认为 off
#tcp_nopush on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
gzip on;
Web服务的监听配置
server {
监听地址及端口
listen 80;
站点域名,可以有多个,用空格隔开
server name www.ggl.com;
网页的默认字符集
charset utf-8;
根目录配置
location / {
网站根目录的位置/usr/local/nginx/html
root html;
默认首页文件名
index index.html index.php;
内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
错误页面配置
location = /50x.html {
root html;
}
}
}
日志格式设定
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
##$remote_addr 记录上一节点地址
##$http_x_forwarded_for 记录所有经过的节点的地址
$remote_user:用来记录客户端用户名称;
$time_local:用来记录访问时间与时区;
$request:用来记录请求的url与http协议;
$status:用来记录请求状态;成功是200;
$body_bytes_sent:记录发送给客户端文件主体内容大小;
$http_referer:用来记录从哪个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote. add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_ forwarded_ for信息, 用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
location常见配置指令
locarion /test
root (根路径配置): root /var/www/html
请求www.ggl.com/test/1.html
会返回/var/www/html/test/1.html
alias (别名配置):alias /var/www/html
请求www.ggl.com/test/1.jpg,
会返回文件/var/www/html/1.jpg
proxy_pass (反向代理配置):
访问状态统计配置
先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS模块
cd /opt/nginx-1.24.0/auto
cat options | grep YES ##查看模已安装的所有模块
cd /usr/local/nginx/conf
vim /usr/local/nginx/conf/nginx.conf
......
http {
.....
server {
listen 80;
server_name www.xyw.com
charset utf-8;
location / {
root html;
index index.html index.php;
}
##添加stub_status配置##
location /status { ## 访问位置为/status
stub_status on; ##打开状态统计功能
access_log off; ##关闭此位置的日志记录
}
}
}
浏览器访问http://192.168.242.66/status
Active connections: 表示当前的活动连接数,即当前与Nginx 服务器建立的连接数。
server accepts handled reguests :表示已经处理的连接信息
三个数字依次表示:服务器已接收的连接数
服务器成功处理的连接数
服务器累计处理的总请求数( 在保持连接模式下,请求数量可能会大于连接数量)
Reading:表示当前正在从客户端读取数据的连接数。
Writing:表示当前正在向客户端写入数据的连接数。
waiting:表示当前空闲并等待请求的连接数。
可curl -Ls http://192.168.242.66/statu 结合awk与if语句进行性能监控。
##查看连接的并行数
curl -Ls 192.168.242.66/status | awk '/Active connections/{print $3}'
##创建脚本,实现每10秒查看一下并行数,并在一定数量后进行告警
#!/bin/bash
while true
do
CONNECT=$(curl -Ls 192.168.242.66/status | awk '/Active connections/{print $3}')
if [ $CONNECT -gt 100 ]
then
echo "告警!当前并发连接过高,当前并发数为:$CONNECT"
fi
sleep 10
done