一、Nginx概述
Nginx:
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。
对HTTP并发连接的处理能力高,单台物理服务器可支持30000~50000个并发请求。
Apache:
Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器环境,因此,在一个apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。
二、Nginx和Apache的差异
Nginx | Apache |
---|---|
nginx是一个基于事件的web服务器 | apache是一个基于流程的服务器 |
所有请求都由一个线程处理 | 单个线程处理单个请求 |
nginx避免子进程的概念 | apache是基于子进程的 |
nginx类似于速度 | apache类似于功率 |
nginx在内存消耗和连接方面比较好 | apache在内存消耗和连接上没有提高 |
nginx在负载均衡方面表现较好 | 当流量到达进程极限时,apache将拒绝新的连接。 |
nginx不支持IBMI和openvms一样的os | apache支持更多的os |
nginx只具有核心功能 | apache提供了比nginx更多的功能 |
nginx的性能和可伸缩性不依赖于硬件 | apache依赖于cpu和内存等硬件组件 |
Nginx支持热部署 | Apache不支持热部署 |
同步和异步
- 同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致。
- 异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。被依赖的服务是否最终完成无法确定,因此它是一个不可靠的服务序列。
阻塞与非阻塞
- 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,函数只有在得到结果之后才会返回。
- 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
Apache:创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。
Nginx:采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx 支持更高的并发。
三、Nginx和Apache的优缺点比较
nginx相对于apache的优点∶
- 轻量级,同样起web服务,比apache占用更少的内存及资源
- 抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的在高并发下,nginx能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简
- 支持热部署,平滑升级
apache相对于nginx的优点∶
- Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
- 模块多,基本想到的都可以找到
- 少bug, nginx的bug相对较多
- 超稳定
- Nginx处理动态请求是弱项,动态请求要Apache去做。
总结:一般来说,需要性能的web服务,用Nginx. 如果不需要性能只求稳定,那就Apache。Nginx处理动态请求是弱项,一般动态请求要Apache去做,Nginx只适处理静态网页或反向代理。
四、Nginx的进程
Apache和Nginx的默认端口都是80,如果其中一个已经启动了,那么再启动另一个会报错。如果想要同时使用,可以修改其中一个的端口号。
Nginx有两个进程:
master process:主进程(守护进程),用来管理工作进程。
worker process:工作进程,用来处理用户的请求。
五、编译安装Nginx服务
1.安装准备
2.安装依赖包
LHEY
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
3.新建nginx用户便于管理
LHEY
useradd -M -s /sbin/nologin nginx
4.切换到nginx-1.18.0,编译安装nginx
LHEY
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
5.修改文件权限
LHEY
chown -R nginx.nginx /apps/nginx
conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。
html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。
sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。
6.将nginx的操作指令放入环境变量PATH的目录下
将nginx的可执行文件做个软链接,放入环境变量PATH的目录下,让系统识别nginx的操作指令。
LHEY
ln -s /apps/nginx/sbin/nginx /usr/sbin/
7.检查、启动、重启、停止nginx服务
检查、启动nginx服务
多种方式查看nginx的PID号
停止nginx服务
重载nginx服务
8.创建Nginx自启动文件
LHEY
#复制同一版本的nginx的yum安装生成的service文件
vim /usr/lib/systemd/system/nginx.service
#建立文件
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
#重新加载配置
systemctl start nginx
#启动nginx服务
六、yum安装nginx服务
LHEY
centos7 需要安装epel源
yum install -y epel-release
#安装epel源
yum install nginx -y
去使用官方源按装较新的版本
http://nginx.org/en/linux_packages.html#RHEL
1.nginx信号
nginx 命令支持向其发送信号,实现不同功能
显示Nginx的帮助信息:nginx -h
显示版本:nginx -v
显示编译详细情况、模块等信息:nginx -V
看信号大全:kill -l
检查语法格式:nginx -t
2.日志分割(移走原有日志,重新打开日志文件)
LHEY
[root@localhost opt]# cd /apps/nginx/logs//切换到日志目录
[root@localhost logs]# ls
access.log error.log nginx.pid
[root@localhost logs]# mv access.log access.log.bak//将原有日志移走
[root@localhost logs]# touch access.log
[root@localhost logs]# cat /apps/nginx/logs/nginx.pid
5985
[root@localhost logs]# ps aux |grep nginx
root 5985 0.0 0.0 46160 1168 ? Ss 14:26 0:00 nginx: master process nginx
nginx 5986 0.0 0.1 48688 2012 ? S 14:26 0:00 nginx: worker process
root 10201 0.0 0.0 112676 984 pts/0 S+ 15:16 0:00 grep --color=auto nginx
[root@localhost logs]# kill -s USR1
kill: 用法:kill [-s 信号声明 | -n 信号编号 | -信号声明] 进程号 | 任务声明 ... 或 kill -l [信号声明]
[root@localhost logs]# kill -USR1 5985//重新生成日志文件
[root@localhost logs]# ls
access.log access.log.bak error.log nginx.pid
客户端访问服务器
服务端查看日志
七、Nginx服务的主配置文件
nginx 官方帮助文档:nginx.org/en/docs/
tengine 帮助文档:tengine.taobao.org/nginx_docs/...
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
主配置文件中有六个主要模块:
-
全局块:全局配置,对全局生效。
-
events块:配置影响Nginx服务器与用户的网络连接。
-
http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
-
server块:配置虚拟主机的相关参数,一个http块中可以有多个server 块。每个 server 块就相当于一个虚拟主机。。
-
location块:用于配置匹配的url,一个server块中可以有多个location块。
-
upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
配置文件由指令和指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
pid:/apps/run/nginx.pid
指令已{}达括号将多条指令组织在一起且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
1.全局配置
nginx有多种模块
-
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能。
-
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等。
-
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等。
-
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持。
-
Stream服务模块: 实现反向代理功能,包括TCP协议代理。
-
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等。
2.隐藏版本或修改版本
隐藏版本号
LHEY
[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
#修改配置文件放在http语句中
http {
server_tokens off;
[root@localhost ~]# nginx -s reload
#重新加载
修改版本号
在nginx停止运行的情况下进行编译
LHEY
#去修改源码,在安装包里, 再重新编译 #号不要去掉
[root@localhost ~]# killall nginx
[root@localhost ~]# cd /opt
[root@localhost opt]# ls
nginx-1.18.0 nginx-1.18.0.tar.gz rh
[root@localhost opt]# vim /opt/nginx-1.18.0/src/core/nginx.h
/*
* Copyright (C) Igor Sysoev
* Copyright (C) Nginx, Inc.
*/
#ifndef _NGINX_H_INCLUDED_
#define _NGINX_H_INCLUDED_
#define nginx_version 1018000
#define NGINX_VERSION "9527
#define NGINX_VER "LHEY/" NGINX_VERSION
[root@localhost opt]# cd nginx-1.18.0/
[root@localhost nginx-1.18.0]# ./configure --prefix=/apps/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module \
> --with-http_v2_module \
> --with-http_realip_module \
> --with-http_stub_status_module \
> --with-http_gzip_static_module \
> --with-pcre \
> --with-stream \
> --with-stream_ssl_module \
> --with-stream_realip_module
3.修改启动的进程数
LHEY
worker_processes 1;
#允许的启动工作进程数数量,和你真实的cpu数量有关
worker_processes auto;
#如果设置为auto,就是你真实的cpu数量
nginx -s reload
#重新加载
[root@localhost ~]#ps axo pid,cmd,psr,ni|grep nginx
#可以看到nginx的worker数量
4.cpu与work进程绑定
将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
worker_cpu_affinity模块指令用于控制 worker进程与CPU的亲缘
LHEY
vim /apps/nginx/conf/nginx.conf
#编辑配置文件
user nginx;
worker_processes 2;
worker_cpu_affinity 00000001 00000010;
#绑定到第一和第二块cpu上
error_log /apps/nginx/logs/error.log;
#指定报错文件的路径
5.nginx进程的优先级(work进程的优先级)
LHEY
vim /apps/nginx/conf/nginx.conf
#编辑配置文件
user nginx;
worker_processes 2;
worker_cpu_affinity 00000001 00000010;
#绑定到第一和第二块cpu上
error_log /apps/nginx/logs/error.log;
#指定报错文件的路径
#pid /run/nginx.pid;
worker_priority -20;
5. 调试work进程打开的文件的个数
所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,只要机器性能够多加几个也没问题。
LHEY
vim /apps/nginx/conf/nginx.conf
#首先修改配置文件
#添加
worker_rlimit_nofile 65536;
临时修改
LHEY
ulimit -n 30000
#修改单个进程能打开的最大文件数为 30000
#仅应用于当前会话即不会永久修改限制
ulimit -a
#显示当前用户的所有资源限制信息
永久修改(需要修改pam认证模块)
LHEY
vim /etc/security/limits.conf
#最后加入
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000
`nproc`(最大进程数限制)的软限制和硬限制都设置为 1000000,当前用户在单个会话中可以创建的最大进程数为 1000000
`nofile`(打开文件描述符限制)的软限制和硬限制都设置为 1000000,这意味着当前用户在单个会话中可以使用的最大文件描述符数将被限制为 1000000。软限制是软性限制,用户可以根据需要进行调整,而硬限制是硬性限制,一旦设定,用户无法超过该限制
`memlock`(锁定内存限制)的软限制和硬限制都设置为 32000,这意味着当前用户在单个会话中可以锁定的最大内存量为 32000KB
`msgqueue`(消息队列限制)的软限制和硬限制都设置为 8192000,这意味着当前用户在单个会话中可以使用的最大消息队列大小为 8192000字节