## 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既不会继承也不会影响其他部分。