您的位置:首页 > 路由器知识路由器知识

2024年Nginx小白入门到精通:从配置到性能优化的100个实用技巧

2026-04-17人已围观

2024年Nginx小白入门到精通:从配置到性能优化的100个实用技巧

一、Nginx到底是个啥?新手必懂的基础知识

你可能经常听程序员大佬们提起Nginx,但它到底是个什么东西呢?简单来说,Nginx就像是你家小区的保安亭,所有外来访客(网络请求)都得先经过它,它决定谁能进、谁不能进,以及该往哪个方向走。专业点说,Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。

为什么要用Nginx呢?想象一下,如果你的网站突然火了,一下子来了1000个人访问,直接让你的应用服务器处理这么多请求,它很可能会"罢工"。这时候Nginx就派上用场了,它可以把这些请求分散到多个服务器上,就像超市开了多个收银台,不会让所有人都挤在一个地方。

Nginx最牛的地方在于它的"饭量小,干活快"——占用资源少,但能处理成千上万的并发连接。有数据显示,Nginx在普通服务器上就能轻松处理每秒5万以上的并发请求,这也是为什么国内外很多大网站都在用它,比如淘宝、京东、Netflix等。

二、手把手教你安装Nginx:比装微信还简单

2.1 Windows系统安装步骤

1. 首先去Nginx官网(http://nginx.org/)下载最新稳定版,注意看清楚是32位还是64位,别下错了版本。

2. 下载完成后是个压缩包,把它解压到你想放的地方,比如`C:\nginx`。记住这个路径,后面要用。

3. 打开命令提示符,切换到Nginx目录:`cd C:\nginx`。

4. 输入`start nginx`启动服务,这时候你可能看不到任何窗口弹出来,别慌,Nginx是在后台运行的。

5. 打开浏览器,输入`http://localhost`,如果看到"Welcome to nginx!"的页面,恭喜你安装成功了!

2.2 Linux系统安装步骤(以Ubuntu为例)

1. 打开终端,输入`sudo apt update`更新软件源。

2. 输入`sudo apt install nginx`安装Nginx,中间会问你"是否继续",输入y然后回车。

3. 安装完成后,Nginx会自动启动。你可以输入`systemctl status nginx`来检查状态,如果看到绿色的"active (running)"就说明一切正常。

4. 同样在浏览器输入服务器的IP地址,就能看到Nginx的欢迎页面了。

2.3 Mac系统安装步骤

Mac用户最简单的方法是用Homebrew:

1. 打开终端,输入`brew install nginx`。

2. 安装完成后,输入`nginx`启动服务。

3. 验证方法和上面一样,浏览器访问`http://localhost:8080`(注意Mac版默认端口是8080,不是80)。

三、核心配置文件详解:nginx.conf就这么简单

Nginx的所有功能都靠配置文件来实现,最重要的就是`nginx.conf`。这个文件就像是Nginx的"大脑",告诉它应该怎么工作。不同系统的配置文件位置 slightly 不同:

- Windows:在你解压的Nginx目录下,比如`C:\nginx\conf\nginx.conf`

- Linux:通常在`/etc/nginx/nginx.conf`

- Mac:用Homebrew安装的话在`/usr/local/etc/nginx/nginx.conf`

3.1 设置请求的根目录:root指令

`root`指令就像是给Nginx指了个方向:"嘿,用户要访问的文件都放在这个文件夹里,你去那儿找!"

举个例子:

```nginx

server {

listen 80;

server_name example.com;

root /var/www/example.com;

}

```

这表示当有人访问`example.com`时,Nginx会到`/var/www/example.com`这个目录下去找对应的文件。比如访问`example.com/index.html`,Nginx就会返回`/var/www/example.com/index.html`这个文件。

小技巧:设置根目录时,最好使用绝对路径,别用相对路径,不然Nginx可能会找不到文件。

3.2 定义路径别名:alias指令

`alias`和`root`有点像,但又不一样。如果说`root`是"整个网站的根目录",那`alias`就是"某个特定路径的别名"。

举个例子:

```nginx

location /images/ {

alias /var/pictures/;

}

```

当用户访问`example.com/images/photo.jpg`时,Nginx会实际去`/var/pictures/photo.jpg`找文件,而不是`/var/www/example.com/images/photo.jpg`。注意`alias`后面的路径最后一定要加斜杠`/`,不然可能会出错。

3.3 反向代理功能:proxy_pass指令

这是Nginx最强大的功能之一。简单说,反向代理就是"帮别人干活"——当有人请求Nginx时,它不自己处理,而是把请求转发给其他服务器,然后把结果返回给用户。

比如你有个Tomcat服务器运行在8080端口,想让用户通过80端口访问:

```nginx

location / {

proxy_pass http://localhost:8080;

}

```

这样用户访问`example.com`时,Nginx会偷偷把请求转发给`localhost:8080`,用户根本感觉不到中间多了一层Nginx。

3.4 前端路由支持:try_files指令

现在很多前端框架(比如Vue、React)都用History模式的路由,这时候刷新页面就会404。`try_files`就是来解决这个问题的。

```nginx

location / {

try_files $uri $uri/ /index.html;

}

```

这句话的意思是:先看看有没有`$uri`这个文件,没有的话看看有没有`$uri`这个目录,都没有的话就返回`/index.html`。这样刷新页面时就会交给前端路由处理,不会出现404错误了。

3.5 默认索引文件:index指令

当用户访问一个目录时,Nginx会自动寻找索引文件。`index`指令就是告诉它要找哪些文件。

```nginx

location / {

root /var/www/example.com;

index index.html index.htm index.php;

}

```

这表示当访问`example.com/`时,Nginx会先找`index.html`,如果没有就找`index.htm`,再没有就找`index.php`,都没有的话才返回403错误。

3.6 URL重写:rewrite指令

`rewrite`可以帮你把一个URL变成另一个URL,就像快递地址变更一样。比如你把网站的`/news`目录改名为`/articles`,但又不想让老用户的收藏失效:

```nginx

rewrite ^/news/(.)$ /articles/$1 permanent;

```

这样当用户访问`example.com/news/2024.html`时,会自动跳转到`example.com/articles/2024.html`,浏览器地址栏也会显示新的URL。

3.7 直接返回状态码:return指令

有时候你想直接告诉用户"这个页面不存在"或者"你没有权限访问",这时候就用`return`指令:

```nginx

location /admin/ {

return 403 "抱歉,你没有权限访问这个页面";

}

location /old-page.html {

return 301 /new-page.html;

}

```

3.8 添加响应头:add_header指令

这个指令可以给HTTP响应添加一些额外的头信息,比如设置CORS(跨域资源共享)规则,或者安全相关的头。

```nginx

location /api/ {

add_header Access-Control-Allow-Origin ;

add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

proxy_pass http://api-server:3000;

}

```

3.9 基本身份认证:auth_basic指令

如果你想给网站的某个目录加个密码保护,不让随便什么人都访问,可以用这个指令:

```nginx

location /secret/ {

auth_basic "请输入密码";

auth_basic_user_file /etc/nginx/.htpasswd;

}

```

然后你需要用`htpasswd`命令生成密码文件:`htpasswd -c /etc/nginx/.htpasswd username`,系统会提示你输入密码。

四、新手避坑清单:这些错误90%的人都会犯

1. 配置文件修改后忘记重启Nginx:修改了配置文件一定要重启或重新加载Nginx才能生效!Linux/Mac用`nginx -s reload`,Windows在命令行进入Nginx目录执行`nginx -s reload`。

2. 端口被占用问题:启动Nginx时如果提示"bind() to 0.0.0.0:80 failed",说明80端口被其他程序占用了(比如Apache或IIS)。解决办法:要么停掉占用端口的程序,要么修改Nginx的监听端口。

3. 配置文件语法错误:Nginx对配置文件的语法要求很严格,少个分号、括号不匹配都会导致启动失败。修改完配置文件后,先用`nginx -t`检查语法,显示"nginx: configuration file /etc/nginx/nginx.conf test is successful"才算没问题。

4. root和alias分不清:这两个指令很容易搞混。简单记:`root`是"根目录 + location路径",`alias`是"直接替换location路径"。

5. 权限问题:Nginx进程需要读取网站文件的权限,如果权限不足,会返回403错误。解决办法:确保Nginx运行的用户(通常是www-data或nginx)对网站目录有读取权限。

6. 日志文件过大:Nginx的访问日志和错误日志会不断变大,如果不处理,可能会占满磁盘空间。解决办法:配置日志轮转(logrotate)或者设置日志级别为warn以上。

7. 未限制并发连接:如果不对单个IP的并发连接数做限制,可能会遭遇DoS攻击。解决办法:使用limit_conn模块限制单个IP的连接数。

8. 缓存配置不当:要么完全没配置缓存,导致服务器压力大;要么缓存时间设置太长,导致用户看不到最新内容。解决办法:合理设置`expires`指令,对静态资源设置较长缓存,对动态内容不缓存或设置短缓存。

9. 未启用gzip压缩:不启用gzip会导致网页加载速度变慢,浪费带宽。解决办法:在http块添加`gzip on;`启用压缩。

10. 直接在主配置文件修改:很多新手喜欢直接修改nginx.conf,但这样不利于维护和升级。正确做法是在`/etc/nginx/conf.d/`目录下创建单独的配置文件,然后在主配置文件用`include`指令包含进来。

五、性能优化秘籍:让你的Nginx飞起来

5.1 启用gzip压缩

这是最简单也最有效的优化手段之一。启用gzip后,Nginx会把HTML、CSS、JavaScript等文本文件压缩后再发送给用户,就像把衣服压缩打包后再邮寄,能显著减少传输的数据量。

在`nginx.conf`的http块中添加:

```nginx

gzip on; 开启gzip压缩

gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 需要压缩的文件类型

gzip_min_length 1k; 文件大小超过1k才压缩

gzip_comp_level 5; 压缩级别,1-9,级别越高压缩率越高但消耗CPU越多

gzip_buffers 4 16k; 压缩缓冲区大小

gzip_http_version 1.1; 支持的HTTP版本

gzip_vary on; 向客户端表明是否使用了gzip压缩

```

配置完成后,重启Nginx,用浏览器的开发者工具查看网络请求,Response Headers中如果有`Content-Encoding: gzip`就说明配置成功了。

5.2 配置浏览器缓存

合理的缓存策略可以让用户第二次访问你的网站时,直接从本地读取部分内容,不用重新下载,既加快了访问速度,又减轻了服务器负担。

```nginx

location ~ \.(jpg|jpeg|png|gif|ico|css|js)$ {

expires 30d; 这些文件缓存30天

add_header Cache-Control "public, max-age=2592000";

}

location ~ \.(html|htm)$ {

expires 1h; HTML文件缓存1小时

add_header Cache-Control "public, max-age=3600";

}

```

注意:对于经常变动的文件,缓存时间不要设置太长;对于不常变动的静态资源(如图片、CSS、JS),可以设置较长的缓存时间。

5.3 优化连接数和工作进程

Nginx的性能很大程度上取决于工作进程数和每个进程的连接数设置。一般来说,工作进程数应该等于或略大于CPU核心数。

```nginx

worker_processes auto; 自动设置为CPU核心数

events {

worker_connections 10240; 每个工作进程的最大连接数

multi_accept on; 允许一个工作进程同时接受多个连接

use epoll; 使用epoll事件模型(Linux系统推荐)

}

```

`worker_connections`的设置要考虑到系统的打开文件限制,可以用`ulimit -n`命令查看当前限制,如果太低,需要修改`/etc/security/limits.conf`文件提高限制。

5.4 启用TCP复用

启用TCP复用可以让Nginx在一个TCP连接上处理多个HTTP请求,减少TCP握手和挥手的开销。

```nginx

http {

tcp_nopush on; 启用TCP NOPUSH选项,在数据包大小达到一定程度才发送

tcp_nodelay on; 禁用Nagle算法,减少延迟

keepalive_timeout 65; 长连接超时时间,单位秒

keepalive_requests 100; 一个长连接最多处理的请求数

}

```

5.5 配置FastCGI缓存(针对PHP网站)

如果你的网站用PHP编写,配置FastCGI缓存可以显著提高性能,减轻PHP-FPM的压力。

```nginx

http {

定义FastCGI缓存

fastcgi_cache_path /var/run/nginx-fastcgi-cache levels=1:2 keys_zone=PHP_CACHE:100m inactive=60m;

fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {

...其他配置

location ~ \.php$ {

fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

启用FastCGI缓存

fastcgi_cache PHP_CACHE;

fastcgi_cache_valid 200 302 10m; 200和302状态码缓存10分钟

fastcgi_cache_valid 404 1m; 404状态码缓存1分钟

fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

fastcgi_cache_bypass $cookie_nocache $arg_nocache $arg_comment;

fastcgi_no_cache $cookie_nocache $arg_nocache $arg_comment;

}

}

}

```

六、10个实用小技巧:让你看起来像Nginx高手

1. 快速查看Nginx版本和编译参数:`nginx -V`(大写V)可以显示Nginx的版本和编译时的参数,这在排查模块相关问题时非常有用。

2. 测试配置文件而不重启:修改配置文件后,先用`nginx -t`测试语法是否正确,避免重启后Nginx无法启动。

3. 优雅重启Nginx:`nginx -s reload`可以在不中断服务的情况下重新加载配置文件,比`systemctl restart nginx`更友好。

4. 查看Nginx进程占用的资源:`ps aux | grep nginx`可以查看Nginx进程的CPU和内存占用情况,`top -p `可以实时监控特定进程。

5. 临时关闭访问日志:如果需要临时排查问题又不想让日志干扰,可以用`nginx -s reopen`重新打开日志文件,然后删除旧日志。或者在配置文件中设置`access_log off;`临时关闭访问日志。

6. 使用map指令定义变量:map指令可以根据客户端信息定义变量,比如根据User-Agent判断是否是移动设备:

```nginx

map $http_user_agent $is_mobile {

default 0;

~mobile 1;

}

```

然后在location中就可以用`if ($is_mobile) { ... }`做不同处理。

7. 限制请求速率:防止爬虫或恶意用户过快地请求服务器:

```nginx

limit_req_zone $binary_remote_addr zone=RATE_LIMIT:10m rate=10r/s;

location / {

limit_req zone=RATE_LIMIT burst=20 nodelay;

}

```

这表示限制每个IP每秒最多10个请求,最多允许20个突发请求。

8. 根据文件类型设置不同的缓存策略:

```nginx

location ~ \.(jpg|jpeg|png|gif|ico|css|js)$ {

expires 30d;

add_header Cache-Control "public, max-age=2592000";

}

location ~ \.(html|htm)$ {

expires 1h;

add_header Cache-Control "public, max-age=3600";

}

location ~ \.(php|jsp)$ {

expires 0;

add_header Cache-Control "no-cache, no-store, must-revalidate";

}

```

9. 设置自定义错误页面:默认的Nginx错误页面太简陋,你可以自定义更友好的错误页面:

```nginx

error_page 404 /404.html;

error_page 500 502 503 504 /50x.html;

location = /404.html {

root /usr/share/nginx/html;

internal; 只允许内部访问,不允许用户直接访问

}

location = /50x.html {

root /usr/share/nginx/html;

internal;

}

```

10. 启用HTTP/2:HTTP/2比HTTP/1.1性能更好,支持多路复用等特性。启用方法很简单,在listen指令后加上`http2`:

```nginx

server {

listen 443 ssl http2; 注意需要先配置SSL

...其他SSL配置

}

```

注意HTTP/2通常需要配合SSL使用,所以你需要先配置HTTPS。

七、5个常见问题解决:遇到问题不用慌

问题1:Nginx启动失败,提示"bind() to 0.0.0.0:80 failed (98: Address already in use)"

这是最常见的问题,意思是80端口被其他程序占用了。

解决步骤:

1. 找出占用80端口的程序:`sudo lsof -i :80` 或 `sudo netstat -tulpn | grep :80`。

2. 根据输出结果,结束占用端口的程序:`sudo kill -9 <进程ID>`。

3. 如果是Apache占用了端口,可以彻底禁用它:`sudo systemctl disable --now apache2`。

4. 如果你想保留占用端口的程序,可以修改Nginx的监听端口,比如改成8080:`listen 8080;`。

问题2:访问网站时出现403 Forbidden错误

403错误通常是权限问题,Nginx没有权限访问网站文件。

解决步骤:

1. 检查Nginx配置文件中的网站根目录是否正确。

2. 检查网站目录的权限:`ls -ld /var/www/example.com`。

3. 检查网站文件的权限:`ls -l /var/www/example.com`。

4. 确保Nginx运行的用户(通常是www-data或nginx)对网站目录和文件有读取权限。

5. 修复权限命令:`sudo chown -R www-data:www-data /var/www/example.com`(更改所有者)和`sudo chmod -R 755 /var/www/example.com`(设置权限)。

6. 另外,如果目录中没有index文件,也会导致403错误,确保目录下有index.html或其他索引文件。

问题3:Nginx配置了反向代理,但访问时出现502 Bad Gateway错误

502错误表示Nginx无法连接到后端服务器。

解决步骤:

1. 检查后端服务器是否正常运行:`curl http://localhost:8080`(假设后端服务在8080端口)。

2. 如果后端服务没运行,先启动后端服务。

3. 如果后端服务正常运行,检查Nginx配置中的`proxy_pass`是否正确,比如IP、端口是否写错。

4. 检查后端服务是否只监听了localhost,如果是,从外部是无法访问的,需要修改后端服务监听0.0.0.0。

5. 检查防火墙是否阻止了Nginx访问后端服务的端口。

6. 查看Nginx错误日志获取更多信息:`tail -f /var/log/nginx/error.log`。

问题4:启用HTTPS后,浏览器提示证书不安全

这通常是因为使用了自签名证书或者证书配置不正确。

解决步骤:

1. 如果你是测试环境,可以在浏览器中手动信任自签名证书(不推荐生产环境使用自签名证书)。

2. 生产环境应该使用可信机构颁发的证书,比如Let's Encrypt提供免费证书。

3. 检查SSL配置是否正确,确保`ssl_certificate`指向正确的证书文件,`ssl_certificate_key`指向私钥文件。

4. 确保证书包含完整的证书链,如果缺少中间证书,也会导致浏览器提示不安全。

5. 可以使用SSL测试工具(如SSL Labs的SSL Test)检查证书配置是否正确。

问题5:Nginx访问日志中出现大量404错误,但实际页面存在

这通常是URL大小写敏感或路径配置问题导致的。

解决步骤:

1. Linux系统下,文件和目录名是大小写敏感的,Windows和Mac默认不敏感。如果你的网站是从Windows迁移到Linux的,可能会出现这个问题。

2. 检查请求的URL和实际文件路径的大小写是否一致。

3. 检查Nginx配置中的`location`指令是否正确,特别是使用正则表达式时。

4. 如果使用了`rewrite`指令,检查重写规则是否正确,是否有循环重写的情况。

5. 启用Nginx的debug日志,获取更详细的信息:在`error_log`指令中添加`debug`级别,然后重启Nginx。

八、长期使用体验:Nginx真的有那么神吗?

我用Nginx已经有8年了,从最开始的个人博客到后来公司的生产环境,Nginx一直是我的首选Web服务器。说实话,它给我的最大印象就是"稳如老狗"——一旦配置好,基本可以忘了它的存在,很少出问题。

记得有一次,我们的网站突然流量暴涨,服务器负载一下子上去了。当时我有点慌,赶紧登录服务器一看,Nginx还在稳稳地工作,只是后端的应用服务器有点扛不住。我马上在Nginx上启用了缓存,又简单配置了一下负载均衡,把流量分散到备用服务器上,几分钟就稳住了局面。要是当时用的是其他Web服务器,可能就没这么容易解决了。

Nginx的文档非常完善,社区也很活跃,基本上你遇到的任何问题,都能在网上找到解决方案。而且它的模块非常丰富,你能想到的Web服务器功能,它几乎都能实现,从简单的静态文件服务到复杂的负载均衡、反向代理、缓存、压缩、安全防护等等。

当然,Nginx也不是完美的。它的配置文件虽然强大,但对新手来说还是有点复杂,需要花时间学习。而且有些高级功能需要手动编译模块,不像Apache那样可以直接通过apt或yum安装模块。但话说回来,这些小缺点和它的优点比起来,根本不值一提。

总的来说,Nginx是一个"你给它多少资源,它就给你多少回报"的软件。如果你只是简单用用,它很简单;如果你想深入优化,它也有足够的深度让你折腾。对于任何需要搭建Web服务的场景,我都会毫不犹豫地推荐Nginx。

九、新手必学的5个高级功能

9.1 负载均衡:让多台服务器一起干活

当你的网站流量越来越大,一台服务器扛不住的时候,负载均衡就派上用场了。Nginx可以把请求分发到多台服务器上,提高网站的并发处理能力和可用性。

基本配置示例:

```nginx

http {

定义上游服务器组

upstream backend_servers {

server backend1.example.com weight=5; weight表示权重,数字越大,被分配到的请求越多

server backend2.example.com;

server 192.168.0.100:8080 backup; backup表示这是备用服务器,只有其他服务器都不可用时才启用

server 192.168.0.101:8080 max_fails=3 fail_timeout=30s; 失败3次后,30秒内不再使用这台服务器

}

server {

listen 80;

server_name example.com;

location / {

proxy_pass http://backend_servers; 转发请求到上游服务器组

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_set_header X-Forwarded-Proto $scheme;

}

}

}

```

9.2 SSL/TLS配置:让网站更安全

现在的网站都应该启用HTTPS,不仅更安全,还能提高搜索引擎排名。下面是一个比较安全的SSL配置:

```nginx

server {

listen 80;

server_name example.com www.example.com;

return 301 https://$host$request_uri; 把HTTP请求重定向到HTTPS

}

server {

listen 443 ssl http2;

server_name example.com www.example.com;

SSL证书配置

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

SSL优化配置

ssl_protocols TLSv1.2 TLSv1.3; 只支持安全的TLS协议版本

ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m; 启用SSL会话缓存

ssl_session_timeout 10m; SSL会话超时时间

ssl_session_tickets on; 启用会话票据

ssl_stapling on; 启用OCSP Stapling

ssl_stapling_verify on; 验证OCSP Stapling响应

resolver 8.8.8.8 8.8.4.4 valid=300s; DNS解析器,用于OCSP Stapling

resolver_timeout 5s;

HSTS配置,告诉浏览器总是使用HTTPS访问

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

其他安全相关的响应头

add_header X-Content-Type-Options nosniff;

add_header X-Frame-Options SAMEORIGIN;

add_header X-XSS-Protection "1; mode=block";

网站内容配置

location / {

root /var/www/example.com;

index index.html;

}

}

```

9.3 URL重写高级技巧:实现复杂的URL跳转

URL重写不仅可以实现简单的跳转,还能实现很多复杂的功能,比如伪静态、隐藏文件扩展名等。

示例1:实现伪静态URL(把`/article.php?id=123`变成`/article/123.html`)

```nginx

rewrite ^/article/(\d+)\.html$ /article.php?id=$1 last;

```

示例2:隐藏PHP文件扩展名(访问`/about`实际上访问`/about.php`)

```nginx

location / {

try_files $uri $uri/ $uri.php$is_args$args;

}

```

示例3:根据用户设备跳转到不同页面

```nginx

location / {

if ($http_user_agent ~ "(mobile|android|iphone|ipad|ipod)") {

rewrite ^/$ /mobile.html break;

}

桌面用户继续访问原来的页面

}

```

9.4 安全防护:抵御常见的Web攻击

Nginx可以通过一些配置来增强网站的安全性,抵御常见的Web攻击。

示例1:防止SQL注入和XSS攻击

```nginx

location / {

过滤SQL注入关键字

if ($request_uri ~ "union.select.\(") { return 403; }

if ($request_uri ~ "union.all.select.") { return 403; }

if ($request_uri ~ "concat.\(") { return 403; }

过滤XSS攻击关键字

if ($request_uri ~ "