前言:在开始介绍之前,先贴出官网地址,一切还是以官网为准
官网地址
http://nginx.org/en/download.html
一、什么是Nginx
Nginx(engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫
为俄罗斯访问量第二的http://Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 其将源
代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,
Nginx 1.0.4发布。 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like
协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用
Nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
——来自官方解释
看不懂没关系,我也看不懂。
简单的说,使用Nginx
可以帮助你完成以下的需求:
1.搭建个人网站;
2.可以用来做反向代理服务器;
3.可以做文件服务器;
4.可以做电子邮件代理服务器;
5.搭建多个虚拟主机。
二、为什么要使用Nginx
有人说WEB服务器完全可以使用Apache
,为什么要使用Nginx
,但是在你看完它的特点之后相信你就不会这么说了。
Nginx的优势:
1.轻量的安装包,占用更少的内存,具有很强的高并发能力;
2.稳定性强,可以做到7*24 *365不宕机(非人为);
3.具有丰富的模块,配置简单
这个感受好比,明明可以使用2000多的手机就能完成的事,那为什么还要去买6000多的手机的道理是一样的。
三、该用什么方式安装
如果使用yum
的方式安装,可以说,谁都会。所以不管是在实际生产中,还是平时的练习使用中,都要学会使用源码包的方式安装。
先贴出官网地址,可能有的同学想要使用不同的版本,可以自己下载:
源码包下载地址
http://nginx.org/en/download.html
安装之前准备(必选):
因为Nginx是使用C语言编写的,在编译安装之前要确保系统安装有C
语言的编译环境和相关依赖包
#gcc是C语言的编译工具
#PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库
#zlib库提供了开发人员的压缩算法,在Nginx的各个模块中需要使用gzip压缩,所以我们也需要提前安装其库及源代码zlib和zlib-devel
#OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包进行安全通信,并且避免被窃听。
yum install -y make gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
总之,用就对了,不然在检查环境configure
的时候会报错,一旦报错就不能进行下一步操作了
安装过程
安装部署:
1.下载cd /usr/local/src/ wget http://nginx.org/download/nginx-1.16.1.tar.gz
2.解压
tar -zxf /usr/local/src/nginx-1.16.1.tar.gz
3.进入解压后的目录
cd /usr/local/src/nginx-1.16.1/
4.执行
configure
工具(简单安装不需要添加任何编译参数)./configure
5.编译安装
make && make install
6.启动测试
/usr/local/nginx/sbin/nginx netstat -tlunp|grep 80
在安装部署的第4步./configure
的时候可以指定一些编译参数,启动模块功能
使用命令`/usr/local/src/nginx-1.16.1/configure --help`查看全部的参数,当然也可以不写,不写就是默认值
/usr/local/src/nginx-1.16.1/configure --help --help print this message --prefix=PATH set installation prefix --sbin-path=PATH set nginx binary pathname --modules-path=PATH set modules path --conf-path=PATH set nginx.conf pathname --error-log-path=PATH set error log pathname --pid-path=PATH set nginx.pid pathname --lock-path=PATH set nginx.lock pathname --user=USER set non-privileged user for worker processes --group=GROUP set non-privileged group for worker processes --build=NAME set build name --builddir=DIR set build directory --with-select_module enable select module --without-select_module disable select module --with-poll_module enable poll module --without-poll_module disable poll module --with-threads enable thread pool support --with-file-aio enable file AIO support
参数有很多,这里只列出了几个常用的。
四、常用命令
Nginx的命令本身就不多,常用的几个命令如下
所有命令建议使用绝对路径的方式启动,不建议将命令加入全局变量
#查看Nginx版本号
/usr/local/nginx/sbin/nginx -V
#nginx帮助命令
/usr/local/nginx/sbin/nginx -h
#验证配置语法是否正确
/usr/local/nginx/sbin/nginx -t
#启动nginx
/usr/local/nginx/sbin/nginx
#关闭nginx
/usr/local/nginx/sbin/nginx -s stop
#配置文件修改重装载命令
/usr/local/nginx/sbin/nginx -s reload
五、配置文件讲解
先给出一份知乎上看到了清单配置
一份配置清单例析 |
---|
|
配置文件说明(不必死记硬背,可以当作工具查看,需要的时候在看)
#定义Nginx运行的用户和用户组
user www www;
#
#nginx进程数,建议设置为等于CPU总核心数.
worker_processes 8;
#
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#
#进程文件
pid /var/run/nginx.pid;
#
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致.
worker_rlimit_nofile 65535;
#
#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型.
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 1024; #最大连接数,默认为512
}
#
#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
# 开启目录列表访问,合适下载服务器,默认关闭.
autoindex on; # 显示目录
autoindex_exact_size on; # 显示文件大小 默认为on,显示出文件的确切大小,单位是bytes 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on; # 显示文件时间 默认为off,显示的文件时间为GMT时间 改为on后,显示的文件时间为文件的服务器时间
sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off.
tcp_nopush on; # 防止网络阻塞
tcp_nodelay on; # 防止网络阻塞
# FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度.下面参数看字面意思都能理解.
fastcgi_connect_timeout 300; ## 链接
fastcgi_send_timeout 300; ##读取 是指nginx进程向fastcgi进程发送request的整个过程的超时时间
fastcgi_read_timeout 300; ##发请求 是指fastcgi进程向nginx进程发送response的整个过程的超时时间
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
# gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大
gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据
#开启限制IP连接数的时候需要使用
#limit_zone crawler $binary_remote_addr 10m;
##upstream的负载均衡,四种调度算法(下例主讲)##
#虚拟主机的配置
server
{
# 监听端口
listen 80;
# 域名可以有多个,用空格隔开
server_name 127.0.0.1;
# HTTP 自动跳转 HTTPS
rewrite ^(.*) https://www.baidu.com;
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
upstream myserver {
server 127.0.0.1:8080;
server 192.168.24.189:8080 backup; #热备
}
server
{
# 监听端口 HTTPS
listen 443 ssl;
server_name https://www.baidu.com;
root /data/www/;
# 配置域名证书
ssl_certificate C:\WebServer\Certs\certificate.crt;
ssl_certificate_key C:\WebServer\Certs\private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
index index.html index.htm index.php;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
# 配置地址拦截转发,解决跨域验证问题
location /oauth/{
proxy_pass https://localhost:13580/oauth/;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 图片缓存时间设置
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 10d;
}
# JS和CSS缓存时间设置
location ~ .*\.(js|css)?$ {
expires 1h;
}
# 日志格式设定
log_format access '$server_name $remote_addr -$remote_user [$time_local] "$request"'
'$status $uptream_status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for" '
'$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time';
# 定义本虚拟主机的访问日志
access_log /var/log/nginx/access.log access;
# 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生.
}
}
}
简化版实用版
# nginx运行的用户名
user nginx;
# nginx启动进程,通常设置成和cpu的数量相等,这里为自动
worker_processes auto;
# errorlog文件位置
error_log /var/log/nginx/error.log;
# pid文件地址,记录了nginx的pid,方便进程管理
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
# 用来加载其他动态模块的配置
include /usr/share/nginx/modules/*.conf;
# 工作模式和连接数上限
events {
# 每个worker_processes的最大并发链接数
# 并发总数:worker_processes*worker_connections
worker_connections 1024;
}
# 与提供http服务相关的一些配置参数类似的还有mail
http {
# 设置日志的格式
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记录访问的用户、页面、浏览器、ip和其他的访问信息
access_log /var/log/nginx/access.log main;
# 这部分下面会单独解释
# 设置nginx是否使用sendfile函数输出文件
sendfile on;
# 数据包最大时发包(使用Nagle算法)
tcp_nopush on;
# 立刻发送数据包(禁用Nagle算法)
tcp_nodelay on;
# 链接超时时间
keepalive_timeout 65;
# 这个我也不清楚...
types_hash_max_size 2048;
# 引入文件扩展名与文件类型映射表
include /etc/nginx/mime.types;
# 默认文件类型
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
# http服务上支持若干虚拟主机。
# 每个虚拟主机一个对应的server配置项
# 配置项里面包含该虚拟主机相关的配置。
server {
# 端口
listen 80 default_server;
listen [::]:80 default_server;
# 访问的域名
server_name _;
# 默认网站根目录(www目录)
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
# 默认请求
location / {
}
# 错误页(404)
error_page 404 /404.html;
location = /40x.html {
}
# 错误页(50X)
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
六、虚拟主机
虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。
在主配置文件的http
块添加include vhosts/*.conf;
vim /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
include vhosts/*.conf;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
mkdir /usr/local/nginx/conf/vhosts/
七、代理
01.正向代理
02.反向代理
八、负载均衡
官方地址
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
简单来说所谓的负载均衡就是把很多请求进行分流,将他们分配到不同的服务器去处理。比如我有3个服务器,分别为A、B、C,
然后使用Nginx进行负载均衡,使用轮询策略,此时如果收到了9个请求,那么会均匀的将这9个请求分发给A、B、Cf服务器,
每一个服务器处理3个请求,这样的话我们可以利用多台机器集群的特性减少单个服务器的压力。
负载均衡架构和策略 |
---|
|
准备三个服务器(单节点多实例)
cd /usr/local/src/
wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.66/bin/apache-tomcat-8.5.66.tar.gz
tar xf apache-tomcat-8.5.66.tar.gz
mv apache-tomcat-8.5.66 /usr/local/tomcat-8.5
cd /usr/local/
#准备三个实例
cp -a tomcat-8.5/ tomcat-8.5.80
cp -a tomcat-8.5/ tomcat-8.5.81
cp -a tomcat-8.5/ tomcat-8.5.82
#修改每个实例的端口和首页
sed -i s/8080/8081/g /usr/local/tomcat-8.5.81/conf/server.xml
sed -i s/8005/8006/g /usr/local/tomcat-8.5.81/conf/server.xml
sed -i s/8009/8010/g /usr/local/tomcat-8.5.81/conf/server.xml
sed -i s/8080/8082/g /usr/local/tomcat-8.5.82/conf/server.xml
sed -i s/8005/8007/g /usr/local/tomcat-8.5.82/conf/server.xml
sed -i s/8009/8011/g /usr/local/tomcat-8.5.82/conf/server.xml
echo "8080" > /usr/local/tomcat-8.5.80/webapps/ROOT/index.jsp
echo "8081" > /usr/local/tomcat-8.5.81/webapps/ROOT/index.jsp
echo "8082" > /usr/local/tomcat-8.5.82/webapps/ROOT/index.jsp
/usr/local/tomcat-8.5.80/bin/startup.sh
/usr/local/tomcat-8.5.81/bin/startup.sh
/usr/local/tomcat-8.5.82/bin/startup.sh
确保三个实例都能正常访问
负载均衡策略
01.轮询
编写虚拟主机配置文件
/usr/local/nginx/conf/vhosts/
vim tomcat.conf
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
#重现加载配置服务
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
#浏览器访问可以看到每次的页面都是不一样的,说明可以能将请求分发到后端的服务器上
02.权重
只需要修改配置文件upstream
模块的功能
vim tomcat.conf
upstream backend {
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:8081 weight=3;
server 127.0.0.1:8082 weight=1;
}
...
#重现加载配置服务
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
03.ip_hash
只需要修改配置文件upstream
模块的功能
vim tomcat.conf
upstream backend {
ip_hash;
server 127.0.0.1:8080 ;
server 127.0.0.1:8081 ;
server 127.0.0.1:8082 ;
}
...
#重现加载配置服务
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
负载均衡的实现最主要的还是依赖于两个模块upstream
和proxy_pass
模块
九、动静分离
Nginx的并发能力公式:
worker_processes * worker_connections / 4|2 = Nginx最终的并发能力
动态资源需要/4,静态资源需要/2
Nginx通过动静分离来提升Nginx的并发能力,更快的给用户响应
为什么要进行动静分离?
在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指HTML,JavaScript,CSS,img等文件。
一般来说,都需要将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离。
在使用前后端分离之后,可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。
01.动态资源配置
在配置文件修改
location / {
proxy_pass URL;
}
02.静态资源配置
#配置如下
location / {
root 静态资源路径;
index 默认访问路径下的什么资源;
autoindex on;#代表展示静态资源的全部内容,以列表的形式展开
}
一般的静态资源文件是放在Nginx所在的服务器上的,可以使用NFS挂载目录。
十、Nginx服务器版本升级
对Nginx版本进行不宕机更新,就需要用到Nginx服务器提供的平滑升级功能。
步骤:
01.查看旧版本的参数配置
/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: #(如果之前没有添加参数配置的话,就不会有以下的参数)
02.下载新版本的源码包
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.18.0.tar.gz
03.解压、进入、进行参数配置和编译,不需要进行安装(make install
)。
#进入源码包目录
cd /usr/local/src/
#解压
tar xf nginx-1.18.0.tar.gz
#参数配置:./configure的时候需要加上旧源码包的参数配置,没有就不添加
./configure
#编译make
make
在make之后就会在目录下生成Makefile
文件和objs
目录,objs
目录就会有刚刚编译生成的二进制可执行文件
04.重命名旧版本的二进制文件
cd /usr/local/nginx/sbin/
mv nginx nginx.old
05.将新编译生成的二进制文件拷贝到原来/usr/local/nginx/sbin
目录下
cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/
06.进入到新版本的安装目录,执行make upgrade
cd /usr/local/src/nginx-1.18.0/
make upgrade
07.查看是否更新成功
/usr/local/nginx/sbin/nginx -V
十一、Nginx添加新模块
添加新模块的思路和版本升级的思路是一样的,不同的地方有两个地方:
1.在添加新模块的时候,确保Nginx使用源码包是同一个
2.在参数配置./configure的时候需要带上–add-module=path_of_new_module
步骤:
01.查看nginx编译安装时安装了哪些模块
/usr/local/nginx/sbin/nginx -V
...
configure arguments:...
...
02.下载好第三方扩展模块nginx-rtmp-module
cd /usr/local/src
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
unzip master.zip
ls nginx-rtmp-module-master/
02.进入原来编译安装的源码包目录(不建议安装完之后删除目录,不然又得去查找相同的源码包)
如果在添加新模块之前已经完成版本升级,需要进入新版本解压好之后的目录
cd /usr/local/src/nginx-1.18.0/
./configure --add-module=/usr/local/src/headers-more-nginx-module-0.23 --add-module=/usr/local/src/nginx-http-concat-master --with-http_gzip_static_module --add-module=/usr/local/src/nginx-rtmp-module-master
03.编译(千万不能make install
)
make
04.替换原来的二进制包
cd /usr/local/nginx/sbin/
mv nginx nginx.old
cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/
05.再次确认是否安装成功
/usr/local/nginx/sbin/nginx -V