【1】搭建 Nginx 静态网站

一、安装 Nginx

在 CentOS 上,可直接使用 yum 来安装 Nginx

yum install nginx 

安装完成后,使用 nginx 命令启动 Nginx:

nginx

此时,访问 http://<您的域名或IP> 可以看到 Nginx 的测试页面。如果无法访问,请试重启 Nginx

nginx -s reload 

二、配置静态服务器访问路径

外网用户访问服务器的 Web 服务由 Nginx 提供,Nginx 需要配置静态资源的路径信息才能通过 url 正确访问到服务器上的静态资源。

打开 Nginx 的默认配置文件 /etc/nginx/nginx.conf ,修改 Nginx 配置,将默认的 root /usr/share/nginx/html; 修改为: root /data/www; 如下:( vim /etc/nginx/nginx.conf )

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx/mime.types;
default_type application/octet-stream;

include /etc/nginx/conf.d/*.conf;

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /data/www;

include /etc/nginx/default.d/*.conf;

location / {
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

}

配置文件将 /data/www/static 作为所有静态资源请求的根路径,如访问: http://<您的域名>/static/index.js,将会去 /data/www/static/ 目录下去查找 index.js。现在我们需要重启 Nginx 让新的配置生效,如:

nginx -s reload

重启后,现在我们应该已经可以使用我们的静态服务器了,现在让我们新建一个静态文件,查看服务是否运行正常。

这里我们修改的是默认的端口对应的文件的位置,其实可以在/etc/nginx/conf.d中去新配置一个端口的监听, 如何操作见下面的部分。

三、上传静态文件

首先让我们在 /data 目录 下创建 www 目录,如:

mkdir -p /data/www

创建第一个静态文件。在 /data/www 目录下创建我们的第一个静态文件 index.html

示例代码:/data/www/index.html

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>第一个静态文件</title>
</head>
<body>
Hello world!
</body>
</html>

现在访问 http://<您的域名>/index.html 应该可以看到页面输出 [Hello world!]

到此,一个基于 Nginx 的静态服务器就搭建完成了,现在所有放在 /data/www 目录下的的静态资源都可以直接通过域名访问。如果无显示,请刷新浏览器页面

恭喜!您已经成功完成了 搭建Http静态服务器环境。

四、报错

4.1. 端口被占用

Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 
nginx: [emerg] still could not bind()

大概意思就是:端口地址已被使用。很大的可能nginx服务进程卡死了,导致80端口被占用。

netstat -anp|grep 80 
  tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      29598/python  
# kill 掉端口占用的进程
kill -9 29598

启动nginx服务

service nginx start

查看nginx服务

service nginx status

error_log位置

error_log /var/log/nginx/error.log;

4.2. Nginx报错403 forbidden (13: Permission denied)的解决办法

引起nginx 403 forbidden通常是三种情况:

  • 一是缺少索引文件
  • 二是权限问题
  • 三是SELinux状态。
1、缺少index.html或者index.php文件

就是配置文件中index index.html index.htm这行中的指定的文件。

server {  
  listen       80;  
  server_name  localhost;  
  index  index.php index.html;  
  root  / var/www;
}

如果在/ var/www下面没有index.php,index.html的时候,直接访问域名,找不到文件,会报403 forbidden。

2、权限问题

如果nginx没有web目录的操作权限,也会出现403错误。

解决办法:修改web目录的读写权限,或者是把nginx的启动用户改成目录的所属用户,重启Nginx即可解决

chmod -R 755 / var/www
3、SELinux设置为开启状态(enabled)的原因

首先查看本机SELinux的开启状态,如果SELinux status参数为enabled即为开启状态

/usr/sbin/sestatus -v 

或者使用getenforce命令检查

找到原因了,如何关闭 SELinux 呢

1、临时关闭(不用重启)

setenforce 0

2、修改配置文件 /etc/ selinux/config,将SELINUX=enforcing改为SELINUX=disabled

vi /etc/ selinux/config Nginx报错403 forbidden (13: Permission denied)的解决办法

注意:修改配置文件需要重启系统 reboot

4.3 多端口多网站

当然改成 8080,8081 什么的都可以,不一定要 81,但是确保 iptable 要放开对该端口的访问。

开启端口100

iptables -I INPUT -p tcp --dport 100 -j ACCEPT

关闭端口111

iptables -A INPUT -p tcp --dport 111 -j DROP

查看监听端口:

netstat -lnt

4.4 解决CentOS7关闭/开启防火墙出现Unit iptables.service failed to load: No such file or directory.

service iptables start/stop  

会报错Failed to start iptables.service: Unit iptables.service failed to load: No such file or directory.

在CentOS 7或RHEL 7或Fedora中防火墙由firewalld来管理, 如果要添加范围例外端口 如 1000-2000

语法命令如下:启用区域端口和协议组合

firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]

此举将启用端口和协议的组合。端口可以是一个单独的端口 或者是一个端口范围 - 。协议可以是 tcp 或 udp。 实际命令如下:

开启防火墙

systemctl start firewalld

次通过 systemctl status firewalld 查看firewalld状态,显示running即已开启了。

如果要关闭防火墙设置,可能通过systemctl stop firewalld这条指令来关闭该功能。

添加

firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=1000-2000/tcp --permanent 

重新载入

firewall-cmd --reload

查看

firewall-cmd --zone=public --query-port=80/tcp

删除

firewall-cmd --zone=public --remove-port=80/tcp --permanent

方法很简单,假设我们要看192.192.193.211这个IP的tcp 22端口是否打开,则运行

telnet 192.192.193.211 22

4.4 nginx:connect() to 127.0.0.1:5601 failed (13: Permission denied) while connecting to upstream错误

查了下日志发现是这个错:

connect() to 127.0.0.1:5601 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1

和权限有关的,就是selinux呗。

[root@localhost ~]# getenforce
Enforcing

看了下果真如此!坑爹啊!我忘记关了。关掉后就没事了。

setenforce 0
sed -i 's/enforcing$/disabled/g' /etc/selinux/config

执行setenforce 0 表示关闭selinux防火墙。

五、讨论

5.1 新增端口网页

在/etc/nginx/conf.d下面配置新的new.conf即可

server {
        listen  新的端口;
        server_name     default_server; 
        root    /home/sam/www;
        index index.html;
        access_log  /home/sam/log/blog_access.log  main;
        error_log  /home/sam/log/blog_error.log ;
        # Load configuration files for server block.

        #include /etc/nginx/default.d/blog.conf;
        location / {
       
                #root /home/sam/www;
                #index index.html;

        }

        error_page 404 /404.html;
                location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
                location = /50x.html {
        }
}

然后防火墙开一下这个端口即可。 这个地方搞了好久,一直报80端口的问题,原来是新的端口的位置一直写的80,所以有问题。直到这一刻才把端口问题搞清楚呀。。

5.2 修改默认80端口

修改默认的端口

vim /etc/nginx/nginx.conf

将下面的80换成了3200端口

server {
    listen       3200 default_server;
    listen       [::]:3200 default_server;
    server_name  _;
    root         /usr/share/nginx/html;


    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;


    location / {
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

查看配置情况

# systemctl restart nginx
# netstat -tlpn| grep nginx
# ss -tlpn| grep nginx

In CentOS or RHEL based Linux distribution you need to install policycoreutils package and add the below rules required by SELinux for Nginx to bind on the new port.

# yum install policycoreutils
# semanage port -a -t http_port_t -p tcp 3200
# semanage port -m -t http_port_t -p tcp 3200

重启Nginx服务

# systemctl restart nginx.service 

查看配置情况

# netstat -tlpn| grep nginx
# ss -tlpn| grep nginx

防火墙新增端口:

firewall-cmd --zone=public --add-port=3200/tcp --permanent
firewall-cmd --zone=public --add-port=3200/udp --permanent

查看结果:

http://sever.ip:3200 

折腾了半天,一直没有解决一个服务器多个站点的问题,后来跟枫景大神一沟通,发现在端口的问题上。

解决办法有二:

1.要么就是开启端口(跟阿里云沟通),可以先检验端口是否开启

telnet 192.192.193.211 22

这个需要在阿里的后台添加一个端口,然后

server {  
  listen       80;  
  server_name  localhost;  
  index  index.php index.html;  
  root  / var/www;
}

2.有域名的情况下,通过80端口代理(我用的这种方法,成功了),

server {
        listen  80;
        server_name     domain_name; #通过域名转接到80入口,然后转到8089端口的内容上去
        root    /home/sam/www;
        index index.html;
        access_log  /home/sam/log/blog_access.log  main;
        error_log  /home/sam/log/blog_error.log ;
        # Load configuration files for server block.

        #include /etc/nginx/default.d/blog.conf;
        location / {
                proxy_pass http://127.0.0.1:8089;  #这里的Ip地址不用改,只用改成你的端口
                #root /home/sam/www;
                #index index.html;

        }

        error_page 404 /404.html;
                location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
                location = /50x.html {
        }
}

总结

PS: 这里面最常碰到的问题就是防火墙的问题

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn