目录
[Nginx服务的主配置文件 nginx.conf](#Nginx服务的主配置文件 nginx.conf)
[2.I/O 事件配置](#2.I/O 事件配置)
[3.HTTP 配置](#3.HTTP 配置)
[4.Web 服务的监听配置](#4.Web 服务的监听配置)
[4.1创建运行用户,组(Nginx服务程序默认以 nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)](#4.1创建运行用户,组(Nginx服务程序默认以 nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限))
Nginx服务基础
一款高性能,轻量级Web服务软件
- 稳定性高
- 系统资源消耗低
- 对HTTP并发连接的处理能力高(单台物理服务器可支持30000------50000个并发请求)
Nginx服务的主配置文件 nginx.conf
- 全局块:全局配置,对全局生效;
- events块:配置影响 Nginx 服务器与用户的网络连接;
- http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
- server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
- location块:用于配置匹配的 uri ;
- upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分
1.全局配置
#user nobody; #运行用户,若编译时未指定则默认为 nobody
worker_processes 1;
#工作进程数量,一般设置为和 CPU 核数一样;设置为auto,nginx将会自己获取这个数值
#error_log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID 文件的位置
worker_rlimit_nofile 65535; #指定 worker 子进程可以打开的最大文件句柄数,默认为1024
2.I/O 事件配置
events {
use epoll;
#使用 epoll I/O模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 65535;
#每个 worker 子进程能够处理的最大并发连接数
multi_accept on;
#是否一次性将监听到的连接全接收进来,默认为off,关闭时一次接收一条连接
accept_mutex on;
#默认为on,开启时表示以串行方式接入新连接,否则将通报给所有worker。这可能会浪费资源并产生不可预计的后果,例如惊群问题
}
#如提高每个进程的连接数还需执行"ulimit -HSn 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
#worker_processes的值和work_connections的值决定了最大并发数量,最大并发数计算方式为:worker_processes*worker_connections。但在反向代理场景中计算方法不同,因为nginx既要维持和客户端的连接,又要维持和后端服务器的连接,因此处理一次连接要占用2个连接,所以最大并发数计算方式为:worker_processes*worker_connections/2。
3.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;
##开启tcp_nopush和tcp_nodelay用于防止网络阻塞
tcp_nopush on;
tcp_nodelay on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
4.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;
}
}
}
Nginx两种进程
- master进程:管理worker进程,加载配置文件
- worker进程:处理请求连接
Nginx应用场景
- 用作Web网站服务,处理http静态页面请求
- 用作虚拟主机,实现一个服务器用于做多个网站站点
- 用作反向代理、负载均衡,可以作为网关代理服务器接收客户端的请求转发给后端节点服务器集群
- 用作web缓存服务器
Nginx与Apache区别
- 最核心的区别在于 Nginx 采用异步非阻塞机制,多个连接可以对应一个进程;Apache 采用的是同步阻塞+多进程/线程模型,一个连接对应一个进程
- 步阻塞+多进程/线程模型,一个连接对应一个进程
- Nginx 抗并发能力更高
- Nginx 更轻量,内存、CPU资源消耗更少
- Nginx 配置简洁,使用场景多,稳定性高
同步与异步;阻塞与非阻塞
- 同步与异步,重点在于消息通知的方式
- 阻塞与非阻塞,重点在于等消息时候的行为
同步与异步
这两个概念是从客户端与服务端通信交互方式来看
同步
- 指服务端接收到客户端请求后,必须处理完该请求后(发送处理结果给客户端)才会接收客户端发送来的下一个请求
异步
- 指服务端还没有处理完客户端请求(没有发送处理结果给客户端),就已经接收下一个客户端发来的请求了
阻塞和非阻塞
这两个概念是从服务器内部处理请求的方式来看
阻塞
- 指服务器接收到请求后,如果遇到IO阻塞,当前线程会被挂起,直到IO完成后唤醒当前线程,当前线程期间不会去处理其他事情
非阻塞
- 指服务器接收到请求后,如果遇到IO阻塞,当前线程不会挂起,而是会立即返回去执行下一个调用
编译安装Nginx服务
准备工作
- 一台虚拟机(20.0.0.3)
- nginx所需软件包
1.初始化操作
systemctl disable --now firewalld #关闭防火墙并且设置开机不启动
setenforce 0 #放空selinux
mount /dev/sr0 /mnt #挂载到/mnt
vim /etc/selinux/config #编辑selinux配置
2.安装nginx所需软件包传到/opt目录下
2.1官网下载软件包
2.2上传软件包,并解压
cd /opt #切换到opt目录
rz -E #上传文件
tar xf nginx-1.26.0.tar.gz #解压缩
3.安装依赖包
mount /dev/sr0 /mnt #挂载
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make #本地yum安装
4.编译安装Nginx
4.1创建运行用户,组**(Nginx服务程序默认以 nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)**
cd /opt/nginx-1.26.0/ #切换目录
useradd -M -s /sbin/nologin nginx #创建用户,组
4.2指定配置模块
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
cd nginx-1.24.0/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module #启用 http_stub_status_module 模块以支持状态统计
4.3编译安装
make -j3 #指定3核,根据本机情况
make install #编译安装
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #让系统更好识别
5.检查,启动,重启,停止nginx服务(kill)
5.1检查配置文件是否正确
nginx -t #检查配置是否正常
5.2启动
/usr/local/nginx/sbin/nginx #启动
5.3停止服务
cat /usr/local/nginx/logs/nginx.pid #先查看nginx的PID号
kill -3 <PID号>
kill -s QUIT <PID号>
killall -3 nginx
killall -s QUIT nginx
5.4重启
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx
5.5平滑升级
kill -USR2 <PID号>
5.6日志分割,重新打开日志文件
kill -USR1 <PID号>
6.添加Nginx服务
方法一
vim /etc/init.d/nginx #编辑文件
#!/bin/bash
#chkconfig: - 99 20
#description:Nginx Service Control Script
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "1" in start) COM
;;stop)
kill -s QUIT $(cat $PID)
;;restart)
$0 stop
$0 start
;;reload)
kill -s HUP $(cat $PID)
;;*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1esac
exit 0
chmod +x /etc/init.d/nginx #文件添加执行权限
chkconfig --add nginx #添加为系统服务
systemctl start nginx #重新启动nginx
方法二
vim /lib/systemd/system/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
[Unit]:服务的说明Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务
[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service