安装

###ubuntu sudo apt-get install nginx

编译安装

waiting (可以加入其它模块)

配置文件

  • /etc/nginx //所有的配置文件
  • /etc/nginx/sites-available //sites-available存放所有配置文件,无论是非启用
  • /etc/nginx/sites-enabled //软链接到sites-available,这里的符号链接代表启用
  • /var/log/nginx //日志
  • /etc/init.d/ //该目录下有启动脚本
  • /usr/share/nginx/www //默认的虚拟主机的目录
  • /usr/sbin/nginx //启动文件

匹配语法

location匹配命令可以参考: nginx location匹配规则

location 优先级:

  1. =前缀的指令严格匹配这个查询。如果找到,停止搜索。
  2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
  3. 正则表达式,在配置文件中定义的顺序。
  4. 如果第3条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。

例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
location  = / {
  # 只匹配"/".
  # [ configuration A ]
}
location  / {
  # 匹配任何请求,因为所有请求都是以"/"开始
  # 但是更长字符匹配或者正则表达式匹配会优先匹配
  # [ configuration B ]
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
  # [ configuration C ]
}
location ~* .(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求.
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
  # [ configuration D ]
}

日常管理

  • sudo /etc/init.d/nginx start //apt安装的启动方式
  • sudo /etc/init.d/nginx restart //重启

用例

一个静态文件服务器

1
2
sudo vim /etc/nginx/sites-available/static_server
sudo ln -s /etc/nginx/sites-available/static_server /etc/nginx/sites-enabled
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
:::text

server {
        client_max_body_size 4G;
        listen  80;  ## listen for ipv4; this line is default and implied
        #server_name static.test.sdk.iwplay.com.tw;
	     root /home/wwj/static_dir; #如果restart nginx没有生效,清理掉/etc/nginx/sites-enabled目录下的default文件
	     location / {
               #auth_basic   "Restricted";  #认证模块
               #auth_basic_user_file /etc/nginx/pass_file;
               autoindex on; #显示索引
               autoindex_exact_size on; #显示大小
		       autoindex_localtime on;  #显示时间
        }

}

添加认证用户:

1
2
3
4
:::text
sudo apt-get install apache2-utils
sudo touch /etc/nginx/pass_file
sudo htpasswd -c -d /etc/nginx/pass_file wwj718

反向代理

假设我们的网站跑在5000端口(flask demo)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
:::text
server {
        listen 80;             #端口
        server_name blog.just4fun.site;   #访问域名
        #root /home/bob/dylan/;
        access_log /tmp/access.log;
        error_log /tmp/access.log;
        location / {
                proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (!-f $request_filename) {
                        proxy_pass http://127.0.0.1:5000;  #这里是内网应用的端口
                        break;
                }
        }
}

我们也时常反向代理到内网的服务器上,诸如: proxy_pass http://192.168.100.2;

如果内网服务器上有多个网站(server_name),那么外层反向代理服务器需要先把server_name导向内网ip,然后内网服务器的nginx来处理具体请求,server_name写了两次。内网的配置不受影响

流媒体

ps:目前版本的nginx好像支持视频流,或者自己编译添加视频模块

目前 WEB 上主流的视频直播方案有 HLS(HTTP Live Streaming) 和 RTMP,移动 WEB 端目前就只有 HLS 能用

docker镜像

docker

我们可以借助docker来使用使用nginx,借助-v参数,可将宿主机的目录映射到docker里,这样一来网站目录和配置文件都不是问题

sudo docker run -it -p 80:80 -v `pwd`/www:/www -v `pwd`/config:/etc/nginx/sites-enabled  -v `pwd`/logs:/var/log/nginx dockerfile/nginx

解释:

  • -v `pwd`/www:/www,将当前路径下的www目录设置为/www,和server配置的路径对应
  • -v `pwd`/logs:/var/log/nginx,nginx运行时产生的日志
  • -v `pwd`/config:/etc/nginx/sites-enabled,server文件的本地路径,映射到docker容器的nginx配置路径。config目录下放一个文件,名为server,Nginx静态网站配置文件,内容为
1
2
3
4
5
6
7
8
9
:::text
server {
        listen 80;

        root /www;
        index index.html index.htm;

        server_name localhost;
}

参考在Docker下部署Nginx

相关项目

server-configs-nginx

Nginx HTTP server boilerplate configs

nginx-rtmp-module

NGINX-based Media Streaming Server

nginx-boilerplate

Awesome Nginx configuration template

openresty

Turning Nginx into a Full-Fledged Scriptable Web Platform (高效)

ngxtop

Real-time metrics for nginx server

nginxparser

Parses nginx configuration with Pyparsing

Same as other serialization modules also you can export configuration with dump and dumps methods.

VeryNginx

功能强大且拥有对人类友好界面的Nginx,提供防火墙,自定义行为,和统计功能

如果你不想安装 OpenResty,或者你已经有了一个正在工作的 Nginx,你也可以自己手动为 Nginx 编译安装这些模块

遇到问题及解决方案

  • Q1:you should increase server_names_hash_bucket_size: 32
    • A: 在配置文件(/etc/nginx/nginx.conf)的http{}段增加一行配置 : server_names_hash_bucket_size 64;

重定向到https

1
2
3
4
5
server {
  listen 80;
  server_name scratch3v3.codelab.club;
  rewrite ^(.*) https://scratch3v3.codelab.club;
}

tips

  • 检查配置: sudo nginx -t

#参考