Nginx 的最重要的几个使用场景:
用一张图表示:
多进程:一个 Master 进程、多个 Worker 进程
Master 进程:管理 Worker 进程
- 1.对外接口:接收外部的操作(信号)
- 2.对内转发:根据外部的操作的不同,通过信号管理 Worker
- 3.监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- 1.实际处理:网络请求,由 Worker 进程处理
- 2.Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
#1.关闭防火墙
systemctl stop firewall
setenforce 0
#2.fnginx的配置及运行需pcre、zlib、openssl等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件
yum -y install pore-devel zlib-devel openssl-devel gcc gcc-c++ make
#3. 创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
#4.编译安装
tar xf nginx-1.22.0.tar.gz
cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx #指定Nginx的安装路径
--user=nginx \ # 指定用户名
--group=nginx \ # 指定组名
--with-http_stub_status_module # 启用http_stub_status_module模块支持状态统计
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
# 查看Nginx服务是否正常
nginx -t
#使用绝路路径启用服务
/usr/local/nginx/sbin/nginx
#用kill关闭进程
netstat -lntp | grep nginx
cat /usr/local/nginx/logs/ngins.pid #查看PID
kill 72347 #根据进程PID关闭服务
killall nginx #根据进程名关闭服务
kiall -0 nginx #查看进程是否存在,可以查看服务是否开启
#重载
kill -1 PID号
kill -s HUP nginx
killall -1 PID号
#日志分割
kill -USR1
cd /opt/
#解压新版软件包
tar xf ngix1.XXXX
cd nginx1.XXX
#安装软件模块
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
#编译,不要安装
make
#把原来的服务文件移走
cd /usr/local/nginx/sbin/
mv nginx nginx_old
cd /opt/nginx/nginx-1.24.0
#把新的文件移过去,注意,服务要开启
cp objs/nginx /usr/local/nginx/sbin/nginx
make upgrade
方法二:
cd /etc/init.d
#!/bin/bash
#chkconfig: 35 22 88
#desc:this is nginx service control scprit
CMD="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
netstat -lntp | grep nginx &> /dev/null
if [ $? -eq 0 ];then
echo "nginx已经启动"
else
ehco "nginx正在启动"
$CMD
fi
;;
stop)
kill -9 $(cat $PID) &> /dev/null
# netstat -lntp | grep nginx &> /dev/null
if [ $? -eq 0 ];then
echo "ngix服务已经关闭"
else
echo "nginx服务关闭失败"
fi
;;
restart)
$0 stop
$0 start
;;
renx &> /dev/nullnetstat -lntp | grep nginx &> /dev/nullload)
Require all granted
kill -1 $(cat $PID) &> /dev/null
if [ $? -eq 0 ];then
echo "nginx服务已经重载"
else
echo "nginx服务重载失败"
fi
;;
status)
netstat -lntp | grep nginx &> /dev/null
if [ $? -eq 0 ];then
echo "nginx已经启动"
else
echo "nginx服务未启动"
fi
;;
*)
echo "请输入start、stop、restart、reload、status"
esac
chmod +x nginx
chkconfig --add nginx
方法二:
cd /lib/systemd/system
vim nginx.service
[Util]
Description=nginx #服务的描述
After=network.target #依赖关系
[Service] #设置服务管理参数
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid #PID文件位置
ExecStart=/usr/local/nginx/sbin/nginx #启动服务
ExecStop=/bin/kill -s QUIT $MAINPID # 根据PID重载配置
ExecReload=/bin/kill -s HUP $MAINPID #更加PID终止进程
PrivateTmp=true
[Install] #服务安装
WantedBy=multi-user.target #启动级别
1.配置文件模块
1、全局块:全局配置,对全局生效;
2、events块:配置影响Nginx服务器与用户的网络连接;
3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
4、server块:配置虚拟主机的相关参数,一个http 块中可以有多个server块;
5、location块:用于配置匹配的 uri;
6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
2.配置文件解释
vim /usr/local/nginx/conf/nginx.conf
#user nobody; #运行用户,若编译时未指定则默认为nobody
worker_processes 1; #工作进程数量,一般设置为和cPu核数一样;设置为auto,nginx将会自己获取这个数值
#error_log logs/error.log; #错误曰志文件的位置
#pid logs/ nginx.pid; #PID 文件的位置
worker_rlinit_nofile 60000; #设置所有worker进程最大可以打开的文件数,默认为1024
#设置worker进程最大打开文件数,不能超过系统的最大文件数配置
ulimit -a #查看系统限制可以查看文件数量限制
ulimit -t #临时修改
vim /etc/security/limits.conf #永久修改系统限制文件位置
#底行添加
soft nofile 60000 #软限制
hard nofile 60000 #硬限制
3. I/O 事件配置
events {
use epoll; #使用epoll I/o模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 60000 ; #每个进程处理60000个连接
multi_accept on; #是否一次性将监听到的连接全接收进来,默认为off,关闭时一次接收一条连接
accept_mutex on; #默认为on,开启时表示以串行方式接入新连接,否则将通报给所有worker。这可能会浪费资源并产生不可预计的后果,例如惊群问题
}
#如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因
为系统为每个TCP连接都要创建一个socket
句柄,每个socket句柄同时也是一个文件句柄)。
#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
#epoll是lLinux内核为处理大批句柄而作改进的poll,是Linx下多路复用IO接口lTselect/pol1的增强板本,它能显著的减少程序在大量并发连按中只有少量活跃的情况下的系统CPU利用率。
#worker_prcesses的值和work_connections的值决定了最大并发数量,最大并发数计算方式为: worker_prcesseswork_connections。但在反向代理场景中计算方法不同,因为nginx既要维持和客户路的连接,又要维持和后端服务器的连接,因此处理一次连接要占用2个连接,所以最大并发数计算方式为: worker_prcesseswork_connections/2。
4.HTTP 配置
http {
##文件扩展名与文件类型映射表
include mime. types;
##默认文件类型
default_type application/octet-stream;
##日志格式设定
#log_format main 'Sremote addr - $remote user [$time local] "$request" '
# '$status $body_bytes_sent "$http referer" '
# '"$http user agent" "shttp x forwarded for"';
##访问日志位置
#access_log logs/access.logmain;
##开启文件传输模式
sendfile on;
#只在sendfile on时有效。调用tcp_cork方法,让数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵赛。默认为off。
#tcp_nopush on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
##web服务的监听配置
server {
##监听地址及端口
listen 80;
##站点域名,可以有多个,用空格隔开
server_name www.kgc.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_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常见配置指令
location常见配置指令,root、 alias、 proxy_pass root(根路径配置) : root
/var/www/html 请求www.kgc.com/test/1.html,会返回文件/var/www/html/test/1.htmlalias (别名配置) : alias /var/www/html
请求www.kgc.com/test/1.html,会返回文件/var/www/html/1.htmlproxy _pass(反向代理配置〉
什么是阻塞与非阻塞 和同步与异步
阻塞 I/O:这种模式下一个用户进程在发起一个 I/O 操作之后,只有收到响应或者超时才可进行处理其它事情,否则 I/O 将会一直阻塞。以读取磁盘上的一段文件为例,系统内核在完成磁盘寻道、读取数据、复制数据到内存中之后,这个调用才算完成。阻塞的这段时间对 CPU 资源是浪费的。
非阻塞 I/O:这种模式下一个用户进程发起一个 I/O 操作之后,如果数据没有就绪,会立刻返回(标志数据资源不可用),此时 CPU 时间片可以用来做一些其它事情。
同步 I/O:应用发送或接收数据后,如果不返回,继续等待(此处发生阻塞),直到数据成功或失败返回。
异步 I/O:应用发送或接收数据后立刻返回,数据写入 OS 缓存,由 OS 完成数据发送或接收,并返回成功或失败的信息给应用。Node.js 就是典型的异步编程例子。
什么是IO多路复用:IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出cpu。多路是指网络连接,复用指的是同一个线程
epoll模型:是Linux特有的IO多路复用机制,自从2.5.44内核版本引入后成为主流。它使用基于事件的方式来管理文件描述符,使用一个事件表(event table)来保存文件描述符和事件信息,并提供了epoll_create()、epoll_ctl()和epoll_wait()等函数来操作事件表。
根目录
location /accp {
root /var/www/html;
这里的“/” 代表的是/var/ww/html
别名目录
location /accp {
alias /var/www/html;
这里的 /accp 指定是/var/www/html
cd /opt/nginx/nginx-1.24.0/auto
cat cat options | grep YES #存放可用模块配置文件
--without-http_charset_module # 关闭模块,需要编译安装,配置软件模块时关闭,或者添加开启需要的模块
nginx -v #查看版本信息
#!/bin/bash
a=$(curl -Ls 192.168.243.102/status | awk '/Active/{print $3}') #获取并发量
while true;do
if [ $a -gt 2 ];then #大于2个报警
echo "并发量过高!当前并发量$a"
fi
sleep 10 #每10秒循环一次脚本
done
~
1.生成用户密码认证文件
yum install -y httpd-tools
htpasswd -c /usr/local/httpd/userlist zhangsan
htpasswd /usr/local/httpd/userlist lisi
chown nginx /usr/local/nginx/userlist #把文件属主更改为nginx
chmod 400 /usr/local/nginx/passwd.db #更改文件权限只有nginx能查看此文件
2.修改主配置文件相对应目录,添加认证配置项
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加认证配置##
auth_basic "secret"; #设置密码提示框文字信息
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}
3.重启服务,访问测试
nginx -t
systemctl restart nginx
访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加控制规则##
allow 192.168.80.107; #允许访问的客户端 IP
deny all; #拒绝其它IP客户端访问
}
}
systemctl restart nginx
1.为虚拟主机提供域名解析
echo “192.168.80.10 www.kgc.com www.benet.com” >> /etc/hosts
2.为虚拟主机准备网页文档
mkdir -p /var/www/html/benet
mkdir -p /var/www/html/kgc
echo "www.kgc.com
" > /var/www/html/kgc/index.html
echo "www.benet.com
" > /var/www/html/benet/index.html
3.修改Nginx的配置文件
http {
......
server {
listen 80;
server_name www.accp.com; #设置域名www.kgc.com
charset utf-8;
access_log logs/www.accp.access.log; #设置日志名
location / {
root /var/www/html/kgc; #设置www.kgc.com 的工作目录
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 80;
server_name www.benet.com; #设置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
ifconfig ens33:0 192.168.243.130 netmask 255.255.255.0
......
http {
......
server {
listen 192.168.243.130:80; #设置监听地址192.168.243.130
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.243.102:888; #设置监听 888 端口