Nginx--简介、安装、常用命令和配置文件

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 

一、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_formataccess_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编码嵌入

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李学不完

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值