什么是 Nginx

一个高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器

基本使用

设置 Nginx 安装源

  1. $ vim /etc/yum.repos.d/nginx.repo
  2. # 内容如下:
  3. [nginx]
  4. name=nginx repo
  5. baseurl=http://nginx.org/packages/centos/7/$basearch/
  6. gpgcheck=0
  7. enabled=1

安装 Nginx

  1. $ yum install nginx -y

启动 Nginx

  1. $ ngnix
  2. # 或者
  3. $ systemctl start nginx

image.png
(Nginx 启动后)

查看 Nginx 服务

  1. $ ps aux | grep ngnix

image.png

停止 Nginx 服务

  1. # 等待 Nginx 服务自行关闭(推荐)
  2. $ nginx -s quit
  3. # 使用系统命令关闭服务(推荐)
  4. $ systemctl stop nginx.service
  5. # 立即停止 Nginx 服务(不推荐)
  6. $ nginx -s stop
  7. # 杀死 Nginx 进程(不推荐)
  8. $ killall ngnix

image.png
(停止的 Nginx 服务)

重启 Nginx

  1. $ systemctl restart nginx.service
  2. # 或者
  3. $ ngnix -s reload

查看启用的端口

  1. $ netstat -tlnp

反向代理 node

项目部署的时候,使用 Nginx 反向代理 Node.js。具体的步骤如下:

首先我们要在 nginx.cnf 文件中的 http 节点打开下面的配置:

  1. http {
  2. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  3. '$status $body_bytes_sent "$http_referer" '
  4. '"$http_user_agent" "$http_x_forwarded_for"';
  5. access_log /var/log/nginx/access.log main;
  6. sendfile on;
  7. tcp_nopush on;
  8. tcp_nodelay on;
  9. keepalive_timeout 65;
  10. types_hash_max_size 2048;
  11. include /etc/nginx/mime.types;
  12. default_type application/octet-stream;
  13. # 打开这一行的配置
  14. include /etc/nginx/conf.d/*.conf;
  15. }

然后每个域名的配置文件就放到这个目录/etc/nginx/conf.d/下,文件后缀以conf结束。

第一种方式,这种简单:

server {
    listen       80 ;
    server_name  localhost;
    root   /xxx/xxx/hxxydexx/;

    #set $my_server_name $scheme://$server_name; 
    #if ( $my_server_name != https://$server_name ) {
    #   rewrite ^ https://$server_name$request_uri? permanent;
    #}

    error_log    /var/log/nginx/hyde_error.log    error;
    access_log    /var/log/nginx/hyde_accss.log    main;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host  $http_host;
        proxy_set_header X-Nginx-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        # 不需要考虑到负载的,就无需配置upstream节点。
        proxy_pass    http://127.0.0.1:3000;
    }

    error_page 404 /404.html;
        location =  /xxx/xxx/40x.html {
    }
    error_page 500 502 503 504 /50x.html;
        location =  /xxx/xxx/50x.html {
    }
}

第二种方式,考虑到负载

upstream node {
    server 127.0.0.1:3000; 
}
server {
    listen       80 ;
    server_name  localhost;
    root   /xxx/xxx/hxxydexx/;

    #set $my_server_name $scheme://$server_name; 
    #if ( $my_server_name != https://$server_name ) {
    #   rewrite ^ https://$server_name$request_uri? permanent;
    #}

    error_log    /var/log/nginx/hyde_error.log    error;
    access_log    /var/log/nginx/hyde_accss.log    main;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host  $http_host;
        proxy_set_header X-Nginx-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        # 配置upstream节点
        proxy_pass    http://node;
    }

    error_page 404 /404.html;
        location =  /xxx/xxx/40x.html {
    }
    error_page 500 502 503 504 /50x.html;
        location =  /xxx/xxx/50x.html {
    }
}

然后重启或者重新载入nginx的配置文件即可。命令如下

# 检查nginx配置文件中语法是否正确
$ nginx -t
# 重启 nginx
$ service nginx restart
# 重载配置文件
$ nginx -s reload

HTTPS

upstream node {
    server 127.0.0.1:3000; 
}

server {
    listen 443 ssl;  #指定使用443端口,开启SSL
    server_name  www.mainhou.com;  #指定网站域名
  ssl                  on;
  ssl_certificate     /root/node/ssl/mh.crt;#配置证书位置
  ssl_certificate_key  /root/node/ssl/mh.key;#配置秘钥位置
  root   /xxx/xxx/hxxydexx/;

  error_log    /var/log/nginx/hyde_error.log    error;
  access_log    /var/log/nginx/hyde_accss.log    main;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host  $http_host;
    proxy_set_header X-Nginx-Proxy true;
    proxy_http_version 1.1;
    proxy_set_header Connection "";

    # 配置upstream节点
    proxy_pass    http://node;
  }

  error_page 404 /404.html;
    location =  /xxx/xxx/40x.html {
  }

  error_page 500 502 503 504 /50x.html;
    location =  /xxx/xxx/50x.html {
  }
}

server {
  listen 80;
  server_name  www.mainhou.com;  #指定网站域名
  return 301 https://$server_name$request_uri;  #设置301重定向
}

Gzip 压缩

$ vim /usr/local/nginx/conf/nginx.conf
gzip on; # 开启Gzip
gzip_min_length 1k; # 不压缩临界值,大于1K的才压缩,一般不用改
gzip_buffers 4 16k; # 默认就好
#gzip_http_version 1.0; # 默认就好
gzip_comp_level 2; # 压缩级别,1-10,数字越大压缩的越好,时间也越长,根据自己的需求更改
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; # 进行压缩的文件类型,缺少什么类型加上,JavaScript有两种写法都写上.
gzip_vary off; # Squid等缓存服务
gzip_disable "MSIE [1-6]\."; # IE6对Gzip不友好,忽略IE6

重新加载 nginx

$ sudo /usr/local/nginx/sbin/nginx -s reload

查看相应页面的 DevTools 是否有响应头 Content-Encoding: gzip,如果有则代表 Gzip 成功。

负载均衡

参考

【1】前端开发者必备的 Nginx 知识
【2】Nginx 中文文档
【3】NGINX 反向代理
【4】Nginx开启Gzip压缩大幅提高页面加载速度
【5】Nginx 反向代理与负载均衡详解