一. 简介
1.1 是什么
- nginx是一个高性能的HTTP和反向代理web服务器,是一款轻量级的Web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行,特点是占有内存少,并发能力强。
- ngnix专为性能优化而开发,能够支持高达50000个并发连接数的响应。ngnix选择了epoll and kqueue作为开发模型。
2.2 能实现哪些功能
nginx具有丰富的配置功能,以满足不同的需求。
-
虚拟主机:nginx可以配置多个虚拟主机,使得一个服务器可以托管多个网站或应用程序。
-
反向代理:可以将客户端请求转发到后端服务器,实现负载均衡和高可用性。
-
缓存:支持HTTP缓存,可以缓存静态文件,减轻后端服务器的负载,提高访问速度
-
SSL/TLS支持:可以配置HTTPS协议,保证数据传输的安全性。
-
URL重写:可以通过配置重写规则,实现URL的重定向和转发。
-
Gzip压缩:支持对响应内容进行压缩,减小传输数据的大小,提高加载速度。
-
访问限制:可以配置IP白名单、黑名单或使用HTTP Basic Authentication对访问进行限制。
-
日志记录:支持将请求和错误信息记录到日志文件中,方便排查问题和进行统计分析。
-
缓存控制:可以配置缓存策略,设置缓存时间、缓存大小等参数。
-
动态模块支持:nginx可以通过动态模块进行功能扩展,例如Lua脚本、HTTP/2支持等。
这些只是nginx配置功能的一部分,还有很多其它的配置选项可以根据具体需求进行配置。
2.3 特性
- nginx具有很高的稳定性。其它HTTP服务器,当遇到访问峰值,或者有人恶意发起慢速连接时,很可能会导致服务器物理内存的消耗频繁交换,失去响应,只能重启服务器。而ngnix采取了分阶段资源分配技术,使得它的CPU和内存占用率很低。ngnix官方表示保持10000个内有活动的连接,nginx只占用2.5M内存。
- ngnix支持热部署。它的启动非常容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动,还可以在不间断服务的情况下,对软件版本进行升级。
- ngnix采用master-slave模型。能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O阻塞延迟,当采用select/poll调用时,还可以限制每个进程的连接数。
二. 概念
2.1 正向代理
如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
客户端要求正向代理服务器向目的服务器要某种资源。客户端需要配置代理服务器,通过代理服务器进行互联网访问。
2.2 反向代理
其实客户端对代理服务器是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再放回给客户端,此时方向代理服务器和目标服务器对外就是一个服务器。暴露的是代理服务器的地址,隐藏了真实服务器IP地址。
2.3 负载均衡
在早期的单一系统使用的架构为客户端发送多个请求给服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将处理结果返回给客户端,这种架构适用于并发量比较少的情况。当并发量比较大时,可能会造成服务器崩溃。
我们首先可能想到的是升级服务器配置。比如提高CPU执行频率,加大内存等。但是我们知道摩尔定律的日益失效,硬件性能提升已经不能满足日益提升的需求。
这个时候集群的概念就产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上。将原先请求集中到单个服务器的情况改为将请求分发到多个服务器上,即将负载分发到不同服务器上,这就是负载均衡。
2.4 动静分离
为了加快网站的解析速度,可以把动态网页和静态网页由不同服务器来解析,加快解析速度,降低原来单个服务器的压力。
三. 安装
在安装ngnix之前需要安装一些相关依赖。
- 安装gcc
gcc是linux下的编译器,用来编译ngnix。
yum -y install gcc
查看gcc版本:
gcc -v
- 安装pcre,pcre-devel
pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库。
yum install -y pcre pcre-devel
- 安装zlib
zlib库提供了很多压缩和解压缩方式,ngnix使用zlib对http包的内容进行解压缩。
yum install -y zlib zlib-devel
- 安装openssl
openssl是进行信息加解密的,是web安全通信的基石。
yum install -y openssl openssl-devel
- 下载ngnix安装包
进入ngnix官网下载最新稳定版本:nginx: download
下载到安装包后,进行解压。
在linux系统中,进入到解压后的ngnix目录,执行下面命令:
#检测你的安装平台的目标特征。比如检测你的编译器等
./configure#编译ngnix
make#安装ngnix
make install
- 运行ngnix
进入到ngnix编译后的文件目录:
cd /usr/local/nginx/sbin#运行ngnix
./ngnix
- 查看是否运行成功
使用命令:
netstat -nltp
可以看到ngnix默认监听在80端口。
在浏览器访问服务器上的ngnix:服务器公网ip:ngnix端口
如果访问不到,可能是防火墙的问题
方案一:直接关闭防火墙
service firewalld status #查看状态
service firewalld stop #关闭
方案二:配置防火墙80端口可以访问
#查看防火墙信息:
firewall-cmd --list-all
#添加端口号:
sudo firewall-cmd --add-port=80/tcp --permanent
#重启防火墙:
firewall-cmd --reload
#再查看防火墙信息:
firewall-cmd --list-all
- 常用命令
前提需要进入到ngnix目录:/usr/local/ngnix/sbin
#查看ngnix版本号
./ngnix -v#运行ngnix
./ngnix#关闭ngnix
./ngnix -s stop#重新加载ngnix
./ngnix -s reload
四. ngnix配置文件
配置文件及位置:
/usr/local/ngnix/conf/ngnix.conf
4.1 组成部分
ngnix配置文件有三部分组成:
- 第一部分:全局块
从配置文件开始到events之间的内容,主要会设置一些影响ngnix服务器整体运行的配置指令
如:
worker_processes 1;这是nginx服务器并发处理服务的关键配置,值越大,可以支持的并发处理量也就越多,但是会受到硬件、软件等设备的制约
- 第二部分:events块
主要影响ngnix服务器与用户的网络连接。
如:
表示ngnix的最大连接数
events {worker_connections 1024;
}
- 第三部分:http块,配置最频繁的部分,代理,缓存和日志定义等绝大多数功能和第三方配置都在这里, http块也分为http全局块和server块。
http全局块是http里面到server里的内容。包括文件引入,MIME-TYPE定义,日志自定义,连接超时时间,单链接请求数上限等。
server块和虚拟主机有关。虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网硬件成本。
每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。
而每个server块也分为全局server块和多个location块。
1. 全局server块:最常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或IP配置。
2. location块:一个server可以配置多个location块。主要作用是基于ngnix服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟主机的名称(也可以是ip别名)之外的字符串(例如:前面的/url-string)进行匹配,对待定的请求进行处理,地址定向,数据缓存和应答控制的功能,还有许多第三方模块的配置也在这里进行。
http {include mime.types;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 logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}