Nginx学习笔记
0.内容目录
- Nginx简介
- Nginx环境搭建
- Nginx配置文件
- Nginx主要应用
- 静态网站
- 负载均衡
- 静态代理
- 动静分离
- 虚拟主机
1.Nginx简介
1、Nginx(engine x)是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器;
- 反向代理(Reverse Proxy )方式是指以代理服务器来接爱internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连的客户端,此时代理服务器对外就表现为一个反向代理服务器。
- 正向代理:类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我;
2、Nginx是由俄罗斯人Igor Sysoev采用C语言开发编写的,第一个公开版本0.1.0发布于2004年10月4日;
Nginx的作者Igor. Sysoev简介:
Igor Sysoev出生与1970年的阿拉木图(哈萨克斯坦共和国城市),也就是前苏联;
1991年苏联解体,哈萨克斯坦宣布独立,Nginx作者1994年毕业于莫斯科国立鲍曼技术大学;
毕业后继续在莫斯科工作和生活,就职于NGINX,Inc,任CTO,公司网址:https://www.nginx.com/
3、Nginx特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求(指的是同时支持5万的请求);
4、与Nginx同类型的Web服务器还有Apache、Lighttpd(音同lighty)、Tengine(阿里巴巴的)等;
5、Nginx的并发处理能力在同类型的Web服务器中表现极好(Apache、Lighttpd),在全世界范围内大量的网站使用了Nginx,国内互联网中也大量使用了Nginx,比如:淘宝、新浪、搜狐、网易、美团等;
6、Nginx是免费开源的,同时Nginx也有收费的商业版本,商业版本提供了性能优化、宕机等紧急问题处理等技术支持和服务;
2.Nginx环境搭建
2.1.Linux下部署
下载
免费开源版的官方网址:http://nginx.org;
Nginx有 Wndows版本和Linux版本,但更推荐在Linux下使用Nginx(毕竟Linux系统内核小并且稳定);
下载Nginx-1.18.0.tar.gz的源代码文件:wget http://nginx.org/download/nginx-1.18.0.tar.gz
安装
-
安装前准备
Nginx的安装需要Linux安装相关的几个库,否则配置和编译会出现错误,这几个库分别是:
1、gcc编译器是否安装?
检查是否安装:yum list installed | grep gcc
执行安装:yum install gcc -y
2、openssl库是否安装?
检查是否安装:yum list installed | grep openssl
执行安装:yum install openssl openssl-devel -y
3、pcre库是否安装?
检查是否安装:yum list installed | grep pcre
执行安装:yum install pcre pcre-devel -y
4、zlib库是否安装?
检查是否安装:yum list installed | grep zlib
执行安装:yum install zlib zlib-devel -y
一次性安装,执行如下命令:
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
-
正式安装
1、解压下载下来的nginx文件,执行命令:tar -zxvf nginx-1.18.0.tar.gz
2、切换至解压后的nginx主目录,执行命令:cd nginx-1.18.0
3、在nginx主目录nginx-1.18.0下执行命令:
./configure --prefix=/usr/local/nginx
(其中–prefix是指定nginx安装路径)
4、执行命令进行编译:make
5、执行命令进行安装:make install
启动
启动nginx执行命令:
1、普通启动。切换到nginx安装目录的sbin目录下,执行:./nginx
2、通过配置文件启动:
./nginx -c /usr/loc al/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf(其中-c是指定配置文件)
3、检查Nginx是否启动:
通过查看进程:ps -ef | grep nginx
nginx体系结构由master进程和其worker进程组成;
master进程读取配置文件,并维护worker进程,而worker进程则对请求进行实际处理;
关闭
Nginx的关闭有多种方式:
1、优雅关闭Nginx:
- 找出nginx的进程号:ps -ef | grep nginx
- 执行命令:kill -QUIT 主pid
(其中pid是主进程号的pid(master process), 其他为子进程pid(worker process))
2、快速关闭Nginx:
- 找出nginx的进程号:ps -ef | grep nginx
- 执行命令:kill -TERM 主pid
3、重启Nginx:./nginx -s reload
(sbin目录下执行此命令)
配置检查
当修改Nginx配置文件后,可以使用Nginx命令进行配置文件语法检查,用于检查Nginx配置文件是否正确;
检查Nginx配置文件是否正确的命令:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t
其他
Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V
参数说明:
-v(小写的v)显示 nginx 的版本;
-V(大写的V)显示 nginx 的版本、编译器版本和配置参数;
2.2.Windows下环境搭建
在官方网站下载最新 windows 版的 nginx:http://nginx.org/en/download.html ,然后将下载下来的nginx压缩包解压到一个目录下,解压后该软件就可以启动使用了;
启动方式1∶双击解压目录下的nginx.exe文件即可运行nginx(不推荐);
启动方式2∶进入dos窗口,切换到nginx主目录下,在dos窗口执行命令:start nginx.exe
关闭方式1∶在资源管理器杀掉Nginx进程(有两个进程)
关闭方式2∶在dos窗口切换到Nginx安装主目录下执行命令: nginx.exe -s stop
重启命令:nginx.exe -s reload
3.Nginx配置文件
学习Nginx首先需要对它的核心配置文件nginx.conf有一定的认识;
Nginx的核心配置文件主要由三个部分构成:
- 基本配置
- events配置
- http配置:
– 基本配置
– 多个server配置
nginx 配置中文说明:
###============================基本配置
#user nobody; ## 配置worker进程运行用户
worker_processes 1; ## 配置工作进程数目, 根据硬件调整, 通常等于 CPU数量 或者 2倍CPU数量
error_log logs/error.log; ## 配置全局错误日志及类型, [debug | info | notice | warn | error | crit], 默认是error
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; ## 配置进程pid文件
###============================events配置
## 配置工作模式和连接数(单个线程连接数可以设置为最大值:55535)
events {
# use epoll; ## 优化参数
worker_connections 1024; ## 配置每个worker进程连接数上限,nginx支持的总连接数等于worker_processer * worker_connections
}
###============================http配置
## 配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
include mime.types; ## 配置nginx支持哪些多媒体类型, 可以在conf/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日志存放路径, 并使用上面定义的main日志格式
#access_log logs/access.log main;
sendfile on; ## 开启高效文件传输模式
#tcp_nopush on; ## 防止网络阻塞
#keepalive_timeout 0;
keepalive_timeout 65; ## 长连接超时时间,单位是秒
gzip on; ## 开启gzip压缩输出
###----------------------http基本配置结束
## 配置虚拟主机
server {
listen 80; ## 配置监听端口
server_name localhost; ## 配置服务名称
#charset koi8-r; ## 配置字符集
#access_log logs/host.access.log main; ## 配置本虚拟主机的访问日志
## 默认的匹配斜杠 / 的请求,当访问路径中有斜杠 /, 会被该location匹配到并进行处理
location / {
root html; ## root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
index index.html index.htm; ## 配置首页文件的名称
}
# error_page 404 /404.html; ## 配置404页面
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html; ## 配置50x错误页面
# 精确匹配
location = /50x.html {
root html;
}
## PHP 脚本请求全部转发到Apache处理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
## PHP 脚本请求全部转发到FastCGI处理
# 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;
#}
## 禁止访问 .htaccess 文件
# 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 服务,安全的网络传输协议,加密传输,默认端口443,主要是运维去配置
# 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;
# }
#}
}
4.Nginx主要应用
4.1.静态网站
Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML、图片等)通过HTTP协议返回给浏览器客户端;
server {
listen 80; #端口号
location / {
root /opt/static/ace; #静态文件路径
}
location /ace {
root /opt/static; #静态文件路径
}
}
例子访问根和访问带有项目名:
1)http://192.168.92.128:80/
2)http://192.168.92.128:80/ace/
规则: ip + port 等于root
1)http://192.168.92.128:80/ = root = /opt/static/ace
2)http://192.168.92.128:80/ace = root = /opt/static/ace
4.2.负载均衡
负载均衡概述
在网站创立初期,我们一般都使用单台机器对外提供集中式服务,但是随着业务量的增大,我们一台服务器不够用,此时就会把多台机器组成一个集群对外提供服务;但是,我们网站沾对外提供的访问入口通常只有一个,比如www.web.com ;
那么当用户在浏览器输入www.web.com进行访问的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情;负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀;
负载均衡实现方式
- 硬件负载均衡
比如F5、深信服、Array等;
优点是有厂商专业的技术服务团队提供支持,性能稳定;
缺点是费用昂贵,对于规模较小的网络应用成本太高; - 软件负载均衡
比如Nginx、LVS、HAProxy 等;
优点是免费开源,成本低廉;
Nginx负载均衡
Nginx如何实现负载均衡︰(通过在Nginx的nginx.conf文件进行配置即可实现
配置如下:(配置2步即可)
1、在http模块上加如下示例代码(按照实际调整)
upstream www.myweb.com {
server 127.0.0.1:9100 weight=3;
server 127.0.0.1:9200 weight=1;
}
参数说明:
其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多;
upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器;
2、在server模块里添加如下示例代码(按照实际调整)
location /myweb {
proxy_set_header http://www.myweb.com;
}
其中www.myweb.com字符串要和upstream后面的字符串相等;
Nginx常用负载均衡策略
- 1、轮询(默认)
每个请求轮流分配到不同的后端服务器,如果后端服务器down掉,将自动剔除,配置如示。
upstream backserver {
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
- 2、权重
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=5;
server 192.168.0.15 weight=2;
}
- 3、ip_hash
ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题。
upstream backserver {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
- 4、最少连接
web请求会被转发到连接数最少的服务器上。
upstream backserver {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:9090;
}
负载均衡其他几个配置
## 第一种
upstream backserver {
server 127.0.0.1:9100;
server 127.0.0.1:9200 backup;##(其它所有的非backup机器down的时候,才请求backup机器)
}
## 第二种
upstream backserver {
server 127.0.0.1:9100;
server 127.0.0.1:9200 down; ##(down表示当前的server是down状态,不参与负载均衡)
}
4.3.静态代理
把所有静态资源的访问改为访问nginx,而不是访问tomcat,因为nginx更擅长于静态资源的处理,性能更好,效率更高;所以在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。
Nginx静态代理如何实现?(通过在Nginx的nginx.conf文件进行配置即可实现)
方式一:通过在nginx.conf配置文件中添加静态资源的location,比如:
## (举例)当访问静态资源,则从Linux服务器/opt/static目录下获取
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/static;
}
参数说明:
~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配;
第一个点 . 表示任意字符;
* 表示一个或多个字符;
\. 是转移字符,是后面这个点的转移字符;
| 表示或者;
$ 表示结尾;
整个配置表示以 . 后面括号里面的这些后缀结尾的文件都由nginx处理;
注意:放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限;
报错:403错误,赋权命令:chmod 755
方式二:通过在nginx.conf配置文件中配置静态资源所在目录实现,比如:
location ~ .*/(js|css|img|images) {
root /opt/static;
}
我们将静态资源放入/opt/static目录下,然后用户访问时由nginx返回这些静态资源。
4.4.动静分离
Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成;静态资源,如图片、css、js等由nginx服务器完成,它们各司其职,专注于做自己擅长的事情。
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构。
动静分离示例
Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可。
负载均衡Nginx配置:
upstream www.p2p.com {
server 127.0.0.1:9100 weight=5;
server 127.0.0.1:9200 weight=2;
}
upstream static.p2p.com {
server 127.0.0.1:81 weight=1;
server 127.0.0.1:82 weight=1;
}
location /p2p {
proxy_pass http://www.p2p.com;
}
location ~ .*/(cssljs|imglimages) {
proxy _pass http://static.p2p.com;
}
静态代理Nginx配置:
location ~ .*/(cssljs|imglimages) {
root /opt/static;
}
4.5.虚拟主机
虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站;
Nginx 提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个网站;
Nginx 中一个server标签就是一个虚拟主机;
nginx 的虚拟主机就是通过 nginx.conf 中 server 节点指定的,想要设置多个虚拟主机,配置多个server节点即可。
配置虚拟主机通常有下面两种方式:
- 基于端口的虚拟主机
基于端口的虚拟主机配置,使用端口来区分。浏览器使用同一个域名+端口或同一个ip地址+端口访问。
server {
listen 8080;
server_name www.myweb.com;
location /myweb {
proxy_pass http://www.myweb.com;
}
}
server {
listen 9090;
server_name www.myweb.com;
location /p2p {
proxy_pass http://www.p2p.com;
}
}
-
基于域名的虚拟主机
基于域名的虚拟主机是最常见的一种虚拟主机。
server {
listen 80;
server_name www.shop.com;
location /myweb {
proxy_pass http://www.shop.com;
}
}
server {
listen 80;
server_name www.p2p.com;
location /myweb {
proxy_pass http://www.p2p.com;
}
}
需要修改一下本地的hosts文件,文件位置:C:\Windows\System32\drivers\etchosts在hosts文件配置:192.168.208.128 www.myweb.com
前面是Linux的IP,后面是你自定义的域名
4.5.1. 虚拟主机示例
城市站点网站(举例说明,我们配置示个城市站点)
步骤:
1、配置3个Tomcat,每个tomcat一个站点,项目部署在tomcat的ROOT目录下;
2、配置3个Nginx虚拟主机
- 方式一:在nginx.conf文件中添加三个server节点,用于配置三个虚拟主机
# -nginx.conf文件中-------------------------------
server {
listen 80;
server_name beijing.myweb.com;
location / {
proxy_pass http://beijing.myweb.com;
}
}
server {
listen 80;
server_name nanjing.myweb.com;
location / {
proxy_pass http://nanjing.myweb.com;
}
}
server {
listen 80;
server_name tianjin.myweb.com;
location / {
proxy_pass http://tianjin.myweb.com;
}
}
- 方式二:通过include的方式在nginx.conf文件中引入虚拟主机配置
include /usr/local/nginx/vhost/vhost.conf;
# -vhost.conf文件内容------------------
server {
listen 80;
server_name beijing.myweb.com;
location / {
proxy_pass http://beijing.myweb.com;
}
}
server {
listen 80;
server_name nanjing.myweb.com;
location / {
proxy_pass http://nanjing.myweb.com;
}
}
server {
listen 80;
server_name tianjin.myweb.com;
location / {
proxy_pass http://tianjin.myweb.com;
}
}
将虚拟目录的配置文件加入到“http{}”部分的末尾,与其他的server并列。
好处:文件是隔开的,配置更加清晰,主文件中没有那么多的server。
3、配置每个虚拟主机请求转发所对应的后端服务器
upstream beijing.myweb.com {
server 127.0.0.1:9100;
}
upstream nanjing.myweb.com {
server 127.0.0.1:9200;
}
upstream tianjin.myweb.com {
server 127.0.0.1:9300;
}
4、修改hosts文件,让Linux的ip指向到一个三个站点的域名
192.168.70.128 beijing.myweb.com
192.168.70.128 nanjing.myweb.com
192.168.70.128 tianjin.myweb.com
以上待续。
上节内容:Nginx安装步骤(CentOS7.x版本)