文章目录
1.1 简介
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务,主要功能是反向代理,通过配置文件可以实现集群和负载均衡,还可以实现静态资源虚拟化。
1.2 常见的服务器
- MS IIS:asp.net
- Weblogic、Jboss:用于传统行业,如ERP/物流/电信/金融
- Tomcat、Jetty:用于J2EE开发
- Apache、Nginx:用于发布一些静态服务实现反向代理
- Netty:高性能服务器编程
以下是Netcraft统计的服务器市场使用率
1.3 反向代理
正向代理:客户端请求目标服务器之间的一个代理服务器,请求会先经过代理服务器,然后再转发请求到目标服务器,获得内容后最后响应给客户端,这个处于中间的服务器就是所谓的正向服务器,代理的是客户端
反向服务:用户请求目标服务器,由代理服务器决定访问哪个ip(服务器ip),代理的是服务器
1.4 Nginx的安装与运行
我的开发环境为Centos7+Finalshell
nginx的下载地址,下载稳定版即可
然后将下载好的文件通过Finalshell上传到Centos 7服务器的指定的文件夹下:
安装依赖环境
- 安装gcc环境:
yum install gcc-c++
- 安装PCRE库,用于解析正则表达式:
yum install -y pcre pcre-devel
- zlib压缩和解压缩依赖:
yum install -y zlib zlib-devel
- SSL安全的加密的套接字协议层,用于HTTP传输,也就是https:
yum install -y openssl-devel
解压
tar -zxvf nginx-1.22.1.tar
,注意解压后得到的是源码,源码需要编译后才能安装
编译
编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错
mkdir /var/temp/nginx -p
在nginx目录,输入如下命令进行配置,目的是为了创建mkefile文件
cd进入解压后的nginx的目录
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
命令 | 解释 |
---|---|
–prefix | 指定nginx的安装目录 |
–pid-path | 指定nginx的pid |
–lock-path | 锁定安装文件,防止被恶意篡改或误操作 |
–error-log | 指定错误日志路径 |
–http-log-path | http日志路径 |
–with-http_gzip_static_module | 启用gzip模块,在线实时压缩输出数据流 |
–http-client-body-temp-path | 设定客户端请求的临时路径 |
–http-proxy-temp-path | 设定http代理临时目录 |
–http-fastcgi-temp-path | 设定fastcgi临时目录 |
–http-uwsgi-temp-path | 设定uwsgi临时目录 |
–http-scgi-temp-path | 设定scgi临时目录 |
make编译
make
安装
make install
测试安装结果
进入 /usr/local/nginx(前面配置的nginx安装目录)下的sbin目录启动nginx
./nginx -s stop #停止服务
./nginx #启动服务
./nginx -s reload #重启服务
本机访问虚拟机的ngnix服务(注意关闭防火墙)
默认index.html显示原理解析:
上面我们已经安装好nginx并访问到了默认主页,其原理是,首先我们在浏览器端输入我们要访问的nginx服务所在的服务器ip,并访问发起请求,服务器端Nginx会持续监听80端口,在接受到用户的访问请求后会找到对应的Server,然后映射路由到index.html,访问成功。下面是nginx.conf这一核心配置文件中服务器的配置内容:
1.5 Nginx的进程模型
- master:主进程
- worker:工作进程
我们可以在nginx.conf配置worker的进程数量(worker_processes:n),配置后重启服务即可
在具体的工作过程中,首先程序员将操作命令发送给master进程,master进程会将命令一个个分发给worker进程,然后每个worker会连接处理每一个客户端请求,并响应请求
1.6 Nginx处理Web请求机制解析
worker抢占机制:
当客户端发送请求到代理服务器时,各个worker进程会抢占一个一个互斥锁来进行服务,抢占到互斥锁的woker进程可以处理客户的请求(这个就是Nginx的Worker抢占机制)
传统服务器事件处理:
假设现在master进程仅仅fork一个worker进程,而woker1处理一个客户的请求时由于某些原因发生了阻塞,现在又来了一些新的请求,按照传统服务器的处理方式所有的进程都会被阻塞等待,此时,master进程会fork一个新的worker进程去处理这些新来的客户请求。这里是传统的服务器事件处理,而nginx在阻塞后worker进程会放弃继续处理当前阻塞的请求而出处理新的客户端请求(这是一种异步非阻塞的模型),同样worker的最大连接数可以在核心配置文件中进行配置。
1.7 Nginx核心配置文件nginx.conf解析
nginx.conf配置结构
main 全局配置
event:配置工作模式以及连接数
http:http模块的相关配置{server:虚拟主机配置,可以有多个
location:路由规则,表达式
upstream:集群,内网服务器
user nobody:标志worker进程所属用户(这里是可以修改的),默认是nobody
worker_processes:worker进程的数量
配置日志和进程的信息,同样可以修改
工作模式默认是epoll
worker_connections:每个worker运行连接的客户端最大连接数
include:可以导入外部的配置文件
default_type:默认的type类型
log_format:日志的格式
access_log:每次请求都会记录到acces.log文件中
sendfile:用于进行文件的高校传输
tcp_nopush:和sendfile一起使用,表示当数据包累积到一定大小时才会发送
keepalive_timeout:客户端连接的超时时间
gzip:内容的传输会压缩成zip,提升传输效率
一个server代表一个虚拟主机
listen:服务监听窗口
server_name:服务器名
location:默认路由(会把index首页展示出来)
error_page:默认错误展示页面
1.8 Nginx常用命令解析
关闭nginx
- 暴力关闭:
./nginx -s stop
,会关闭所有的用户连接,对用户是很不友好的- 优雅关闭:
./nginx -s quit
,当当前还有用户连接时不会关闭直到没有用户连接时会关闭
更改配置文件后监测语法是否正确
./nginx -t
查看nginx当前版本号
./nginx -v
:粗略的查看版本信息
./nginx -V
:详细的查看nginx信息
1.9 Nginx日志切割
根据我们之前的配置可以知道,日志文件都放置在/var/log/nginx文件夹下,随着nginx服务器的运行,所保存的日志信息会越来越判断,所以我们需要针对日志进行切割下面有两种切割方式:
手动日志切割
现有的日志都会保存在access.log文件中,但是随着时间的推移,这个文件的内容会越来越多,体积也会越来越大,不便于运维人员查看,所以我们可以通过把这个大的日志文件切割为多份不同的小文件作为日志,切割规则可以以天为单位,如果每天有几百G或者几个T的日志的话,则可以按需以每半天或者半小时对日志切割一下:
- 创建一个shell可执行文件:cut_my_log.sh,内容为
#!/bin/bash
LOG_PATH="/var/log/nginx/"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M).log #
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
kill -USR1 'cat $PID'
- 为cut_my_log.sh添加可执行权限
chmod +x cut_my_log.sh
定时切割
3. 安装定时任务
yum install crontabs
- crontab -e 编辑并且添加一行新的任务
*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh
- 重启定时任务
service crond restart
常见定时任务命令(可以看我这篇博客)
service crond start #启动服务
service crond stop #关闭服务
service crond restart #重启服务
service crond reload #重新载入配置
crontab -e #编辑任务
crontab -l #查看任务列表
1.10 Nginx为静态资源提供服务
常见的静态资源可以分为两类,第一类是我们的html页面,css文件等,另一类如视频、音频和图片
- 设置server
- 上传静态文件到server中配置的路径下(下载地址)
1.11 使用Gzip压缩提高请求效率
在没有使用Gzip压缩方式之前,我们可以看到浏览器请求各类资源的大小
下面在核心配置文件中配置gzip(然后再次访问比较文件大小)
gzip on; #打开gzip服务
gzip_min_length 1; #设置压缩下限(小于1字节不压缩)
gzip_comp_level 3; #设置压缩级别(级别越高cpu消耗越到)
#设置压缩文件的类型
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;
1.12 location匹配规则解析
location是一种路径的匹配规则,相当于ssm的控制器前面的路径映射
location /
:默认匹配规则,代表当前server的根路径(可以访问该路径下所有内容)location = /
:代表路径精确匹配,这里表示只能匹配/location ~* \.(GIF|png|bmp|jpg){ root /home;}
:正则表达式匹配方式。*代表不区分大小写,这里表示可以匹配home下指定文件后缀的文件location ^~ /home/img{ root /home;}
:正则表达式,以某个字符路径开头请求,这里表示只能请求img下的文件资源