前言
Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器
安装
- yum安装
- 源码安装
yum安装
以CentOS6.5 为例
设置yum源, vi etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/6/x86_64/
gpgcheck=0
enabled=1
设置代理 vi /etc/yum.conf
(公网情况下可忽略)
proxy=代理IP
命令安装
sudo yum install nginx
源码安装
下载nginx源码
wget http://nginx.org/download/nginx-1.13.12.tar.gz
tar -xvzf nginx-1.13.12.tar.gz
cd nginx-1.13.12
./configure --prefix=/usr/local/nginx
make
sudo make install
模块扩展安装
在安装nginx的时候, 往往会有配置需求, 同时如果我们想要安装一个第三方的模块, 则需要 --add-module 进行设置. 例如下面要求
已知第三方模块
- nginx-http-concat 前端JS,CSS文件合并资源
git clone https://github.com/alibaba/nginx-http-concat.git
# nginx 编译
./configure --add-module=/path/to/nginx-http-concat
make
sudo make install
源码重新编译
有时候, 我们需要给现有的nginx加入一些扩展模块. 那么就需要通过对应的版本的源代码, 重新configure, 具体步骤如下:
# 老的nginx 执行 nginx -V
/usr/local/nginx/sbin/nginx -V
# nginx 同一版本下的源码 执行 configure, 附加新的模块
./configure --prefix=/usr/local/nginx --add-module=/path/to/nginx-http-concat
# 编译
make
# 备份老的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
# 将objs目录下产生新的 nginx 覆盖老的nginx
cp objs/nginx /usr/local/nginx/sbin/nginx
# 如果出现文件打开错误,运行下面这句
mkdir -p /dev/shm/nginx_temp/client_body
# 测试
sudo /usr/local/nginx/sbin/nginx -t
# 平滑重启nginx
sudo /usr/local/nginx/sbin/nginx -s reload
nginx配置
基本配置
user www www; # 用户名 用户组
http {
# http服务设置
# 引入多个mime类型
include mime.types;
# 启用gzip压缩
gzip on;
# 错误页面重定向
error_page 400 401 402 403 404 405 408 410 412 413 414 415 500 501 502 503 506 = /error.html;
# 引入额外配置
include vhosts/*.conf;
}
虚拟主机配置
用户请求 host为 liylblog.com 主机时, 将访问 root 目录下的资源
server {
listen 80;
server_name liylblog.com;
root /home/www/liyblog/html;
}
路由匹配设置
server {
listen 80;
server_name liylblog.com;
root /home/www/liyblog/html;
# 最长优先匹配, 所以 / 为最后匹配规则
location / {
# 设置默认的index文件名称
index index.html index.html;
try_files $uri $uri/;
}
# 以.php结尾或者 .php/xxx 结尾的路径, ~ 表示大小写敏感
location ~ \.php($|/) {
# 规则
}
# 大小写敏感, 以 /img/ 开头的资源路径将被匹配
# /img/logo.png
# /img/avatar.png
location ^~ /img/ {
# 规则
}
# 大小写敏感, 匹配 /api 资源
location ^~ = /api {
f( !-e $request_filename )
{
rewrite ^/api /api/ last;
}
}
}
nginx 配置负载均衡
server {
listen 80;
server_name liylblog.com;
location / {
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_pass http://proxy_stream;
}
}
# 多台机器代理, 背后可能是其它web服务器
upstream proxy_stream {
server 192.168.1.1 max_fails=3 fail_timeout=30s;
server 192.168.1.2 max_fails=3 fail_timeout=30s;
}
反向代理
PHP-FPM代理
server {
listen 80;
server_name liylblog.com;
root /home/www/liyblog/html;
access_log /usr/local/nginx/logs/liylblog.access.log;
error_log /usr/local/nginx/logs/liylblog.error.log;
location / {
index index.html index.htm index.php;
if (!-e $request_filename) { ## if 后面必须有空格
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
# 大小写敏感, 匹配.php后缀结尾或者 .php/ 结尾的路径
location ~ \.php($|/) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
client_max_body_size 100M;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
include fastcgi_params;
}
}
Node.js 代理
server {
listen 80;
server_name liylblog.com;
root /home/www/liyblog/html;
access_log /usr/local/nginx/logs/liylblog.access.log;
error_log /usr/local/nginx/logs/liylblog.error.log;
location @proxy {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:7001;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_key sfs$request_uri$scheme;
}
location / {
autoindex on;
index index.html index.htm;
# 尝试访问地址 例如, 访问 $root/foo, $root/foo/index.html, $root/foo/index.htm, $proxy/foo;
try_files $uri $uri/ @proxy;
}
}
小结
nginx 是一个优秀的代理服务器, 还有很多未知的知识亟待去挖掘