Ubuntu Nginx 配置
一. 序言
历经了千难万险, 终于是把Nginx 配置成功了, 单单自己还不行, 还要不断从网上总结各种问题的解决方法才能彻底解决, 要不一下两下是不能轻易解决。 在这我详细说名一些我遇到的问题, 让大家省些时间, 少些煎熬。
二. 安装Nginx
sudo apt-get install nginx
. 启动Nginx 服务。
sudo systemctl start nginx
--------------------------------+
. 开机自动启动nginx 服务
sudo systemctl enable nginx
. 关闭开机自动启动nginx 服务
sudo systemctl disable nginx
--------------------------------+
打开浏览器, 在地址栏输入127.0.0.1 or localhost, 出现Nginx 经典网页即表示成功。
我遇到的问题,我在请求localhost的时候,出现的是阿帕奇的界面,因为我之前装的就是阿帕奇的,解决方法,进去到var/log/nginx目录下,有个index.html,配置完成后,nginx默认访问的是这个页面,你看下这个页面的内容,把这个页面换成nginx就好了
. 也可以用Nginx 命令去测试
sudo nginx -t
Tip: 当每次修改完nginx 配置后, 也可使用此语句先查看配置是否正确.
. 查看端口
sudo lsof -i:80
三. Nginx 目录介绍
若Apache 的目录稍稍看懂, 那么Nginx 的目录也大同小异。 常用到的两个主目录:
/etc/nginx, /var/log/nginx.
. /etc/nginx, Nginx 配置目录
------------------------------------------------------------------------------+
drwxr-xr-x conf.d/ # 包含一般性的配置文件, 里面默认没有东西...
-rw-r--r-- fastcgi.conf # fastcgi 的配置
-rw-r--r-- fastcgi_params # fastcgi 参数的配置
-rw-r--r-- koi-utf
-rw-r--r-- koi-win
-rw-r--r-- mime.types # 资源的媒体类型相关配置
drwxr-xr-x modules-available/ # 模块区
drwxr-xr-x modules-enabled/
-rw-r--r-- nginx.conf # nginx 主配置文件
-rw-r--r-- proxy_params
-rw-r--r-- scgi_params
drwxr-xr-x sites-available/ # 虚拟主机配置文件夹
drwxr-xr-x sites-enabled/ # 虚拟主机配置文件夹, 生效区
drwxr-xr-x snippets/
-rw-r--r-- uwsgi_params
-rw-r--r-- win-utf
--------------------------------------------------------------------+
其他的都默认不动就好了, 主要有三个地方, nginx.conf ,sites-available/, sites-enabled/。
四. 配置
从亲手配置到理解配置。
a) 首先, 让Nginx 解析PHP 文件。
. 让Nginx 解析PHP 文件, 需要安装php7.0-fpm.
sudo apt install php7.0-fpm
b) 编辑Nginx 文件
. 进入到Nginx 配置文件夹下, 并打开Nginx 配置文件
cd /etc/nginx
sudo vim nginx/conf
Tip: 里面有许多东西是注释掉的, 需要你自己配置。
------------------------------------------------+
# 运行Nginx 服务的身份, 默认是www-data, 我给注释掉了。 经过一系列配置后, 我发现注释掉也是可以的, 没影响。 可能和以后服务器正式环境有些相关吧。
#user root;
worker_processes 4; # 进程数量, CPU 有几核, 就设置几, 我设置4.
pid /run/nginx.pid; # Nginx PID 值保存的文件
# 引入模块的各种配置
include /etc/nginx/modules-enabled/*.conf;
# Nginx 事件
events {
worker_connections 1024; # 单个worker process 进程的最大并发链接数
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log; # 访问日志
error_log /var/log/nginx/error.log; # 错误日志
##
# Gzip Settings
##
# gzip 设置, 使用gizp压缩提高网站的传输速度。 之前的是注释掉的, 我给开启了, 默认就好。
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
# 虚拟配置引入
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
# Nginx 还可以做邮箱服务器和反向代理服务器。 默认是注释。
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
------------------------------------------------+
. 看完了Nginx 配置, 发现没什么要修改的。 于是开始着手让Nginx 开始解析PHP。 首先打开虚拟机配置文件, 还是同一个目录下操作。 先给配置文件做一个备份, 以防万一。
sudo cp sites-available/default sites-available/default.bak
sudo vim sites-available/default
. 其他注释的地方我就没复制
----------------------------------------------------------+
server {
listen 80 default_server; # IPv4 端口号
listen [::]:80 default_server; # IPv6 端口号
root /var/www/html; # Nginx 服务器根目录
# Add index.php to the list if you are using PHP
# 默认有好多类型的, 在这我添加了PHP 的index 索引文件, 然后把其他的都删掉了。
# 开头的index, 告诉Nginx 要添加的index 索引文件, 不可少。
index index.php; # 添加自动索引文件
server_name localhost; # 域名
# location / 通用匹配,任何请求都会匹配到。
# 我在这里只开启了可以浏览文件夹。
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
# pass PHP scripts to FastCGI server
# 访问带.php 后缀的文件的地址, 需要走这里, 比如localhost/test.php。 就是让Nginx 去解析PHP 文件。
location ~ \.php$ {
include snippets/fastcgi-php.conf;
#
# # With php-fpm (or other unix sockets):
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; ^ 注释一
# # With php-cgi (or other tcp sockets):
# fastcgi_pass 127.0.0.1:9000; ^ 注释二
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# 禁止htaccess 文件
# location ~ /\.ht {
# deny all;
#}
}
# 下面还有提供的虚拟主机配置的模板。 意思是你可以再新建一个文件, 用此模板, 放在sites-available/ 中, 链接到sites-enabled/ 启用就可以。
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
--------------------------------------------------+
Tip: 注释一, 二详解
注释一: fastcgi_pass unix:/var/run/php/php7.1-fpm.sock
注释二: fastcgi_pass 127.0.0.1:9000。
这两句不能同时开启, 只能开启一个.
1. 若开启注释一, 出现报错, 那么就走下面, 若没有错误, 服务正常开启, 那么就成功了
. 进入到php目录下, 并查看
cd /etc/php/7.0
ls
. 会看到这四个文件夹
apache2 cgi fpm mods-available
若使用nginx 服务器, 那么以后fpm 中的php.ini 文件会成为php 的配置文件, 开启个扩展, 或debug 调试, 都要从这里面修改. 同理若使用apache 服务器, 那么会使用apache2 目录下的配置文件.
若出现了报错, 则需要更改fpm/pool.d/www.conf 配置文件
sudo vim fpm/pool.d/www.conf
vim 一般模式下, /listen 找到如下三行
listen.owner = www-data
listen.group = www-data
;listen.mode = 0660
把最后一个去掉注释. 保存退出.
2. 若开启注释二, 则
. 首先查看Fastcgi 的端口, 查看是否有127.0.0.1:9000。
netstat -antp
. 若没有, 则开启
php-cgi -b 127.0.0.1:9000 &
这时, 他会提醒你安装php-cgi, 你就安装你的php 版本的cgi
sudo apt install php7.1-cgi
. 再重复一次, 开启
php-cgi -b 127.0.0.1:9000 &
这样基本配置就完成了, 首先测试一下, 是否能解析PHP 文件。 在/var/www/html 目录下, 创建一个index.php 文件。
sudo vim /var/www/html/index.php
i, 进入编辑模式
phpinfo();
?>
Esc, :wq 保存退出。
. 开启服务
sudo systemctl start nginx php7.0-fpm
Tip: 编辑配置配置文件若出现错误时, 往往开启不了服务, 这时则需要去Nginx 日志目录下查看错误日志,错误一看便知, 它会告诉你错误出现在哪个配置文件的哪一行。 日志文件在/var/log/nginx 目录下, 可more error.log 查看。
. 打开浏览器, 在地址栏输入127.0.0.1 or localhost
若出现php 的信息, 则成功。
五. 问题
1. 若出现403 Forbiddn, 则不是你的配置的事情, 应该是你的该根目录权限的问题。 首先查看根目录
ll /var/www
若不是这样, 权限不足的话, 则改一下权限。
sudo chmod 777 /var/www/html
然后再去浏览器刷新, 看是否成功. 若还是禁止, 则该转向另一个问题了. 使用者是否正确
. 首先
查看用户www-data 是否存在。 若不存在, 则添加该用户和用户组。
// 创建用户
sudo useradd www-data
// 把该用户添加到sudo 组中, 以后就可以使用sudo 来提升权限
sudo usermod -a -G sudo www-data
. 或者去Nginx 的配置文件中, 把第一行的用户的注释去掉, 改成root。
sudo vim /etc/nginx/nginx.conf
去掉注释。 这时重启Nginx 服务。
nginx -s reload
or
sudo systemctl restart nginx
再去浏览器刷新一下, 看是否有效果。 若有效果, 则进入下一步。
2. 若出现502 Bad Gateway
502 Bad Gateway, 连接超时 我们向服务器发送请求 由于服务器当前链接太多,导致服务器方面无法给于正常的响应,产生此类报错。
回到上面的两个注释上去解决.
六. 更改根目录
. 按上面所说, 编辑虚拟主机默认配置文件
进入到Nginx 配置目录。
cd /etc/nginx/
编辑配置文件。
sudo vim sites-enabled/default
把里面的root 更换你自己的目录。
比如我的是home/loseself/www。 别忘了创建那个文件夹。
然后更改根目录权限。
sudo chmod 777 home/loseself/www
. 重启Nginx 服务
sudo systemctl restart nginx
七. 配置虚拟主机
. 进入到Nginx 配置目录。
cd /etc/nginx/
. 在sites-available 下新建一个文件, 复制其下的default 的文件即可, 然后进行配置, 再链接到sites-enabled 文件夹下。(和Apache 配置步骤差不多, 且default 文件下还有提供的虚拟主机配置模板, 上面提到过!)
. 给文件起你想要的名字, 在这就叫做april, 然后编辑april 文件, 修改端口设置, 域名和根目录。
cp sites-available/default sites-available/april
端口像这样, 去掉default, 下面有模板。
然后更改域名和根目录。 完成后保存退出。 Esc, :wq
. 创建链接文件到site-enabled文件夹下, 这次链接的路径也和Apache不一样, 按他的来。
su ln -s /etc/nginx/sites-available/april sites-enabled/april
. 查看一下
ll sites-available
成功后, 去hosts 文件添加你修改的域名。
. 添加域名
sudo vim /etc/hosts
. 新添一个你的域名, 我的叫loseself.im
127.0.0.1 loseself.im
保存退出。
. 在根目录下添加一个测试文件index.php
sudo vim 你的根目录/index.php
phpinfo();
?>
保存退出。 重启Nginx 服务。
sudo systemctl restart nginx
. 打开浏览器, 输入你的新添域名。 看到效果即可。
八. 开启Nginx 服务器PHP 的调试
1. 前往属于Nginx 的php配置文件的目录下
cd /etc/php/7.0/fpm
2. 打开php.ini
sudo vim php.ini
/ERROR
找到error_reporting, display_errors 并改为以下.
error_reporting = E_ALL & ~E_ERROR
display_errors = On
3. 重启nginx, php7.0-fpm 服务
sudo systemctl restart nginx php7.0-fpm
4. 若还不行, 则打开php-fpm.conf
sudo vim php-fpm.conf
在最后一行复制上下面这句话
php_flag[display_errors] = on
再重启nginx, php7.0-fpm 服务.