Linux:Nginx快速入门

文章目录

  • Nginx基本概述
    • 一、常见的HTTP Web服务
    • 二、Nginx优点
    • 三、Nginx应用场景
  • Nginx框架原理
    • 一、多线程模型
  • Nginx基础
    • 官方提供三种版本下载
    • 安装方式
    • 1、epel源安装
    • 2、官方源安装
    • 3、编译安装(源码包)
    • Nginx命令
    • Nginx目录结构
    • Nginx常用编译选项
  • Nginx配置文件
  • Nginx配置网站
  • Nginx日志管理
    • log_format详解
    • nginx日志切割

Nginx基本概述

Nginx 是一个开源且高性能、可靠的 Http Web 服务、代理服务。

开源: 直接获取源代码
高性能: 支持海量并发
可靠: 服务稳定

一、常见的HTTP Web服务

Apache:

  1. httpd,最早的web服务

Nginx:

  1. OpenResty,基于Nginx+Lua
  2. Tengine,淘宝基于Nginx开发

Lighttpd:

  1. 德国人领导的开源轻量Web服务器软件

IIS

  1. 微软,微软公司提供的基于运行Microsoft Windows的互联网基本服务。

GWS

  1. Google Web Server

BWS

  1. Baidu Web Server

二、Nginx优点

  • 高性能、高并发

    • 支持很高的并发,在处理大量并发的情况下,比其他web服务器要高效
  • 轻量且高扩展

    • 功能模块少(源代码仅保留http与核心模块代码,其余不够核心代码会作为插件来安装)
    • 代码模块化(易读,便于二次开发,支持第三方模块,对于开发人员非常友好)
  • 高可靠性

    • 只要不过分不会出现问题
    • 宕机时间,99.999%
    • 大部分web服务需要定期重启维护,nginx不需要
  • 支持热备份

    • 运行期间,更新迭代、代码部署
  • 互联网公司都选择 Nginx

    • Nginx技术成熟, 国内公司基本大规模使用
    • 适合当前主流架构趋势, 微服务、云架构、中间层
    • 统一技术栈, 降低维护成本, 降低技术更新成本
  • 事件模型:Nginx 采用 Epoll 网络模型, Apache 采用 Select 模型

    • Select: 当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下。
    • Epoll: 当用户发起请求,epoll模型会直接进行处理,效率高效,并无连接限制。

三、Nginx应用场景

Linux:Nginx快速入门_第1张图片

Nginx框架原理

一、多线程模型

进程是操作系统资源分配的最小单位,由于CPU数量有限,多个进程通过被分配的时间片来获得CPU的使用权,系统在进行内核管理和进程调度时,要执行保存当前进程上下文、更新控制信息、选择另一就绪进程、恢复就绪进程等一系列操作,而频繁切换进程会造成资源消耗。

  • 1、Nginx采用master-workers的工作机制
    Linux:Nginx快速入门_第2张图片

  • 主进程负责工作进程的配置加载、启动等操作;

  • 工作进程负责处理具体请求;

  • 工作进程之间都是独立的,每个工作进程处理多个连接;

  • 每个连接由一个工作进程全权处理,不需要进行进程切换,不会产生进程切换引起的资源消耗问题;

  • 共享内存允许多个进程访问同一个内存地址,一个进程改变了内存中的内容后,其他进程都可以使用变更后的内容

worker进程工作原理,如下图

Linux:Nginx快速入门_第3张图片
2、模块化
模块化的设计为Nginx提供了高度的可靠性、可扩展性、可定制特性。

  • 模块化(core)
    • 提供了Nginx服务运行的基本服务,如Nginx的进程管理、CPU亲缘性、内存管理、配置文件解析、日志等功能
  • 事件模块(event)
    • 负责进行连接处理、提供不同操作系统的I/O网络模型支持和自动根据系统平台选择最有效I/O网络模型的方法
  • HTTP模块(http)
    • 提供处理HTTP处理的核心功能和部分功能模块。
  • Mail模块(mail)
    • 提供邮件代理功能
  • Stream模块(stream)
    • 提供TCP/UDP会话代理和负载相关功能
  • upstream模块
    • 提供七层代理和负载均衡

Nginx基础

官方提供三种版本下载

  • Mainline version:主线版本,也叫开发版。最新版本,但没经过大量测试
  • Stable version:稳定版本,通过大量的测试,相对比较稳定的版本,生产环境使用该版本
  • Legacy version:往期的稳定版

安装方式

  1. 源码编译=>Nginx (1.版本随意 2.安装复杂 3.升级繁琐)
  2. epel源=>Nginx (1.版本较低 2.安装简单 )
  3. 官方源=>Nginx (1.版本较新 2.安装简单 )

PS:三种安装方式都需要安装运行环境

yum install -y gcc gcc-c++ autoconf \
pcre pcre-devel zlib-devel openssl-devel \
make automake wget httpd-tools vim tree

1、epel源安装

  1. 部署阿里云epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  1. 安装nginx
yum install -y nginx

2、官方源安装

  1. 配置nginx yum源(官方源)
cat > /etc/yum.repos.d/nginx.repo<<EOF
[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
EOF
  1. 安装nginx服务
yum install nginx -y

3、编译安装(源码包)

  1. 下载源码包
wget http://nginx.org/download/nginx-1.20.1.tar.g
  1. 解压源码包
 tar xf nginx-1.20.1.tar.gz
  1. 配置安装环境
# 进入解压目录
cd nginx-1.20.1/
# 创建相应用户和组
useradd -M -s /sbin/nologin nginx
# 创建文件夹app
mkdir -p /app
# 相关配置
./configure \
--prefix=/app/nginx-1.20.2 \
--user=nginx --group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' \
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

相关选项用法:
./configure --help #查看配置参数
–prefix= #指定nginx安装路径
–user= #指定nginx程序用户
–group= #指定nginx程序用户组
–with-**= #指定编译模块
–without-**= #指定不编译模块
–add-module= #指定第三方模块

  1. 编译安装
make && make install
  1. 创建软链接
ln -s /app/nginx-1.20.1 /app/nginx
  1. 配置环境变量
# 写入启动配置文件
echo "export PATH=$PATH:/app/nginx/sbin" >> /etc/profile
# 马上生效
source /etc/profile

Nginx命令

nginx #启动nginx。 等价于systemctl start nginx

-s reopen #重启Nginx。 等价于systemctl restart nginx
-s reload #重新加载Nginx配置文件,重启Nginx。 等价于systemctl reload

nginx
-s stop #强制停止Nginx服务。 等价于systemctl stop nginx
-s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)
-?,-h #打开帮助信息
-v #显示版本信息并退出
-V #显示版本和配置选项信息,然后退出
-T #检测配置文件是否有语法错误,转储并退出
-q #在检测配置文件期间屏蔽非错误信息
-p prefix #设置前缀路径(默认是:/usr/share/nginx/)
-c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)
-g directives #设置配置文件外的全局指令

Nginx目录结构

路径 类型 作用
/etc/nginx
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
配置文件 Nginx的站点配置文件
/etc/nginx/fastcgi_params
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
配置文件 Scgi、Fastcgi、Uwcgi配置文件
/etc/nginx/win-utf
/etc/nginx/koi-utf
/etc/nginx/koi-win
配置文件 Nginx编码转换映射文件
/etc/nginx/mime.types 配置文件 http协议的Content-Type与扩展名
/usr/lib/systemd/system/nginx.service 配置文件 配置系统守护进程管理器
/etc/logrotate.d/nginx 配置文件 Nginx日志轮询,日志切割
/usr/sbin/nginx
/usr/sbin/nginx-debug
命令 Nginx终端管理命令
/etc/nginx/modules
/usr/lib64/nginx
/usr/lib64/nginx/modules
目录 Nginx模块目录
/usr/share/nginx/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
目录 Nginx默认站点目录
/usr/share/doc/nginx-1.12.2
/usr/share/man/man8/nginx.8.gz
目录 Nginx的帮助手册
/var/cache/nginx 目录 Nginx的缓存目录
/var/log/nginx 目录 Nginx的日志目录

Nginx常用编译选项

通过 nginx -V 查看 Nginx 编译选项

编译选项 作用
–prefix=/etc/nginx
–sbin-path=/usr/sbin/nginx
–modules-path=/usr/lib64/nginx/modules
–conf-path=/etc/nginx/nginx.conf
–error-logpath=/var/log/nginx/error.log
–http-log-path=/var/log/nginx/access.log
–pid-path=/var/run/nginx.pid
–lock-path=/var/run/nginx.lock
程序安装目录和路径
–http-client-body-temppath=/var/cache/nginx/client_tem
–http-proxy-temppath=/var/cache/nginx/proxy_temp
–http-fastcgi-temppath=/var/cache/nginx/fastcgi_temp
–http-uwsgi-temppath=/var/cache/nginx/uwsgi_temp
–http-scgi-temp-path=/var/cache/nginx/scgi_temp
临时缓存文件
–user=nginx
–group=nginx
设定Nginx进程启动用户和组(安全)
–with-cc-opt 设置额外的参数将被添加到CFLAGS变量
–with-ld-opt 设置附加的参数, 链接系统库

Nginx配置文件

Nginx 主配置文件 /etc/nginx/nginx.conf 是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束。

1.CoreModule 核心模块
2.EventModule 事件驱动模块
3.HttpCoreModule http内核模块
需了解扩展项
CoreModule层下可以有Event、HTTP
HTTP模块层允许有多个Server层, Server主要用于配置多个网站
Server层又允许有多个Location,
Location主要用于定义网站访问路径

  • CoreModule 核心模块
user nginx; #Nginx进程所使用的用户
worker_processes 1; #Nginx运行的work进程数量(建议与CPU数量一致或
auto)
error_log /var/log/nginx/error.log warn #Nginx错误日志存放路径
pid /var/run/nginx.pid #Nginx服务运行后产生的pid进程号
  • events 事件模块
events { 
 worker_connections 1024 //每个worker进程支持的最大连接数
 use epoll; //事件驱动模型, epoll默认
}
  • http 内核模块
//公共的配置定义在http{}
http { 				//http层开始 
	include mime.types; 	//引入MIME类型映射表文件
	default_type application/octet-stream; 	//浏览器检测文件类型
	access_log /var/log/nginx/access.log main 	//访问日志
	sendfile on;	 //启用零复制机制
	keepalive_timeout 65;	 //保持连接超时时间65s;
	
	//使用Server配置网站, 每个Server{}代表一个网站(简称虚拟主机)
	server {
		listen 80;	 //监听端口, 默认80
		server_name localhost;	 //提供服务的域名或主机名
		//控制网站访问路径
		location / {
		root /usr/share/nginx/html; 	//存放网站代码路径
		index index.html index.htm;		//服务器返回的默认页面文件
		}
		//指定错误代码, 统一定义错误页面, 错误代码重定向到新的Locaiton
		error_page 500 502 503 504 /50x.html;
	}
	...
	//第二个虚拟主机配置
	server {
	...																																																																																																																																																																																																																																																																																																																																																																																
	}
	include /etc/nginx/conf.d/*.conf; //包含/etc/nginx/conf.d/目录下所有以.conf结尾
的文件
} //http层结束

Nginx配置网站

  • 1、新增nginx配置文件
vim /etc/nginx/conf.d/game.conf 
server {     #默认虚拟服务器
 listen 80;  #服务端口,对NGINX所在主机的所有的ip地址的80端口都监听。
 server_name game.xx.com;   #服务地址(域名)
 location / {  #主要用来对于传入的URL进行匹配到特定的location,location可以有多个
 root /web/h5game;   #root:定义这个location的查找资源的根目录
 index index.html;    #index:定义访问的默认首页
 }
}
  • 2、放置对应的源代码文件至指定的目录
mkdir -p /web
cd /web
rz -E h5game.zip
unzip h5game.zip
ls ./h5game
ceshi  game  img  index.html  readme.txt
  • 3、检查语法是否存在错误
cd /etc/nginx/conf.d/
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • 4、重新加载Nginx配置文件
方法一:
[root@web01 code]# nginx -s reload
方法二:建议这种
[root@web01 code]# systemctl reload nginx
  • 5、访问网站
1.通过服务器的IP直接访问(不推荐)
2.通过假域名方式访问(推荐方式)
Windows修改 C:\Windows\System32\drivers\etc\hosts
10.0.0.7 game.tf.com
3.使用ping命令测试域名解析是否正常

Nginx日志管理

Nginx有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志。日志格式通过log_format 命令定义格式。

log_format详解

  1. log_format 的作用是定义日志格式语法
# 配置语法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http
  1. nginx默认日志格式语法如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
				'$status $body_bytes_sent "$http_referer" '
				'"$http_user_agent" "$http_x_forwarded_for"';
  1. Nginx日志格式允许包含的内置变量
$remote_addr # 记录客户端IP地址
$remote_user # 记录客户端用户名
$time_local # 记录通用的本地时间
$time_iso8601 # 记录ISO8601标准格式下的本地时间
$request # 记录请求的方法以及请求的http协议
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒。
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time # 请求花费的时间,单位为秒,精度毫秒
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地
址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。
  1. access_log日志配置语法
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] 
[if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
  1. Nginx Access日志配置实践
server {
 listen 80;
 server_name code.tf.com;
#将当前的server网站的访问日志记录至对应的目录,使用main格式
 access_log /var/log/nginx/code.tf.com.log main;
 location / {
 root /code;
 }
#当有人请求改favicon.ico时,不记录日志
 location /favicon.ico {
 access_log off;
 return 200;
 }
}

nginx日志切割

使用logrotate切割日志

cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
	 daily # 每天切割日志
	 missingok # 日志丢失忽略
	 rotate 52 # 日志保留52天
	 compress # 日志文件压缩
	 delaycompress # 延迟压缩日志
	 notifempty # 不切割空文件
	 create 640 nginx adm # 日志文件权限
	 sharedscripts
	 postrotate # 切割日志执行的命令
			if [ -f /var/run/nginx.pid ]; then
				kill -USR1 `cat /var/run/nginx.pid`
			fi
	endscript
}

日志切割后的效果

ll /var/log/nginx/
total 4044
-rw-r----- 1 www adm 54438 Oct 12 03:28 access.log-20181012.gz
-rw-r----- 1 www adm 28657 Oct 13 03:48 access.log-20181013.gz
-rw-r----- 1 www adm 10135 Oct 12 03:28 error.log-20181130.gz
-rw-r----- 1 www adm 7452 Oct 13 03:48 error.log-20181201.gz

你可能感兴趣的:(linux,nginx,运维,服务器)