Nginx的配置与使用
目录
一、Nginx是什么
二、使用Nginx可以做什么
三、安装Nginx
四、Nginx目录解析
五、配置Nginx
5.1、配置全局处理核数
5.2、配置events块
5.3、配置http块
5.3.1、http全局块
5.3.2、server块
5.4、日志配置
六、完整示例
一、Nginx是什么
简单来说,Nginx是一个web代理服务器,可以用来部署web应用。更多介绍我们可以自行百度一下,毕竟目前介绍Nginx资料还是非常多的。这里就不在过多介绍了。
二、使用Nginx可以做什么
通过了解我们知道Nginx可以用来做web服务器,简单来说把我们的代码打包后放到Nginx的html目录里,就可以启动我们的应用。但为什么不在本地或服务器上部署我们的应用服务,而多此一举到Nginx启动呢?Nginx本身作为web服务器,其自身做了很多的优化配置,常用的有:代理转发、负载均衡、资源缓存等。
代理相信大家都了解,主要解决跨域的问题。在Nginx中配置proxy_pass参数,可以实现请求转发到后端。若条件充足有集群的情况下,配置集群ip地址,Nginx自动分发请求到不同机器上达到负载均衡的效果。
还有一个常用的功能,目前主流前后端分离开发部署,前端所产生的静态文件(图片、视频等等)存放到对应包下,当请求静态资源时,Nginx会读取并缓存起来,提高响应速度。
三、安装Nginx
我们可以打开 Nginx的官网下载 找到Stable version栏目下载稳定版;同时GitHub也可以下载到Nginx的发行版。
下载完成后,解压到一个文件夹里,配置下nginx的环境变量,打开终端输入nginx -version验证是否配置成功。
四、Nginx目录解析
下载验证完成后,我们打开解压的文件夹,一般都包括如下几个文件夹。其中conf文件夹用来配置nginx,html文件夹用来存放我们打包后的应用程序,logs文件夹用来存放nginx运行产生的日志;而启动Nginx的入口文件则在sbin文件夹中。

五、配置Nginx
5.1、配置全局处理核数
worker_processes配置用来指定应用进程数,好做分发处理,这个地方建议使用集群从核数,可以设置为 worker_processes auto;
拓展配置:worker_cpu_affinity auto; # 自动绑定CPU

5.2、配置events块
如图所示,被events花括号包裹着的就是events块的配置,这块主要是对每个worker进程的配置。如下,默认文件里会配置 worker_connections 1024; 指定了每个worker进程的连接数为1024。此外,events块还可以配置worker进程之间是否互斥等等,不过这些配置nginx都默认给的最优的配置,大多数情况下不需要重新设置。

5.3、配置http块
它来了,它来了,Nginx带着最重要的配置它来了,之前讲到的web服务、反向代理、日志等等都是在http块里进行配置的。
5.3.1、http全局块
打开Nginx的配置的文件,默认有下面的配置。我们可以根据自身需要修改对应配置,比如日志格式化,上面都有注释的示例,供我们参照修改。
除去默认文件给的参数,还有几个参数我们也会经常用到。
# 指定字符集
charset utf-8;
# 单次保持连接时间(一个请求发送后,超过指定时间无请求后才会关闭连接)
keepalive_timeout 65
# 单次连接最大请求数
keepalive_requests 1000

5.3.2、server块
配置完一些基本配置后,往下进入到server块。server这里主要是配置运行服务相关的配置,如服务ip、端口、ssl等。
# 监听服务port(启用https:listen 8787 ssl)
listen 8787;
# 监听服务ip
server_name localhost;
# 配置静态文件存放路径(相对于nginx)
root html/dist;
# 配置应用路由规则
location / {
index index.html index.htm;
try_files $uri $uri/ /index.html;
}# 配置静态文件缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
access_log off; # 关闭日志减少IO压力
etag on; # 启用ETag验证
}# 配置访问不存在的资源或404报错统一页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}# 反向代理
location /aspApi/ {
rewrite ^/aspApi/(.*) /$1 break;# 以aspApi开头的请求都会转到本地的5001服务
proxy_pass http://localhost:5001;
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_connect_timeout 6000;
proxy_read_timeout 6000;
}# 负载均衡配置
# 1、配置后端服务器组
upstream backend {
server localhost:5000 weight=3; # 权重3
server localhost:5000 weight=2; # 权重2
server localhost:5000 backup; # 备用节点
}# 2、server 接收转发给定义的服务器组
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://backend; # 请求转发至 upstream 组
proxy_set_header Host $host;
}
}
ps:若有在一台服务器上部署多个应用场景,只需要再复制一个server块出来,改一下里面的监听端口和服务ip,即可开启多个应用服务,之前互不影响。
5.4、日志配置
Nginx自身运行和我们应用运行产生的日志,我们可以配置日志存放路径。这对于单服务多应用很有效果,如果把日志配置放到全局,那么配置的两个server将会同用一个日志,结果就是不好区分和拍错。
我们刚刚解析了Nginx的配置文件,其中有全局块、http块、server块。对应这三个块都可以配置,区别在于配置在全局块,那整个Nginx里所有块都会使用全局块里的日志配置;若配置在http块,则http块下所有的server都会使用;同理若配到每个server里,则只会影响当前server块里的应用日志。日志配置读取的优先级为:server > http > 全局,只会生效一个日志配置。
access_log logs/access.log main;
error_log logs/error.log info;
六、完整示例
#user nobody;
worker_processes auto;
worker_cpu_affinity auto;# 这里是全局(不使用全局,即使没有注释,server块里配置了会优先使用server块里的)
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;# nginx进程pid存放
pid logs/nginx.pid;# events配置
events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;charset utf-8;sendfile on;#tcp_nopush on;keepalive_request 1000;keepalive_timeout 65;gzip on;server {listen 8777;server_name localhost;root html/dist;# server日志配置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;# 错误日志为info级别(可选:warn, info等)error_log logs/error.log info;# 路由匹配location / {index index.html index.htm;try_files $uri $uri/ /index.html; }# 静态文件缓存location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {expires 1y;add_header Cache-Control "public, max-age=31536000, immutable";access_log off; # 关闭日志减少IO压力etag on; # 启用ETag验证}# 错误页面处理error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# 反向代理配置location /officeToolsApi/ {rewrite ^/officeToolsApi/(.*) /$1 break;proxy_pass http://localhost:5001;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_connect_timeout 6000; # â³ æ ¹æ®éè¦è®¾ç½®è¶
æ¶proxy_read_timeout 6000;}}