分类 PHP 下的文章

Nginx配置文件通常位于sites-available目录中,一个网站一个配置文件。参考文档
Nginx配置文件主要分成以下几部分:

1、 main(全局设置)

配置影响nginx全局指令,一般有运行nginx服务器的用户组、nginx进程pid存放路径、日志存放路径、配置文件引入、允许生成的worker_process数等

2、 events

配置影响nginx服务器或与用户的网络连接等。

有每个进程的最大连接数,选取那种事件驱动模型处理连接请求,是否允许同事接受多个网络连接、开启多个网络连接序列化等

3、 http

可以嵌套多个server,配置代理、缓存、日志定义等绝大多数功能和第三方模块的配置。如文件引入、mime-type定义、日志自定义、连接超时时间、单连接请求数等

4、 server(主机设置)

主要用于配置虚拟主机的相关参数,如域名、IP、端口等。一个http中可以有多个server

5、 upstream(上游服务器设置,主要为反向代理、负载均衡等相关配置)

主要用于设置一系列的后端服务器

6、 location(URL匹配特定位置后的设置)

配置请求的路由对应的网页位置,以及各种网页的处理情况。比如,根目录“/”,“/images”,)

server 继承 main,location 继承 server,upstream独立(既不继承也不被继承)。
比如location的root 可以放在server中,也可以放在location中

Nginx文件结构

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

通用配置文件

user www www;
worker_processes 2;  
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;  
pid logs/nginx.pid;

events {
    use epoll;
    worker_connections 2048;
}

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 65;  

    # gzip压缩功能设置
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 6;
    gzip_types text/html text/plain text/css text/javascript application/json application/javascript   application/x-javascript application/xml;
    gzip_vary on;  

    # http_proxy 设置
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 75;
    proxy_send_timeout 75;
    proxy_read_timeout 75;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_temp_path /usr/local/nginx/proxy_temp 1 2;  

    # 设定负载均衡后台服务器列表
    upstream backend {
        #ip_hash;
        server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ;
        server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
    }  

    # 很重要的虚拟主机配置
    server {
        listen 80;
        server_name itoatest.example.com;
        root /apps/oaapp;  
        charset utf-8;
        access_log logs/host.access.log main;  

        #对 / 所有做负载均衡+反向代理
    location / {
        root /apps/oaapp;
        index index.jsp index.html index.htm;  
        proxy_pass http://backend;
        proxy_redirect off;

        # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
      }  

    #静态文件,nginx自己处理,不去backend请求tomcat
    location ~* /download/ {
        root /apps/oa/fs;
    }
    location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {    
        root /apps/oaapp;
        expires 7d;
    }
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 192.168.10.0/24;
        deny all;
    } 
    location ~ ^/(WEB-INF)/ {
        deny all;
    }
    #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;
}
}  
## 其它虚拟主机,server 指令开始
}

通用指令、变量说明

map 指令是由ngx_http_map_module 模块提供的,默认情况下安装nginx都会安装
map 的作用是 创建自定义变量,通过使用nginx的内置变量,去匹配某些特定规则,如果匹配常规则将值给自定义变量。

语法:map $var1 $var2 {...}
$var1是源变量,通常为nginx的内置变量。$var2就是自定义的变量,$var2的值取决于匹配的情况
内部匹配是正则表达式,如果以"~"开头,则表明对大小写敏感,"~*"则是不敏感

例: 匹配请求的url传过来的参数。如果参数是"debug",则设置$foo=1,默认设置$foo=0

map $args $foo {
    default 0;
    debug   1;
}

解释 $args是nginx的内置变量,就是获取的请求url的参数。如果 $args 匹配到debug 那么就会将$foo的值设置为1,默认为0

2、常用指令说明

2.1 全局配置

  • worker_processes 2

在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数grep ^processor /proc/cpuinfo | wc -l,也是 auto 值,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。

  • worker_cpu_affinity

也是写在main部分。在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如 worker_cpu_affinity 0001 0010 0100 1000; (四核)。

  • worker_connections 2048

写在events部分。每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。nginx作为反向代理服务器,计算公式 最大连接数 = worker_processes * worker_connections/4,所以这里客户端最大连接数是1024,这个可以增到到8192都没关系,看情况而定,但不能超过后面的worker_rlimit_nofile。当nginx作为http服务器时,计算公式里面是除以2。

  • worker_rlimit_nofile 10240

写在main部分。默认是没有设置,可以限制为操作系统最大的限制65535。

  • use epoll

写在events部分。在Linux操作系统下,nginx默认使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。在操作系统不支持这些高效模型时才使用select。

2.2

3、配置WebSocket

Nginx 配置 WebSocket反向代理,可直接复制使用.


map $http_upgrade $connection_upgrade { 
    default upgrade; 
    '' close; 
} 
upstream wsbackend{ 
    server ip1:port1; 
    server ip2:port2; 
    keepalive 1000; 
} 

server { 
    listen 20038; 
    location /{ 
        proxy_http_version 1.1; 
        proxy_pass http://wsbackend; 
        proxy_redirect off; 
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_read_timeout 3600s; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection $connection_upgrade; 
    } 
}

详解:
http协议中,header中有个Upgrade(主要用于检测协议)
Ngin代理WebSocket的重点是设置Upgrade和Connection响应头。
配置Nginx根据Upgrade(既$http_upgrade)来设置Connection

  • 如果请求头中有Upgrade,就直接设置到响应头中,并把Connection设置为upgrade。
    因为websocket请求时header中会带上 Upgrade:websocket,Connection:Upgrade
    否则把Connection设置为close。如普通的Http请求

websocket.png

因此
第一步、

map $http_upgrade $connection_upgrade { 
    default upgrade; 
    '' close; 
}

表示的是

  1. 如果 $http_upgrade 不为 '' (空),则 $connection_upgrade 为 upgrade
  2. 如果 $http_upgrade 为 '' (空),则 $connection_upgrade 为 close

第二步、

   upstream wsbackend{ 
        server ip1:port1; 
        server ip2:port2; 
        keepalive 1000; 
    } 

表示的是 nginx负载均衡

  1. 两台服务器 (ip1:port1)和(ip2:port2)
  2. keepalive 1000 表示的是每个nginx进程中上游服务器保持的空闲连接,当空闲连接过多时,会关闭最少使用的空闲连接.当然,这不是限制连接总数的,可以想象成空闲连接池的大小.设置的值应该是上游服务器能够承受的

最后、

server { 
    listen 20038; 
    location /{ 
    proxy_http_version 1.1; 
    proxy_pass http://wsbackend; 
    proxy_redirect off; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_read_timeout 3600s; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $connection_upgrade; 
    } 
} 

表示的是监听的服务器的配置

  1. listen 20038 表示 nginx 监听的端口
  2. locations / 表示监听的路径(/表示所有路径,通用匹配,相当于default)
  3. proxt_http_version 1.1 表示反向代理发送的HTTP协议的版本是1.1,HTTP1.1支持长连接
  4. proxy_pass http://wsbackend; 表示反向代理的uri,这里可以使用负载均衡变量
  5. proxy_redirect off; 表示不要替换路径,其实这里如果是/则有没有都没关系,因为default也是将路径替换到proxy_pass的后边
  6. proxy_set_header Host $host; 表示传递时请求头不变, $host是nginx内置变量,表示的是当前的请求头,proxy_set_header表示设置请求头
  7. proxy_set_header X-Real-IP $remote_addr; 表示传递时来源的ip还是现在的客户端的ip
  8. proxy_read_timeout 3600s; 表的两次请求之间的间隔超过 3600s 后才关闭这个连接,默认的60s.自动关闭的元凶
  9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 表示X-Forwarded-For头不发生改变
  10. proxy_set_header Upgrade $http_upgrade; 表示设置Upgrade不变 11. proxy_set_header Connection $connection_upgrade; 表示如果 $http_upgrade为upgrade,则请求为upgrade(websocket),如果不是,就关闭连接

前言

官方文档
参考了PHP 开发环境安装配置:Win10+Docker+Laradock(上篇)
Laradock 是Laravel + docker 的缩写,最早是为Laravel打造的,现在已成为广泛使用的一套基于Docker的PHP开发环境,提供了多个预先配置和打包的Docker镜像。
类似的选择有 Homestead、Laragon.
安装准备:

  • Win10 x64 专业版 (Win10 才用Hyper-V,因此不支持虚拟机版Win10安装)
  • **BIOS 开启 虚拟化(Virtualization is enabled)
  • CPU支持SLAT功能
  • 请退出360 安全卫士等软件
  • Docker 安装程序 链接:https://pan.baidu.com/s/1loaiILSMxtKzuMco6crKtA 提取码:n7en

<span style='color:red'>注意,安装前请确认没有安装过虚拟机软件,如VMware Workstation 、Virtual Box。如果安装过一定要将其卸载,否则可能会出现冲突,因为Win10 安装Docker时会启用Win10自带的Hyper-V虚拟机

Win10 中安装 Docker

  1. 运行下载好的 Docker Desktop Installer.exe安装程序,按下图选择。
    Add shortcut to desktop 是指添加桌面快捷方式
    Use Windows containers instead... 是指使用Windows容器而不是Linux容器(可以在安装后更改),不要勾选,因为Laradock需要Linux安装
    7P(((TQDR[L`VL7B$~$)C~V.png
  2. 正在安装

正在安装.png

  1. 安装完成,点击 Close and log out(关闭并注销),会注销系统。

    安装完成.png

  1. 重新登录账户后,会弹出如下提示,点击OK!意思是Hyper-V未启用,Docker不能正常工作,重启启动Hyper-V!

    4.png

  2. 重启成功后,通知栏会出现一个Docker的图标,显示Docker desktop is runing,说明 Docker已成功运行。
    右键Settings->Advanced,配置虚拟机的信息(CPU,内存)