概述
Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,具有处理高并发的能力。时常用于服务端的反向代理和负载均衡。划重点:处理高并发,反向代理,负载均衡。
安装(windows)
-
download
-
可以自行选择适合自己电脑的版本(开发版本/稳定版本/历史版本)--推荐稳定版(stable)
-
傻瓜式安装即可,安装完成运行nginx.exe。打开浏览器访问127.0.0.1,或者localhost
效果图
nginx安装成功效果图目录结构
nginx目录结构说明-
这里conf文件夹是最重要的,里边存放的是nginx的配置文件
-
html文件夹是静态站点文件,里边可以放一些静态页面
-
logs文件夹里边存放的是日志文件,还有nginx的pid
-
temp文件夹下是一些临时文件
-
docs和contrib可自行查看 ,很少用
conf/nginx.conf
#user nobody; #运行用户
worker_processes 1; #Nginx进程数
#错误日志存放目录
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#指定nginx进程运行文件存放地址
#pid logs/nginx.pid;
events {
worker_connections 1024; # 单一进程最大连接数
}
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; #nginx访问日志目录
sendfile on; #开启高效传输模式
#tcp_nopush on; #减少网络报文段的数量
#keepalive_timeout 0;
keepalive_timeout 65; #超时时间
#gzip on; # 开启gzip压缩
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html; # root表示访问的目录
index index.html index.htm; # index表示默认首页
}
#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;
}
# 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;
# }
#}
}
nginx命令
注意:linux下的nginx指令需要进入sbin文件夹,修改配置文件需重新加载
操作 | windows | linux |
---|---|---|
启动 | 双击运行nginx.exe | nginx |
重启 | 通过任务管理器杀掉nginx进程再度运行 | nginx -s reload |
关闭 | 通过任务管理器杀掉nginx进程 | killall nginx o |
查看运行信息 | 任务管理器 | ps -ef | grep nginx |
权限过滤
有时候,某些页面我们不想让用户访问,比如后台管理的页面
# 这样配置 首页只能这个115.29.159.223访问,其他都被禁止
# allow和deny是存在优先级的,前覆盖后,谁在前边以谁为准
# deny all allow 115.29.159.223 这样所有ip都被禁止访问了
location / {
root html; # root表示访问的目录
index index.html index.htm; # index表示默认首页
allow 115.29.159.223;
deny all;
}
# 后台只允许公司内网的人访问
location =/admin{
# =表示精确匹配,也可以用正则 ~区分大小写 ~*不区分大小写
root html; # root表示访问的目录
index index.html index.htm; # index表示默认首页
deny all;
}
虚拟主机
一个域名指向一个ip,但是一个ip可以有多个域名。实现就是通过Nginx监听多个端口,根据不同的端口号,来区分不同的域名。nginx支持的划分方式很多,常用的三种
端口号划分
server{
listen 3000;
server_name localhost;
root html;
index home.html;
}
server{
listen 3001;
server_name localhost;
root html;
index news.html;
}
server{
listen 3002;
server_name localhost;
root html;
index about.html;
}
ip划分(前提是有多ip)
server{
listen 3000;
server_name ip1;
root html;
index home.html;
}
server{
listen 3000;
server_name ip2;
root html;
index news.html;
}
server{
listen 3000;
server_name ip3;
root html;
index about.html;
}
# 上述ip1/ip2/ip3为伪代码
按域名划分
server{
listen 80;
server_name domain1;
root html;
index news.html;
}
server{
listen 80;
server_name domain2;
root html;
index about.html;
}
# 上述domain1 ,domain2为伪代码,指的是实际域名 比如www.baidu.com baidu.image.com
反向代理
正向代理
正向代理示意图正向代理代理的是客户端。镜像原理就是正向代理。中间代理服务器具有访问网络的能力,而将从远程服务器的资源存到自己这里。对于客户端而言,并不关心资源来自远程外网还是来自代理服务器。
反向代理
反向代理示意图反向代理代理的是服务端。每个请求具体指向哪个服务器,是nginx控制的。(通常会用context上下文区别) 反向代理常用于解决跨域问题,当所有请求来源都被nginx接管,当然符合同源策略,不存在跨域。此外,反向代理还可以实现服务端的负载均衡,撑起海量高并发。(关于负载均衡,下边会提到)
# 将原始node3000端口代理到当前nginx服务器所在的80端口,上下文为node(默认nginx端口为80)
location /node/{
proxy_pass http://12.10.164.100:3000;
}
# 将原始java8000端口代理到当前nginx服务器所在的80端口,上下文为java(默认nginx端口为80)
location /java/{
proxy_pass http://12.10.164.100:8000;
}
原始请求 | nginx代理后请求 | 类型 |
---|---|---|
http://127.0.0.1:3000/home | http://12.10.164.100/node/home | node |
http://127.0.0.1:8000/home | http://12.10.164.100/java/home | java |
这个时候看的应该更明显,同协议(http),同域名/ip (12.10.164.100),同端口(80) 不存在跨域
负载均衡
在实际开发中,大的项目通常会分服务器部署,这些服务器协同办公,可以看作一个集群。nginx可以均匀分配客户端请求到这些服务器上,避免某个服务器内存过载崩掉。假如某网站单个服务器最大并发5000,一下子来了15000请求,自己肯定承受不住,此时nginx再分配其他的请求到另外两台服务器,就撑起了15000的高并发。
# 设定负载均衡的服务器列表
upstream load_balance_server {
#weigth参数表示权值,权值越高被分配到的几率越大
server 12.18.1.22:80 weight=6;
server 12.18.1.23:80 weight=5;
server 12.18.1.24:80 weight=4;
}
413传输限制
在进行图片或者其他文件上传的时候,超出nginx默认传输大小,会报错:413 Request Entity Too Large 。这个时候,修改一下传输相关的配置即可。
server {
client_max_body_size 50m; # 修改最大传输限制为50M 可根据实际情况修改
}
作者说
nginx超级好用,这篇文章只是基础入门教程,还是有必要深入了解的,加油。