这是本文档旧的修订版!
NGINX 实践
for Nginx v1.20.1 or Later
本实践崇尚快速落地部署,因此整理一些最小化的安装及部署配置,通常情况下,将配置文件复制过去修改部分参数就可以使用。
最小化 nginx 静态站配置
server { listen 80; listen [::]:80; server_name www.xyz.com; # server_name _ 未提供HOST头部时使用的站点 root /var/www/app-path/ index index.html location / { } }
通常指定网站根目录及首页即可
Nginx + 反向代理 + SSL
server { listen 80; listen [::]:80; server_name www.xxx.com; return 301 https://$server_name:443$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name c.ezua.com; charset utf-8; # ssl配置 ssl_protocols TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_ecdh_curve secp384r1; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; ssl_certificate /etc/letsencrypt/live/www.xxx.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.xxx.com/privkey.pem; root /usr/share/nginx/html; location / { proxy_ssl_server_name on; proxy_pass https://bing.imeizi.me; proxy_set_header Accept-Encoding ''; sub_filter "bing.imeizi.me" "www.xyz.com"; sub_filter_once off; } location /long-long-path { proxy_redirect off; proxy_pass http://127.0.0.1:20860; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; # Show real IP in v2ray access.log proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
其中:
- 第一个 location 是通用路径反代,获取之后数据之后对部分内容进行替换。
sub_filter
指令将获取到的部分内容进行替换 - 使用了高级功能的一些网站可能需要进行传递 Upgrade,以及 Connection 头部,如:WebSocket
- X-Real-IP 多用于代理服务器,向真实服务器传递远程客户端IP地址
- Server Listen 80 端口,并使用301重定向
- X-Forwarded-For XFF头不是标准HTTP头部
- 第二个 location 可以设置的长一点,这样可以把该路径隐藏在转发的网站中
Nginx + PHP-fpm + SSL
预装PHP及PHP-FPM环境
配置PHP fastcgi 转发
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.c.ezua.com; charset utf-8; # ssl配置 ssl_protocols TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_ecdh_curve secp384r1; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; ssl_certificate /etc/letsencrypt/live/www.c.ezua.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.c.ezua.com/privkey.pem; #root /var/www/html/; root /var/www/dokuwiki/; index index.php; location ~ \.(php|php5).* { fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/var/run/php-fpm/www.sock; include fastcgi_params; } location / { } }
在配置方面与普通的反代没有区别, fastcgi_pass
除了可以用unix sockets方式转发外,还可以使用 tcp://127.0.0.1:9000
的形式配置,要看 php-fpm.conf
配置文件里面监听的是socket还是端口
Nginx + 负载均衡
暂未涉及
Nginx + 正向代理
将 Nginx 作为一个HTTP代理服务器使用
最小化配置
# Proxy-serv.conf server { listen 18081; server_name _; # other settings for example ssl location / { resolver 8.8.8.8; #DNS Server used proxy_pass $scheme://$host$request_uri; proxy_set_header HOST $host; #proxy_buffers 256 4k; #proxy_max_temp_file_size 0k; #proxy_connect_timeout 30; #proxy_send_timeout 60; #proxy_read_timeout 60; #proxy_next_upstream error timeout invalid_header http_502; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/html; } }
注意:被注释掉的部分都是可以不需要的,是配置代理服务器的一般参数
测试正向代理
设置代理,如须在系统中一直启用,须在启动文件,诸如:~/.bashrc
等文件中添加以下指令
export http_proxy=$IP:$PORT export https_proxy=$IP:$PORT
使用代理下载数据或者获取参数
$ curl --proxy=$IP:$PORT request_url
注:如果命令中包含引号,&等符号,须用双引号(单引号)将整个参数包裹,或者进行转义,否则命令会被截断。至于包裹符号用单引号还是双引号,取决于命令中包含的符号,如果命令中包含单引号,则用双引号包裹,反之则用单引号包裹。
Nginx location 及访问控制
关于 location 匹配规则
语法规则为: location [=|~|~*|^~] /uri/ { … }
- = /path... 为精确匹配
- ^~ /path... 匹配以/path开关的路径。location中的规则无需进行url编解码,当请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)
- ~ expr... 匹配包含expr的路径,可用正则表达式
- ~* expr... 同上,但不区分大小写
- !~ expr 与 !~* expr... 反向匹配,匹配不包含指定路径的规则
- / 通用路径匹配,最终路径,所有路径均未匹配时,调用规则
规则匹配顺序
- = /PATH ..., 精确匹配
- ^~ /PATH ..., 首位匹配
- 按照配置文件进行匹配
访问控制
禁止客户端访问指定路径,以下配置节禁止客户端访问/conf/, /bin/, /inc, /vendor/ 等目录
location ~ /(conf|bin|inc|vendor)/ { allow 192.168.1.0/24; deny all; }
针对指定路径返回指定状态,以下配置将路径/usr/c03f883c.db设置为404未找到
location ^~ /usr/c03f883c.db { return 404; }
对指定路径进行HTTP BASIC认证
location / { auth_basic "访问需要认证"; auth_basic_user_file /etc/nginx/conf.d/htpasswd; #autoindex on; }
需要注意认证文件位置,否则会一直无法认证
使用以下命令生成所需的PASSWORD文件
printf "hsiaotien:$(openssl passwd -crypt 123456)\n" >> conf/htpasswd #用户名:hsiaotien, 密码:123456 #注意:密码不要超过8位,否则可能无法工作。也因此在有条件的情况下,不要使用BASIC认证方式