前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
一、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 repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_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 80
tcp 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.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure 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]# ls
50x.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.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html/3D; # 修改为自己静态文件目录
index index.html index.htm; # 默认展示目录中的index文件
}
...
(3)检查并重新加载生效
[root@centos html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: 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编码嵌入;
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!