nginx常见问题整理和解决办法
1. 服务器上的nginx没有启动该怎么办?
首先,我们需要检查一下nginx是否已经正确安装了。可以使用nginx -v
命令来查看当前安装的nginx版本信息。如果显示没有安装,则需要先安装nginx相关的软件包。
一般情况下,如果nginx没有启动,我们需要进入nginx安装目录下进行手动启动,通过以下命令启动nginx:
cd /usr/local/nginx/sbin/
./nginx
如果nginx已经成功启动,直接访问服务器ip地址/域名就能访问nginx。如果无法访问,则需要检查防火墙是否开启,或者检查是否有其他服务占用了80端口。
2. 如何禁用/启用nginx服务?
一般情况下,我们可以使用以下命令来启动/停止nginx服务:
# 启动nginx服务
systemctl start nginx
# 停止nginx服务
systemctl stop nginx
# 重启nginx服务
systemctl restart nginx
# 查看nginx服务状态
systemctl status nginx
如果需要禁用或启用nginx服务,可以使用以下命令:
# 禁用nginx服务
systemctl disable nginx
# 启用nginx服务
systemctl enable nginx
当禁用nginx服务后,nginx服务将会在系统启动时不会随着系统一起启动;而启用nginx后,nginx服务将会在系统启动时随着系统同时启动。
3. 如何防止nginx被攻击?
- 限制ip访问
针对公网的nginx服务,一定要限制ip访问。通过nginx配置文件中的allow
和deny
指令来限制ip访问。例如:
nginx
http {
#...
server {
#...
location / {
#...
# 只允许10.10.10.10访问
allow 10.10.10.10;
# 拒绝其他ip访问
deny all;
}
}
}
- 限制nginx执行脚本
设置nginx配置文件中的cgi.fix_pathinfo
字段为0
可以避免使用fastcgi等脚本执行方式的漏洞。例如:
nginx
http {
#...
server {
#...
location ~ \.php$ {
#...
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO "";
fastcgi_param PATH_TRANSLATED "";
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
# 禁用脚本包含功能
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 限制脚本执行
fastcgi_param PATH_TRANSLATED $fastcgi_script_name;
fastcgi_intercept_errors on;
fastcgi_pass 127.0.0.1:9000;
}
}
}
- 启用HTTPS协议
启用HTTPS协议可以避免数据在传输过程中被截获和篡改。可以通过使用SSL证书来启用HTTPS协议。例如:
```nginx
http {
#...
server {
#...
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location / {
#...
}
}
}
```
示例说明
下面给出两个示例说明:
示例一:使用php-fpm启动nginx服务
如果希望使用php-fpm启动nginx服务来执行php脚本,则需要在nginx配置文件中进行相关配置。例如:
http {
#...
server {
#...
location ~ \.php$ {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
}
示例二:使用upstream指令实现nginx负载均衡
可以使用upstream指令来实现nginx的负载均衡。例如:
http {
#...
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
}
其中,upstream
指令中的backend
是一个自定义的名称,可以是任意名称。server
指令中的weight
代表权重,server
指令中可以写多个服务器地址,每个地址之间用空格隔开。在server
指令中,还可以写unix域套接字的方式连接服务器。在server
指令后,即通过proxy_pass
指令将请求转发到upstream backend
后的具体服务器上。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nginx常见问题整理和解决办法 - Python技术站