介绍
以下学习笔记来自于尚硅谷的Nginx课程
目录
前言
-
说明 Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和HTTP缓存。 该软件由伊戈尔·赛索耶夫(Игорь Сысоев)创建并于2004年首次公开发布。2011年成立同名公司以提供支持。 2019年3月11日,Nginx公司被F5 Networks以6.7亿美元收购。
-
原理 多进程:一个 Master 进程、多个 Worker 进程 Master 进程:管理 Worker 进程 对外接口:接收外部的操作(信号) 对内转发:根据外部的操作的不同,通过信号管理 Worker 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程 Worker 进程:所有 Worker 进程都是平等的 实际处理:网络请求,由 Worker 进程处理; Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
- 常用命令
- nginx -v #查看版本号
- nginx #启动
- nginx -s stop #关闭
- nginx -s reload #重新加载
- 默认配置文件
-
nginx.conf
- user nginx;
- worker_processes auto;#工作进程数
- error_log /var/log/nginx/error.log notice;
- pid /var/run/nginx.pid;
- events {
- worker_connections 1024;#最大连接数
- }
- http {
- include /etc/nginx/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 /var/log/nginx/access.log main;
- sendfile on;
- #tcp_nopush on;
- keepalive_timeout 65;
- #gzip on;
- include /etc/nginx/conf.d/*.conf;
- }
-
conf.d/default.conf
- server {
- listen 80;
- listen [::]:80;
- server_name localhost;
- #access_log /var/log/nginx/host.access.log main;
- location / {
- root /usr/share/nginx/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 /usr/share/nginx/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;
- #}
- }
location值令
精确匹配: = , 后面的表达式中写的是纯字符串 字符串匹配: ^~ 和 无符号匹配 , 后面的表达式中写的是纯字符串 正则匹配: ~ 和 ~* 和 !~ 和 !~* , 后面的表达式中写的是正则表达式 匹配顺序: = > ^~ > ~ > ~* > /
- =
- # 精确匹配,必须是 servername/
- location = / {
- ...
- }
- # 精确匹配,必须是127.0.0.1/login
- location = /login {
- ...
- }
- 2. ^~ ```properties ## 对uri 起始字符 做 字符串匹配,不是 正则匹配。 区分大小写 ## servername/static/js. location ^~ /static/ { ... } ```
- ~
- ##对 uri (可以不是起始字符)做 正则匹配,区分大小写
- ## 区分大小写,以gif,jpg,js结尾
- location ~ \.(gif|jpg|png|js|css)$ {
- ...
- }
- ~*
- ##对 uri (可以不是起始字符)做 正则匹配,不区分大小写
- ## 不区分大小写,匹配.png结尾的
- location ~* \.png$ {
- ...
- }
- !~ 和!~*
- ##分别为区分大小写不匹配及不区分大小写不匹配 的正则匹配,可以用于错误页
- ## 区分大小写,匹配不以.xhtml结尾的
- location !~ \.xhtml$ {
- ...
- }
- location !~* \.xhtml$ {
- ...
- }
- /
- ## 什么都可以
- location / {
- ...
- }
- @
- ##此种方式的location配置,无法通过外网访问,只能通过内网跳转,实现容错的功能
- location @name { ... }
-
Rewrite重定向&&Return重定向
- last – 表示完成rewrite
- break – 中止Rewirte,不在继续匹配
- redirect – 返回临时重定向的HTTP状态302
- permanent – 返回永久重定向的HTTP状态301
- 1、下面是可以用来判断的表达式:
- -f和!-f用来判断是否存在文件
- -d和!-d用来判断是否存在目录
- -e和!-e用来判断是否存在文件或目录
- -x和!-x用来判断文件是否可执行
- 2、下面是可以用作判断的全局变量
- 例:http://localhost:88/test1/test2/test.php
- $host:localhost
- $server_port:88
- $request_uri:/test1/test2/test.php
- $document_uri:/test1/test2/test.php
- $document_root:D:\nginx/html
- $request_filename:D:\nginx/html/test1/test2/test.php
- Rewrite
- server {
- listen 80;
- server_name start.igrow.cn;
- root html;
- index index.html index.php;
- rewrite ^(.*) https://star.igrow.cn$1 permanent;
- }
- Return
- server {
- listen 80;
- server_name start.igrow.cn;
- return 301 https://$host$request_uri;
- }
-
区别
rewrite 重定向:需要先做正则匹配,然后再给客户端返回新地址进行重定向(做了两步操作) return 重定向:不需要做正则匹配,直接给客户端返回新地址进行重定向(做了一步操作)
if
- // 如果用户设备为IE浏览器的时候,重定向 。如果UA包含"MSIE",rewrite请求到/msid/目录下
- if ($http_user_agent ~ MSIE) {
- rewrite ^(.*)$ /msie/$1 break;
- }
-
- //如果cookie匹配正则,设置变量$id等于正则引用部分
- if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
- set $id $1;
- }
-
- //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
- if ($request_method = POST) {
- return 405;
- }
-
- //限速,$slow可以通过 set 指令设置
- if ($slow) {
- limit_rate 10k;
- }
-
- //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
- if (!-f $request_filename){
- break;
- proxy_pass http://127.0.0.1;
- }
-
- //如果query string中包含"post=140",永久重定向到example.com
- if ($args ~ post=140){
- rewrite ^ http://example.com/ permanent;
- }
-
- //防盗链
- //如果 valid_referers 条件判断未通过,nginx 则会赋值 invalid_referer 为true
- //语法: valid_referers none | blocked | server_names | string ...;
- //参数说明:
- //none: 不允许 “Referer” 来源头部为空的情况
- //blocked: 不允许“Referer”值为空情况,有可能Referer的值被代理或者防火墙删除
- //server_names: “Referer”来源头部包必须含当前的server_names (当前域名)可以多个
-
- location ~* \.(gif|jpg|png|swf|flv)$ {
- valid_referers none blocked www.jefflei.com www.lfa.com;
- if ($invalid_referer) {
- return 404;
- }
- }
-
- //根据文件类型设置过期时间
- location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
- if (-f $request_filename) {
- expires 1h;
- break;
- }
- }
-
- // 禁止访问某个目录
- location ~* \.(txt|doc)${
- root /data/www/wwwroot/linuxtone/test;
- deny all;
- }
- $host : 请求主机头字段,否则为服务器名称。
- $http_user_agent : 客户端agent信息
- $http_cookie : 客户端cookie信息
- $request_method : 客户端请求的动作,通常为GET或POST。
- $content_length : 请求头中的Content-length字段。
- $content_type : 请求头中的Content-Type字段。
- $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
- $uri : 不包含请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
- $document_uri : 与$uri相同。
- $query_string
- $args : 这个变量等于请求行中的参数,同$query_string
- $document_root : 当前请求在root指令中指定的值。
- $limit_rate : 这个变量可以限制连接速率。
- $request_body_file
- $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
- $remote_addr : 客户端的IP地址。
- $remote_port : 客户端的端口。
- $remote_user : 已经经过Auth Basic Module验证的用户名。
- $scheme : HTTP方法(如http,https)。
- $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
- $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
- $server_name : 服务器名称。
- $server_port : 请求到达服务器的端口号。
- //例:
- http://localhost:88/test1/test2/test.php
- $host:localhost
- $server_port:88
- $request_uri:http://localhost:88/test1/test2/test.php
- $document_uri:/test1/test2/test.php
- $document_root:/var/www/html
- $request_filename:/var/www/html/test1/test2/test.php
-
反向代理
- 正向代理:代理服务的配置内容在客户端,比如http代理 socks5 vemss,代理端后置于客户端
- 反向代理:代理的配置在服务端,对用户透明,代理端前置于真实服务器
负载平衡器
- upstream myserer{
- server FuzaiUri:xx
- server FuzaiUri:yy
- }
-
- location / {
- proxy_pass http://myserver
- }
- 策略
- 轮询(默认) 如果服务器down掉能自动切换
- weight 代表权重,默认为1
- upstream myserer{
- server FuzaiUri:xx weight 5
- server FuzaiUri:yy weight 10
- }
- ip_hash ip分配到hash slot
- upstream myserer{
- ip_hash
- server FuzaiUri:xx
- server FuzaiUri:yy
- }
- fair(第三方) 根据请求的响应时间分配 响应时间短优先分配
- upstream myserer{
- fair
- server FuzaiUri:xx
- server FuzaiUri:yy
- }
动静分离
- location ^~ /static/ {
- root /webroot/static/;
- }
-
- location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
- root /webroot/res/;
- }