CentOS7下的Nginx安装和配置
Nginx是目前最流行的网站服务器软件,可以说是服务端必备工具。相比传统的Apache服务器软件,Nginx更轻量化,性能更好。
以下教程按照阿里云centOS7服务器为参考。
为yum添加库
sudo yum install epel-release
使用yum安装
sudo yum install nginx
启动Nginx
sudo systemctl start nginx
然后通过IP地址或域名可以访问站点,默认是打开CentOS介绍页。
修改网站文件目录
打开/etc/nginx/nginx.conf
文件,http{}
中server{}
里的这句说明了默认的网站文件目录位置。
root /usr/share/nginx/html;
我们可以直接修改到实际放置网站文件的目录。比如
root /10knet/web;
修改后需要重新启动Nginx使其生效。
重新启动
nginx -s reload
重启后通过IP地址或域名可以访问站点,检查是否成功。
新增配置文件
nginx.conf是Nginx的最基本设置文件,它也规定了还要自动载入哪些别的配置文件,默认情况会自动载入下面两个目录下所有的.conf
文件,第二个include在http{}
里面。
include /usr/share/nginx/modules/*.conf;
include /etc/nginx/conf.d/*.conf;
如果你的网站文件夹很固定,比如一直是/10knet/
这个文件,那么就可以把把它也添加到http{}
中来:
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
include /10knet/*.conf;
然后就可以在网站文件夹下创建一个myNginx.conf文件,把整个server{}
内容剪切、粘贴过去,保存好之后重启使配置生效。
这样做的好处是以后可以直接在项目目录内修改Nginx配置,而不需要每次都打开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;
include /10knet/*.conf;
}
注意其中error_page
两段,这是自动处理找不到页面或服务器出错的,遇到这种情况服务器就会从这里设定的目录读取40x.html返回给用户,就是最常见的404错误。如果ai.10knet.com/333
找不到文件,就会自动返回10knet/pub/ai/err/40x.html
文件。
代理转发
除了静态网页文件服务,我们还要接收和反应用户接口的请求服务,比如用户请求/login
的时候服务器要进行用户密码验证。
因为我们的接口处理程序都是运行在服务器某个端口上的,所以我们只要让Nginx把这些接口请求转发到这个端口就可以了。
配置代码如下:
location ^~ /api/ {
proxy_pass http://127.0.0.1:3100/api/;
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_set_header Via "nginx";
}
这是把所有/api/...
接口都转发到http://127.0.0.1:3100/api/
。所以我们必须编写和运行一个服务器程序运行在3100端口上,比如用Java、Nogdejs或者Golang编写都可以,实际上也非常简单。
重点提示!务必设置阿里云服务器的端口开放权限,禁止3100端口对外开放,不能让用户直接访问这个端口,否则很容易造成安全风险。
子域名配置
子域名就是类似http://app.10knet.com
或者http://ai.10knet.com
这样的域名。可以让我们把网站的不同模块内容清楚地划分开。
可以在阿里云DNS云解析设置中为网站配置特定的子域名,但那要指定不同的服务器,而且要手工为每个子域名进行配置。
能不能在一个服务器上自动配置所有子域名?这就是Nginx的泛域名解析模式。方法是采样动态的server_name,比如myNginx.conf中下面这个写法:
server_name ~^(?<subdomain>.+).10knet.com$;
root /10knet/pub/$subdomain/;
index index.html index.htm;
这就可以接收任意的xxx.10knet.com
的域名地址,并且自动匹配到/10knet/pub/xxx
文件夹下的index.html
页面。
如下所示的是/10knet/myNginx.conf
文件内容:
server {
#http主要泛域名服务器,静态文件和接口
listen 80;
server_name ~^(?<subdomain>.+).10knet.com$;
root /10knet/pub/$subdomain/;
index index.html index.htm;
#接口代理到本地服务程序
location ^~ /api/ {
proxy_pass http://127.0.0.1:3100/api/;
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_set_header Via "nginx";
}
#出错地址指向子域名内error文件夹
error_page 404 /40x.html;
location = /40x.html {
root /10knet/pub/$subdomain/err ;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /10knet/pub/$subdomain/err;
}
}
重定向设置
上面设置了泛域名,但丢失了主域名10knet.com
的解析,我们偷个懒,直接把它重定向到www.10knet.com
,增加一个新的server配置就可以,代码如下:
server {
#重定向http://10knet.com到http://www.10knet.com
listen 80;
server_name 10knet.com;
return 301 http://www.10knet.com$request_uri;
}
设置为随系统启动
使用下面的命令让Nginx自动开机启动,可以使用下面的命令。
sudo systemctl enable nginx
也可以直接修改/etc/rc.d/rc.local
命令,例如下面这样:
# 启动MongoDB
nohup mongod --dbpath=/var/lib/mongo --logpath=/var/log/mongodb/log.txt > /shell/mongod.log 2>&1 &
sleep 3s
sudo systemctl start nginx
sleep 3s
# 启动其他程序
(
cd /opt/app
nohup ./app > kfission.log 2>&1 &
cd /
)
关于这个代码请参考这个文章【编程】Golang服务端程序部署
欢迎关注我的专栏( つ•̀ω•́)つ【人工智能通识】
每个人的智能新时代
如果您发现文章错误,请不吝留言指正;
如果您觉得有用,请点喜欢;
如果您觉得很有用,欢迎转载~