Nginx 有几个模块,实际项目中经常使用,但在编译安装的时候默认是不安装的,需要加入命令选项。当然,如果刚开始没有安装,后续也是可以再次编译替换的。具体选项配置可以参阅官网文档:http://nginx.org/en/docs/configure.html
1 2 3 4 5 6 7 8 9 10 11 12
| --with-http_ssl_module
--with-http_v2_module
--with-http_sub_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_stub_status_module
|
以上几个模块默认都是不安装的。如果目前已经存在线上运行的 Nginx 服务,并且缺少上面的某些模块,那么再次下载和线上版本一致的 Nginx,然后重新编译(不需要安装),把需要用到的模块编译进去,然后替换源文件(nginx)即可。(如果线上版本较低,顺带想要升级,可以直接编译安装,覆盖原来的,注意 配置备份)。
这里就以更新为主,新安装的比较简单,编译完成后直接安装(make install)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| sudo apt install libpcre3 libpcre3-dev zlib1g-dev libssl-dev build-essential -y
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzvf nginx-1.24.0.tar.gz cd nginx-1.24.0
./configure --prefix=/usr/local/nginx \ --with-http_sub_module \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_gunzip_module \ --with-http_gzip_static_module
make
|
经过以上步骤后,在该目录下(.../xx/nginx-1.24.0
)会多出来一个 objs
的目录,该目录下有一个 nginx
文件,这个就是新编译可执行文件。现在有两种选择:备份目前正在使用的 .../sbin/nginx
文件,然后拷贝新生成的 nginx
到该目录下;或者直接替换掉旧版本(最好版本一致时这样做)。
二、命令
1 2 3 4 5 6
| ./nginx -s stop
./nginx -t
./nginx -s reload
|
三、配置
Nginx 的 location
块中可以使用两种配置方式。一种是 root
,一种是 alias
。注意,alias 只能在 location 中使用。
1 2 3 4 5 6 7 8 9
| ... location /share { root /data; }
location /test { alias /data/share/; } ...
|
上面的配置可以访问:http://localhost:port/share
、http://localhost:port/test
查看,两种配置方式在地址栏访问路径不同,但是访问的结果却是相同的。那么我们可以得到一个结论,alias 后跟的是资源的绝对路径,而 root 实际访问时会自动加上 location 后的目录。
location 后只是使用 http 访问时的别名。
另外根据官方文档的示例,root 方式可以不用在路径最后添加 /
;alias 则必须添加。
2. 自定义配置
conf/nginx.conf1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
log_format main '$time_iso8601|$remote_addr|$remote_user|$request_method|$uri|' '$status|$request_time|$request_length|$body_bytes_sent|$bytes_sent|' '$connection|$http_x_forwarded_for|$upstream_addr|$upstream_status|' '$upstream_response_time|$args|$http_referer|$http_user_agent'; access_log logs/access.log main;
upstream server_name { server localhost:8080 weight=2; server localhost:8081; server localhost:8082; }
server { listen 81; server_name localhost;
location / { root /usr/share/nginx/html/dist; try_files $uri $uri/ /index.html; index index.html index.htm; }
location /api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8888/; } }
server { listen 80; server_name localhost; error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
location / { proxy_pass http://server_name/; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
location ~ .*\.(css|gif|ico|jpg|js|png|ttf|woff)$ { expires 24h; root D:/image/; proxy_store on; proxy_store_access user:rw group:rw all:rw; proxy_temp_path D:/image/; proxy_redirect off;
proxy_set_header Host 127.0.0.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; cl ient_max_body_size 10m; client_body_buffer_size 1280k; proxy_connect_timeout 900; proxy_send_timeout 900; proxy_read_timeout 900; proxy_buffer_size 40k; proxy_buffers 40 320k; proxy_busy_buffers_size 640k; proxy_temp_file_write_size 640k; if ( !-e $request_filename) { proxy_pass http://127.0.0.1:80; } } }
server { listen 8181; server_name localhost;
location /share { root /data; autoindex on; autoindex_exact_size off; autoindex_localtime on; default_type text/plain; charset UTF-8; } } }
|
若修改配置文件后再次启动报错:[emerg]: bind() to 0.0.0.0:80 failed (80: Address already in use)
执行命令:sudo fuser -k 80/tcp
,然后重新启动 ./nginx
四、附
1. 常用的 nginx 全局变量
变量名称 |
含义 |
$args |
请求行中的参数。 |
$content_length |
请求头中的Content-length字段。 |
$content_type |
请求头中的Content-Type字段。 |
$document_root |
当前请求在root指令中指定的值。 |
$host |
请求主机头字段,否则为服务器名称。 |
$http_user_agent |
客户端agent信息 |
$http_cookie |
客户端cookie信息 |
$limit_rate |
这个变量可以限制连接速率。 |
$request_body_file |
客户端请求主体信息的临时文件名。 |
$request_method |
客户端请求的动作,通常为GET或POST。 |
$remote_addr |
客户端的IP地址。 |
$remote_port |
客户端的端口。 |
$remote_user |
已经经过Auth Basic Module验证的用户名。 |
$request_filename |
当前请求的文件路径,由root或alias指令与URI请求生成。 |
$query_string |
与$args相同。 |
$scheme |
HTTP方法(如http,https)。 |
$server_protocol |
请求使用的协议,通常是HTTP/1.0或HTTP/1.1。 |
$server_addr |
服务器地址,在完成一次系统调用后可以确定这个值。 |
$server_name |
服务器名称。 |
$server_port |
请求到达服务器的端口号。 |
$request_uri |
包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。 |
$uri |
不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。 |
$document_uri |
与 $uri 相同。 |