## Nginx常用命令

Nginx启动时会创建多个进程,其中一个是master进程,另外的是worker进程。以下是一些常用的Nginx命令:

- 启动Nginx:`nginx -h nginx [-c /etc/nginx/nginx.conf]`。其中`-c`参数用于指定配置文件路径。

- 停止Nginx:`nginx -s stop`或`nginx -s quit`,或者使用`kill -QUIT pid`从容停止,`kill -TERM pid`快速停止,`kill -9 pid`强制停止。

- 重启Nginx:`nginx -s reload`或`nginx -s reopen`,或者使用`kill -HUP pid`。

- 日志文件拆分:`kill -USR2 pid`。

- 平滑升级Nginx版本:`kill -WINCH pid`。

- 从容关闭工作进程:`nginx -s quit`或`nginx -s close`。

## Nginx负载均衡与反向代理

#############负载均衡#############

Nginx支持多种负载均衡方式:

1. **手动负载均衡**:适用于一些下载网站、视频网站等,选择下载服务器和路线。

2. **DNS轮询方式**:给一个域名配置多个A记录ip,请求被随机打到后面的一个ip上面。缺点是故障恢复时间周期长,因为各运营商将DNS放入缓存中,全部生效要几小时,期间所有访问这台服务都会报错;不能分配负载占比。

3. **四/七层负载均衡设备**:硬件有F5,软件有四层LVS,七层Nginx、Haproxy。其中,Nginx只支持http、邮件协议。

#############反向代理#############

Nginx的反向代理配置示例如下:

以下是重构后的 Nginx 配置文件:

```nginx

http {

include mime.types;

default_type application/octet-stream;

upstream php_server_pool {

ip_hash; # 默认轮询,这里采用 ip hash 的路由方式

# 可以是域名、ip、端口

server 192.168.1.10:80 weight=4 max_fails=2 fail_timeout=30s;

# backup只有在非 backup 全部宕机才启用

server 192.168.1.11:80 weight=4 max_fails=2 fail_timeout=30s backup;

server 192.168.1.12:80 weight=2 max_fails=2 fail_timeout=30s down;

}

# 虚拟主机,反向代理 php_server_pool

server {

listen 80;

server_name www.yourdomain.com;

location / {

# 如果后端报错,则自动路由到下一个节点

proxy_next_upstream http_502 http_504 error timeout invalid_header;

proxy_pass http://php_server_pool;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

access_log /data1/logs/www.yourdomain.com_access.log;

}

```

以下是重构后的内容:

## 使用公网虚拟IP的方式

### 方式1:只用一个公网虚拟IP,平时指向主Nginx,如果主挂掉,备Nginx接管这个虚拟IP

在这种方式下,我们只需要一个公网虚拟IP地址,将其指向主Nginx服务器。当主Nginx服务器出现故障时,备用Nginx服务器将接管该虚拟IP地址,继续提供服务。

### 方式2:用两个公网虚拟IP,如果其中一个Nginx挂掉,接管挂掉的Nginx的IP

这种方式下,我们需要两个公网虚拟IP地址。当主Nginx服务器出现故障时,备用Nginx服务器将接管其中一个虚拟IP地址,继续提供服务。这样可以提高服务的可用性和负载均衡。

## Nginx rewrite重定向相关指令

在Nginx配置中,我们可以使用`if`、`rewrite`、`set`、`return`和`break`等指令来实现重定向功能。

### if指令

语法:`if (condition) {}`

作用域:`server`、`location`

注意事项:不支持嵌套,不支持`&&`、`||`连接多个条件。条件可以为变量。

示例:

```nginx

if ($http_user_agent ~ MSIE) { rewrite ^ (. *) $ /msie/$1 break; }

if ($http_cookie ~* "id=([^;] +)(?:;I$)") { set $id $1; }

if ($request_method POST) { return 405; }

```

### return指令

语法:`return code`

作用域:`server`、`location`、`if`

示例:

```nginx

location ~ .*\.(sh|bash)?$ { return 403; }

```

### rewrite指令

语法:`rewrite regex replacement flag`

作用域:`server`、`location`、`if`

flag说明:

- `last`:相当于Apache里的[L]标记,表示完成重写;

- `break`:本条规则匹配完成后,终止匹配,不再匹配后面的规则;

- `redirect`:返回302临时重定向,浏览器地址栏会显示跳转后的URL地址;

- `permanent`:返回到301永久重定向,浏览器地址栏会显示跳转后的URL地址。

示例:

```nginx

rewrite ^/old-url(.*)$ /new-url$1 permanent;

```

以下是根据提供的内容重构后的Nginx配置文件:

```nginx

$document_uri $host $http_user_agent $http_cookie $limit_rate $request_body_file $request_method $remote_addr $remote_port $remote_user $request_filename $request_uri $query_string $scheme $server_protocol $server_addr $server_name $server_port $uri

禁止访问以 /data 开头的文件:

location ~ ^/data {

deny all;

}

设置浏览器缓存时间

location ~ .*(gif|png|jpg|jpeg) {

expires 1d;

}

location ~ .*(js|css) {

expires 1h;

}

多目录转成参数

if ($host -* (. *)\.domain\.com) {

set $sub_name $1;

rewrite ^/sort/ (\d+)/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;

}

```

Nginx模块开发主要包含以下模块:main(全局配置)、server(虚拟主机配置)、upstream(反向代理、负载均衡配置)和location(目录匹配配置)。location继承server的指令,server继承main的指令,upstream既不会继承也不会影响其他部分。