Nginx快速入门
一、Nginx简介
Nginx(发音同 engine x)是一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·赛索耶夫)所开发,最初供俄国大型网站Rambler.ru及搜寻引擎Rambler使用。
nginx可以做轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器
Nginx特点
优点:
高并发量:基于 epoll/kqueue 模型开发,支持高并发量,官方说其支持高达 5w 并发连接数的响应
内存消耗少:善于处理静态文件,相较于其他web(比如:apache),占用更少的内存及资源
简单稳定:配置简单(一个conf文件),运行简单(nginx命令),而且运行稳定
模块化程度高:功能模块插件化设计,可以自由配置相应的功能。
支持Rwrite重写规则:能够根据域名、URL等请求关键点,实现定制化的高质量分发。
低成本:Nginx的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。
支持多系统:Nginx代码完全用C语言从头写成,可以在各系统上编译并使用。
缺点:
动态处理差:nginx善于处理静态文件,但是处理动态页面相较于Apache之类重量级的web软件能力稍欠缺。
rewrite弱:虽然nginx支持rewrite功能多,但是相较于Apache之类重量级的web软件能力稍欠缺。
二、Nginx的安装(linux:ubuntu为例)
安装Nginx软件
执行命令:apt-get install nginx -y
检查安装效果
执行命令 :nginx -v 查看nginx版本信息
查看是否启动nginx服务 安装成功后默认开启服务
执行命令:ps ajx | grep ngi 查看nginx是否开启
Nginx配置简介
nginx软件目录:
工作目录:/etc/nginx
执行文件: /usr/sbin/nginx
日志目录:/var/log/nginx
启动文件:/etc/init.d/nginx
web目录:/var/www/html/,首页文件是index.nginx-debian.html
/usr/share/nginx/html/ 首页文件是index.html
nginx配置文件:
默认文件:
/etc/nginx/nginx.conf
其他目录:
/etc/nginx/{sites-available/sites-enabled/conf.d}
文件结构:
全局配置段
http配置段
server配置段 项目或者应用
location配置段 url配置
安装好nginx后 ubuntu就可以做为nginx服务器了
使用文本编辑器远程连接ubuntu
我这里使用windows下的vscode远程连接ubuntu系统
使用vscode下载sftp拓展即可ssh连接ubuntu
安装此拓展后可以创建一个名为nginx的文件夹,快捷键ctrl+shift+P 输入sftp 自动创建sftp配置文件
输入要链接的远程ubuntu地址,设置路径为/etc/nginx目录,然后保存,
点击Download Floder 输入密码,连接成功后会将ubuntu系统下/etc/nginx下的配置文件下载过来,同时在windows下修改也会自动上传至ubuntu。
下载过来的目录结构为这个样子
html文件夹是不包含的 这个是我后来创建的
nginx.conf是全局配置文件
三、nginx配置详解
全局配置段
主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置:
- user 设置使用用户(worker)
- worker_processes 进行增大并发连接数的处理 跟cpu保持一致 八核设置八个
- error_log nginx的错误日志
- pid nginx服务启动时候pid
- events 定义事件相关的属性
- worker_connections 一个进程允许处理的最大连接数
- use 定义使用的内核模型
http配置段
主要配置server通用的一些配置
- include mime.types; # 文件扩展名与文件类型映射表
- default_type application/octet-stream; # 默认文件类型
- sendfile on; # 开启高效文件传输模式。
- autoindex on; # 开启目录列表访问,合适下载服务器,默认关闭。
- tcp_nopush on; # 防止网络阻塞
- tcp_nodelay on; # 防止网络阻塞
- keepalive_timeout 120; # 长连接超时时间,单位是秒
- gzip on; # 开启gzip压缩输出
Server常见配置属性
常见样式
server {
# 监听ip以及端口号
listen 端口;
# 该服务端名称
server_name 主机名;
...
}
server配置段最重要的属性是listen和server_name。它们都是用于匹配并处理请求的。
listen属性
作用:定义Server监听的ip和port,当ip/port匹配时候才进行下一步匹配
server_name属性
作用:定义Server监听的域名,当域名匹配时候才进行下一步操作
root属性
作用:定义Server相应请求的html文件所在路径
表现形式:
root /var/www/html;
index属性
作用:定义响应请求后返回的文件名称或格式
表现形式:
index index.html index.htm index.nginx-debian.html;
return属性
作用:定义响应请求后返回的http状态码
表现形式:
return 444;
四、实例演示方便理解
快速实现访问
在conf.d文件夹下创建了nginx.conf文件
新建终端 ssh连接到ubuntu
每次修改conf配置文件 都会自动上传至ubuntu系统,
但是需要使用 nginx -t 测试是否出错
出现这说明没有代码错误
然后要使用 nginx -s reload 命令 重新加载nginx配置服务
此时使用浏览器访问监听地址172.26.236.86:80即可得到访问成功页面
这样我们就成功的配置好了nginx服务器以及成功访问到nginx了。
新建html文件夹 并且新建index.html文件
修改配置文件conf.d下的nginx.conf为
再次访问监听地址得到页面
基本用法
server {
# 监听地址以及端口
listen 172.26.236.86:80;
# 监听命名 非必须指定
server_name www;
location / {
# root 指定文件目录
root /etc/nginx/html;
# index 指定返回的首页文件
# 即使不指定,在root条件下,访问根路径也会自动去html目录下寻找index文件
# index 8000.html
index index.html;
}
}
匹配优先级
server {
# 监听地址以及端口
listen 172.26.236.86:80;
#------------ 匹配规则优先级 ----------
#通用匹配规则 优先级最低
location / {
return 400;
}
#精确匹配 使用=符号 优先级最高
location = / {
return 401;
}
#优先匹配 使用~符号 优先级第二高
location ~ / {
return 402;
}
}
访问页面依次得到
try_files 和 return的使用以及区别
# return 直接返回状态码
# 在根路径下使用try_files 返回400状态码并不会成功
# 在其他路径下可以通过try_files返回状态码
location / {
try_files $uri $uri/ =400;
}
# try_files 也可以返回状态码 但是不能对跟路由进行处理处理 /
location /a {
try_files $uri $uri/ =401;
}
# try_files可以配合@使用 但是return不能配合@使用
location /a {
try_files $uri $uri/ @ceshi;
}
location @ceshi {
return 402;
}
# return 使用重定向跳转
# 这里访问监听地址会直接跳到百度首页
location / {
return 302 http://www.baidu.com;
}
匹配路径后面的 / 问题
如果不加/ 即/a 那么 能够匹配/a后边所有的路由 例如 /a/b/c 等
如果加了/ 即/a/ 那么只能匹配路由/a/
root 和 alias 的使用和区别
root根路径下使用 不需要再指定路径最后加 / 例如:root /etc/nginx/html;
location / {
# # 指定文件目录
root /etc/nginx/html;
# 返回指定首页文件 如果html文件夹下有index.html,那么默认会打开index 即使不指定index
index index.html;
}
# alias的根路径下使用使用 指定文件目录时需要在最后面加上 / 例如:alias /etc/nginx/html/;
location / {
# # 指定文件目录
alias /etc/nginx/html/;
# # 返回指定首页文件 如果html文件夹下有index.html,那么默认会打开index 即使不指定index
index index.html;
}
# root 非根路径下使用
# root只能在根路径下 使用 否则会返回404
location /a {
# # 指定文件目录
root /etc/nginx/html;
# 返回指定首页文件 如果html文件夹下有index.html,那么默认会打开index 即使不指定index
index index.html;
}
# alias 可以在非根路径下使用
location /a {
# # 指定文件目录
alias /etc/nginx/html;
# # 返回指定首页文件 如果html文件夹下有index.html,那么默认会打开index 即使不指定index
index index.html;
}
访问控制
server {
# 监听地址以及端口
listen 172.26.236.86:80;
# ---------------------访问控制------------------------
location / {
stub_status on; # 返回nginx的状态信息
allow 10.211.152.157; # 允许指定ip访问
deny all; # 除了允许访问的ip 其他均拒绝访问
}
}
使用允许访问的ip地址访问得到nginx状态信息
目录下载控制
server {
# 监听地址以及端口
listen 172.26.236.86:80;
# -----------------目录下载控制-----------------
location /download {
# 指定目录
alias /etc/nginx;
# 允许下载
autoindex on;
}
}
访问地址得到页面
Ngnix进阶知识
反向代理
代理是什么?
简单来说,我找一个中间人,代替我去做一件事情,只要他给我结果就可以。
代理一般分为两种:正向代理、反向代理
反向代理的使用(proxy_pass)
# 反向代理转发
server {
listen 172.26.236.86:80;
location / {
# 使用proxy_pass 进行反向代理
# 当访问80端口的时候会自动跳转到到8000端口
proxy_pass http://172.26.236.86:8000;
}
}
server {
listen 172.26.236.86:8000;
location / {
root /etc/nginx/html;
index 8000.html;
}
}
负载均衡
负载均衡是什么?
我们之前使用proxy_pass的方式实现了nginx代理请求到后端的效果,随着我们的网站访问量越来越多,一个后端就不现实了,那么接下来我们应该如果在访问量日渐增大的情况下,满足线上业务的稳定呢?
解决方法就是:负载均衡
负载均衡简单说来人多力量大,打群架。
负载均衡的使用(upstream)
# 负载均衡的使用 轮询 遍历 每次访问调用一次
upstream meiduo {
# 默认轮询调度算法
# server 172.26.236.86:8000;
# server 172.26.236.86:8001;
# server 172.26.236.86:8002;
# 加权轮询 优先调用权重的服务
# server 172.26.236.86:8000 weight=1;
# server 172.26.236.86:8001 weight=2;
# server 172.26.236.86:8002 weight=3;
# ip_hash 算法
# 第一次分配到那个ip 以后的所有请求都会访问na哪个ip
ip_hash;
server 172.26.236.86:8000;
server 172.26.236.86:8001;
server 172.26.236.86:8002;
}
# 反向代理转发
server {
listen 172.26.236.86:80;
location / {
proxy_pass http://meiduo;
}
}
server {
listen 172.26.236.86:8000;
location / {
root /etc/nginx/html;
index 8000.html;
}
}
server {
listen 172.26.236.86:8001;
location / {
root /etc/nginx/html;
index 8001.html;
}
}
server {
listen 172.26.236.86:8002;
location / {
root /etc/nginx/html;
index 8002.html;
}
}