Nginx 学习笔记
2017年06月10日
基本操作
Mac 上安装 Nginx:
brew install nginx
启用 Nginx(可修改此配置文件):
sudo nginx -c /usr/local/etc/nginx/nginx.conf
Mac 上 Log 文件地址:
/usr/local/var/log/nginx
停止 nginx:
ps -ef | grep nginx
kill -QUIT [主进程号]
确认配置文件语法是否正确:
sudo nginx -t -c /usr/local/etc/nginx/nginx.conf
如果正确,会显示以下提示信息:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
平滑重启:
sudo kill -HUP [主进程号]
Error log path:
/usr/local/var/log/nginx
http basic auth
1. 生成密码
1printf "your_username:$(openssl passwd -crypt your_password)\n" >> conf/passwd
2. 配置
1location /kibana/ { 2 auth_basic "closed site"; 3 auth_basic_user_file conf/passwd; 4 rewrite ^/kibana/(.*) /$1 break; 5 proxy_pass http://localhost:5601; 6 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 7 proxy_set_header X-Real-IP $remote_addr; 8}
Linux 安装配置
配置时指定安装目录为/usr/local/nginx
,且开启 https 解析。
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make
make install
开启 nginx:
./nginx -c /usr/local/nginx/conf/my.conf
下面是目前服务器的一些配置:
1worker_processes 1; 2 3events { 4 worker_connections 1024; 5} 6 7http { 8 include mime.types; 9 default_type application/octet-stream; 10 11 sendfile on; 12 13 keepalive_timeout 65; 14 15 server { 16 listen 80; 17 listen 443 ssl; 18 server_name localhost; 19 20 ssl_certificate ....pem; 21 ssl_certificate_key ....key; 22 23 location / { 24 proxy_pass http://localhost:8000; 25 } 26 27 location /auto_deploy/ { 28 proxy_pass http://localhost:8001; 29 } 30 31 error_page 500 502 503 504 /50x.html; 32 location = /50x.html { 33 root html; 34 } 35 } 36 37}
代理其他端口的 webapp 如 node
用户在访问网站时,请求先到 nginx 进行处理,如果是 node.js 站点的话,将请求转发到 node.js 的服务,然后再将 node.js 服务的结果返回给用户。
在 nginx 中设置反向代理很简单,一句 proxy_pass
就可以搞定:
1server { 2 listen 80; 3 server_name example.com; 4 5 location / { 6 proxy_pass http://localhost:9000; 7 } 8}
如果需要在某路径代理某端口,url 可以 rewrite,但需要注意此端口的引用静态文件均要改为相对路径:
1server { 2 listen 80; 3 server_name example.com; 4 5 location /app/ { 6 rewrite ^/app/(.*) /$1 break; 7 proxy_pass http://127.0.0.1:3000; 8 } 9}
配置 PHP 时踩的坑
从官网下载 PHP 后,./configure
需要输入一大堆参数,指定安装的文件夹,安装php-fpm
等,然后才make & make install
。
基本原理
nginx 本身不能处理 PHP,它只是个 web 服务器,当接收到请求后,如果是 php 请求,则发给 php 解释器处理,并把结果返回给客户端。nginx 一般是把请求发 fastcgi 管理进程处理,fascgi 管理进程选择 cgi 子进程处理结果并返回被 nginx。
且需要配置 php-fpm:
#复制一份有效的配置文件
sudo cp /usr/local/php/etc/php-fpm.conf.default.conf php-fpm.conf
#复制一份有效的用户配置文件,用户名是配置php的时候指定的
sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default www.conf
#启动php-fpm,mac必须要以root用户启动,-R 参数表示 --allow-to-run-as-root
sudo /usr/local/php/sbin/php-fpm -R
#查看一下php-fpm是否启动成功
ps aux | grep php-fpm
#查看9000端口是否已经listen
netstat -ant | grep 9000
然后还需要配置 nginx, 文件地址/usr/local/etc/nginx/nginx.conf
:
1location ~ \.php$ { 2 root html; 3 fastcgi_pass 127.0.0.1:9000; 4 fastcgi_index index.php; 5 fastcgi_param SCRIPT_FILENAME /usr/local/var/www$fastcgi_script_name; 6 include fastcgi_params; 7}
上面是最终的配置结果,其实中间经历了nginx File not found
的问题,结果解决办法在这个网址:解决办法
之后在/usr/local/var/www/
此文件夹中编辑一个最简单的 php 文件即可检查是否配置成功。这个文件夹有个关于html
的链接,所以上面的root
选项配置的是html
。
实现二级域名转发
1server { 2 listen 80; 3 server_name *.abc.com; 4 5 if ($http_host ~* "^(.*?)\.abc\.com$") { #正则表达式 6 set $domain $1; #设置变量 7 } 8 9 location / { 10 if ($domain ~* "shop") { 11 proxy_pass http://abc.com:3001; #域名中有shop,转发到3001端口 12 } 13 if ($domain ~* "mail") { 14 proxy_pass http://abc.com:3002; #域名中有mail,转发到3002端口 15 } 16 17 tcp_nodelay on; 18 proxy_set_header Host $host; 19 proxy_set_header X-Real-IP $remote_addr; 20 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 21 #以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上 22 23 root html; 24 index index.html index.htm; #默认情况 25 }