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        }

参考网址