前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
一、Nginx简介
1、nginx介绍
Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务,也是一个IMAP/POP3/SMTP服务。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好
在高连接并发的情况下,Nginx是Apache服务器不错的替代品
2、为什么选择nginx
- 作为web服务器
- 作为负载均衡服务器
- 作为邮件代理服务器
- Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器
3、IO多路复用
3.1、I/O multiplexing(多并发)
第一种方法就是最传统的多进程并发模型 (每进来一个新的I/O流会分配一个新的进程管理。)
第二种方法就是I/O多路复用 (单个线程,通过记录跟踪每个I/O流(sock)的状态,来同时管理多个I/O流)
I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流。发明它的原因,是尽量多的提高服务器的吞吐能力。 在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流
3.2、Nginx使用epoll接收请求的过程
ngnix会有很多连接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。
epoll:
epoll 可以说是I/O 多路复用最新的一个实现,epoll 修复了poll 和select绝大部分问题, 比如:
- epoll 现在是线程安全的
-
epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了
3.3、异步、非阻塞
[root@centos ~]# pstree |grep nginx|-+= 81666 root nginx: master process nginx| |--- 82500 nobody nginx: worker process| --- 82501 nobody nginx: worker process
每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理 的worker不会这么一直等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。这就是异步。此时,如果再有request 进来,他就可以很快再按这种方式处理。这就是非阻塞和IO多路复用。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。这就是异步回调。
4、Nginx的内部技术架构
- nginx启动时,会生成两种类型的进程,一个是主进程(Master),一个(windows版本的目前只有一个)或多个工作进程(Worker)。主进程并不处理网络请求,主要负责调度工作进程,也就是图示的三项:加载配置、启动工作进程及非停升级。所以,nginx启动以后,查看操作系统的进程列表,我们就 能看到至少有两个nginx进程。
- 服务器实际处理网络请求及响应的是工作进程(worker),在类unix系统上,nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求
- 模块化设计。nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。
- 事件驱动、异步及非阻塞,可以说是nginx得以获得高并发、高性能的关键因素,同时也得益于对Linux、Solaris及类BSD等操作系统内核中事件通知及I/O性能增强功能的采用,如kqueue、epoll及event ports
-
代理(proxy)设计,可以说是nginx深入骨髓的设计,无论是对于HTTP,还是对于FastCGI、memcache、Redis等的网络请求或响应,本质上都采用了代理机制。所以,nginx天生就是高性能的代理服务器
二、Nginx的安装(Linux:CentOS7)
1、Nginx版本类型
- Mainline version: 主线版,即开发版
- Stable version: 最新稳定版,生产环境上建议使用的版本
-
Legacy versions: 遗留的老版本的稳定版
2、YUM安装
2.1、配置yum源地址
官网有给出Nginx稳定版的yum仓库源地址; nginx news
2.2、开始配置并下载nginx
# cd /etc/yum.repos.d/# vim nginx.repo[nginx-stable]name=nginx stable repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true# yum install -y nginx
2.3、关闭防火墙与selinux
# getenforce Enforcing# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config# systemctl stop firewalld# systemctl disable firewalld
2.4、启动并设置开机自启
# systemctl start nginx
# systemctl enable nginx
2.5、在浏览器输入本机IP即可访问到Nginx默认主页
3、源码编译安装
3.1、安装环境以及相关包
# 安装编译环境、pcre软件包(使nginx支持http rewrite模块)、openssl-devel(使nginx支持ssl)、zlib包yum -y install gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel
3.2、创建用户nginx
useradd nginx
3.3、安装nginx
[root@centos ~]# wget http://nginx.org/download/nginx-1.16.0.tar.gz[root@centos ~]# tar xzf nginx-1.16.0.tar.gz -C /usr/local/[root@centos ~]# cd /usr/local/nginx-1.16.0/[root@centos nginx-1.16.0]# ./configure \--prefix=/usr/local/nginx \--group=nginx \--user=nginx \--sbin-path=/usr/local/nginx/sbin/nginx \--conf-path=/etc/nginx/nginx.conf \--error-log-path=/var/log/nginx/error.log \--http-log-path=/var/log/nginx/access.log \--http-client-body-temp-path=/tmp/nginx/client_body \--http-proxy-temp-path=/tmp/nginx/proxy \--http-fastcgi-temp-path=/tmp/nginx/fastcgi \--pid-path=/var/run/nginx.pid \--lock-path=/var/lock/nginx \--with-http_stub_status_module \--with-http_ssl_module \--with-http_gzip_static_module \--with-pcre \--with-http_realip_module \--with-stream[root@centos nginx-1.16.0]# make && make install
3.4、配置与启动nginx命令
# 尝试启动nginx [root@centos nginx-1.16.0]# /usr/local/nginx/sbin/nginx nginx: [emerg] mkdir() "/tmp/nginx/client_body" failed (2: No such file or directory)# 检查并创建Nginx所需配置目录文件[root@centos nginx-1.16.0]# mkdir -p /tmp/nginx/client_body [root@centos nginx-1.16.0]# mkdir /usr/local/nginx/logs# 启动Nginx服务[root@centos nginx-1.16.0]# /usr/local/nginx/sbin/nginx# 查看nginx服务是否运行[root@centos nginx-1.16.0]# netstat -tunlp | grep 80tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10390/nginx: master# 配置Ngingx命令至环境变量中,便于执行[root@centos nginx-1.16.0]# echo -e "export PATH=/usr/local/nginx/sbin/:$PATH" >> /etc/profile[root@centos nginx-1.16.0]# source /etc/profile[root@centos nginx-1.16.0]# nginx -t
3.5、Nginx编译参数
# 查看 nginx 安装的模块[root@centos nginx-1.16.0]# nginx -V# 模块参数具体功能nginx version: nginx/1.16.0built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017TLS SNI support enabledconfigure arguments: --prefix=/usr/local/nginx # 指向安装目录--group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf # 指定配置文件--error-log-path=/var/log/nginx/error.log # 指定错误日志--http-log-path=/var/log/nginx/access.log # 指定访问日志--http-client-body-temp-path=/tmp/nginx/client_body # 设定http客户端请求临时文件路径--http-proxy-temp-path=/tmp/nginx/proxy # 设定http代理临时文件路径--http-fastcgi-temp-path=/tmp/nginx/fastcgi # 设定http fastcgi临时文件路径--pid-path=/var/run/nginx.pid # 指定pid文件--lock-path=/var/lock/nginx # 指定lock文件--with-http_stub_status_module # 获取nginx自上次启动以来的状态--with-http_ssl_module # 启用ssl支持--with-http_gzip_static_module # 在线实时压缩输出数据流--with-pcre --with-http_realip_module # # 允许从请求标头更改客户端的IP地址值,默认为关--with-stream
3.6、配置文件/etc/nginx/nginx.conf
配置文件中有很多#, 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的内容如下:
# ---------------------全局块-------------------# worker_processes 1; # nginx的工作进程数,auto:基于可用CPU自动确定# --------------------事件模块------------------#events {worker_connections 1024; # 每个工作进程允许的最大连接数}# --------------------HTTP配置------------------#http {include mime.types; # MIME 类型default_type application/octet-stream; # 设置默认的 MIME 类型sendfile on; # 启用高效文件传输模式keepalive_timeout 65; # 设置长连接的超时时间为 65 秒server {listen 80; # 监听端口server_name localhost; # 服务器的名称或域名location / { # 位置块,定义对根 URL (/) 的请求如何处理root html; # 请求的根目录index index.html index.htm; # 指定当请求是目录,默认提供的文件名}error_page 500 502 503 504 /50x.html; # 错误页面location = /50x.html {root html; # 这里的绝对位置是/usr/local/nginx/html}}}
nginx.conf的组成:nginx.conf一共由三部分组成,分别为:全局块、events块、http块。在http 块中又包含http全局块、多个server块。每个server块中又包含server全局块以及多个location块。在统一配置块中嵌套的配置块,各个之间不存在次序关系。
3.7、在浏览器访问
三、Nginx常用命令和配置文件
1、常用命令
命令 | 作用 |
---|---|
nginx -c /path/nginx.conf | 以特定目录下的配置文件启动nginx: |
nginx -s reload | 修改配置后重新加载生效 |
nginx -s reopen | 重新打开日志文件 |
nginx -s stop | 快速停止nginx |
nginx -s quit | 完整有序的停止nginx |
nginx -t | 测试当前配置文件是否正确 |
nginx -t -c /path/to/nginx.conf | 测试特定的nginx配置文件是否正确 |
nginx -s reload 命令加载修改后的配置文件,命令下达后发生如下事件:
- Nginx的master进程检查配置文件的正确性,若是错误则返回错误信息,nginx继续采用原配置文件进行工作(因为worker未受到影响)
- Nginx启动新的worker进程,采用新的配置文件
- Nginx将新的请求分配新的worker进程
- Nginx等待以前的worker进程的全部请求已经都返回后,关闭相关worker进程
-
重复上面过程,知道全部旧的worker进程都被关闭掉
2、配置文件
- /usr/share/nginx/html/:网站主目录
- /etc/nginx/nginx.conf:主配置文件
- /etc/nginx/conf.d/default.conf:子配置文件
2.1、Nginx配置文件的组成
yum进行安装的nginx配置文件与源码编译安装的nginx配置文件有所不同,其yum安装的配置文件中的server块单独成了一个文件,而源码编译安装的配置文件则在主配置文件中全有;
/etc/nginx/nginx.conf:
# --------------------基础配置------------------#user nginx; # 设置nginx工作进程运行的用户,nginx表示nginx服务以nginx用户权限运行worker_processes auto; # nginx的工作进程数,auto:基于可用CPU自动确定error_log /var/log/nginx/error.log notice; # 指定错误日志的位置和记录级别pid /var/run/nginx.pid; # 设置存放 NGINX 主进程号的文件位置# --------------------事件模块------------------#events {worker_connections 1024; # 每个工作进程允许的最大连接数}# --------------------HTTP配置------------------#http {include /etc/nginx/mime.types; # MIME类型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 /var/log/nginx/access.log main; # 访问日志sendfile on; # 开启高效文件传输模式#tcp_nopush on;keepalive_timeout 65; # 长连接的超时时间#gzip on; # 对特定类型的响应进行gzip压缩include /etc/nginx/conf.d/*.conf; # 包含其他配置}
/etc/nginx/conf.d/default.conf: 精简之后的内容如下 ,当然,这个子配置文件
server {listen 80; # 监听端口server_name localhost; # 设置服务器的名称或IP地址location / { # /:匹配所有请求root /usr/share/nginx/html; # Nginx默认的静态文件存放目录index index.html index.htm; # 指定当请求是一个目录时,默认返回的文件}error_page 500 502 503 504 /50x.html; # 定义服务器响应某些错误状态时显示的页面location = /50x.html { # 精确匹配/50x.html的请求root /usr/share/nginx/html; # 错误页面存放目录}
3、默认首页修改
(1)下面修改首页改为CSDN首页静态页面,先上传文件至/usr/nginx/html/
目录下
[root@centos html]# pwd/usr/share/nginx/html[root@centos html]# ls50x.html index.html CSDN[root@centos html]# tree -a.├── 50x.html├── CSDN│ ├── CSDN\ ...│ └── index.html # 修改自己的首页文件名为index.html/或在配置文件中设置首页文件名├── index.html└── index.html
(2)修改子配置文件/etc/nginx/conf.d/default.conf
:
[root@centos html]# vim /etc/nginx/conf.d/default.confserver {listen 80;server_name localhost;location / {root /usr/share/nginx/html/3D; # 修改为自己静态文件目录index index.html index.htm; # 默认展示目录中的index文件}...
(3)检查并重新加载生效
[root@centos html]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful[root@centos html]# nginx -s reload
(4)在浏览器访问,发现主页已经变成我们设置的静态文件页面
4、Nginx日志文件
nginx 日志文件分为 log_format 和 access_log 两部分,其中log_format格式为:
log_format 样式名称 样式详情
配置文件中默认有:
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 /var/log/nginx/access.log main;
变量 | 说明 |
---|---|
http_x_forwarded_for | 客户端的IP |
$remote_user | 客户端的名称 |
$time_local | 访问时的本地时间 |
$request | 请求的URL和http协议 |
$status | 访问的状态码 |
$body_bytes_sent | 发送给客户端的主体内容大小 |
$http_referer | 记录客户端是从哪个页面链接访问过来的,若没有链接,则访问'-' |
$http_user_agent | 记录客户端使用的浏览器相关信息 |
5、使用 limit_rate 限制客户端传输数据的速度
5.1、编辑/etc/nginx/nginx.conf
location / {root /var/www/nginx/;index index.html index.htm;limit_rate 2k; # 对每个连接的限速为2k/s
}
6、Nginx错误页面配置
nginx错误页面包括404 403 500 502 503 504等页面,只需要在server中增加以下配置即可
#error_page 404 403 500 502 503 504 /404.html;
location = /404.html {root /usr/local/nginx/html;
}
注意:/usr/local/nginx/html/ 路径下必须有404.html这个文件!!!
404.html上如果引用其他文件的png或css就会有问题,显示不出来,因为其他文件的访问也要做配置; 为了简单,可以将css嵌入文件中,图片用base编码嵌入;
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!