关于Nginx

Nginx是一个强大的网站服务器,它支持静态网站,本地代理和反向代理等等常用且实用的功能。该服务器包括很多的模块,不同的模块又有相应的指定的指令,ngingx通过读取这些指令进行相应的行为。

nginx有一个全局配置文件:nginx.conf。该全局配置文件可以定义几乎所有的Nginx指令。当然也可以在其他的文件中定义Nginx的相关指令,并在nginx.conf使用include xxx将这些指令引用到全局配置文件中,有点像C语言中的#include预编译指令。将过长的指令分配到不同的配置文件中可以使得配置更有条理便于维护。这里主要分析常用的Nginx配置文件组成和常用的虚拟服务器功能的配置方法。

安装Nginx

CentOS操作系统:

$ sudo yum update
$ sudo yum install nginx -y
$ sudo yum install update

Ubuntu 和 Debian

$ sudo apt-get update
$ sudo apt-get install nginx -y
$ sudo apt-get update

按上述方法安装的Nginx的配置文件目录一般位于:/etc/nginx/

所以我们执行 $ cd /etc/nginx/ 进入Nginx的安配置文件目录。

执行 $ ls 命令可以看到Nginx配置文件目录的文件状态,如下图所示:

Nginx.conf 配置文件

首先我们打开配置文件,$ cat nginx.conf$ vim nginx.conf

在Nginx配置文件中 =,每行以 ‘#’ 号开头的行为注释,调整配置文件时可以对这些行进行忽略。

Nginx配置文件每条配置语句均以半角分号’;’结尾。

main 模块

main模块是定义Nginx的主要参数的模块。其包括几个配置:

  • user nginx; 这条指令定义了Nginx在操作系统中启动时使用的用户名,这里的配置意思是以nginx身份启动。
  • worker_processes auto; 这条指令是指定Nginx同时运行的进程数或Nginx的实例。Nginx有一个master进程,还有一些worker进。其中master进程是用来读取和鉴定配置,并将请求分配到不同的worker进程上去处理;worker进程是提供服务的进程,包括请求转发、代理、http缓存等等。这里的配置意思是自动分配worker进程数量。
  • error_log /var/log/nginx/error.log; 指定了发生错误时错误日志的目录。
  • pid /run/nginx.pid; 指定了Nginx的master 进程ID(PID)写入的位置,操作系统会用到PID跟踪和发信号给Nginx进程。
  • include /usr/share/nginx/modules/*.conf; 指定了外部模块文件的储存位置,Nginx在该目录中找到这些文件并导入配置。

main 模块是Nginx配置模块中最地层的模块,其配置直接影响Nginx服务器,当然可以在更高级的服务器模块中配置相同的指令,这些指令将覆盖在 main 中配置的相关指令。

events

events {
    worker_connections  1024;
}

这组配置使用到了一组大括号,该模块的上下文为events,里面用到了worker_connections 1024;指定了worker进程可以同时提供多少的连接服务。

http

http {
    worker_connections  1024;
}
  • include /etc/nginx/mime.types; 加载http服务使用到的 MIME typeMiME type 告诉浏览器,如何处理不同类型的文件。输出该文件,其内容可能如下:

  • access_log /var/log/nginx/access.log main; 该指令指定了http访问日志的储存位置,该指令也可以在serverlocation模块中使用。
  • index index.html index.htm; 该指令指定了请求地址不包含指定文件时在该目录下查找的文件,若该文件不存在,则返回404错误。

server

server {
    ...
}

server 模块定义了一个虚拟主机,若想在服务器上配置多个网站,可以通过配置不同的server模块实现。一般每个server模块的配置可以单独使用文件进行保存。

  • listen 80 default_server; 改指令指定了服务器的监听端口。监听端口前也可以加上IP地址,或主机地址。default_server的意思是如果是请求头不匹配其他虚拟主机名时,默认匹配给改虚拟主机。
  • server_name localhost; 该指令定义了服务器的虚拟主机名,当有请求时,Nginx获取请求头匹配来匹配使用哪个虚拟主机提供服务。若要配置域名访问或指定的IP地址访问,可以将localhost替换成需要的域名或IP地址即可。支持配置泛域名*.eaample.com
  • root /usr/share/nginx/html; 该指令指定了该虚拟主机的请求地址对应的物理根目录,直接访问主机头可以得到该目录下的对应页面。

location

location / {
}

location模块是server的二级模块,其配置Nginx响应请求的方式,如定义不同的请求目录等。若 location 后面接的是 ‘/‘ ,则对请求地址的根目录映射root所对应的根目录。

定义指定文件请求:

location 可以定义指定文件的处理方式,格式如下:


location ~* \.(gif|jpg|png)$ {
  ...
}

表示定义对图片的请求方式,使用该请求方式可以实现将请求代理到CDN图床等等。。。

location 可以定义指定请求目录的处理方式,格式如下:


location ^~ /blog/ {
  ...  
}

改定义方式匹配/blog/请求目录,如匹配:localhost/blog/example.com/blog/等等。

精确匹配可将 ^~ 换成 =

Nginx 的常用服务器配置

静态网站虚拟主机

配置一个静态网站,至少需要指定以下几项参数:

  1. 网站监听端口listen
  2. 虚拟主机名server_name
  3. 网站根目录root
  4. 虚拟主机目录location
  5. 404页面error_page

如:需要在80和443端口上监听 www.aaa.comaaa.com 虚拟主机根目录对应静态网站物理路径 /var/www/aaa.com/ ,错误页面在静态网站路径中。网站使用SSL证书加密,证书路径为:/var/www/aaa.com/crt/,配置图床地址为https://pic.aaa.com。则可以参考配置如下。

server {
  listen 80;
  server_name www.aaa.com aaa.com;
  root /var/www/aaa.com/;
  index index.html index.htm;

  location ~* \.(gif|jpg|png)$ {
    root https://pic.aaa.com;
  }
}
server {
  listen 443;
  server_name www.aaa.com aaa.com;
  root /var/www/aaa.com/;
  index index.html index.htm;

  location ~* \.(gif|jpg|png)$ {
    root https://pic.aaa.com;
  }

  ssl on;
  ssl_certificate /var/www/aaa.com/crt/aaa.com.crt;#证书路径
  ssl_certificate_key /var/www/aaa.com/crt/aaa.com.key;#证书密钥
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; #TLS协议
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#SSL加密套件
  ssl_prefer_server_ciphers on;
}

如果配置http重定向至https可以修改80端口的虚拟主机为以下二选1:

server {
    listen       80;
    server_name  www.aaa.com aaa.com;
    rewrite ^(.*) https://$host$1 permanent;
}

server {
    listen 80;
    server_name tuhongwei.com www.tuhongwei.com;
    return 301 https://$host$1 permanent;
}

Nginx 配置端口代理

端口代理即nginx代替客户端访问本地端口服务,至少需要提供以下参数:

  1. 网站监听端口listen
  2. 虚拟主机名server_name
  3. 反向代理的地址proxy_pass

假设在本地有监听服务在http://127.0.0.1:1234,该服务需要获取远程IP,获取远程cookies。虚拟主机名为 aaa.com


server {
  listen 80;
  server_name aaa.com;

  location / {
    proxy_pass http://127.0.0.1:1234;
    proxy_set_header HOST $host; # 将主机名添加到请求头
    proxy_set_header X-Forwarded-Proto $scheme; # 将协议类型添加到请求头
    proxy_set_header X-Real-IP $remote_addr; # 将远程客户端IP发送至请求头
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 将http拓展头添加至请求头 
  }
}

若要进行TLS访问,可以如上一条所示添加443端口的虚拟主机监听。

Nginx 文件服务器

nginx的文件服务器同静态网站,其直接指向虚拟主机的主目录文件。配置方法:

server {
	listen       80;
	server_name  file.aaa.com;
	#root     /usr/share/nginx/html;
	root     /;
  autoindex on;# 显示目录
	autoindex_exact_size on;# 显示文件大小
  autoindex_localtime on;# 显示文件时间
}